@pactor-app/skills 1.24.0 → 1.26.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.
- package/README.md +79 -19
- package/package.json +13 -4
- package/{pactor → pactor-dsl}/SKILL.md +28 -28
- package/{pactor → pactor-dsl}/references/dsl-authoring.md +1 -1
- package/pactor-dsl/references/page-catalog-and-layout.md +67 -0
- package/pactor-prd/SKILL.md +105 -0
- package/{prd-to-app → pactor-prd}/references/acceptance-checklist.md +3 -1
- package/pactor-prd/references/incremental-wireframe-delta.md +76 -0
- package/pactor-prd/references/page-inventory-and-files.md +65 -0
- package/{prd-to-app → pactor-prd}/references/page-templates.md +1 -1
- package/{prd-to-app → pactor-prd}/references/project-structure.md +1 -1
- package/{prd-to-app → pactor-prd}/template/README.md +1 -1
- package/pactor-project/SKILL.md +121 -0
- package/pactor-project/references/minimal-vite.md +39 -0
- package/pactor-project/references/templates.md +92 -0
- package/scripts/validate-skills.mjs +65 -0
- package/prd-to-app/SKILL.md +0 -75
- /package/{prd-to-app → pactor-prd}/references/component-mapping.md +0 -0
- /package/{prd-to-app → pactor-prd}/references/mock-data-routes.md +0 -0
- /package/{prd-to-app → pactor-prd}/references/theme-and-style.md +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/[[...slug]]/page.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/api/auth/login/route.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/api/auth/logout/route.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/api/data/[...parts]/route.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/api/public/pages/[id]/route.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/api/sitemap/route.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/api/users/route.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/favicon.ico +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/globals.css +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/layout.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/app/login.css +0 -0
- /package/{prd-to-app → pactor-prd}/template/eslint.config.mjs +0 -0
- /package/{prd-to-app → pactor-prd}/template/next-env.d.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/next.config.js +0 -0
- /package/{prd-to-app → pactor-prd}/template/package.json +0 -0
- /package/{prd-to-app → pactor-prd}/template/pnpm-lock.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/pnpm-workspace.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/postcss.config.mjs +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/file.svg +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/globe.svg +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/next.svg +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/skins/chenwunaifu.css +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/skins/taijingshenlin.css +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/skins/xuanzhimoyun.css +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/vercel.svg +0 -0
- /package/{prd-to-app → pactor-prd}/template/public/window.svg +0 -0
- /package/{prd-to-app → pactor-prd}/template/scripts/build.mjs +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/App.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/actions.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/card-links.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/chip-filter.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/chip-node.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/debug-chat.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/index.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/log-status.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/status-badge.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/components/theme-switcher.tsx +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/config.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/audit-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/call-logs-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/client-debug-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/client-templates-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/clients-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/costs-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/dashboard-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/model-debug-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/models-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/ops-usage-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/providers-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/mocks/routes-mock.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/services.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/pactor/skin.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/accounts.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/cors.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/sitemap.ts +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/common/dashboard.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/common/login.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/provider/provider-create.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/provider/provider-detail.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/provider/provider-edit.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/provider/provider-list.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/route/route-create.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/route/route-detail.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/route/route-edit.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/route/route-list.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/src/server/yaml/sitemap.yaml +0 -0
- /package/{prd-to-app → pactor-prd}/template/tsconfig.json +0 -0
package/README.md
CHANGED
|
@@ -1,39 +1,99 @@
|
|
|
1
1
|
# @pactor-app/skills
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
面向 AI Agent 的 [Pactor](https://github.com/426-330/pactor) 开发技能集。技能目录均以 **`pactor-`** 为前缀,与 npm 脚手架包 `create-pactor-app` 区分。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
本仓库路径:**根目录 `skills/`**(pnpm workspace 包 `@pactor-app/skills`)。
|
|
6
|
+
|
|
7
|
+
| 目录 / skill id | 用途 |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| **`pactor-dsl`** | 框架与 `*.page.yaml` DSL 编写 |
|
|
10
|
+
| **`pactor-project`** | 新建工程、`pnpm create pactor-app`、模板选型 |
|
|
11
|
+
| **`pactor-prd`** | PRD / 线框图 → 完整可运行后台(含 `template/`) |
|
|
12
|
+
|
|
13
|
+
## 在本仓库使用(Cursor / Claude Code)
|
|
14
|
+
|
|
15
|
+
`pactor-prd` 须连同 **`references/`** 与 **`template/`** 一起可见。
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
mkdir -p .cursor/skills
|
|
19
|
+
ln -sf ../../skills/pactor-dsl .cursor/skills/pactor-dsl
|
|
20
|
+
ln -sf ../../skills/pactor-project .cursor/skills/pactor-project
|
|
21
|
+
ln -sf ../../skills/pactor-prd .cursor/skills/pactor-prd
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 安装(业务仓库)
|
|
6
25
|
|
|
7
26
|
```bash
|
|
8
|
-
npm install -D @pactor-app/skills
|
|
9
|
-
# 或
|
|
10
27
|
pnpm add -D @pactor-app/skills
|
|
11
28
|
```
|
|
12
29
|
|
|
13
|
-
|
|
30
|
+
```bash
|
|
31
|
+
ln -s node_modules/@pactor-app/skills/pactor-dsl ~/.claude/skills/pactor-dsl
|
|
32
|
+
ln -s node_modules/@pactor-app/skills/pactor-project ~/.claude/skills/pactor-project
|
|
33
|
+
ln -s node_modules/@pactor-app/skills/pactor-prd ~/.claude/skills/pactor-prd
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 技能一览
|
|
39
|
+
|
|
40
|
+
| Skill | 典型触发 | 产出 |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| **`pactor-dsl`** | 写/改 YAML 页面、表达式、动作、组件、主题、Chat | 规范与示例(不生成新仓库) |
|
|
43
|
+
| **`pactor-project`** | 初始化项目、`pnpm create pactor-app` | next-app / spa 或最小 Vite 壳工程 |
|
|
44
|
+
| **`pactor-prd`** | PRD/线框图 → 页面(**新工程**复制 template,**已有工程**线框图增量) | YAML + sitemap/mock/样式 + 验收 |
|
|
45
|
+
|
|
46
|
+
关系:**`pactor-project`** 搭通用壳;**`pactor-prd`** 从自带 **`template/`** 批量铺页(勿用脚手架空起);日常改页用 **`pactor-dsl`**。
|
|
14
47
|
|
|
15
|
-
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## `pactor-dsl`
|
|
51
|
+
|
|
52
|
+
- **入口**:`pactor-dsl/SKILL.md`,深参考 `pactor-dsl/references/dsl-authoring.md`
|
|
53
|
+
- **能力**:DSL 语法;**按清单批量加页**(目录 A/B、`sitemap`/menus、`StaticDslLoader`)— `pactor-dsl/references/page-catalog-and-layout.md`;组件、dataSources、权限、Chat、`pactor validate`
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## `pactor-project`
|
|
58
|
+
|
|
59
|
+
- **入口**:`pactor-project/SKILL.md`,`references/templates.md`、`references/minimal-vite.md`
|
|
60
|
+
- **能力**:`pnpm create pactor-app -t next-app|spa`(npm 包名仍为 **`create-pactor-app`**)、`pactor create`、starters 复制、脚手架后检查清单
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## `pactor-prd`(PRD → 可运行应用)
|
|
65
|
+
|
|
66
|
+
**版本**:见 `pactor-prd/SKILL.md` frontmatter。
|
|
67
|
+
|
|
68
|
+
### 能力摘要
|
|
69
|
+
|
|
70
|
+
- 输入:产品总览 README + 分页 Markdown 线框图(可选原产品仓抽样式)
|
|
71
|
+
- 产出:Next + Pactor 工程 — `sitemap.yaml`、分模块 `*.page.yaml`、http 数据源 + `app/api/data/*` mock、懒加载页面 API、多套皮肤与验收清单
|
|
72
|
+
- **新建工程**:解析 → 复制 `template/` → 按清单建 `yaml/<模块>/<id>.yaml` → mock → 样式 → 全站验收(`page-inventory-and-files.md`)
|
|
73
|
+
- **增量**:摸底现状 → 线框图 **add/update** → 只改相关 yaml、sitemap、mock → 变更页验收 + 回归(`incremental-wireframe-delta.md`)
|
|
74
|
+
- 红线:dataSources 仅 `http`;表单一律 `Form`;列表操作列规范;功能闭环;文案跟线框图
|
|
75
|
+
|
|
76
|
+
### 捆绑资产
|
|
77
|
+
|
|
78
|
+
| 路径 | 作用 |
|
|
16
79
|
| --- | --- |
|
|
17
|
-
| `pactor
|
|
18
|
-
| `prd
|
|
80
|
+
| `pactor-prd/template/` | 可运行模板工程(common + provider/route 参考模块) |
|
|
81
|
+
| `pactor-prd/references/*.md` | 目录结构、组件映射、页模板、mock、主题、验收清单 |
|
|
82
|
+
|
|
83
|
+
详见 [`pactor-prd/SKILL.md`](pactor-prd/SKILL.md) 与 [`pactor-prd/template/README.md`](pactor-prd/template/README.md)。
|
|
19
84
|
|
|
20
|
-
|
|
85
|
+
---
|
|
21
86
|
|
|
22
|
-
|
|
87
|
+
## 校验与发布
|
|
23
88
|
|
|
24
89
|
```bash
|
|
25
|
-
#
|
|
26
|
-
ln -s node_modules/@pactor-app/skills/pactor ~/.claude/skills/pactor
|
|
27
|
-
ln -s node_modules/@pactor-app/skills/prd-to-app ~/.claude/skills/prd-to-app
|
|
90
|
+
cd skills && pnpm validate # 目录名与 SKILL frontmatter、references、template 存在性
|
|
28
91
|
```
|
|
29
92
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
## Adding a skill
|
|
93
|
+
## 新增技能
|
|
33
94
|
|
|
34
|
-
1.
|
|
35
|
-
2.
|
|
36
|
-
3. The skill ships with the package automatically on next publish.
|
|
95
|
+
1. 在 `skills/` 下新建 **`pactor-<topic>/`**,`SKILL.md` 的 `name` 与目录名一致。
|
|
96
|
+
2. 更新本 README 表格;`pnpm validate` 通过后发布 `@pactor-app/skills`。
|
|
37
97
|
|
|
38
98
|
## License
|
|
39
99
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pactor-app/skills",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.0",
|
|
4
4
|
"description": "Agent skills for rapidly building pactor Server-Driven UI applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pactor",
|
|
@@ -14,13 +14,22 @@
|
|
|
14
14
|
"repository": {
|
|
15
15
|
"type": "git",
|
|
16
16
|
"url": "git+https://github.com/426-330/pactor.git",
|
|
17
|
-
"directory": "
|
|
17
|
+
"directory": "skills"
|
|
18
18
|
},
|
|
19
|
-
"homepage": "https://github.com/426-330/pactor/tree/main/
|
|
19
|
+
"homepage": "https://github.com/426-330/pactor/tree/main/skills",
|
|
20
20
|
"bugs": "https://github.com/426-330/pactor/issues",
|
|
21
21
|
"type": "module",
|
|
22
|
+
"files": [
|
|
23
|
+
"README.md",
|
|
24
|
+
"pactor-dsl",
|
|
25
|
+
"pactor-project",
|
|
26
|
+
"pactor-prd",
|
|
27
|
+
"scripts"
|
|
28
|
+
],
|
|
22
29
|
"publishConfig": {
|
|
23
30
|
"access": "public"
|
|
24
31
|
},
|
|
25
|
-
"scripts": {
|
|
32
|
+
"scripts": {
|
|
33
|
+
"validate": "node scripts/validate-skills.mjs"
|
|
34
|
+
}
|
|
26
35
|
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: pactor
|
|
2
|
+
name: pactor-dsl
|
|
3
3
|
description: |
|
|
4
|
-
Use
|
|
5
|
-
version:
|
|
4
|
+
Use for Pactor DSL and runtime wiring inside an existing app (skill id pactor-dsl). Triggers: write/edit *.page.yaml, add N pages with module folders and sitemap/menus, state, dataSources, events, actions, expressions, custom components/actions/services, themes, permissions, Chat/ChatShell, vite-plugin, pactor validate. NOT for empty-repo scaffold (use pactor-project) or full PRD-to-repo generation (use pactor-prd).
|
|
5
|
+
version: 2.0.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# pactor-app
|
|
9
9
|
|
|
10
10
|
## When to activate
|
|
11
11
|
|
|
12
|
-
Activate
|
|
12
|
+
Activate when the user works with **Pactor DSL or runtime APIs** in a project that already exists:
|
|
13
13
|
|
|
14
|
-
-
|
|
15
|
-
- Using `createPactorApplication`, `@pactor-app/app`, or `StaticDslLoader`
|
|
14
|
+
- Adding or changing **one or many** YAML pages and their **directory + sitemap/menu** relationships
|
|
15
|
+
- Using `createPactorApplication`, `@pactor-app/app`, or `StaticDslLoader` **inside an existing codebase** (new repo → **`pactor-project`** first)
|
|
16
16
|
- Writing YAML/JSON DSL pages, components, events, or actions
|
|
17
17
|
- Creating or registering custom components / actions / services
|
|
18
18
|
- Building AI chat pages (`Chat`, `ChatShell`, `ChatServicesProvider`)
|
|
@@ -25,7 +25,7 @@ Activate this skill when the user works with **Pactor** — any `@pactor-app/*`
|
|
|
25
25
|
## What you can do with this skill
|
|
26
26
|
|
|
27
27
|
- Explain Pactor architecture, package boundaries, and dependency rules
|
|
28
|
-
-
|
|
28
|
+
- **Batch-create pages** from a page inventory: file paths (`yaml/<module>/<id>.yaml` vs `yaml/pages/*.page.yaml`), `sitemap.yaml` `pages`/`menus`, or `StaticDslLoader.pages` — see `references/page-catalog-and-layout.md`
|
|
29
29
|
- Register custom components, actions, services, and capabilities
|
|
30
30
|
- Design data flow, expressions, events, and action orchestration
|
|
31
31
|
- Configure themes/skins, layouts, routing, resources, and permissions
|
|
@@ -54,7 +54,7 @@ Activate this skill when the user works with **Pactor** — any `@pactor-app/*`
|
|
|
54
54
|
| `packages/cli` | `@pactor-app/cli` | DSL validation, inspection, scaffolding |
|
|
55
55
|
| `packages/app` | `@pactor-app/app` | One-stop composition (`createPactorApplication`) |
|
|
56
56
|
| `packages/pactor` | `pactor-app` | Meta package — depends on all modules, re-exports `@pactor-app/app` |
|
|
57
|
-
| `
|
|
57
|
+
| `skills/` | `@pactor-app/skills` | Agent skills collection (this skill lives at `skills/pactor-dsl/`) |
|
|
58
58
|
|
|
59
59
|
## Dependency rules
|
|
60
60
|
|
|
@@ -125,7 +125,7 @@ For YAML imports add `@pactor-app/vite-plugin` to `vite.config.ts` and declare `
|
|
|
125
125
|
|
|
126
126
|
The built-in shadcn-style UI (`@pactor-app/ui`) registers these DSL component types — reference them by `type` in pages:
|
|
127
127
|
|
|
128
|
-
- **Page & layout**: `Page`, `Layout` / `Header` / `Sider` / `Content` / `Footer`, `Grid`, `Flex`, `Card`, `Sidebar`
|
|
128
|
+
- **Page & layout**: `Page`, `Layout` / `Header` / `Sider` / `Content` / `Footer`, `Grid`, `Flex`, `Card`, `Sidebar`, `For`(数据驱动循环渲染,行作用域 `${row}`/`${rowIndex}`)
|
|
129
129
|
- **Basic**: `Button`, `Alert`, `Statistic`, `Menu`, `Link`, `Text`, `Typography`, `Icon`
|
|
130
130
|
- **Data**: `Table`, `Tabs`, `DataTable`, `Chart`
|
|
131
131
|
- **Form**: `Form`, `Input`, `NumberInput`, `Select`, `Textarea`, `Checkbox`, `RadioGroup`, `Switch`, `Slider`, `Label`, `Field`, `ChatInput`, `DatePicker`
|
|
@@ -143,14 +143,18 @@ Notable behaviors:
|
|
|
143
143
|
|
|
144
144
|
Component contracts and per-component props: see the docs site (`docs/src/content/docs/components/`).
|
|
145
145
|
|
|
146
|
-
## Workflow:
|
|
146
|
+
## Workflow: add or edit pages (single or many)
|
|
147
147
|
|
|
148
|
-
When the user asks
|
|
148
|
+
When the user asks for **N pages** or a **module tree**:
|
|
149
149
|
|
|
150
|
-
1.
|
|
151
|
-
2.
|
|
152
|
-
3.
|
|
153
|
-
4. Validate
|
|
150
|
+
1. Read `references/page-catalog-and-layout.md` — pick layout **A** (flat `pages/*.page.yaml`) or **B** (`<module>/<id>.yaml`) to match the project; output a **page inventory table** (id, path, file, menu, hidden).
|
|
151
|
+
2. Create **one YAML file per row**; register all ids in `sitemap.yaml` (SitemapApp) or `StaticDslLoader` + `bootstrap.menus`.
|
|
152
|
+
3. Per file: use the skeleton below — never invent the top-level shape; declare `state` / `dataSources`, then `body`; wire `events` → actions.
|
|
153
|
+
4. Validate: `npx pactor validate '<glob>'` (`@pactor-app/cli`). Monorepo: `node packages/cli/dist/cli.js validate <file>`. Schema only — props见 `references/dsl-authoring.md`.
|
|
154
|
+
|
|
155
|
+
When editing a **single** existing page, skip step 1 unless menus/paths change.
|
|
156
|
+
|
|
157
|
+
## Workflow: authoring DSL pages (single-file skeleton)
|
|
154
158
|
|
|
155
159
|
```yaml
|
|
156
160
|
dsl: '1.0' # required, DSL spec version
|
|
@@ -181,7 +185,7 @@ Facts that are NOT guessable and must be followed:
|
|
|
181
185
|
- `navigate` takes `to`; `message` takes `text` + `messageType` (a `type` key in action `params` disables expression evaluation).
|
|
182
186
|
- Query linkage = `onSubmit: [setState, reload]`; the data source's `params` referencing `${state.x}` pick up new values on reload.
|
|
183
187
|
|
|
184
|
-
**Full DSL grammar, action catalog, expression/scopes tables, and copy-paste recipes: read `references/dsl-authoring.md
|
|
188
|
+
**Full DSL grammar, action catalog, expression/scopes tables, and copy-paste recipes: read `references/dsl-authoring.md`.** Page count, folders, and sitemap: **`references/page-catalog-and-layout.md`**. Component props: bundled dsl-authoring + [Pactor docs](https://github.com/426-330/pactor/tree/main/docs/src/content/docs/components) when online.
|
|
185
189
|
|
|
186
190
|
## Workflow: custom component
|
|
187
191
|
|
|
@@ -355,19 +359,15 @@ pnpm pactor create my-app
|
|
|
355
359
|
- **Do not** put a `type` key in action `params` (see the events workflow pitfall).
|
|
356
360
|
- **Do not** expect DslNode slots (sidebar / toolbar / inspector / …) to render outside a page runtime; in pure React hosts pass ReactNode instead.
|
|
357
361
|
|
|
358
|
-
## References
|
|
362
|
+
## References (bundled — works from npm install)
|
|
363
|
+
|
|
364
|
+
- **Page inventory & directories**: `references/page-catalog-and-layout.md`
|
|
365
|
+
- **DSL grammar & recipes**: `references/dsl-authoring.md`
|
|
366
|
+
- **New repository**: sibling `pactor-project` (`../pactor-project/SKILL.md`)
|
|
367
|
+
- **PRD full-site generation**: sibling `pactor-prd` (`../pactor-prd/SKILL.md`)
|
|
359
368
|
|
|
360
|
-
|
|
361
|
-
- Framework design specification: `docs/src/content/docs/framework-design.md`
|
|
362
|
-
- Quick start: `docs/src/content/docs/guides/getting-started.md`
|
|
363
|
-
- @pactor-app/app docs: `docs/src/content/docs/packages/app.md`
|
|
364
|
-
- @pactor-app/chat docs: `docs/src/content/docs/packages/chat.md`
|
|
365
|
-
- Component reference: `docs/src/content/docs/components/`
|
|
366
|
-
- Example projects:
|
|
367
|
-
- `examples/vite-starter` — minimal starter
|
|
368
|
-
- `examples/admin` — shadcn admin dashboard with skin settings
|
|
369
|
-
- `examples/chat` — AI chat workspace (pactor-app assembly)
|
|
369
|
+
Online (optional): [getting started](https://github.com/426-330/pactor/blob/main/docs/src/content/docs/guides/getting-started.md), [DSL reference](https://github.com/426-330/pactor/blob/main/docs/src/content/docs/reference/dsl.md), [framework design](https://github.com/426-330/pactor/blob/main/docs/src/content/docs/framework-design.md).
|
|
370
370
|
|
|
371
371
|
## How to use this skill
|
|
372
372
|
|
|
373
|
-
This skill is maintained as `
|
|
373
|
+
This skill is maintained as `skills/pactor-dsl/SKILL.md` together with `references/dsl-authoring.md`. AI agents can copy or link the whole `skills/pactor-dsl` directory into their skill directory to provide contextual guidance when reading or editing Pactor projects.
|
|
@@ -165,7 +165,7 @@ Global scope keys:
|
|
|
165
165
|
| `actions` | results of named actions (by `id`) | `${actions.editResult.success}` |
|
|
166
166
|
| `locale` / `t` | current locale / translate fn | `${t('menu.home')}` |
|
|
167
167
|
|
|
168
|
-
Local scope keys (only where produced): `event` (event payload), `row` / `rowIndex` (Table `cell` templates), `parent` (parent page snapshot inside overlays).
|
|
168
|
+
Local scope keys (only where produced): `event` (event payload), `row` / `rowIndex` (Table `cell` templates and `For` item templates), `parent` (parent page snapshot inside overlays).
|
|
169
169
|
|
|
170
170
|
## 6. Events and actions
|
|
171
171
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 页面清单、目录结构与 sitemap 关系
|
|
2
|
+
|
|
3
|
+
在**已有 Pactor 工程**内按需求新增 **任意数量** 页面时,先产出「页面清单」,再按工程采用的 **YAML 布局模式** 创建文件并注册 `sitemap`(或 `StaticDslLoader`)。
|
|
4
|
+
|
|
5
|
+
> 新建空仓库请用 **`pactor-project`**;从 PRD 批量铺全站请用 **`pactor-prd`**。本参考只覆盖「加页 / 改目录」。
|
|
6
|
+
|
|
7
|
+
## 两种 YAML 磁盘布局(二选一,勿混用)
|
|
8
|
+
|
|
9
|
+
| 模式 | 适用 | 路径规则 | 页面 id |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| **A. 演示平铺** | 官方 `pnpm create pactor-app -t next-app` / `starters/next-app-starter`;页面 ≤5、模块单一 | `src/server/yaml/pages/<id>.page.yaml` | `page.id` = 文件名去掉 `.page.yaml`(如 `home.page.yaml` → `home`) |
|
|
12
|
+
| **B. 模块分目录** | `pactor-prd` 模板及多模块后台(模块 ≥2 或页面 >5) | `src/server/yaml/<模块>/<id>.yaml` | `page.id` = 文件名去掉 `.yaml`(**无** `.page` 后缀) |
|
|
13
|
+
|
|
14
|
+
`src/server/sitemap.ts`(或等价加载器)递归扫描 `yaml/` 子目录建立 **id → 文件路径** 索引;**id 全局唯一**,且与 `sitemap.yaml` 里 `pages[].id`、`menus[].pageId` 一致。
|
|
15
|
+
|
|
16
|
+
从模式 A 扩到模式 B:新建模块子目录,把新页放进 `<模块>/`;旧页可逐步迁移,同一时刻不要两个文件共用一个 id。
|
|
17
|
+
|
|
18
|
+
## 页面清单(Agent 先输出,再写文件)
|
|
19
|
+
|
|
20
|
+
对用户给的 N 个页面,先填表(N 任意):
|
|
21
|
+
|
|
22
|
+
| page id | 模块目录 | 文件路径(相对 `src/server/yaml/`) | path | 菜单分组 | 进菜单? | layout | permission |
|
|
23
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
24
|
+
| user-list | user | `user/user-list.yaml` 或 `pages/user-list.page.yaml` | `/users` | 系统管理 | 是 | admin | user:view |
|
|
25
|
+
| user-edit | user | `user/user-edit.yaml` | `/users/:id/edit` | — | 否 hidden | admin | user:edit |
|
|
26
|
+
|
|
27
|
+
约定:
|
|
28
|
+
|
|
29
|
+
- **模块目录**:kebab-case 英文域(`user`、`order`、`report`),与 PRD 模块树对齐;模式 A 可填 `pages` 或 `-`。
|
|
30
|
+
- **详情 / 编辑 / 新建**:`hidden: true` + `activeMenu` 指向列表菜单项 id;path 用 `:param` 与框架 Path Matcher 一致。
|
|
31
|
+
- **page.id**:全局唯一 kebab-case;= DSL 内 `page.id` = 文件名(模式 B)。
|
|
32
|
+
|
|
33
|
+
## 创建步骤(按数量批量执行)
|
|
34
|
+
|
|
35
|
+
1. **定布局模式**:看工程现有 `yaml/` 是 `pages/*.page.yaml` 还是 `<模块>/*.yaml`,新页跟随现状;大规模新增优先模式 B。
|
|
36
|
+
2. **按清单建文件**:每个页面一个 YAML;从 `references/dsl-authoring.md` 骨架 + 列表/详情/表单模板(`pactor-prd/references/page-templates.md` 可复用结构,数据源类型按工程约定 http 或 service)。
|
|
37
|
+
3. **改 `sitemap.yaml`**(next-app / SitemapApp):
|
|
38
|
+
- `pages` 数组:每个 id 一条,`lazy: true`(推荐懒加载)
|
|
39
|
+
- `menus`:group / page 树与模块一致;`pageId` 指向清单 id
|
|
40
|
+
4. **StaticDslLoader 工程**(如 `examples/vite-starter`):
|
|
41
|
+
- `import` 每个 yaml,`loader` 的 `pages: { [id]: doc }` 与 `bootstrap.menus` 的 `pageId` 与清单一致
|
|
42
|
+
5. **校验**:`npx pactor validate 'path/to/**/*.yaml'`(或 monorepo 内 `node packages/cli/dist/cli.js validate …`)
|
|
43
|
+
6. **重启 dev**:服务端加载 yaml 的 Next 模板常需重启 dev server 后才能在浏览器看到新页
|
|
44
|
+
|
|
45
|
+
## sitemap 片段示例(模式 B,两页)
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
pages:
|
|
49
|
+
- { id: user-list, path: /users, title: 用户列表, version: 1, lazy: true }
|
|
50
|
+
- { id: user-edit, path: /users/:id/edit, title: 编辑用户, version: 1, lazy: true }
|
|
51
|
+
|
|
52
|
+
menus:
|
|
53
|
+
- id: system
|
|
54
|
+
type: group
|
|
55
|
+
title: 系统管理
|
|
56
|
+
icon: settings
|
|
57
|
+
children:
|
|
58
|
+
- { id: nav-users, type: page, pageId: user-list, title: 用户 }
|
|
59
|
+
- { id: nav-user-edit, type: page, pageId: user-edit, title: 编辑用户, hidden: true, activeMenu: nav-users }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 与 `pactor-prd` 的分工
|
|
63
|
+
|
|
64
|
+
| 场景 | 使用 |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| 已有工程加 1~N 页、改菜单 | **本参考** + `pactor-dsl` |
|
|
67
|
+
| 从 PRD 目录一次性生成全站文件 + mock + 验收 | **`pactor-prd`** + `references/page-inventory-and-files.md` |
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pactor-prd
|
|
3
|
+
description: |
|
|
4
|
+
Use when PRD or markdown wireframes drive Pactor YAML pages (skill id pactor-prd). Greenfield: copy template/ into a new repo. Incremental: in an existing Pactor project, add or update pages from new/changed wireframe files (DSL, sitemap, menus, mock API, styles). Triggers: pactor-prd, prd-to-app, 线框图增量, 已有项目加页面, PRD 更新页面.
|
|
5
|
+
version: 1.3.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# PRD → YAML 页面应用生成
|
|
9
|
+
|
|
10
|
+
把「产品文档 + Markdown 线框图」落到 **YAML 页面 + sitemap/mock/样式**;支持 **两种模式**(先选型再执行):
|
|
11
|
+
|
|
12
|
+
| 模式 | 何时用 | 脚手架 |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| **新建工程** | 空目录 / 新仓库 / 首次从 PRD 出整站 | 复制 `template/` |
|
|
15
|
+
| **增量(已有工程)** | 仓库已是 Pactor 后台,线框图新增或调整 | **不复制 template**;按 delta 改文件 |
|
|
16
|
+
|
|
17
|
+
## 输入要求
|
|
18
|
+
|
|
19
|
+
- PRD/线框图:总览 README(模块 × 页面 × 优先级)+ 分页线框 markdown(ASCII + 区域 + 交互)
|
|
20
|
+
- **增量**:可只提供 **变更的线框图文件** 列表(或 PRD 目录 + 标明 diff 范围)
|
|
21
|
+
- 原产品代码仓(可选):抽设计令牌、自定义 CSS、交互
|
|
22
|
+
- 目标:空目录(新建工程)或已有工程根目录(增量)
|
|
23
|
+
|
|
24
|
+
输入格式不同时,先归纳「模块 → 页面 → 区域 → 交互」,再套用流程。
|
|
25
|
+
|
|
26
|
+
## 红线(必须遵守)
|
|
27
|
+
|
|
28
|
+
1. **dataSources 一律 `type: http`**,指向 `/api/data/...`,不写 `type: service`,便于后续替换真实接口
|
|
29
|
+
2. **布局与间距以样板页为准**:新建工程时以 `template/` 同类页为准;**增量时以目标工程内同模块/同类型页**为准。线框图只提取结构与功能,不逐像素还原 ASCII
|
|
30
|
+
3. **样式与原产品一致**:主题令牌(含深浅色)、自定义 CSS(如登录页)、换肤入口全部移植对齐,见 `references/theme-and-style.md`
|
|
31
|
+
4. **功能与原产品一致**:线框图描述的筛选/搜索/跳转/弹窗/提交等交互必须经 events/actions 闭环可用,禁止只画静态骨架;错误分支(校验失败提示等)也要实现
|
|
32
|
+
5. **表单一律用 `Form` 组件**:凡是一组「字段 + 校验 + 提交」的表单——独立表单页、页面内嵌的配置面板(如树/列表右侧的编辑表单)、弹窗/抽屉表单、**搜索栏(关键词 + 查询/重置 的筛选区,用 `Form layout: inline`)**——都必须用 `Form` 包裹,字段经 `props.name` 绑定,校验用字段级 `rules`(required + message),提交用 `submit: true` 的 Button 触发 `onSubmit`;**禁止**散放 `Input`/`Select` + `setState` 攒草稿 + `if` 动作手写校验。回填联动(如点击列表/树节点填充表单)用 `form.setValues` 动作,不要绑 `${state.x}` 到字段 value;即点即生效的 ChipFilter 快筛行没有提交语义,不属于表单
|
|
33
|
+
6. **列表页操作列规范**:操作列按钮样式统一 `Button variant: link`;「编辑」与「新建」指向同一个表单(同一路由页或同一弹窗),唯一区别是编辑以行数据预填(路由页 `initialValues: ${data.detail}`,弹窗/内嵌面板 `form.setValues`)
|
|
34
|
+
7. **文案以线框图为准**:标题、按钮、空态文案逐字取自线框图/PRD
|
|
35
|
+
8. DSL 语法细节(组件 props、表达式、动作)以 `pactor-dsl` skill 与 packages/ui 当前导出为准,本 skill 只约定流程与产出物
|
|
36
|
+
|
|
37
|
+
## 流程总览
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
选型 → 1 解析 → 2 脚手架(仅新建工程)→ 3 页面 → 4 mock → 5 样式 → 6 验收
|
|
41
|
+
增量:2 改为「摸底」;1/3 只处理 delta;6 变更页全验 + 少量回归
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
详细增量步骤:**`references/incremental-wireframe-delta.md`**。
|
|
45
|
+
|
|
46
|
+
### 1. 输入解析
|
|
47
|
+
|
|
48
|
+
- 读 README / 变更线框图:模块树、页面 id(kebab-case)、path、菜单、P0/P1/P2
|
|
49
|
+
- 逐页读线框:页面类型、区域、字段、交互
|
|
50
|
+
- **新建工程**:输出全量 **页面清单表**(`references/page-inventory-and-files.md`)
|
|
51
|
+
- **增量**:扫描工程现状清单 + 输出 **delta 表**(add / update / deprecate,`references/incremental-wireframe-delta.md`);P2 不建文件
|
|
52
|
+
|
|
53
|
+
### 2. 脚手架
|
|
54
|
+
|
|
55
|
+
**新建工程**
|
|
56
|
+
|
|
57
|
+
- **整体复制 `template/`** 为新项目起点;不要用 `pnpm create pactor-app` 替代
|
|
58
|
+
- 工程名:README 产品名 → kebab-case 英文名,创建前确认一次
|
|
59
|
+
- `pnpm install` + dev 验证;核对 `references/project-structure.md`
|
|
60
|
+
- 参考模块 provider/route 作样板;**全站生成完成后删除**参考模块及 mock
|
|
61
|
+
|
|
62
|
+
**增量**
|
|
63
|
+
|
|
64
|
+
- **跳过复制 template**;执行 `incremental-wireframe-delta.md` 的「摸底」
|
|
65
|
+
- 确认 yaml 布局模式 A/B 与 `sitemap`、data API 接线完整;缺则先补壳或转新建工程
|
|
66
|
+
|
|
67
|
+
### 3. 页面生成(按清单或 delta 改文件)
|
|
68
|
+
|
|
69
|
+
- **新建工程**:清单一行 = 一个文件 `yaml/<模块>/<page-id>.yaml`(或工程既定 A/B 规则);`mkdir` 模块目录;N = P0/P1 行数
|
|
70
|
+
- **增量**:仅 **add** 新建文件;**update** 改已有 yaml;**deprecate** 删文件并改 sitemap(须用户确认)
|
|
71
|
+
- 校验见 `page-inventory-and-files.md`(全量)或 `incremental-wireframe-delta.md`(增量)
|
|
72
|
+
- 按 `references/component-mapping.md` 映射组件;按 `references/page-templates.md` 选列表/详情/表单模板;表单一律 `Form` 包裹
|
|
73
|
+
- 同步更新 `sitemap.yaml` 的 `pages` + `menus`(hidden 详情/编辑带 `activeMenu`)
|
|
74
|
+
- 每页 dataSources 全部 `type: http`;交互 events + actions 闭环
|
|
75
|
+
|
|
76
|
+
### 4. mock 服务
|
|
77
|
+
|
|
78
|
+
- 按 `references/mock-data-routes.md` 注册/更新路由表与 `src/pactor/mocks/`;**增量只动变更页涉及的接口**
|
|
79
|
+
|
|
80
|
+
### 5. 样式移植
|
|
81
|
+
|
|
82
|
+
- 按 `references/theme-and-style.md`;**增量**仅受影响页面/令牌(新建工程做全站对齐)
|
|
83
|
+
|
|
84
|
+
### 6. 功能与视觉验收(必经,不可跳过)
|
|
85
|
+
|
|
86
|
+
- `references/acceptance-checklist.md`:**新建工程**逐页全站验收;**增量**对 **所有变更页** 全项验收 + **至少 1~2 个未改页回归**(菜单可达、控制台无新增 error)
|
|
87
|
+
|
|
88
|
+
## references 索引
|
|
89
|
+
|
|
90
|
+
| 文件 | 何时加载 |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| `template/` | 阶段 2 **仅新建工程**:复制为新工程起点;增量勿用 |
|
|
93
|
+
| `references/incremental-wireframe-delta.md` | **已有工程**:线框图 add/update/deprecate、改 sitemap/mock/样式 |
|
|
94
|
+
| `references/project-structure.md` | 阶段 2:目录结构约定与 sitemap.yaml 骨架 |
|
|
95
|
+
| `references/component-mapping.md` | 阶段 3:线框图区域 → pactor 组件映射 |
|
|
96
|
+
| `references/page-templates.md` | 阶段 3:列表/详情/表单页 yaml 模板 |
|
|
97
|
+
| `references/mock-data-routes.md` | 阶段 4:mock 路由表模板与命名约定 |
|
|
98
|
+
| `references/theme-and-style.md` | 阶段 5:主题令牌提取、皮肤、自定义 CSS、换肤 |
|
|
99
|
+
| `references/acceptance-checklist.md` | 阶段 6:验收清单与结果输出格式 |
|
|
100
|
+
| `references/page-inventory-and-files.md` | 阶段 1–3:清单列 → 目录与文件批量创建、与 sitemap 对齐 |
|
|
101
|
+
|
|
102
|
+
## Sibling skills
|
|
103
|
+
|
|
104
|
+
- **`pactor-dsl`** — 无线框图的单页/清单加页;**有线框图 + mock/sitemap 联动**仍用本 skill 增量模式
|
|
105
|
+
- **`pactor-project`** — `pnpm create pactor-app` 空壳(**不要**用其替代本 skill 的 template 复制)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# 验收清单
|
|
2
2
|
|
|
3
|
-
验收是必经阶段。启动 dev server,用浏览器(playwright-cli / WebBridge
|
|
3
|
+
验收是必经阶段。启动 dev server,用浏览器(playwright-cli / WebBridge 均可)执行,输出验收结果表。**全部通过才算完成;任何一项不通过,修复后重验该页全部项。**
|
|
4
|
+
|
|
5
|
+
**增量(已有工程)**:对 **本次变更的每个 page id** 跑下方「每页检查项」;另抽 **1~2 个未改动的核心页**(如首页、任一列表)做路由可达 + 控制台无新增 error,作为回归。
|
|
4
6
|
|
|
5
7
|
## 每页检查项
|
|
6
8
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 已有工程:线框图增量(新增 / 调整)
|
|
2
|
+
|
|
3
|
+
当目标已是 Pactor 工程(由 `pactor-prd/template`、或已对齐 PRD 约定的 next-app 扩展仓)时,**不要**再复制 `template/`。根据 **新增或变更** 的线框图 markdown(及 README 增量)更新 DSL 与配套文件。
|
|
4
|
+
|
|
5
|
+
## 适用条件
|
|
6
|
+
|
|
7
|
+
工程至少具备:
|
|
8
|
+
|
|
9
|
+
- `src/server/yaml/sitemap.yaml`(或等价 sitemap 源)
|
|
10
|
+
- 页面 yaml 目录(**模式 B** `yaml/<模块>/<id>.yaml` 或 **模式 A** `yaml/pages/*.page.yaml` — 见 `pactor-dsl/references/page-catalog-and-layout.md`)
|
|
11
|
+
- PRD 风格 mock:`app/api/data/[...parts]/route.ts` + `src/pactor/mocks/`(若工程仍用 `type: service`,增量页 **仍须 http**,并迁移或仅对新页遵守红线)
|
|
12
|
+
|
|
13
|
+
不满足时:先 **`pactor-project`** 或 **新建工程 `pactor-prd` 模式** 搭壳,再回来做增量。
|
|
14
|
+
|
|
15
|
+
## 0. 摸底(只读)
|
|
16
|
+
|
|
17
|
+
1. 扫描 `src/server/yaml/**`(排除 `sitemap.yaml`),建立 **现状清单**:`page id`、文件路径、`sitemap.pages` 的 path、`menus` 引用。
|
|
18
|
+
2. 确认 `pageEndpoint` / 懒加载 API 路径(`src/pactor/config.ts`)与 `app/api/public/pages/[id]` 存在。
|
|
19
|
+
3. 读工程内 **同类页** 一份(同模块列表页或表单页)作为排版样板(增量时红线「以模板为准」= **以本工程同类页为准**)。
|
|
20
|
+
|
|
21
|
+
## 1. 解析线框图增量
|
|
22
|
+
|
|
23
|
+
输入可以是:
|
|
24
|
+
|
|
25
|
+
- 仅 **新增/修改** 的线框图 `.md` 文件列表;或
|
|
26
|
+
- PRD 目录 + 用户标明「只处理这些文件」
|
|
27
|
+
|
|
28
|
+
对 **每个** 线框图文件输出 delta 行:
|
|
29
|
+
|
|
30
|
+
| 变更 | page id | 模块 | 文件路径 | path | 菜单 | 说明 |
|
|
31
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
32
|
+
| add | order-list | order | yaml/order/order-list.yaml | /orders | 进菜单 | 新列表 |
|
|
33
|
+
| update | order-list | order | (同上) | /orders | | 线框图改筛选区 |
|
|
34
|
+
| add | order-edit | order | yaml/order/order-edit.yaml | /orders/:id/edit | hidden | 新编辑页 |
|
|
35
|
+
| rename-id | order-detail → order-view | … | 需迁文件 + 改 sitemap | | | 少见,须用户确认 |
|
|
36
|
+
| deprecate | old-page | | | | 下架 | 用户确认后删 yaml + 从 sitemap 移除 |
|
|
37
|
+
|
|
38
|
+
**update** 不臆造新 page id;**deprecate** 必须用户明确,避免误删。
|
|
39
|
+
|
|
40
|
+
## 2. 改哪些文件(按变更类型)
|
|
41
|
+
|
|
42
|
+
| 变更 | 动作 |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| **add 页面** | `mkdir` 模块目录;新建 yaml;`sitemap.yaml` 增加 `pages` + `menus`;mock 路由表 + mocks 文件 |
|
|
45
|
+
| **update 页面** | 改对应 yaml(结构/字段/交互/文案);若 path 或 id 变则同步 `sitemap.yaml`、检查 `router.push` / 菜单 `pageId` |
|
|
46
|
+
| **update 仅文案/字段** | 只改 yaml;mock 字段变更时改 `mocks/*` 与路由返回形状 |
|
|
47
|
+
| **add 数据源** | yaml 内 `dataSources` + `app/api/data/...` 注册 + mock handler |
|
|
48
|
+
| **样式** | 仅当线框图要求新页面级样式时改 `globals.css` / `login.css` / 皮肤;见 `theme-and-style.md` |
|
|
49
|
+
| **deprecate** | 删 yaml;从 `pages`/`menus` 移除;删 mock 路由项;全局搜 `pageId` / 路径引用 |
|
|
50
|
+
|
|
51
|
+
**禁止**:为增量在仓库根再复制一份 `template/` 覆盖工程。
|
|
52
|
+
|
|
53
|
+
## 3. 与全量流程的差异
|
|
54
|
+
|
|
55
|
+
| 阶段 | 新建工程 | 增量(已有工程) |
|
|
56
|
+
| --- | --- | --- |
|
|
57
|
+
| 脚手架 | 复制 `template/` | **跳过**;仅摸底 |
|
|
58
|
+
| 页面 | 全量清单 N 文件 | 仅 **delta** 行对应文件 |
|
|
59
|
+
| mock | 全表扩展 | 只加/改涉及接口 |
|
|
60
|
+
| 样式 | 全站移植 | 仅受影响页面/令牌 |
|
|
61
|
+
| 验收 | 全站清单 | **变更页全量验** + **抽 1~2 条旧页回归**(见 acceptance-checklist) |
|
|
62
|
+
|
|
63
|
+
## 4. 交叉检查(增量)
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
对每个 add:存在 yaml 且 sitemap.pages 含 id 且 menus 正确
|
|
67
|
+
对每个 update:page.id 未变(除非走 rename 流程)且 validate 通过
|
|
68
|
+
mock:变更页涉及的所有 http 路径在 Network 200
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`npx pactor validate` 仅覆盖改动的 yaml 路径。
|
|
72
|
+
|
|
73
|
+
## 5. 与 `pactor-dsl` 的分工
|
|
74
|
+
|
|
75
|
+
- **单页小改**、无线框图、只改 DSL 语法:可用 **`pactor-dsl`**。
|
|
76
|
+
- **线框图驱动**、含 mock/sitemap/多页联动:用 **本增量流程**(仍属 `pactor-prd`)。
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# 按目录批量生成 DSL 文件与菜单关系
|
|
2
|
+
|
|
3
|
+
`pactor-prd` 在阶段 1 产出 **页面清单** 后,阶段 3 必须 **按清单逐文件创建** YAML,保证「磁盘目录 ↔ 模块 ↔ sitemap ↔ 菜单」一致。
|
|
4
|
+
|
|
5
|
+
## 清单 → 文件映射(核心规则)
|
|
6
|
+
|
|
7
|
+
**一律采用模块分目录(模式 B)**:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
src/server/yaml/
|
|
11
|
+
sitemap.yaml
|
|
12
|
+
common/ # 可选:login、dashboard
|
|
13
|
+
<模块>/ # PRD 模块,kebab-case
|
|
14
|
+
<page-id>.yaml # 一页一文件;page-id = 清单 id = page.id
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| 清单列 | 写入位置 |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| 模块 `user` | 目录 `yaml/user/` |
|
|
20
|
+
| 页面 id `user-list` | 文件 `yaml/user/user-list.yaml` |
|
|
21
|
+
| 路由 `/users` | `sitemap.yaml` → `pages[].path` |
|
|
22
|
+
| 菜单「用户」 | `menus` → `pageId: user-list` |
|
|
23
|
+
|
|
24
|
+
**禁止**:清单 10 页只写 1 个合并 yaml;**禁止** id 与文件名不一致。
|
|
25
|
+
|
|
26
|
+
## 批量创建流程
|
|
27
|
+
|
|
28
|
+
1. **按模块建目录**:对清单中每个 distinct `<模块>` 执行 `mkdir -p src/server/yaml/<模块>`(生成时保持树形与 PRD 模块树一致)。
|
|
29
|
+
2. **按行建文件**:清单每一行 → 一个 `yaml/<模块>/<id>.yaml`;内容类型从线框图判定(列表 / 详情 / 表单),套 `references/page-templates.md`。
|
|
30
|
+
3. **一次更新 sitemap**:
|
|
31
|
+
- `pages`:清单中每一页一条(含 hidden 的详情/编辑)
|
|
32
|
+
- `menus`:仅「进导航」的页进 group;hidden 页带 `activeMenu`
|
|
33
|
+
4. **mock 批量注册**:按 `references/mock-data-routes.md`,每个 http 数据源在 `app/api/data/[...parts]/route.ts` 路由表增加一项;`src/pactor/mocks/` 按域拆分文件。
|
|
34
|
+
5. **交叉检查**(生成后必做):
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
清单行数 N
|
|
38
|
+
= yaml 业务页文件数(不含 sitemap.yaml)
|
|
39
|
+
= sitemap.pages 中业务页条数(含 hidden)
|
|
40
|
+
且 ∀ id: 存在文件 yaml/<模块>/<id>.yaml 且 DSL 内 page.id === id
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 清单模板(复制填充)
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
| # | 模块目录 | page id | 文件路径 | path | 类型 | 菜单 | hidden | activeMenu | P |
|
|
47
|
+
| 1 | provider | provider-list | yaml/provider/provider-list.yaml | /providers | 列表 | 是 | | | P0 |
|
|
48
|
+
| 2 | provider | provider-edit | yaml/provider/provider-edit.yaml | /providers/:id/edit | 表单 | 否 | true | nav-providers | P0 |
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- **P**:P0 必须生成;P2 只登记不建文件(在 SKILL 阶段 1 已约定)。
|
|
52
|
+
- **类型**:决定用 page-templates 哪一节;同一业务域列表+编辑共用表单规范(见 SKILL 红线)。
|
|
53
|
+
|
|
54
|
+
## 参考模块(模板内)
|
|
55
|
+
|
|
56
|
+
复制 `pactor-prd/template/` 后,保留 `yaml/provider/`、`yaml/route/` 作写法样本;新模块 **照同样目录深度** 新增;全站生成完成后删除参考模块及其 mock 路由项。
|
|
57
|
+
|
|
58
|
+
## 已有工程(增量)
|
|
59
|
+
|
|
60
|
+
线框图只增改部分页面时:**不要**复制 `template/`。走 **`incremental-wireframe-delta.md`**(delta 表、只改涉及文件、验收变更页 + 回归)。
|
|
61
|
+
|
|
62
|
+
## 与 `pactor-dsl` 的衔接
|
|
63
|
+
|
|
64
|
+
单页 DSL 语法、组件 props、表达式:读 **`pactor-dsl`** + `pactor-dsl/references/dsl-authoring.md`。
|
|
65
|
+
本文件约束 **全量** 文件与 sitemap 对齐;增量见 **`incremental-wireframe-delta.md`**。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 页面 YAML 模板
|
|
2
2
|
|
|
3
|
-
三类常用页面模板。占位符:`{{kebab-id}}` 页面 id、`{{页面标题}}`、`{{模块名}}`、`{{resource}}` 数据接口名(单段,见 mock-data-routes.md)。DSL 语法细节以 pactor skill 与 packages/ui 当前导出为准。
|
|
3
|
+
三类常用页面模板。占位符:`{{kebab-id}}` 页面 id、`{{页面标题}}`、`{{模块名}}`、`{{resource}}` 数据接口名(单段,见 mock-data-routes.md)。DSL 语法细节以 `pactor-dsl` skill 与 packages/ui 当前导出为准。
|
|
4
4
|
|
|
5
5
|
## 列表页(筛选 + 表格/卡片 + 操作列)
|
|
6
6
|
|
|
@@ -72,7 +72,7 @@ layouts:
|
|
|
72
72
|
|
|
73
73
|
- 页面按 PRD 模块树分目录:`yaml/<模块>/<id>.yaml`(如 `yaml/user/user-list.yaml`);模块目录名用 kebab-case 英文域,按 PRD 模块树划分(如 user / order / report)
|
|
74
74
|
- 页面 id kebab-case,= 文件名(不含 `.yaml`);`pages:` 注册、`menus:` 引用、文件名三者一致
|
|
75
|
-
- 模板自带的 `yaml/pages/*.page.yaml` 平铺写法仅适合页面极少的 demo;模块 ≥2 或页面 >5
|
|
75
|
+
- 模板自带的 `yaml/pages/*.page.yaml` 平铺写法仅适合页面极少的 demo;模块 ≥2 或页面 >5 时一律按模块分目录(模板目录可整体替换)。批量建文件与清单对齐见 **`page-inventory-and-files.md`**;与官方脚手架平铺模式对比见 **`pactor-dsl/references/page-catalog-and-layout.md`**
|
|
76
76
|
- 列表/详情/编辑成组路径:`/projects`、`/projects/:code`、`/projects/:code/edit`、`/projects/new`
|
|
77
77
|
- 详情/编辑页不进菜单(`hidden: true`),用 `activeMenu` 保持列表菜单高亮
|
|
78
78
|
- 菜单图标仅一级菜单配置(目录 group 与「首页」这类独立页面项都要配),用 pactor Icon 白名单 kebab-case 名;二级及以下菜单项一律不配图标
|