@lark-apaas/coding-steering 0.1.49-alpha.20260908071836 → 0.1.49
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/package.json +6 -6
- package/steering/nestjs-react-fullstack/skills/app-init-feasibility-guide/SKILL.md +2 -0
- package/steering/nestjs-react-fullstack/skills/coding-guide/SKILL.md +8 -3
- package/steering/nestjs-react-fullstack/skills_common/user-identity/SKILL.md +3 -1
- package/steering/nestjs-react-fullstack/skills_local/coding-guide/SKILL.md +5 -2
package/package.json
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/coding-steering",
|
|
3
|
-
"version": "0.1.49
|
|
3
|
+
"version": "0.1.49",
|
|
4
4
|
"description": "Stack-specific steering content for miaoda-coding templates",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"steering"
|
|
8
8
|
],
|
|
9
|
-
"scripts": {
|
|
10
|
-
"lint:md": "markdownlint 'steering/**/*.md' --ignore 'steering/**/skills/**' --ignore 'steering/**/skills_common/**' --ignore 'steering/**/skills_local/**'"
|
|
11
|
-
},
|
|
12
9
|
"devDependencies": {
|
|
13
10
|
"markdownlint-cli": "^0.47.0"
|
|
14
11
|
},
|
|
@@ -20,5 +17,8 @@
|
|
|
20
17
|
"miaoda",
|
|
21
18
|
"coding-steering"
|
|
22
19
|
],
|
|
23
|
-
"license": "MIT"
|
|
24
|
-
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"scripts": {
|
|
22
|
+
"lint:md": "markdownlint 'steering/**/*.md' --ignore 'steering/**/skills/**' --ignore 'steering/**/skills_common/**' --ignore 'steering/**/skills_local/**'"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -83,6 +83,7 @@ available-agents:
|
|
|
83
83
|
| 无持久化状态、纯展示或前端工具 | 纯前端 |
|
|
84
84
|
| 需要数据存储、用户隔离、后端逻辑 | 全栈 |
|
|
85
85
|
| 涉及文件上传与管理 | 全栈 + 文件服务 |
|
|
86
|
+
| 服务端图像、音视频处理(易引入 native addon) | 先确认能否改用 client 处理、平台服务或纯 JS/WASM |
|
|
86
87
|
| 以飞书多维表格为数据源 | 插件优先;复杂查询场景评估是否同步至本地库 |
|
|
87
88
|
| 需要飞书通知、群组、AI 能力 | 插件集成,标记插件实例需求 |
|
|
88
89
|
| 需要定时或事件驱动的后台处理 | 全栈 + 自动化任务 |
|
|
@@ -113,6 +114,7 @@ available-agents:
|
|
|
113
114
|
- 集成点:飞书、多维表格、AI、内网接口、OpenAPI、自动化触发。
|
|
114
115
|
- 边界与限制:不支持的能力、外部依赖、数据权限边界。
|
|
115
116
|
- 交给 Code agent 时标明需要加载的专项 skill(表格、表单、图表、插件、权限、文件、自动化)。
|
|
117
|
+
- 需要 native addon 时:确认它提供覆盖 linux-x64 / glibc 的预编译二进制并记录包名与版本;没有预编译二进制、装的时候要现场编译的不能用。
|
|
116
118
|
|
|
117
119
|
## Common Mistakes
|
|
118
120
|
|
|
@@ -156,7 +156,8 @@ shared/ # 前后端共享的目录
|
|
|
156
156
|
## 依赖使用规范
|
|
157
157
|
|
|
158
158
|
1. **子包完整性检查**:部分库有多个子包(如 `@dnd-kit/core` + `@dnd-kit/sortable` + `@dnd-kit/utilities`),添加 import 后必须确认 package.json 中包含所有需要的子包
|
|
159
|
-
2.
|
|
159
|
+
2. **禁止安装时需现场编译的 native addon**(`node-gyp rebuild`、`binding.gyp`、需要系统头文件或编译器)。依赖按平台内置能力 / 浏览器能力 → 纯 JS 或 WASM → 有预编译二进制的 native addon 的顺序选型
|
|
160
|
+
3. 用法不清时查看 readme,可进一步搜索或网页访问获取信息
|
|
160
161
|
|
|
161
162
|
## 文件命名约定
|
|
162
163
|
|
|
@@ -233,6 +234,7 @@ shared/ # 前后端共享的目录
|
|
|
233
234
|
- **能力边界**:服务端不支持文件上传(FaaS 限制),前端用 dataloom SDK 上传,服务端仅保存元信息
|
|
234
235
|
- **环境判断**:`process.env.NODE_ENV === "production"` 表示生产环境
|
|
235
236
|
- **文件系统**:临时文件、下载内容和处理中间产物统一写入 `/tmp` 下的独立目录,用完后清理
|
|
237
|
+
- **启动关键路径**:`bootstrap`、`onModuleInit` 和 `OnApplicationBootstrap` 只做必须的同步装配,不得执行 DDL、全量数据同步、长轮询或无界外部请求。应用应尽早 `listen()`;非关键预热放到后台任务,外部调用必须有超时、错误日志和降级路径
|
|
236
238
|
- **服务端运行时资源文件**(字体 / 证书 / 模板 / wasm 等需在运行时读取的非代码文件,CRITICAL — 发布后静默失效根因):① 必须在 `nest-cli.json` 的 `assets` 中声明(如 `{"include": "assets/<dir>/**/*", "outDir": "dist/server"}`),否则不会进 `dist/` 构建产物;② 路径用 `__dirname` 相对**编译产物**定位(如 `path.join(__dirname, "../assets/...")`),**禁止 `process.cwd()` 相对源码路径**——dev 跑源码能命中、发布跑 `dist/` 会落空;③ 资源缺失或加载失败必须 **fail-loud**(抛错或明确错误日志),禁止 `catch` 后静默返回残缺产物
|
|
237
239
|
- **启动生命周期**:`constructor`、`onModuleInit` 和 `onApplicationBootstrap` 应快速完成,避免在其中下载大文件、全量同步或批量迁移;仅将钩子声明为 `async` 仍会被等待,无法缩短启动时间
|
|
238
240
|
|
|
@@ -475,10 +477,13 @@ await db.select().from(users).where(eq(users.adminUser, userId));
|
|
|
475
477
|
|
|
476
478
|
- **必须从 `req.userContext` 获取**,禁止从前端传递,禁止硬编码(`const { userId } = req.userContext`)
|
|
477
479
|
- 依赖用户信息的接口不要用 API 测试工具测试,用 `think` 工具思考
|
|
480
|
+
- 后端按 `user-identity` 和 `@lark-apaas/fullstack-nestjs-core` 的 Express `Request` 增强读取 `req.userContext`;`tenantId` 为可选 number,不能套用前端 `window.tenantId` / `viewContext` 字符串语义。
|
|
481
|
+
- Controller 直接用 `@Req() req: Request`;测试、mock 或业务窄类型用独立接口,只声明实际读取字段。不要继承 Express `Request` 或重声明 `userContext`;未读 `tenantId` 就省略,必须保留时用 `unknown` 或 SDK 兼容类型。
|
|
478
482
|
|
|
479
483
|
```typescript
|
|
480
|
-
// req.userContext
|
|
481
|
-
// - userId/
|
|
484
|
+
// req.userContext 字段(由身份认证中间件挂载,完整合同见 user-identity):
|
|
485
|
+
// - userId/appId: string
|
|
486
|
+
// - tenantId: SDK Request.userContext 的可选 number
|
|
482
487
|
// - env: 'preview' | 'runtime' (preview=预览态, runtime=发布运行态)
|
|
483
488
|
// - userName/userNameEn: string
|
|
484
489
|
// - userNameI18n: string (多语名字, 如 {zh_cn: '用户', en_us: 'user'})
|
|
@@ -93,12 +93,14 @@ match-template-name: nestjs-react-fullstack
|
|
|
93
93
|
|
|
94
94
|
> 完整的解析→守卫流程见 `authn-guide` skill 第二节"认证流程"。
|
|
95
95
|
|
|
96
|
+
类型使用规则:Controller 直接用 `@Req() req: Request` 读取 SDK 增强的 `req.userContext`。测试、mock 或局部业务需要窄类型时,定义独立接口,只声明实际读取字段;不要继承 Express `Request`,也不要重声明平台增强的 `userContext`。未读取的 `tenantId` 省略;必须保留时用 `unknown` 或 SDK 兼容类型。
|
|
97
|
+
|
|
96
98
|
### 字段表
|
|
97
99
|
|
|
98
100
|
| 字段 | 类型 | 说明 |
|
|
99
101
|
|------|------|------|
|
|
100
102
|
| `userId` | `string` | 妙搭用户 ID |
|
|
101
|
-
| `tenantId` | `number` | 租户 ID |
|
|
103
|
+
| `tenantId` | `number \| undefined` | 租户 ID;按 SDK Express `Request.userContext` 增强:可选 number |
|
|
102
104
|
| `appId` | `string` | 应用 ID |
|
|
103
105
|
| `loginUrl` | `string` | 登录跳转 URL |
|
|
104
106
|
| `userType` | `string` | 用户类型(如 `_employee`) |
|
|
@@ -335,10 +335,13 @@ await db.select().from(users).where(eq(users.adminUser, userId));
|
|
|
335
335
|
|
|
336
336
|
- **必须从 `req.userContext` 获取**,禁止从前端传递,禁止硬编码
|
|
337
337
|
- 依赖用户信息的接口不要用 API 测试工具测试,用 `think` 工具思考
|
|
338
|
+
- 后端按 `user-identity` 和 `@lark-apaas/fullstack-nestjs-core` 的 Express `Request` 增强读取 `req.userContext`;`tenantId` 为可选 number,不能套用前端 `window.tenantId` / `viewContext` 字符串语义。
|
|
339
|
+
- Controller 直接用 `@Req() req: Request`;测试、mock 或业务窄类型用独立接口,只声明实际读取字段。不要继承 Express `Request` 或重声明 `userContext`;未读 `tenantId` 就省略,必须保留时用 `unknown` 或 SDK 兼容类型。
|
|
338
340
|
|
|
339
341
|
```typescript
|
|
340
|
-
// req.userContext
|
|
341
|
-
// - userId/
|
|
342
|
+
// req.userContext 字段(由身份认证中间件挂载,完整合同见 user-identity):
|
|
343
|
+
// - userId/appId: string
|
|
344
|
+
// - tenantId: SDK Request.userContext 的可选 number
|
|
342
345
|
// - env: 'preview' | 'runtime' (preview=预览态, runtime=发布运行态)
|
|
343
346
|
// - userName/userNameEn: string
|
|
344
347
|
// - userNameI18n: string (多语名字, 如 {zh_cn: '用户', en_us: 'user'})
|