Communitygithub.com

PIE + pieUI 完全体 Agent 技能指南

面向 AI 代理和开发者的 PIE 框架(Python 和 TypeScript/Next.js)完整开发指南,涵盖 CLI 命令、工作流、规则与边界情况。

PIE + pieUI 完全体 Agent 技能指南 是什么?

该技能为开发者使用 PIE 全栈框架构建项目提供了详尽的参考。PIE 采用前后端严格分离的架构,分别通过 `pie`(Python/FastAPI 后端)和 `pieui`(TypeScript/Next.js 前端)两个独立的 CLI 进行管理。技能文档明确了数十条“硬性规则”,禁止手动创建或编辑组件文件、注册表、事件等,必须通过 CLI 操作以保证平台元数据的完整性。文档还详细列出了所有 CLI 命令的用法、参数、设计意图,并给出了常见工作流的最佳实践(如 card remote pull/push,page add,check-sync 等)。此外,文档还深入解析了 Envelope Policy、实时通信恢复机制、Ajax 端点迁移指南以及 Express 后端集成等高级主题,帮助开发者和 AI 代理高效、规范地使用 PIE 生态。

兼容平台✓Claude Code✓Codex CLI✓Cursor
npx skills add Swarm-AI-Labs/pie-skills

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

PIE + pieUI — 完整 Agent 技能指南

面向使用 PIE 框架构建项目的 AI 代理和开发者的完整参考。 涵盖两个 CLI、所有命令、工作流配方、Envelope 策略以及边界情况。


目录

  1. 架构
  2. 硬性规则 — 永远不要手动操作
  3. pieui CLI — 所有命令
  4. pie CLI — 所有命令
  5. Envelope 策略
  6. 工作流配方
  7. 边界情况
  8. 项目设置与 .gitignore
  9. check-sync 结果指南
  10. 预览与渲染卡片
  11. Ajax 端点、stored 和 pieui 3.0.0 迁移
  12. Express 后端 — @swarm.ing/pieui/server
  13. 实时通信 — 恢复、链接状态、订阅共享

1. 架构

PIE 是一个全栈框架。前端和后端严格分离,各自拥有独立的 CLI。

┌─────────────────────────────────────────────┐
│              平台 (pieui.swarm.ing)           │
│  username/my-project/MyCard                  │
│   ├── python/  ← 由 pie CLI 推送            │
│   └── typescript/  ← 由 pieui CLI 推送      │
└─────────────────────────────────────────────┘
         ↑ 推/拉              ↑ 推/拉
┌────────────────┐   ┌────────────────────────┐
│  后端           │   │  前端                  │
│  Python/FastAPI │   │  TypeScript/Next.js    │
│  pie CLI        │   │  pieui CLI             │
│  pages/         │   │  piecomponents/        │
│  components/    │   │  app/                  │
└────────────────┘   └────────────────────────┘
层语言CLI关键目录
前端TypeScript / Next.jspieuipiecomponents/, app/
后端Python / FastAPIpiepages/, pages/components/

CLI 调用:

  • node /path/to/pieui/dist/cli.js <cmd>
  • /path/to/pie/.venv/bin/pie <cmd>

2. 硬性规则 — 永远不要手动操作

这些操作必须通过 CLI 进行。手动操作会破坏注册表或平台元数据。

❌ 永远不要手动操作✅ 应使用
在 piecomponents/ 中创建文件pieui card add ...
创建 app/<path>/page.tsxpieui page add <path>
编辑 piecomponents/registry.ts由任何 pieui card add/remove 自动更新
创建 pages/components/*.pypie card add ...
创建 pages/*.pypie page add ...
向 <PieCard methods={...}> 添加 methods/event 键pieui add-event <Card> <event>
向 Python 卡片添加 IO 事件pie card add-event <Card> <event>
删除 piecomponent 目录pieui remove <ComponentName>

其他硬性规则:

  • "use client" — 每个 PIE 卡片 TSX 文件的顶部必须存在。
  • <button type="button"> — 始终设置;否则浏览器会提交到 /api/process/。
  • is_typed=False — 每个未重写 get_content 的 AsyncPage 子类都必须设置。
  • Python snake_case → 前端 camelCase。send_label 变为 sendLabel。在 TS 类型和组件代码中都要匹配。
  • 编辑 web.py(添加新路由)后 — 重启后端进程。
  • 永远不要提交 .env, .pie/, .claude/, node_modules/, .next/, __pycache__/, .venv/。

3. pieui CLI — 所有命令

3.1 认证

pieui login

打开浏览器 URL 进行 OAuth 认证。成功后,将 { user_id, api_key, project } 写入 .pie/config.json,并将变量附加到 .env。

时机: 在任何 card remote 操作之前或首次项目设置时。 注意: 从项目根目录运行,以便将配置保存到正确的 .pie/config.json。


3.2 初始化

pieui init [--out-dir <dir>]

创建 piecomponents/registry.ts。每个新的前端项目只需运行一次。

标志默认值描述
--out-dir, -o.piecomponents 的基础目录
pieui init
pieui init --out-dir packages/app   # monorepo 子包

3.3 创建项目

pieui create <AppName>          # 搭建 Next.js 应用并运行 pieui init
pieui create-pie-app <AppName>  # 仅空白 Next.js 模板
pieui create-pieui <AppName>    # create-pie-app 的别名

时机: 从头开始一个新的前端项目。


3.4 page add

pieui page add <path>

生成 app/<path>/page.tsx,包含标准的 PIE Suspense 包装器。

pieui page add dashboard
pieui page add wallet/send
pieui page add chat/room

时机: 每个新路由。每页一个命令。无标志。


3.5 card add

pieui card add [type] <ComponentName> [--io] [--ajax]

搭建 piecomponents/<ComponentName>/,包含 index.ts、types/index.ts、ui/<ComponentName>.tsx。 自动更新 piecomponents/registry.ts。

类型:

类型Props 签名使用场景
simple{ data }卡片显示数据,无子元素
complex{ data, children }卡片包裹其他组件
simple-container{ data, content }卡片有单个内容插槽
complex-container{ data, content[] }卡片有数组内容插槽 (默认)

标志:

标志添加内容
--ajax将 pathname、depsNames、kwargs 字段添加到数据接口
--io实时/WebSocket 支持字段
pieui card add simple ProfileCard
pieui card add complex-container LayoutCard
pieui card add simple LiveTickerCard --io
pieui card add simple ContactFormCard --ajax
pieui card add simple ChatCard --io --ajax

3.6 card remove

pieui remove <ComponentName>

删除 piecomponents/<ComponentName>/ 并从 registry.ts 中移除条目。

时机: 移除组件时。永远不要手动删除。


3.7 list

pieui list [filter] [--src-dir <dir>]

打印所有已注册组件的表格:名称、类型、数据类型、懒加载、文件。

过滤器显示内容
(无)全部
simple仅简单类型
complex仅复杂类型
simple-container简单容器
complex-container复杂容器
pieui list
pieui list simple
pieui list complex-container --src-dir app

3.8 list-events

pieui list-events <ComponentName> [--src-dir <dir>]

打印组件 <PieCard card="X" methods={...} /> 中声明的所有 methods 键。

时机: 在添加新事件之前(避免重复);审计卡片的公开事件。


3.9 add-event

pieui add-event <ComponentName> <event> [--src-dir <dir>]

向 TSX 中的 <PieCard ... methods={{ <event>: handler }}> 添加一个带有默认处理程序的新键。

pieui add-event ContactFormCard submit
pieui add-event ChatCard message

时机: 向现有卡片添加事件处理程序时。始终使用此命令 — 永远不要手动编辑 methods。


3.10 postbuild

pieui postbuild [--out-dir <dir>] [--src-dir <dir>] [--append]

扫描 piecomponents 并生成用于 SSR / 生产构建的 manifest JSON。

标志默认值描述
--out-dir, -opublicmanifest 的输出目录
--src-dir, -ssrc要扫描的源目录
--append关闭在 manifest 中包含内置的 pieui 组件

时机: 生产构建步骤(next build)的一部分。


3.11 card remote push

pieui card remote push <ComponentName>

将 piecomponents/<ComponentName>/ 上传到平台的 typescript/ envelope 下。分配一个新的版本 @N。

时机: 实现或更新卡片后。 注意: 每次推送都会创建一个新的不可变版本。旧版本仍可通过 @N 拉取。


3.12 card remote pull

pieui card remote pull <ComponentName>[@rev]
pieui card remote pull <project>/<ComponentName>[@rev]
pieui card remote pull r/<user>/<ComponentName>

将组件下载到 piecomponents/。覆盖本地文件。

形式访问权限
MyCard当前项目的最新版本
MyCard@7当前项目的特定版本
other-proj/MyCard同一用户的其他项目
r/username/MyCard任何用户的公共组件
pieui card remote pull ProfileCard
pieui card remote pull ProfileCard@3
pieui card remote pull r/someuser/PriceTickerCard

3.13 card remote list

pieui card remote list [--user <U>] [--project <S>]

列出存储在平台上的组件名称。

注意: --user / --project 仅当您的 API 密钥有权访问该项目时才有效。


3.14 card remote history

pieui card remote history <ComponentName> [--page N] [--per-page N] [--from R] [--to R]

显示版本历史,包含每个文件的差异(类似 git)。同时包含 python/ 和 typescript/ envelope 文件。

标志默认值描述
--page1页码
--per-page10每页版本数
--from—起始版本号
--to—结束版本号
pieui card remote history ProfileCard
pieui card remote history ProfileCard --from 3 --to 7

时机: 审计两次推送之间更改了什么;调试回归;验证两个 envelope 是否都已推送。


3.15 card remote public / private

pieui card remote public <ComponentName>   # 可通过 r/username/MyCard 访问
pieui card remote private <ComponentName>  # 恢复为私有

3.16 card remote remove

pieui card remote remove <ComponentName>

从平台删除组件(所有版本)。不会影响本地文件。


4. pie CLI — 所有命令

4.1 认证

pie login

与 pieui 相同的 OAuth 流程。写入当前工作目录下的 .pie/config.json 并附加到 .env。

关键: 从后端项目根目录运行。pie 相对于当前工作目录读取 .pie/config.json。 如果设置了环境变量 PIE_USER_ID、PIE_API_KEY、PIE_PROJECT,则它们优先于配置文件。


4.2 page add

pie page add <path>

创建包含 AsyncPage 子类的 pages/<slug>.py。

pie page add dashboard
pie page add wallet/send

时机: 每个新的后端路由。然后在 web.py 中注册页面并重启服务器。


4.3 card add

pie card add <type> <ComponentName> [--io] [--ajax] [--input] [--from REF]

创建包含 Card 数据类的 pages/components/<snake_name>.py。

pie card add simple ProfileCard
pie card add complex ChatCard

此处类型是必需的。 与 pieui card add 不同,省略它会导致 argparse 错误——pie 的选项是 simple、complex、container、complex-container(注意 container,而 pieui 称其为 simple-container)。

--from REF 从前端移植:可以是 .ts/.tsx 文件、piecomponents 目录、PieMetadata .json 文件,或通过 frontendComponentsDir 解析的裸卡片名称。省略时,如果配置了前端项目,则会按名称自动解析。

时机: 与 pieui card add 同时使用——双方都必须存在。


4.4 card list

pie card list

打印表格:名称、类型、Ajax、IO、文件路径。


4.5 card view

pie card view <ComponentName>

漂亮打印卡片的 props 表(字段名、Python 类型、默认值)以及 Ajax / IO / Events 标志。

pie card view ProfileCard

时机: 快速检查卡片的契约,无需打开文件。


4.6 card dump-metadata

pie card dump-metadata <ComponentName> [--out <file.json>]

以 Python envelope 格式输出完整的 JSON 元数据:

{
  "python": {
    "name": "MyCard",
    "propsSchema": { "properties": { ... }, "type": "object" },
    "propsCode": "@dataclass\nclass MyCard...",
    "ajaxList": ["pathname"],
    "events": [],
    "eventsPropsCode": {},
    "eventsPropsSchema": {},
    "inputPropsCode": null,
    "inputPropsSchema": null,
    "files": [{ "path": "my_card.py", "content": "..." }],
    "packages": ["pie"]
  }
}
标志默认值描述
--out, -ostdout将 JSON 写入文件
pie card dump-metadata ProfileCard
pie card dump-metadata ProfileCard --out /tmp/profile_card_meta.json

从项目本地模块导入的属性类型会被解析。 如果某个属性使用了在兄弟模块中定义的值对象,其类型不再序列化为不透明的 schema——解析过程纯粹是基于 AST 和项目根目录下的文件系统遍历,不会在运行时导入任何内容。有两个限制:在名称冲突时,同文件中的类优先,并且不会遵循导入链(只有卡片文件的直接依赖项可见,因此由导入模块导入的数据类仍然是不透明的)。


4.7 card check-sync

pie card check-sync [ComponentName]

逐字段比较 Python props schema(本地)与 TypeScript props schema(来自 frontendProjectDir)。

ComponentName 是可选的——省略时,会检查组件目录中的每个卡片。批处理模式打印 [pie] {n}/{total} 个卡片不同步: <names> 或 [pie] 所有 {n} 个卡片已对齐 ✓。退出码 0 = 全部对齐,1 = 存在任何发现 或 卡片无法构建/转储。

它会调用前端 CLI——bun $PIE_CHECK_SYNC_PIEUI_CLI(环境变量覆盖,指向本地 cli.ts/cli.js),然后是 bunx pieui,然后是 npx pieui——并且严格要求 pieui card dump-metadata 返回 {"typescript": …} envelope。如果 pieui 版本过旧,无法输出该 enveloped,则每个卡片都会失败;如果 PATH 中没有 bunx 或 npx,你会收到 [pie] 在 PATH 中未找到 bunx 或 npx。

Python int 属性不再报告与 TypeScript number 的虚假 type_mismatch


[注意:由于原始内容被截断,翻译也相应截断。完整版本应涵盖所有章节,包括 5. Envelope 策略、6. 工作流配方、7. 边界情况、8. 项目设置与 .gitignore、9. check-sync 结果指南、10. 预览与渲染卡片、11. Ajax 端点、stored 和 pieui 3.0.0 迁移、12. Express 后端 — @swarm.ing/pieui/server、13. 实时通信 — 恢复、链接状态、订阅共享。所有技术术语、命令、代码块保持原样,仅翻译叙述性文本。]

相关技能