@lark-apaas/coding-steering 0.1.6-alpha.8 → 0.1.6-beta.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 (55) hide show
  1. package/package.json +1 -1
  2. package/steering/design-stack/skills/.gitkeep +0 -0
  3. package/steering/nestjs-react-fullstack/skills/authz-guide/SKILL.md +174 -0
  4. package/steering/nestjs-react-fullstack/skills/authz-guide/references/dynamic-permission-guide.md +627 -0
  5. package/steering/nestjs-react-fullstack/skills/authz-guide/references/management-page-spec.md +508 -0
  6. package/steering/nestjs-react-fullstack/skills/authz-guide/references/runtime-role-controller-spec.md +203 -0
  7. package/steering/nestjs-react-fullstack/skills/authz-guide/references/sdk-examples.md +90 -0
  8. package/steering/nestjs-react-fullstack/skills/authz-guide/references/sdk-types.md +216 -0
  9. package/steering/nestjs-react-fullstack/skills/client-add-aily-web-chat/SKILL.md +1 -1
  10. package/steering/nestjs-react-fullstack/skills/client-builtins-file-storage-service/SKILL.md +431 -0
  11. package/steering/nestjs-react-fullstack/skills/client-builtins-user-service/SKILL.md +39 -127
  12. package/steering/nestjs-react-fullstack/skills/devops-guide/SKILL.md +119 -0
  13. package/steering/nestjs-react-fullstack/skills/feishu/SKILL.md +0 -1
  14. package/steering/nestjs-react-fullstack/skills/feishu/references/approval.md +1 -1
  15. package/steering/nestjs-react-fullstack/skills/feishu/references/attendance.md +1 -1
  16. package/steering/nestjs-react-fullstack/skills/feishu/references/bitable.md +3 -1
  17. package/steering/nestjs-react-fullstack/skills/feishu/references/calendar.md +1 -1
  18. package/steering/nestjs-react-fullstack/skills/feishu/references/contacts.md +1 -1
  19. package/steering/nestjs-react-fullstack/skills/feishu/references/doc.md +2 -1
  20. package/steering/nestjs-react-fullstack/skills/feishu/references/drive.md +2 -1
  21. package/steering/nestjs-react-fullstack/skills/feishu/references/events.md +2 -1
  22. package/steering/nestjs-react-fullstack/skills/feishu/references/id-convert.md +2 -2
  23. package/steering/nestjs-react-fullstack/skills/feishu/references/messaging.md +1 -1
  24. package/steering/nestjs-react-fullstack/skills/feishu/references/oauth.md +2 -1
  25. package/steering/nestjs-react-fullstack/skills/feishu/references/perm.md +2 -1
  26. package/steering/nestjs-react-fullstack/skills/feishu/references/wiki.md +3 -2
  27. package/steering/nestjs-react-fullstack/skills/openapi-guide/SKILL.md +1 -0
  28. package/steering/nestjs-react-fullstack/skills/plugin-guide/SKILL.md +601 -0
  29. package/steering/nestjs-react-fullstack/skills/plugin-guide/references/plugin-coding-guide.md +360 -0
  30. package/steering/nestjs-react-fullstack/skills/plugin-guide/references/table.md +515 -0
  31. package/steering/nestjs-react-fullstack/skills/react-hook-best-practices/SKILL.md +118 -0
  32. package/steering/nestjs-react-fullstack/skills/server-builtins-file-storage-service/SKILL.md +177 -0
  33. package/steering/nestjs-react-fullstack/skills/trigger-guide/SKILL.md +1 -0
  34. package/steering/nestjs-react-fullstack/skills/user-identity/SKILL.md +1 -0
  35. package/steering/nestjs-react-fullstack/skills/user-management-best-practices/SKILL.md +142 -0
  36. package/steering/nestjs-react-fullstack/skills_local/code-fix/SKILL.md +42 -28
  37. package/steering/nestjs-react-fullstack/skills_local/coding-guide/SKILL.md +37 -149
  38. package/steering/design-stack/skills/client-add-aily-web-chat/SKILL.md +0 -139
  39. package/steering/design-stack/skills/client-builtins-user-service/SKILL.md +0 -628
  40. package/steering/design-stack/skills/code-fix/SKILL.md +0 -246
  41. package/steering/design-stack/skills/feishu/SKILL.md +0 -270
  42. package/steering/design-stack/skills/feishu/references/approval.md +0 -214
  43. package/steering/design-stack/skills/feishu/references/attendance.md +0 -163
  44. package/steering/design-stack/skills/feishu/references/bitable.md +0 -309
  45. package/steering/design-stack/skills/feishu/references/calendar.md +0 -190
  46. package/steering/design-stack/skills/feishu/references/contacts.md +0 -160
  47. package/steering/design-stack/skills/feishu/references/doc.md +0 -256
  48. package/steering/design-stack/skills/feishu/references/drive.md +0 -103
  49. package/steering/design-stack/skills/feishu/references/events.md +0 -198
  50. package/steering/design-stack/skills/feishu/references/id-convert.md +0 -128
  51. package/steering/design-stack/skills/feishu/references/messaging.md +0 -207
  52. package/steering/design-stack/skills/feishu/references/oauth.md +0 -164
  53. package/steering/design-stack/skills/feishu/references/perm.md +0 -90
  54. package/steering/design-stack/skills/feishu/references/wiki.md +0 -164
  55. package/steering/design-stack/skills/user-identity/SKILL.md +0 -300
@@ -10,6 +10,7 @@ match-template-name: nestjs-react-fullstack
10
10
  # Dataloom 用户信息与鉴权 SDK
11
11
 
12
12
  ## 概述
13
+
13
14
  项目提供了 Dataloom SDK 的用户信息与鉴权服务,用于用户登录、登出、获取用户信息等身份认证相关功能。
14
15
 
15
16
  > **边界说明**:`dataloom.service.session` 仅用于用户登录/登出/获取用户信息等鉴权操作。**插件调用(capability)不属于 dataloom**,须使用独立的 `capabilityClient`(参见 plugin-guide)。
@@ -17,6 +18,7 @@ match-template-name: nestjs-react-fullstack
17
18
  ## 统一响应结构
18
19
 
19
20
  ### 响应类型定义
21
+
20
22
  ```typescript
21
23
  /**
22
24
  * 统一结果返回结构
@@ -57,6 +59,7 @@ type DataloomServiceResponse<T> = DataloomServiceSuccess<T> | DataloomServiceFai
57
59
  ```
58
60
 
59
61
  ## Dataloom实例获取方式
62
+
60
63
  ```typescript
61
64
  import { getDataloom } from "@lark-apaas/client-toolkit/dataloom";
62
65
 
@@ -69,12 +72,15 @@ const dataloom = await getDataloom();
69
72
  #### 1. 登录跳转接口 (redirectToLogin)
70
73
 
71
74
  ##### 用途
75
+
72
76
  跳转至 Dataloom 登录页面,适用于:用户身份认证、单点登录、权限验证
73
77
 
74
78
  ##### 适用场景
79
+
75
80
  需要用户进行身份认证的场景
76
81
 
77
82
  ##### 入参说明
83
+
78
84
  ```typescript
79
85
  interface SignInRedirectionOptions {
80
86
  /**
@@ -94,6 +100,7 @@ interface SignInRedirectionOptions {
94
100
  | `newTab` | `boolean` | ❌ | `false` | 是否在新浏览器标签页打开登录页 |
95
101
 
96
102
  ##### 出参说明
103
+
97
104
  | 字段名 | 类型 | 说明 |
98
105
  |--------|------|---------|
99
106
  | `data` | `'success'` | 成功标识 |
@@ -102,6 +109,7 @@ interface SignInRedirectionOptions {
102
109
  | `statusText` | `'OK'` | HTTP状态文本 |
103
110
 
104
111
  ##### 使用示例
112
+
105
113
  ```typescript
106
114
  /**
107
115
  * 跳转至dataloom登录页
@@ -139,15 +147,19 @@ const loginResult = dataloom
139
147
  #### 2. 退出登录接口 (signOut)
140
148
 
141
149
  ##### 用途
150
+
142
151
  退出登录,删除cookie中的登录态,适用于:用户主动登出、会话清理、安全退出
143
152
 
144
153
  ##### 适用场景
154
+
145
155
  需要清除用户登录状态的场景
146
156
 
147
157
  ##### 入参说明
158
+
148
159
  无需传入参数
149
160
 
150
161
  ##### 出参说明
162
+
151
163
  | 字段名 | 类型 | 说明 |
152
164
  |--------|------|---------|
153
165
  | `data` | `null` | 数据为空 |
@@ -156,6 +168,7 @@ const loginResult = dataloom
156
168
  | `statusText` | `'OK'` | HTTP状态文本 |
157
169
 
158
170
  ##### 使用示例
171
+
159
172
  ```typescript
160
173
  /**
161
174
  * 退出登录,删除cookie中的登陆态
@@ -196,12 +209,15 @@ try {
196
209
  #### 3. 跳转用户详情页接口 (navigateToUserProfile)
197
210
 
198
211
  ##### 用途
212
+
199
213
  跳转至当前登录用户的详情页,适用于:查看个人资料、从用户头像/姓名点击进入详情页面
200
214
 
201
215
  ##### 适用场景
216
+
202
217
  需要在应用中快速打开用户详情页面的场景
203
218
 
204
219
  ##### 入参说明
220
+
205
221
  ```typescript
206
222
  interface NavigateToUserProfileOptions {
207
223
  /**
@@ -216,6 +232,7 @@ interface NavigateToUserProfileOptions {
216
232
  | `newTab` | `boolean` | ❌ | `false` | 是否在新浏览器标签页打开详情页 |
217
233
 
218
234
  ##### 出参说明
235
+
219
236
  | 字段名 | 类型 | 说明 |
220
237
  |--------|------|---------|
221
238
  | `data` | `'success'` | 成功标识 |
@@ -224,6 +241,7 @@ interface NavigateToUserProfileOptions {
224
241
  | `statusText` | `'OK'` | HTTP状态文本 |
225
242
 
226
243
  ##### 使用示例
244
+
227
245
  ```typescript
228
246
  /**
229
247
  * 跳转至用户详情页
@@ -252,12 +270,15 @@ const resNewTab = dataloom
252
270
  #### 4. 获取用户信息接口 (getUserInfo)
253
271
 
254
272
  ##### 用途
273
+
255
274
  根据当前登录态获取已登录的用户信息,适用于:用户资料展示、权限判断、个性化配置
256
275
 
257
276
  ##### 适用场景
277
+
258
278
  需要获取当前登录用户详细信息的场景
259
279
 
260
280
  ##### 数据类型定义
281
+
261
282
  ```typescript
262
283
  interface I18n {
263
284
  language_code: number;
@@ -289,9 +310,11 @@ interface UserInfoResponse {
289
310
  ```
290
311
 
291
312
  ##### 入参说明
313
+
292
314
  无需传入参数
293
315
 
294
316
  ##### 出参说明
317
+
295
318
  | 字段名 | 类型 | 说明 |
296
319
  |--------|------|---------|
297
320
  | `data.user_info` | `UserBaseInfo` | 用户基本信息对象 |
@@ -304,6 +327,7 @@ interface UserInfoResponse {
304
327
  | `error` | `null` | 错误信息,成功时为null |
305
328
 
306
329
  ##### 使用示例
330
+
307
331
  ```typescript
308
332
  /**
309
333
  * 根据当前登陆态获取已登录的用户信息。
@@ -359,6 +383,7 @@ try {
359
383
  ## 错误处理
360
384
 
361
385
  ### 常见错误类型
386
+
362
387
  | 错误码 | 说明 | 处理建议 |
363
388
  |--------|------|---------|
364
389
  | `400` | 请求参数错误 | 检查传入参数是否正确 |
@@ -368,6 +393,7 @@ try {
368
393
  | `500` | 服务器内部错误 | 稍后重试或联系技术支持 |
369
394
 
370
395
  ### 错误处理最佳实践
396
+
371
397
  ```typescript
372
398
  // 统一错误处理函数
373
399
  function handleDataloomError(response: DataloomServiceResponse<any>) {
@@ -414,12 +440,15 @@ if (handleDataloomError(userInfoResult)) {
414
440
  # 用户系统前端相关规范
415
441
 
416
442
  ## 概述
443
+
417
444
  内置的用户前端组件规范,提供了 UserSelect(支持单选/多选的用户选择器)和 UserDisplay(用户信息展示组件)两个核心 React 组件,基于统一的userid数据,并且用户选择组件中会通过onchange返回User类型数据,专门用于处理用户相关的表单输入和数据展示场景。
418
445
 
419
446
  同时提供 DepartmentSelect(部门选择组件),用于部门字段的单选/多选选择,交互与受控规范与 UserSelect 保持一致。
447
+
420
448
  ## 类型定义
421
449
 
422
450
  ### 用户数据类型
451
+
423
452
  ```typescript
424
453
  import type { User } from '@/types/common';
425
454
  ```
@@ -437,6 +466,7 @@ export type User = {
437
466
  ## 当前用户信息的获取方案
438
467
 
439
468
  ### 常用场景
469
+
440
470
  - **用户信息展示**:在界面中显示当前用户名称和头像
441
471
  - **权限验证**:基于用户ID进行权限检查和控制
442
472
  - **数据关联**:在数据操作时关联当前用户信息
@@ -445,6 +475,7 @@ export type User = {
445
475
  ### Hooks 方法: `useCurrentUserProfile` - 在 React 中获取当前用户信息
446
476
 
447
477
  ### 基本信息
478
+
448
479
  - **文件路径**:`@lark-apaas/client-toolkit/hooks/useCurrentUserProfile`
449
480
  - **功能**:获取当前登录用户的个人信息(含飞书 user_id)
450
481
  - **返回值**:`Partial<IUserProfile>`(初始为空对象 `{}`,异步获取后填充完整字段)
@@ -460,12 +491,14 @@ export type User = {
460
491
  | `lark_user_id` | `string` | 飞书 user_id,通过额外异步请求获取,可能晚于其他字段就绪 |
461
492
 
462
493
  > ⚠️ **空值处理(CRITICAL)**:该 Hook 初始返回空对象 `{}`(truthy),所有字段均为 `undefined`。
494
+ >
463
495
  > - **MUST** 使用可选链访问:`userInfo?.name`、`userInfo?.user_id`
464
496
  > - **MUST** 判断加载状态用 `if (!userInfo?.user_id)` 而非 `if (!userInfo)`(空对象是 truthy)
465
497
  > - **MUST** 渲染时提供默认值:`userInfo?.name ?? '加载中...'`
466
498
  > - **MUST** `lark_user_id` 通过额外异步请求获取,可能为 `undefined`(加载中/获取失败/无飞书账号),使用时必须条件渲染
467
499
 
468
500
  ### 使用方法
501
+
469
502
  ```typescript
470
503
  import { useCurrentUserProfile } from "@lark-apaas/client-toolkit/hooks/useCurrentUserProfile";
471
504
 
@@ -486,143 +519,22 @@ const MyComponent = () => {
486
519
  > **飞书 ID 转换详细指南**(后端 `AuthNPaasService` 用法、自定义转换接口等)参见 `user-identity` skill。
487
520
 
488
521
  ## 用户展示与选择方案
489
- {% if projectMeta['flags']['supportBusinessUser'] %}
522
+
490
523
  这些组件在使用之前必须读取 client/src/components/business-ui/README.md文件来理解用法
491
524
 
492
525
  目前可用的组件有:
526
+
493
527
  - UserSelect 用户选择组件(@/components/business-ui/user-select)
494
528
  - DepartmentSelect 部门选择组件(@/components/business-ui/department-select)
495
529
  - UserDisplay - 用户展示组件(@/components/business-ui/user-display)
496
530
 
497
- {% else %}
498
- ##
499
-
500
- ### 基本信息
501
- - **组件路径**:`@lark-apaas/client-toolkit/components/User`
502
- - **功能**:用于所有用户字段的表单输入
503
- - **特性**:支持单选/多选模式,内置搜索功能
504
-
505
- ### 组件 Props 定义
506
- ```typescript
507
- interface UserSelectProps {
508
- mode: 'single' | 'multiple'; // 选择模式
509
- value?: string | string[]; // 当前userid的值
510
- onChange?: (value: IUserProfile | IUserProfile[]) => void; // userid值变化回调
511
- placeholder?: string; // 占位符文本
512
- disabled?: boolean; // 是否禁用
513
- }
514
- ```
515
-
516
- ### 值类型说明
517
- - **单选模式** (`mode="single"`):值为 userid,返回为`IUserProfile` 对象
518
- - **多选模式** (`mode="multiple"`):值为 userid数组,返回为`IUserProfile` 数组
519
-
520
- ### 使用示例
521
-
522
- #### 表单集成
523
- ```typescript
524
- import { useForm } from "react-hook-form";
525
- import { zodResolver } from "@hookform/resolvers/zod";
526
- import * as z from "zod";
527
- import { Form, FormControl, FormField, FormItem, FormLabel } from "@/components/ui/form";
528
- import { UserSelect } from "@lark-apaas/client-toolkit/components/User";
529
-
530
- // 定义表单验证schema
531
- const formSchema = z.object({
532
- assignee: z.string(),
533
- participants: z.array(z.string()).optional(),
534
- });
535
-
536
- const form = useForm<z.infer<typeof formSchema>>({
537
- resolver: zodResolver(formSchema),
538
- });
539
-
540
- <Form {...form}>
541
- <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
542
- <FormField
543
- control={form.control}
544
- name="assignee"
545
- render={({ field }) => (
546
- <FormItem>
547
- <FormLabel>负责人</FormLabel>
548
- <FormControl>
549
- <UserSelect
550
- mode="single"
551
- placeholder="选择负责人"
552
- value={field.value}
553
- onChange={(user) => field.onChange(user.user_id)}
554
- />
555
- </FormControl>
556
- </FormItem>
557
- )}
558
- />
559
-
560
- <FormField
561
- control={form.control}
562
- name="participants"
563
- render={({ field }) => (
564
- <FormItem>
565
- <FormLabel>参与人(多选)</FormLabel>
566
- <FormControl>
567
- <UserSelect
568
- mode="multiple"
569
- placeholder="选择参与人员"
570
- value={field.value}
571
- onChange={(users) => field.onChange(users.map(user => user.user_id))}
572
- />
573
- </FormControl>
574
- </FormItem>
575
- )}
576
- />
577
- </form>
578
- </Form>
579
- ```
580
-
581
- ## UserDisplay - 用户展示组件
582
-
583
- ### 基本信息
584
- - **组件路径**:`@lark-apaas/client-toolkit/components/User`
585
- - **功能**:用于所有用户信息的展示场景
586
- - **特性**:显示用户**头像**和**姓名**,支持多用户展示
587
-
588
- IMPORTANT:当不传递showLabel时,组件会同时展示用户头像和姓名,如果只需要头像,则需要传递showLabel的值为false
589
-
590
- ### 属性定义
591
- ```typescript
592
- interface UserDisplayProps {
593
- users: string[]; // 用户id数组(必需)
594
- size?: 'small' | 'medium' | 'large'; // 头像尺寸
595
- className?: string; // 自定义样式类名
596
- showLabel?: boolean; // 默认为true,会展示用户姓名,如果只需要展示头像则需要设置为false
597
- }
598
- ```
599
-
600
- ### 使用示例
601
-
602
- #### 基础用法
603
- ```jsx
604
- import { UserDisplay } from "@lark-apaas/client-toolkit/components/User";
605
- import { useEmployeeStore } from "@/models/employee";
606
-
607
- const { employeesId } = useEmployeeStore();
608
-
609
- // 单个用户展示
610
- <UserDisplay
611
- users={[employeesId]}
612
- size="small"
613
- />
614
-
615
- // 多用户展示
616
- <UserDisplay
617
- users={project.participants}
618
- size="medium"
619
- className="project-members"
620
- />
621
- ```
531
+ <!-- legacy: client-toolkit User 组件备用方案,已不再推荐;按本地版静态化,仅保留 business-ui 路径 -->
532
+ <!-- begin: removed Nunjucks else branch (line 532..672 in upstream) -->
533
+ <!-- end -->
622
534
 
623
535
  ## 使用注意事项
624
536
 
625
537
  ### 最佳实践
538
+
626
539
  - 根据展示场景选择合适的组件尺寸(`small`、`medium`、`large`)
627
540
  - 对于用户信息 userId,禁止直接展示文本,总是使用 UserDisplay 组件展示
628
- {% endif %}
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: devops-guide
3
+ description: "Use when user needs build, deploy, run, troubleshoot, or operate a miaoda fullstack app. IMPORTANT: Only activate this skill when the user explicitly asks about deployment, build failures, or service operations. Do NOT proactively trigger this skill during normal code development — reading devops skills to troubleshoot preemptively disrupts the development workflow. Only use when: build fails, deploy fails, service crashes, or user explicitly asks about ops issues. 触发词:devops, 构建, 部署, 运维, 日志, 启动失败, 编译失败, 服务异常, read_logs, pkill, ps, pstree"
4
+ steering: true
5
+ steering-topic: devops
6
+ match-template-name: nestjs-react-fullstack
7
+ control-by-feature-ab: true
8
+ ---
9
+
10
+ # DevOps Guide
11
+
12
+ 用于处理妙搭全栈应用的构建、部署、运行排障。
13
+
14
+ 核心原则:**先检查,再验证,再看日志,最后才下结论**。
15
+
16
+ ## Quick Reference
17
+
18
+ | 场景 | 必做动作 | 结果标准 |
19
+ |------|----------|----------|
20
+ | 修改代码后自检 | 先跑代码检查工具 | 无语法错误、无类型错误、无明显构建错误 |
21
+ | 修改服务端代码 | 补跑接口测试 | 每个新增接口都能验证通过 |
22
+ | 准备交付前 | 读取最新日志 | 最新改动后无错误日志 |
23
+ | 用户反馈编译失败 | 查 lint/typecheck + devServer 日志 | 定位到具体文件、具体报错 |
24
+ | 用户反馈服务无响应 | 查日志 + 查进程状态 | 确认是代码报错还是 dev 进程卡死 |
25
+
26
+ ## Step 1:先判断问题类型
27
+
28
+ ### A. 代码改完后的质量保障
29
+
30
+ 按固定顺序执行:
31
+
32
+ 1. 运行代码检查工具,优先发现语法、类型、样式问题。
33
+ 2. 若改了服务端代码,执行接口测试,覆盖新增接口。
34
+ 3. 最后读取日志,确认最新改动没有引入错误日志。
35
+
36
+ ### B. 编译失败 / 服务启动失败 / 页面异常
37
+
38
+ 按定位顺序执行:
39
+
40
+ 1. 先查代码检查结果。
41
+ 2. 再查 devServer 日志。
42
+ 3. 必要时检查进程状态,判断 dev 进程是否失活。
43
+
44
+ ## Step 2:根据改动范围读取正确日志
45
+
46
+ | 改动范围 | 必读日志 |
47
+ |----------|----------|
48
+ | 服务端代码 | `server`、`server-devserver` |
49
+ | 客户端代码 | `client-devserver` |
50
+ | 编译失败但范围不清楚 | `server-devserver` + `client-devserver` |
51
+ | 请求报错 | `server`,必要时补 `trace` |
52
+
53
+ 规则:
54
+
55
+ - **不要只看一个日志源**。
56
+ - **不要基于旧日志下结论**,要读取最新日志。
57
+ - 日志为空不代表没问题,先确认对应服务是否真的在运行。
58
+
59
+ ## Step 3:devServer 无响应时的 SOP
60
+
61
+ 若你发现代码已经修改,但 dev 日志长时间不更新,优先怀疑 dev 进程失活。
62
+
63
+ ### 检查顺序
64
+
65
+ 1. 用 `ps` / `pgrep` / `pstree` 确认 `dev:server`、`dev:client` 相关进程是否存在。
66
+ 2. 若进程存在但日志不更新,先把现象记录为结论,不要直接重启环境。
67
+ 3. 只有调用方明确要求时,才执行 `pkill -f "dev:server"` 或 `pkill -f "dev:client"`。
68
+
69
+ ### 推荐命令
70
+
71
+ ```bash
72
+ ps -ef | grep "dev:server"
73
+ ps -ef | grep "dev:client"
74
+ pgrep -af "dev:server"
75
+ pgrep -af "dev:client"
76
+ pstree -p <pid>
77
+ pkill -f "dev:server"
78
+ pkill -f "dev:client"
79
+ ```
80
+
81
+ ### 判断标准
82
+
83
+ - 有进程、日志持续刷新:devServer 正常,继续排查代码问题。
84
+ - 有进程、日志不刷新:高概率卡死,先报告现象和证据。
85
+ - 没进程:说明服务未拉起,先看最近一次 devServer 错误日志。
86
+
87
+ ## Step 4:构建 / 部署 / 运维排查框架
88
+
89
+ 按照 **现象 → 根因 → 方案** 输出。
90
+
91
+ ### 常见现象映射
92
+
93
+ | 现象 | 高概率根因 | 优先方案 |
94
+ |------|------------|----------|
95
+ | 编译失败 | 语法错误、类型错误、依赖误用 | 先跑 lint / typecheck,再看 devServer 日志 |
96
+ | 后端启动失败 | Nest 模块注册错误、配置错误、运行时异常 | 查 `server-devserver` 和 `server` |
97
+ | 页面白屏 | 前端编译错误、运行时异常、接口异常 | 查 `client-devserver`,必要时补 `browser` |
98
+ | 接口 500 | 服务端业务异常 | 查 `server` / `trace`,补接口测试 |
99
+ | 热更新失效 | dev 进程卡死 | 查进程状态,不要默认重启 |
100
+
101
+ ## 交付要求
102
+
103
+ 输出排查结果时,必须包含:
104
+
105
+ 1. **现象**:用户看到什么错误。
106
+ 2. **根因**:定位到哪一层出问题。
107
+ 3. **证据**:哪条日志、哪段报错、哪个检查结果支撑结论。
108
+ 4. **方案**:下一步修复动作。
109
+
110
+ ## Common Mistakes
111
+
112
+ | 错误 | 正确做法 |
113
+ |------|----------|
114
+ | 改完代码直接说“没问题” | 先跑代码检查,再读日志 |
115
+ | 服务端改动后不测接口 | 必须验证新增接口 |
116
+ | 只看 `server` 不看 `server-devserver` | 服务端至少看两个日志源 |
117
+ | 发现无响应就直接 `pkill` | 先用 `ps` / `pgrep` / `pstree` 定位,再报告结论 |
118
+ | `pkill` 后不复读日志 | 只有明确要求重启时才执行,并再次读日志确认 |
119
+ | 只给结论不给证据 | 必须给日志或检查结果作为依据 |
@@ -267,4 +267,3 @@ for await (const items of await client.contact.user.listWithIterator({
267
267
  | 忘记开启机器人能力 | 应用能力 → 添加机器人(发消息必须) |
268
268
  | 日期格式搞混 | 日历用 RFC3339 (`2026-01-01T09:00:00+08:00`),考勤用整数 (`20260101`) |
269
269
  | 生成独立可运行的脚本文件 | 所有飞书调用放在 NestJS Service 方法中,由 Controller 调用 |
270
-
@@ -1,6 +1,6 @@
1
1
  # 审批 (Approval)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/approval-v4/approval-overview.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/approval-v4/approval-overview.md>
4
4
 
5
5
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中管理飞书审批流程。
6
6
 
@@ -1,6 +1,6 @@
1
1
  # 考勤 (Attendance)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/attendance-v1/overview.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/attendance-v1/overview.md>
4
4
 
5
5
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中查询飞书考勤数据。
6
6
 
@@ -1,6 +1,6 @@
1
1
  # 多维表格 (Bitable)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/docs/bitable-v1/bitable-overview.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/docs/bitable-v1/bitable-overview.md>
4
4
 
5
5
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中操作飞书多维表格。
6
6
 
@@ -16,6 +16,7 @@
16
16
  ## 获取 app_token
17
17
 
18
18
  多维表格的 `app_token` 有三种获取方式:
19
+
19
20
  1. **通过 API 创建** → 响应中包含 `app_token`
20
21
  2. **通过 API 列出** → 从文件列表中获取
21
22
  3. **从 URL 提取** → 见下方 URL 解析
@@ -264,6 +265,7 @@ await client.bitable.appTableField.delete({
264
265
  ## 新建多维表格清理建议
265
266
 
266
267
  新建的多维表格会自动创建默认字段(单选、日期、附件)和空行。建议创建后清理:
268
+
267
269
  1. 删除不需要的默认字段(类型 3/5/17)
268
270
  2. 重命名主字段为有意义的名称
269
271
  3. 批量删除空的占位行
@@ -1,6 +1,6 @@
1
1
  # 日历与会议室 (Calendar)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/calendar-v4/overview.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/calendar-v4/overview.md>
4
4
 
5
5
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中管理日程、预约会议室和查询忙闲状态。
6
6
 
@@ -1,6 +1,6 @@
1
1
  # 通讯录 (Contacts)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/contact-v3/resources.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/contact-v3/resources.md>
4
4
 
5
5
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中查询飞书通讯录用户和部门信息。
6
6
 
@@ -1,6 +1,7 @@
1
1
  # 云文档 (Document)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/docs/docs-overview
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/docs/docs-overview>
4
+ .md
4
5
 
5
6
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中操作飞书云文档。
6
7
 
@@ -1,6 +1,7 @@
1
1
  # 云空间 (Drive)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/docs/drive-v1/introduction
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/docs/drive-v1/introduction>
4
+ .md
4
5
 
5
6
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中管理飞书云空间文件和文件夹。
6
7
 
@@ -1,6 +1,7 @@
1
1
  # 事件订阅 (Events)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/event-subscription-guide/overview
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/event-subscription-guide/overview>
4
+ .md
4
5
 
5
6
  通过 WebSocket 长连接接收飞书事件推送,无需公网 IP / 域名,无需加解密。
6
7
 
@@ -1,8 +1,8 @@
1
1
  # 妙搭与飞书开放平台 — ID 识别与转换
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/spark-v1/overview.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/spark-v1/overview.md>
4
4
  >
5
- > 飞书用户身份体系官方说明:https://open.larkoffice.com/document/platform-overveiw/basic-concepts/user-identity-introduction/introduction
5
+ > 飞书用户身份体系官方说明:<https://open.larkoffice.com/document/platform-overveiw/basic-concepts/user-identity-introduction/introduction>
6
6
  >
7
7
  > **承接 `user-identity` skill 决策树**:如果只需 妙搭 userId → 飞书 user_id(employee_id),在 nestjs-react-fullstack 项目内优先用 `AuthNPaasService`。本文覆盖 `AuthNPaasService` 不支持的场景:需要 `open_id` / `union_id`、或需要任何方向的反查、或不在该模板内的项目。
8
8
 
@@ -1,6 +1,6 @@
1
1
  # 消息 (Messaging)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/im-v1/introduction.md
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/im-v1/introduction.md>
4
4
 
5
5
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中发送和回复飞书消息。
6
6
 
@@ -1,6 +1,7 @@
1
1
  # OAuth 用户授权
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM>
4
+ .md
4
5
 
5
6
  默认的 tenant_access_token 以应用身份调用 API。
6
7
  部分场景(个人日历、搜索联系人)需要 user_access_token 代表用户操作。
@@ -1,6 +1,7 @@
1
1
  # 权限管理 (Permission)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/docs/permission/overview
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/docs/permission/overview>
4
+ .md
4
5
 
5
6
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中管理飞书云文档的协作者权限。
6
7
 
@@ -1,6 +1,7 @@
1
1
  # 知识库 (Wiki)
2
2
 
3
- > 开放平台文档(Markdown 版):https://open.larkoffice.com/document/server-docs/docs/wiki-v2/wiki-overview
3
+ > 开放平台文档(Markdown 版):<https://open.larkoffice.com/document/server-docs/docs/wiki-v2/wiki-overview>
4
+ .md
4
5
 
5
6
  使用 `@larksuiteoapi/node-sdk` 在 NestJS 中操作飞书知识库。
6
7
 
@@ -151,7 +152,7 @@ Wiki API 不提供搜索功能。获取内容需通过以下方式:
151
152
 
152
153
  1. 打开知识空间 → 设置 → 成员管理
153
154
  2. 添加机器人应用
154
- 3. 参考:https://open.feishu.cn/document/server-docs/docs/wiki-v2/wiki-qa
155
+ 3. 参考:<https://open.feishu.cn/document/server-docs/docs/wiki-v2/wiki-qa>
155
156
 
156
157
  ## Common Mistakes
157
158
 
@@ -72,6 +72,7 @@ modules/orders/
72
72
  ```
73
73
 
74
74
  在 `orders.module.ts` 中注册:
75
+
75
76
  ```typescript
76
77
  @Module({
77
78
  controllers: [OrdersController, OpenApiOrdersController],