Files
datalive-design/AGENTS.md
T
skycurtain 973f74d0d8 docs: 更新 AGENTS.md 以明确项目阶段与协作规范
- 将文档标题和结构重定向为 Agent 协作指南,强调“严禁直接改代码”的铁律
- 清晰定义当前项目阶段:仅有核心 Schema 类型定义,无运行时代码
- 详细说明工具链(Bun)、语言(中文注释)和 Schema 架构铁律
- 列出设计文档位置和常见误区,以指导后续开发决策
2026-05-08 09:40:18 +08:00

71 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DatAlive 低代码设计器 - Agent 指南
## 头号铁律:不要直接改代码
> **严禁直接修改项目源代码。** Agent 的工作模式:阅读 → 给出方案/代码片段 → 由用户手动落地。
> 未经用户明确指示前,不要使用 `Edit` / `Write` / `ast_grep_replace` / `lsp_rename` 等会改动文件的工具。
> 这是项目自定的最高优先级协作规则(见历史 commit `6d99132`),优先级高于一切默认行为。
## 项目阶段(决定 Agent 期望)
- 当前仅有**核心 Schema 类型定义**,全部位于 `src/schema/`
- `src/index.ts``src/schema/index.ts` **当前为空**,没有运行时代码、组件、引擎、测试。
- README 中的 `bun run index.ts` 不会有任何输出 —— 不要尝试"运行"或"测试"项目。
- 远期路线(未实现,勿擅自引入):`React + Vite + React Router/Tanstack Router + Tanstack Query + Zustand`,五大引擎(工作区 / 画布 / 渲染 / 数据 / 交互)。
## 工具链与命令
- 包管理:**Bun**lockfile = `bun.lock`)。**勿用 npm/pnpm/yarn**。
- `package.json` **没有 `scripts` 字段**,不存在 lint / test / build / typecheck 命令。
- 类型检查唯一手段:`bunx tsc --noEmit``tsconfig.json``noEmit: true` + `strict` 全开 + `noUncheckedIndexedAccess`)。
- 没有 ESLint / Prettier / Vitest / CI / pre-commit / codegen / dev server。
## 语言
- 注释、文档、PR/commit 信息均用**中文**;类型与变量用英文。新增内容请保持。
- `docs/` 下文件名为中文,部分终端(PowerShell + GBK)会显示乱码 —— 用 `Glob "docs/*.md"``Read` 直接以 UTF-8 读取,不要试图通过 shell ls 解读。
## Schema 架构铁律
修改 `src/schema/**` 前必读。这些约定在多个文件的 JSDoc 中反复强调,违反会污染整个蓝图:
1. **Schema vs Store 二元分离**
- Schema 仅承载需要持久化、可导入导出的稳定配置。
- 派生状态(`isLoading / data / error`)、`AppMode``parentId`、设计器选中态、缓存等**永不进 Schema**。
2. **`AppMode` 不是 Schema 字段**
- `design / preview / runtime` 三态由宿主容器在运行时注入。
3. **所有可寻址实体继承 `Entity`** (`src/schema/shared/entity.ts`)`id`UUIDRPC 寻址 + React key+ `label`(仅 UI 展示)。
- **`label` 严禁出现在表达式或数据流绑定中**,那里只能用 `id``Variable.key`
4. **`JsonValue`** (`src/schema/shared/json-value.ts`) 是序列化铁壁。Schema 中用户可填写的纯数据字段必须用它,不要用 `any` / `object` / `unknown`,更不能允许 `Function / Date / RegExp`
5. **`DynamicExpression`** (`src/schema/shared/dynamic-expression.ts`) 是统一逃生舱:`type: 'code'` + `code: string`**函数体片段**,需含 `return`)。引擎用 `new Function('context', code)` 编译,注入 `context: { variables, queries, event?, data? }`。新增 code 模式字段一律 `extends DynamicExpression`
6. **二元联合 `fixed | code` 模式** —— 见 `RestRequest``ActionParams``Condition``Filter``QueryConfig``MutationConfig``DataSourceConfigByRest`。新增可逃生字段时延续此命名与判别式。
7. **`null` 在 REST 配置中具有显式抹除语义**:`RestRequestByFixed.params/headers` 中的 `null` 表示从合并后的全局 DataSource 配置中**物理删除**该键,并非置空字符串。
8. **数组字段必须显式 `[]`,不允许 `undefined`** —— `interactions` / `children` / `routes` / `pages` / `filterIds` 等。引擎依赖此约定避免兜底分支。
9. **没有 `MutationConfigByStatic`** —— 写操作必有副作用,不允许 mock 变体。
10. **Action 不枚举具体类型**(拒绝 `ShowToast` / `Navigate` 这类设计),统一用 `target: { type, id } + method + params` 的泛化 RPC 模型。
11. **`Variable.key` 是表达式中可见的真实标识符**:必须满足 `/^[a-zA-Z_$][a-zA-Z0-9_$]*$/` 且全局唯一;与 `label` 严格区分。
12. **`parentId` 永不持久化**:组件树是嵌套结构,扁平 `parentId` 字典由引擎在内存中按需推导。
## 命名与组织约定
- 文件名 **kebab-case**`component-data.ts``data-source-by-rest.ts`
- 标记联合命名 **`<Type>By<Variant>`**`ComponentDataByStatic``QueryConfigByRest``FilterByCode``DataSourceConfigByRestWithCode`
- 每个 schema 域目录有自己的 `index.ts` barrel;跨域请从 barrel `import type { ... } from '../shared'`,不要写 `'../shared/entity'`
- 现有域:`application / component / data-source / filter / interaction / mutation / page / query / route / shared / variable`
- `src/schema/index.ts` 当前为空;如需新增聚合导出,请在此处汇总。
## 设计文档(在 `docs/`,修改 Schema 前对齐)
- `应用运行模式架构规范.md``AppMode` 三态边界、`preview``runtime` 的同源异构差异。
- `实体生命周期引擎实现规范.md``Interaction.event` 命名表(`onLaunch / onLoad / onEnter / onLeave / onChange / onSuccess / onError / onSettled / onMount / onUnmount` 等)以及谁挂载哪些事件。
- `设计器静态依赖分析方案.md``DynamicExpression` 的 AST 解析、依赖图谱、变量重命名级联策略。
- `设计器悬浮组件架构规范.md` — Modal/Drawer 不享受 Schema 特权;`isOverlay` 是 Component Registry 元数据,不进 Schema。
- `设计器选中与分组交互规范.md``selectedIds` / `activeContainerId` 仅在设计态运行时 Store。
## 常见误区
- 不要在 `Page` 下新增 `modals: Component[]` 等"特权数组",悬浮组件统一走 `components` 树。
- 不要把组件注册元数据(`isOverlay` / `isContainer` / `setters`)放进 Schema —— 那是物料库静态字典。
- 不要把 `prefetch / polling / enabled` 等查询配置复制到 `Mutation``Mutation` 只能命令式触发。
- 不要把 React 生命周期等价于业务生命周期 —— 全部走 `Interaction`,避免 Strict Mode 双调用陷阱。