@lark-apaas/coding-miaoda-sandbox-skills 0.1.0-dev.72ac425 → 0.1.0-dev.7cbbb20
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/miaoda/debug-investigation/SKILL.md +17 -8
- package/miaoda/forms-skill/SKILL.md +37 -4
- package/miaoda/lark-apps-db/SKILL.md +6 -0
- package/miaoda/miaoda-sql/SKILL.md +6 -0
- package/miaoda-modern/debug-investigation/SKILL.md +1 -1
- package/miaoda-modern/forms-skill/SKILL.md +37 -4
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debug-investigation
|
|
3
|
-
description: "Debug investigation methodology for the Reviewer agent. LOAD THIS SKILL (via
|
|
3
|
+
description: "Debug investigation methodology for the Reviewer agent. LOAD THIS SKILL (via the Skill tool) when caller prompt contains symptom keywords: 卡死 / 白屏 / 修不好 / 修不掉 / 报错 / 定位 bug / 为什么 X 不工作 / 出 bug / 故障 / 已经修了 N 次 / 线上报错 / 线上异常 / 发布后出问题 / 用户反馈线上 / hang / crash / broken / doesn't work / can't figure out / still broken / production error / online issue. For 'user reported symptom, find root cause' tasks. Runs alongside security/performance/correctness review but does not replace them — pattern libraries come from those skills, this skill only owns the investigation flow (Phase 1-3 + 4.5 Architecture Questioning). 触发词:定位 bug, root cause, 症状排查, 线上异常排查"
|
|
4
4
|
available-agents:
|
|
5
5
|
- Reviewer
|
|
6
6
|
---
|
|
@@ -15,33 +15,42 @@ Reviewer 的工具白名单已物理强制此规则:你无 Edit/Write 权限
|
|
|
15
15
|
# Phase 1 — Root Cause Investigation (必做)
|
|
16
16
|
|
|
17
17
|
1. 读 caller prompt 提取症状:What / When / Where / 触发条件,并判定症状
|
|
18
|
-
发生环境:沙箱预览(dev 态) vs
|
|
19
|
-
线上 / 发布后 / 线上用户反馈 / production / online 等表述 →
|
|
18
|
+
发生环境:沙箱预览(dev 态) vs 线上(已发布应用)。从 caller 转述的用户
|
|
19
|
+
原话判断:出现 线上 / 发布后 / 线上用户反馈 / production / online 等表述 →
|
|
20
|
+
按线上处理;用户描述的是应用使用者看到的现象,或判断不了 → 两条链路都查
|
|
21
|
+
(都是只读)
|
|
20
22
|
2. 日志证据(按环境选链路,两条链路日志互不相通):
|
|
21
23
|
- **沙箱 dev 态** → ReadLogs browser / server-devserver / client-devserver /
|
|
22
24
|
server,找对应错误栈、请求 / 响应、console error
|
|
23
25
|
- **线上(已发布)** → 见下方「Phase 1 子步骤:线上异常取证」,按当前沙箱
|
|
24
26
|
的线上观测手册拉线上日志。ReadLogs 读不到线上日志——
|
|
25
27
|
不要拿沙箱日志当线上症状的证据
|
|
28
|
+
- 一条链路查不到事件痕迹(没有对应请求、没有报错)时,不要下「无法考证」的
|
|
29
|
+
结论:事件多半发生在另一条链路,先查另一条。数据库查询、审计开关只反映
|
|
30
|
+
当前状态,说明不了是谁、何时改的
|
|
26
31
|
3. 近期改动:`git log --oneline -20 <suspected_file>`,必要时看 `git show <sha>`
|
|
27
32
|
4. 数据流反向追溯(见下方 5 步流程)
|
|
28
33
|
5. 跨组件证据:即使没法 runtime 埋点,也要在报告里列清每层"当前行为 vs
|
|
29
34
|
期望行为",指出断点
|
|
30
35
|
|
|
31
|
-
## Phase 1
|
|
36
|
+
## Phase 1 子步骤:线上异常取证(第 1 步判定需要查线上时必做)
|
|
32
37
|
|
|
33
|
-
|
|
38
|
+
当第 1 步判定需要查**线上(已发布应用)**时,必须拉取线上日志作为
|
|
34
39
|
证据,禁止只凭静态代码阅读下结论。所有取证在 Phase 1 内完成(Reviewer 的
|
|
35
40
|
Phase 3 禁止工具调用规则不变)。
|
|
36
41
|
|
|
37
|
-
1.
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
1. **加载命令手册**:在 Available Skills 里找 `lark-apps-ops` 或 `miaoda-cli`,
|
|
43
|
+
按其 location 推出同目录下的 `references/lark-apps-observability.md` /
|
|
44
|
+
`references/observability.md`,用 Read 加载存在的那份(不要用 Glob / rg
|
|
45
|
+
在文件系统里搜:`.agent/` 被应用 .gitignore 忽略,会搜不到)。
|
|
40
46
|
完整命令 / flag / 默认值一律以该文档为准,不要凭记忆拼命令。
|
|
41
47
|
两份都找不到 → 当前栈不支持线上日志查询,在报告里注明
|
|
42
48
|
「线上日志不可用」,回退沙箱日志 + 静态分析,不阻塞调查
|
|
43
49
|
2. **错误日志**:按手册的日志检索条目拉 ERROR 级日志,时间窗按 caller 描述
|
|
44
50
|
的发生时间收敛(如最近 1 小时);有关键词或具体接口时,按手册支持的方式收窄
|
|
51
|
+
**请求追溯**:要找某个数据 / 资源被哪个请求改动时,不限 ERROR 级,按资源
|
|
52
|
+
id、标题、关键词或接口路径加时间窗检索;日志条目带时间戳、method、path、
|
|
53
|
+
user_id、trace_id,可直接回答「哪个请求、谁、何时」
|
|
45
54
|
3. **链路追溯**:从日志取 `trace_id`,按手册的 trace 检索条目看完整调用链,
|
|
46
55
|
定位慢点 / 失败环节
|
|
47
56
|
4. **前端报错反解源码**:日志含前端错误时,按手册的前端源码反解条目拿到
|
|
@@ -13,6 +13,11 @@ Shadcn Form + React Hook Form + Zod 表单开发。
|
|
|
13
13
|
- 所有字段必须有默认值
|
|
14
14
|
- 必须用 Shadcn 组件,禁止原生 input
|
|
15
15
|
- 同行 FormField 必须等宽
|
|
16
|
+
- 每个控件都要有能读出来的字段名(读屏和自动化验收都按它找控件):FormField 内用 `FormLabel` + `FormControl`,id 会自动关联;FormField 外的筛选、搜索控件用 `<Label htmlFor="x">` 配控件 `id="x"`,没有可见标签时加 `aria-label`。不要只靠 placeholder 或当前选中值表达字段含义
|
|
17
|
+
- 必填星号加 `aria-hidden="true"`,别让 `*` 混进字段名
|
|
18
|
+
- 字段校验错误用 `<FormMessage />` 显示在字段下方;toast 只用于提交结果(成功 / 接口失败),不要用 toast 提示「请输入 xx」
|
|
19
|
+
- 日期字段用 `Popover` + `Calendar`,`FormControl` 包住触发按钮,禁止 `input[type="date"]`
|
|
20
|
+
- 自定义输入组件(富文本等)也放进 `FormControl`,并把 `id`、`aria-*` 透传到真正可编辑的元素上
|
|
16
21
|
- 表单提交到必填 API/DTO/Request/interface 前,先读目标 shared/server 类型,在 `handleSubmit` 回调里用 `data` 逐字段构造 typed request(见 Patterns);不要整体传 `data`、`schema.parse(data)` 或 `.required().parse(data)`,也不要用 `any`/`as` 绕过 TS2322。修完后跑 LSP 或 `typecheck`。
|
|
17
22
|
|
|
18
23
|
---
|
|
@@ -49,14 +54,14 @@ export function StudentForm() {
|
|
|
49
54
|
<div className="flex flex-wrap gap-4">
|
|
50
55
|
<FormField control={form.control} name="name" render={({ field }) => (
|
|
51
56
|
<FormItem className="flex-1">
|
|
52
|
-
<FormLabel>姓名 <span className="text-destructive">*</span></FormLabel>
|
|
57
|
+
<FormLabel>姓名 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
53
58
|
<FormControl><Input placeholder="请输入姓名" {...field} /></FormControl>
|
|
54
59
|
<FormMessage />
|
|
55
60
|
</FormItem>
|
|
56
61
|
)} />
|
|
57
62
|
<FormField control={form.control} name="age" render={({ field }) => (
|
|
58
63
|
<FormItem className="flex-1">
|
|
59
|
-
<FormLabel>年龄 <span className="text-destructive">*</span></FormLabel>
|
|
64
|
+
<FormLabel>年龄 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
60
65
|
<FormControl><Input type="number" {...field} /></FormControl>
|
|
61
66
|
<FormMessage />
|
|
62
67
|
</FormItem>
|
|
@@ -64,7 +69,7 @@ export function StudentForm() {
|
|
|
64
69
|
</div>
|
|
65
70
|
<FormField control={form.control} name="grade" render={({ field }) => (
|
|
66
71
|
<FormItem>
|
|
67
|
-
<FormLabel>年级 <span className="text-destructive">*</span></FormLabel>
|
|
72
|
+
<FormLabel>年级 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
68
73
|
<Select onValueChange={field.onChange} defaultValue={field.value}>
|
|
69
74
|
<FormControl><SelectTrigger><SelectValue placeholder="请选择" /></SelectTrigger></FormControl>
|
|
70
75
|
<SelectContent>
|
|
@@ -99,7 +104,35 @@ const form = useForm<FormData>({ resolver: zodResolver(schema), defaultValues: {
|
|
|
99
104
|
</div>
|
|
100
105
|
|
|
101
106
|
// 必填标记
|
|
102
|
-
<FormLabel>字段 <span className="text-destructive">*</span></FormLabel>
|
|
107
|
+
<FormLabel>字段 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
108
|
+
|
|
109
|
+
// 表单外的筛选 / 搜索控件:可见标签用 htmlFor + id 关联;没有可见标签必须加 aria-label
|
|
110
|
+
<Label htmlFor="status-filter">状态</Label>
|
|
111
|
+
<Select value={status} onValueChange={setStatus}>
|
|
112
|
+
<SelectTrigger id="status-filter"><SelectValue placeholder="全部状态" /></SelectTrigger>
|
|
113
|
+
<SelectContent>{/* SelectItem ... */}</SelectContent>
|
|
114
|
+
</Select>
|
|
115
|
+
<Input aria-label="搜索姓名或职位" placeholder="搜索姓名或职位" value={keyword} onChange={(e) => setKeyword(e.target.value)} />
|
|
116
|
+
|
|
117
|
+
// 日期:Popover + Calendar,FormControl 包住触发按钮,label 才能关联到它
|
|
118
|
+
<FormField control={form.control} name="dueDate" render={({ field }) => (
|
|
119
|
+
<FormItem>
|
|
120
|
+
<FormLabel>截止日期</FormLabel>
|
|
121
|
+
<Popover>
|
|
122
|
+
<PopoverTrigger asChild>
|
|
123
|
+
<FormControl>
|
|
124
|
+
<Button variant="outline" className="w-full justify-start font-normal">
|
|
125
|
+
{field.value ? dayjs(field.value).format("YYYY-MM-DD") : "请选择日期"}
|
|
126
|
+
</Button>
|
|
127
|
+
</FormControl>
|
|
128
|
+
</PopoverTrigger>
|
|
129
|
+
<PopoverContent className="w-auto p-0" align="start">
|
|
130
|
+
<Calendar mode="single" selected={field.value} onSelect={field.onChange} />
|
|
131
|
+
</PopoverContent>
|
|
132
|
+
</Popover>
|
|
133
|
+
<FormMessage />
|
|
134
|
+
</FormItem>
|
|
135
|
+
)} />
|
|
103
136
|
|
|
104
137
|
// 必填 Request/DTO 桥接:zodResolver 负责运行时校验,DTO 边界负责静态类型匹配。
|
|
105
138
|
// 用 handleSubmit 回调的 data,不要用 getValues(拿到的是 coerce 前的原始值)。
|
|
@@ -133,6 +133,7 @@ CREATE POLICY "修改本人数据" ON <table>
|
|
|
133
133
|
5. 执行前向用户展示目标对象和变更内容;DROP / DROP COLUMN 还要说明数据丢失风险并取得明确授权。
|
|
134
134
|
6. 执行:`lark-cli apps +db-execute --app-id "$app_id" --sql "<ddl>" --yes`。多条 DDL 是一个逻辑单元时放在一次调用;需要全回滚则显式包事务。
|
|
135
135
|
7. DDL 成功后**立即**在应用工程根目录执行 `npm run gen:db-schema` 刷新 `server/database/schema.ts`——`+db-execute` 不会自动刷新。多批 DDL 每批成功后都跑一次。
|
|
136
|
+
8. 已存在的表只能用 `ALTER TABLE` 修改。`CREATE TABLE IF NOT EXISTS` 只会跳过建表,**不会**更新已有列的类型、默认值或约束;执行 `ALTER TABLE` 后再次用 `+db-table-get --table <table>` 回读 DDL,确认目标定义已经改变。
|
|
136
137
|
|
|
137
138
|
### DDL Do / Don't
|
|
138
139
|
|
|
@@ -160,6 +161,11 @@ CREATE POLICY "修改本人数据" ON <table>
|
|
|
160
161
|
| 标量子查询多行 | `VALUES((SELECT ...))` / `SET col=(SELECT ...)` 必须唯一或 `ORDER BY ... LIMIT 1` |
|
|
161
162
|
| 系统表查询 | 常规结构查询用 `+db-table-list/get`;系统表仅限 reference 中列出的白名单 |
|
|
162
163
|
| 多语句事务误判 | `A; B; C` 不自动包事务,B 失败时 A 不回滚;需要原子性用 `BEGIN/COMMIT` |
|
|
164
|
+
| 时间表达式依赖会话时区 | `timestamptz` 参与日期/小时计算、CHECK 或表达式索引时,显式写 `AT TIME ZONE 'UTC'` 或明确的业务时区;用跨日期边界的时间值验证结果,禁止依赖会话默认时区 |
|
|
165
|
+
|
|
166
|
+
### 写入前核对全部唯一性
|
|
167
|
+
|
|
168
|
+
新增或修改 `INSERT`、`UPDATE`、upsert 写入逻辑前,先用 `+db-table-get --table <table> --format pretty` 读取目标表完整 DDL,列出其中**全部** UNIQUE 约束和唯一索引(含条件索引、表达式索引),逐条检查本次写入是否可能冲突。`ON CONFLICT` 只处理它明确匹配的那一条唯一规则,不能挡住其它唯一索引;发现其它冲突时,应在写入前按业务语义处理,或将 `23505` 转成明确的冲突错误,禁止让它冒成 500。
|
|
163
169
|
|
|
164
170
|
## Data Types and Design
|
|
165
171
|
|
|
@@ -121,6 +121,7 @@ CREATE POLICY "修改本人数据" ON <table>
|
|
|
121
121
|
4. CREATE TABLE / CREATE INDEX / ALTER TABLE ADD COLUMN 必须带 `IF NOT EXISTS`,避免重复执行失败。
|
|
122
122
|
5. 执行前向用户展示目标对象和变更内容;DROP / DROP COLUMN 还要说明数据丢失风险并取得明确授权。
|
|
123
123
|
6. 执行:`miaoda db sql "<ddl>"`。多条 DDL 是一个逻辑单元时放在一次调用;需要全回滚则显式包事务。
|
|
124
|
+
7. 已存在的表只能用 `ALTER TABLE` 修改。`CREATE TABLE IF NOT EXISTS` 只会跳过建表,**不会**更新已有列的类型、默认值或约束;执行 `ALTER TABLE` 后再次用 `miaoda db schema get <table>` 回读 DDL,确认目标定义已经改变。
|
|
124
125
|
|
|
125
126
|
### DDL Do / Don't
|
|
126
127
|
|
|
@@ -149,6 +150,11 @@ CREATE POLICY "修改本人数据" ON <table>
|
|
|
149
150
|
| 标量子查询多行 | `VALUES((SELECT ...))` / `SET col=(SELECT ...)` 必须唯一或 `ORDER BY ... LIMIT 1` |
|
|
150
151
|
| 系统表查询 | 常规结构查询用 schema 命令;系统表仅限 reference 中列出的白名单 |
|
|
151
152
|
| 多语句事务误判 | `A; B; C` 不自动包事务,B 失败时 A 不回滚;需要原子性用 `BEGIN/COMMIT` |
|
|
153
|
+
| 时间表达式依赖会话时区 | `timestamptz` 参与日期/小时计算、CHECK 或表达式索引时,显式写 `AT TIME ZONE 'UTC'` 或明确的业务时区;用跨日期边界的时间值验证结果,禁止依赖会话默认时区 |
|
|
154
|
+
|
|
155
|
+
### 写入前核对全部唯一性
|
|
156
|
+
|
|
157
|
+
新增或修改 `INSERT`、`UPDATE`、upsert 写入逻辑前,先用 `miaoda db schema get <table>` 读取目标表完整 DDL,列出其中**全部** UNIQUE 约束和唯一索引(含条件索引、表达式索引),逐条检查本次写入是否可能冲突。`ON CONFLICT` 只处理它明确匹配的那一条唯一规则,不能挡住其它唯一索引;发现其它冲突时,应在写入前按业务语义处理,或将 `23505` 转成明确的冲突错误,禁止让它冒成 500。
|
|
152
158
|
|
|
153
159
|
## Data Types and Design
|
|
154
160
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debug-investigation
|
|
3
|
-
description: "Debug investigation methodology for the Reviewer agent. LOAD THIS SKILL (via
|
|
3
|
+
description: "Debug investigation methodology for the Reviewer agent. LOAD THIS SKILL (via the Skill tool) when caller prompt contains symptom keywords: 卡死 / 白屏 / 修不好 / 修不掉 / 报错 / 定位 bug / 为什么 X 不工作 / 出 bug / 故障 / 已经修了 N 次 / hang / crash / broken / doesn't work / can't figure out / still broken. For 'user reported symptom, find root cause' tasks. Runs alongside security/performance/correctness review but does not replace them — pattern libraries come from those skills, this skill only owns the investigation flow (Phase 1-3 + 4.5 Architecture Questioning). 触发词:定位 bug, root cause, 症状排查"
|
|
4
4
|
available-agents:
|
|
5
5
|
- Reviewer
|
|
6
6
|
---
|
|
@@ -15,6 +15,11 @@ Shadcn Form + React Hook Form + Zod 表单开发。
|
|
|
15
15
|
- API 合同允许字段可选的查询、筛选、搜索表单,继续提交 `z.infer` 值
|
|
16
16
|
- 必须用 Shadcn 组件,禁止原生 input
|
|
17
17
|
- 同行 FormField 必须等宽
|
|
18
|
+
- 每个控件都要有能读出来的字段名(读屏和自动化验收都按它找控件):FormField 内用 `FormLabel` + `FormControl`,id 会自动关联;FormField 外的筛选、搜索控件用 `<Label htmlFor="x">` 配控件 `id="x"`,没有可见标签时加 `aria-label`。不要只靠 placeholder 或当前选中值表达字段含义
|
|
19
|
+
- 必填星号加 `aria-hidden="true"`,别让 `*` 混进字段名
|
|
20
|
+
- 字段校验错误用 `<FormMessage />` 显示在字段下方;toast 只用于提交结果(成功 / 接口失败),不要用 toast 提示「请输入 xx」
|
|
21
|
+
- 日期字段用 `Popover` + `Calendar`,`FormControl` 包住触发按钮,禁止 `input[type="date"]`
|
|
22
|
+
- 自定义输入组件(富文本等)也放进 `FormControl`,并把 `id`、`aria-*` 透传到真正可编辑的元素上
|
|
18
23
|
- 表单提交到必填 API/DTO/Request/interface 前,先读目标 shared/server 类型,在 `handleSubmit` 回调里用 `data` 逐字段构造 typed request(见 Patterns);不要整体传 `data`、`schema.parse(data)` 或 `.required().parse(data)`,也不要用 `any`/`as` 绕过 TS2322。修完后跑 LSP 或 `typecheck`。
|
|
19
24
|
|
|
20
25
|
---
|
|
@@ -70,14 +75,14 @@ export function StudentForm() {
|
|
|
70
75
|
<div className="flex flex-wrap gap-4">
|
|
71
76
|
<FormField control={form.control} name="name" render={({ field }) => (
|
|
72
77
|
<FormItem className="flex-1">
|
|
73
|
-
<FormLabel>姓名 <span className="text-destructive">*</span></FormLabel>
|
|
78
|
+
<FormLabel>姓名 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
74
79
|
<FormControl><Input placeholder="请输入姓名" {...field} /></FormControl>
|
|
75
80
|
<FormMessage />
|
|
76
81
|
</FormItem>
|
|
77
82
|
)} />
|
|
78
83
|
<FormField control={form.control} name="age" render={({ field }) => (
|
|
79
84
|
<FormItem className="flex-1">
|
|
80
|
-
<FormLabel>年龄 <span className="text-destructive">*</span></FormLabel>
|
|
85
|
+
<FormLabel>年龄 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
81
86
|
<FormControl><Input type="number" {...field} /></FormControl>
|
|
82
87
|
<FormMessage />
|
|
83
88
|
</FormItem>
|
|
@@ -85,7 +90,7 @@ export function StudentForm() {
|
|
|
85
90
|
</div>
|
|
86
91
|
<FormField control={form.control} name="grade" render={({ field }) => (
|
|
87
92
|
<FormItem>
|
|
88
|
-
<FormLabel>年级 <span className="text-destructive">*</span></FormLabel>
|
|
93
|
+
<FormLabel>年级 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
89
94
|
<Select onValueChange={field.onChange} defaultValue={field.value}>
|
|
90
95
|
<FormControl><SelectTrigger><SelectValue placeholder="请选择" /></SelectTrigger></FormControl>
|
|
91
96
|
<SelectContent>
|
|
@@ -120,7 +125,35 @@ const form = useForm<FormData>({ resolver: zodResolver(schema), defaultValues: {
|
|
|
120
125
|
</div>
|
|
121
126
|
|
|
122
127
|
// 必填标记
|
|
123
|
-
<FormLabel>字段 <span className="text-destructive">*</span></FormLabel>
|
|
128
|
+
<FormLabel>字段 <span aria-hidden="true" className="text-destructive">*</span></FormLabel>
|
|
129
|
+
|
|
130
|
+
// 表单外的筛选 / 搜索控件:可见标签用 htmlFor + id 关联;没有可见标签必须加 aria-label
|
|
131
|
+
<Label htmlFor="status-filter">状态</Label>
|
|
132
|
+
<Select value={status} onValueChange={setStatus}>
|
|
133
|
+
<SelectTrigger id="status-filter"><SelectValue placeholder="全部状态" /></SelectTrigger>
|
|
134
|
+
<SelectContent>{/* SelectItem ... */}</SelectContent>
|
|
135
|
+
</Select>
|
|
136
|
+
<Input aria-label="搜索姓名或职位" placeholder="搜索姓名或职位" value={keyword} onChange={(e) => setKeyword(e.target.value)} />
|
|
137
|
+
|
|
138
|
+
// 日期:Popover + Calendar,FormControl 包住触发按钮,label 才能关联到它
|
|
139
|
+
<FormField control={form.control} name="dueDate" render={({ field }) => (
|
|
140
|
+
<FormItem>
|
|
141
|
+
<FormLabel>截止日期</FormLabel>
|
|
142
|
+
<Popover>
|
|
143
|
+
<PopoverTrigger asChild>
|
|
144
|
+
<FormControl>
|
|
145
|
+
<Button variant="outline" className="w-full justify-start font-normal">
|
|
146
|
+
{field.value ? dayjs(field.value).format("YYYY-MM-DD") : "请选择日期"}
|
|
147
|
+
</Button>
|
|
148
|
+
</FormControl>
|
|
149
|
+
</PopoverTrigger>
|
|
150
|
+
<PopoverContent className="w-auto p-0" align="start">
|
|
151
|
+
<Calendar mode="single" selected={field.value} onSelect={field.onChange} />
|
|
152
|
+
</PopoverContent>
|
|
153
|
+
</Popover>
|
|
154
|
+
<FormMessage />
|
|
155
|
+
</FormItem>
|
|
156
|
+
)} />
|
|
124
157
|
|
|
125
158
|
// 必填 Request/DTO 桥接:zodResolver 负责运行时校验,DTO 边界负责静态类型匹配。
|
|
126
159
|
// 用 handleSubmit 回调的 data,不要用 getValues(拿到的是 coerce 前的原始值)。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/coding-miaoda-sandbox-skills",
|
|
3
|
-
"version": "0.1.0-dev.
|
|
3
|
+
"version": "0.1.0-dev.7cbbb20",
|
|
4
4
|
"description": "Miaoda 合并沙箱 skills 包(包含原 miaoda-skills 的 miaoda / miaoda-modern / miaoda-design / shared 四条业务线);发布公网 npm,随沙箱运行时经 update-skills 同步到 .agent/skills/",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|