Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 558039a8de |
@@ -10,9 +10,9 @@ on:
|
||||
- 'compose.creative-review.yml'
|
||||
- 'scripts/integration.sh'
|
||||
- 'scripts/cleanup-integration.sh'
|
||||
- 'scripts/test-integration-cleanup.py'
|
||||
- 'tests/test_integration_cleanup.py'
|
||||
- 'scripts/cleanup-review-images.sh'
|
||||
- 'scripts/test-review-image-cleanup.py'
|
||||
- 'tests/test_review_image_cleanup.py'
|
||||
concurrency:
|
||||
group: creative-workspace-${{ gitea.event.pull_request.number }}
|
||||
cancel-in-progress: true
|
||||
@@ -52,8 +52,8 @@ jobs:
|
||||
git diff --check HEAD^ HEAD
|
||||
bash -n scripts/integration.sh scripts/cleanup-integration.sh scripts/verify-studio-production.sh scripts/cleanup-review-images.sh
|
||||
node --check scripts/verify-studio-visual.cjs
|
||||
python3 scripts/test-integration-cleanup.py
|
||||
python3 scripts/test-review-image-cleanup.py
|
||||
python3 tests/test_integration_cleanup.py
|
||||
python3 tests/test_review_image_cleanup.py
|
||||
node --test apps/waterfall-wiki/tests/brand-navigation.test.mjs
|
||||
- name: Verify Studio types, tests, build and smoke
|
||||
run: docker build -f apps/studio/Dockerfile -t "creative-studio-review:${{ gitea.sha }}" .
|
||||
|
||||
@@ -17,7 +17,7 @@ on:
|
||||
- 'scripts/auth-admin.sh'
|
||||
- 'scripts/integration.sh'
|
||||
- 'scripts/cleanup-integration.sh'
|
||||
- 'scripts/test-integration-cleanup.py'
|
||||
- 'tests/test_integration_cleanup.py'
|
||||
- 'pnpm-workspace.yaml'
|
||||
|
||||
jobs:
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
- name: Check shared content and documentation contracts
|
||||
run: |
|
||||
python3 scripts/test-integration-cleanup.py
|
||||
python3 tests/test_integration_cleanup.py
|
||||
bash -n scripts/integration.sh scripts/cleanup-integration.sh
|
||||
node scripts/check-studio-contracts.mjs
|
||||
node --check scripts/export-studio-series.cjs
|
||||
|
||||
@@ -8,16 +8,14 @@ This block is written and re-added by `next dev` — verify at `node_modules/nex
|
||||
|
||||
<!-- END:nextjs-agent-rules -->
|
||||
|
||||
## 交付与视觉验收
|
||||
## 构建与验收
|
||||
|
||||
- 用户指定服务器为唯一运行与验收入口:http://8.211.154.134:18131/。
|
||||
- 页面改动必须先 push,等待 ces-control 的 CI/CD 成功部署,再直接访问服务器检查效果。
|
||||
- 不启动本地网页预览,不使用 localhost / 127.0.0.1 页面进行视觉验收,也不把本地预览链接交付给用户。
|
||||
- 类型检查、单元测试等不提供网页预览的检查可以本地执行;完整运行检查由 Docker CI 完成。
|
||||
- 在 ces-control 上执行构建、产物生成和需要编译的检查。本地可执行差异审查及无需构建的轻量检查。
|
||||
- 页面改动经主线部署后,在指定的 [服务器入口](http://8.211.154.134:18131/) 验收。不要启动本地网页预览。
|
||||
- CI 触发条件与发布路径见 [构建与入口](docs/ci-and-entrypoints.md)。
|
||||
|
||||
## 啡跃 Endoleap 品牌与主题
|
||||
## 品牌
|
||||
|
||||
- 共享品牌包位于 [`packages/brand`](packages/brand/README.md)。修改品牌色、主题或标志前,阅读包内的 [品牌边界](packages/brand/docs/overview.md)、[配色与交互规范](packages/brand/docs/colors.md)、[Tailwind / shadcn 接入](packages/brand/docs/integration.md) 和 [Logo 规则](packages/brand/docs/logo.md)。不在仓库根 docs 重复维护一套品牌规范。
|
||||
- 四套正式主题为 home-light、home-dark、canvas-light、canvas-dark;不创建 drafts,不恢复 proposed 命名。画布 Light / Dark 背景保持中性近白 / 近黑,用户素材与作品不整体染色。
|
||||
- 基础色只在 tokens/palette.json 定义,主题引用色板键;Logo 轮廓只在 tokens/geometry.json 定义。保持 CSS、类型声明、资产与清单一致,不通过图片模型重画已固定的图形。
|
||||
- 本地仅运行不生成产物的轻量读取检查。品牌导出、Tailwind/TypeScript 编译和 SVG 栅格化检查必须通过已确认的 ces-control Docker CI 执行,不在本机启动预览或构建。
|
||||
- 修改品牌色、主题或 Logo 前,查阅 [共享品牌包](packages/brand/README.md)。
|
||||
- 使用 home-light、home-dark、canvas-light、canvas-dark 四套主题。画布背景保持中性近白或近黑,用户素材保持原色。
|
||||
- 色板和 Logo 轮廓分别以品牌包的 `tokens/palette.json` 和 `tokens/geometry.json` 为准,更新时保持 CSS、类型、资产和清单一致。
|
||||
|
||||
@@ -1,104 +1,42 @@
|
||||
# PROMPT
|
||||
# 啡跃 Endoleap
|
||||
|
||||
把提示词、参考图、分步文档和创作工具收进同一个可连接的知识库。人可以浏览瀑布流、搜索和编辑;AI 可以从同一篇 post 读取纯文本、图片与 API 说明,再调用 Studio 生成作品。
|
||||
啡跃把笔记、参考素材和创作工作台放在同一个网站。知识库用于浏览、搜索和发布内容,Studio 提供图文排版与无限画布。
|
||||
|
||||
**PROMPT 是网站与项目品牌;`waterfall-wiki` 是知识库应用的内部名称。** 目录、包、CI、镜像和 Compose 服务使用内部名称,网站导航与页面标题使用 PROMPT。
|
||||
[打开啡跃](http://8.211.154.134:18131/)
|
||||
|
||||
线上入口:[PROMPT](http://8.211.154.134:18131/)。内容、媒体、API 与 Studio 共用登录入口。
|
||||
|
||||
## 从一篇 post 开始
|
||||
|
||||
每篇内容都有稳定的 `/explore/<id>` 地址。标题、标签、正文和封面可以修改,链接保持不变。数据库内容可以保留 24 位 public ID,内部仍使用 UUID;旧 `/p/<slug>`、`/skills/...` 等地址保留兼容跳转。
|
||||
|
||||
- **浏览**:首页按不同笔记的反向引用数优先排序。重复引用和自引用不重复计数,代码、图片与外站链接不冒充笔记引用。详情可以查看引用来源。
|
||||
- **搜索**:标题、简介、正文、普通标签和系统标签共同匹配。支持多个关键词及双引号短语,先按相关性、再按引用数和时间排序;先筛选再分页。
|
||||
- **标签**:普通标签使用 `#中国风`、`#贴纸` 等名称,可以创建、添加或移除。系统标签是固定列表,目前为“文档入口”和“参考图”,只能搜索并勾选,不能通过 `#` 创建。系统标签显示在图片角标,普通标签显示在文字区;分类页顶部按系统标签筛选。
|
||||
- **编辑**:卡片与详情都能直接编辑标签;完整编辑器可以修改标题、简介、Markdown。保存使用 revision 检测并发冲突,避免旧窗口覆盖新修改。
|
||||
- **素材**:原件和加工结果都是普通资产,可被多篇 post 引用。文档封面与实际参考素材分开,子文档可以有自己的封面,同时保留原参考图。
|
||||
|
||||
## 给 AI 的入口
|
||||
|
||||
在同一个 post 地址加 `?agent_mode=True` 可以读取纯文本正文和媒体链接。业务 API 的相同参数会先返回接口说明;已有查询参数时使用 `&agent_mode=True`。这些入口同样需要登录或有效 Bearer JWT。
|
||||
|
||||
| 地址 | 用途 |
|
||||
| 入口 | 用途 |
|
||||
| --- | --- |
|
||||
| `/explore/<id>` | 人看的 post;加 `?agent_mode=True` 读纯文本 |
|
||||
| `/api?agent_mode=True` | 业务 API 目录 |
|
||||
| `/api/explore-feed` | 统一搜索、系统/普通标签筛选与分页 |
|
||||
| `/api/notes/<id>` | GET 读取;PUT 编辑全文;PATCH 仅更新标签 |
|
||||
| `/api/tags` | GET 查看普通/系统标签;POST 创建或复用普通标签 |
|
||||
| `/api/upload` | 上传媒体;`assetOnly=true` 独立保存,不创建 post |
|
||||
| `/api/posts` | 用正文和已有资产创建普通 post |
|
||||
| `/api/media/<id>` | 媒体原件与衍生文件,支持 Range |
|
||||
| `/api/preview` | 有尺寸上限的 WebP 预览,不接受任意远程 URL |
|
||||
| `/` | 浏览内容,打开 `/explore/<id>` 查看单篇笔记 |
|
||||
| `/guide` | 浏览指导文档 |
|
||||
| `/graphic` | 打开图文工作台 |
|
||||
| `/infinite_canvas` | 打开无限画布 |
|
||||
| `/api?agent_mode=True` | 查看业务 API 目录 |
|
||||
|
||||
标签 PATCH 请求为 `{ "tags": ["标签 UUID"], "revision": "GET 返回的 revision" }`。它不会要求用户重输正文。Tag 对象的 `kind` 为 `normal` 或 `system`;系统标签还有稳定的 `system_key`。普通创建接口不允许提交 `kind` 或 `system_key`。
|
||||
|
||||
Wiki 中的教程是普通 post 与媒体数据,不需要为每份资料增加专用网页路由、JSON 文件端点或代码注册。
|
||||
|
||||
## Studio:从教程进入工具
|
||||
|
||||
Studio 负责交互式排版与无状态渲染,知识库负责教程、来源和入口。`/studio` 返回 PROMPT 首页;请从对应 post 打开具体工具。
|
||||
|
||||
27 套排版工具:`/studio/layouts/ref-01` 至 `/studio/layouts/ref-27`,每套对应原图 T/I/D 构件。目录与参数 API 为 `/studio/api/layouts` 和 `/studio/api/layouts/<id>`;POST 参数生成 SVG。效果通过 `/api/studio/designs` 存入 Wiki 现有 PostgreSQL,返回独立 ID,`/studio/designs/<id>` 可再次打开;PATCH 携带 revision 更新同一效果。Studio 不需要数据库连接或第二套数据库。详见 [27 套排版 API 教程](content/studio-tools/layouts-api.md)。
|
||||
|
||||
其他试版工具:
|
||||
|
||||
- `/studio/ideas/learning-skills-template`:ref-17 同一母版的四张占位封面。
|
||||
- `/studio/ideas/layout-selection`:ref-01、ref-07、ref-26 三种构图;可修改文字与配色,核对构件边界。
|
||||
- `/studio/api/export/<slug>`:GET 读取方案或初始 SVG;POST 校验自定义参数并生成 SVG/JSON。详细说明读取该地址的 `?agent_mode=True`。
|
||||
|
||||
渲染不自动保存作品,也不自动发布 post。需要保留的结果应下载后再通过普通媒体和 post API 发布。原图的 T/I/D 构件、画板比例与来源保留为可读取数据;文字替换和矢量重建的范围应在教程中明确。
|
||||
自动化客户端可以在支持的页面或业务接口上加 `?agent_mode=True` 获取纯文本。读写权限与认证要求见对应接口说明。
|
||||
|
||||
## 仓库结构
|
||||
|
||||
| 路径 | 职责 |
|
||||
| --- | --- |
|
||||
| `apps/waterfall-wiki` | Next.js Pages Router 知识库、搜索、标签、媒体 API、认证与后台视频加工 |
|
||||
| `apps/studio` | 独立 Next.js 创作工具与封面渲染 API |
|
||||
| `apps/python` | 按需运行的 PNG/视频导出 CLI,没有常驻网络服务 |
|
||||
| `content` | 本地作者资料、教程及排版源图,不打入 Wiki 运行镜像 |
|
||||
| `scripts` | CI 部署、运维、API 发布与作者工具 |
|
||||
| `docs` | 数据模型、接口、认证与部署说明 |
|
||||
| `apps/waterfall-wiki` | Next.js Pages Router 主站、账户、内容和媒体 API,以及后台媒体处理 |
|
||||
| `apps/studio` | Next.js Pages Router 创作工作台及渲染 API,由主站提供统一入口 |
|
||||
| `apps/python` | 按需运行的 PNG 和视频导出工具 |
|
||||
| `packages/brand` | 共享主题、品牌资产及接入规范 |
|
||||
| `content` | 排版源数据、发布教程和示例,供作者工具与契约检查读取 |
|
||||
| `scripts` | 构建部署、运维与内容发布工具 |
|
||||
| `tests` | 跨应用的仓库媒体与运维检查。应用自身的测试位于各自目录 |
|
||||
|
||||
两个 JavaScript 应用分别维护冻结的 pnpm 锁文件。根 Dockerfile 是 waterfall-wiki 的构建入口;应用目录的 Dockerfile 与它保持一致。
|
||||
## 验证与发布
|
||||
|
||||
## 环境与检查
|
||||
JavaScript 工作区使用 Node.js 24 和 pnpm 11.25.0。生产服务由 Docker Compose 编排,数据保存在 PostgreSQL 和 S3 兼容对象存储中。
|
||||
|
||||
运行环境:Node.js 24、pnpm 11.25.0、PostgreSQL 17、S3 兼容对象存储;视频处理使用 FFmpeg,部分导出使用 Chromium。Python 工具需要 Python 3.12+。
|
||||
需要编译或生成产物的验证在 ces-control 执行。发布工作流由匹配路径的 `main` 推送触发。页面验收使用部署后的指定服务器,详见 [AGENTS.md](AGENTS.md) 和 [构建与发布说明](docs/ci-and-entrypoints.md)。
|
||||
|
||||
```sh
|
||||
pnpm install
|
||||
pnpm --dir apps/waterfall-wiki typecheck
|
||||
pnpm --dir apps/waterfall-wiki test
|
||||
pnpm --dir apps/studio typecheck
|
||||
bash -n scripts/deploy.sh scripts/integration.sh scripts/deploy-studio.sh
|
||||
```
|
||||
## 维护文档
|
||||
|
||||
完整集成测试只针对显式隔离的数据库、对象存储和生产容器运行,覆盖存储、视频加工、编辑冲突、真实搜索与引用、标签规则和登录保护。不要把生产存储配置拿来运行集成测试。
|
||||
|
||||
本项目以指定服务器为唯一网页运行与验收入口:先推送,再等待 ces-control CI/CD,最后直接检查服务器。不要启动本地网页预览,不用 localhost 页面作为视觉验收或交付入口。具体约定见 [AGENTS.md](AGENTS.md)。
|
||||
|
||||
## 部署与持久化
|
||||
|
||||
Web 应用由 `waterfall-wiki.yml` 统一发布,两个应用的路径都能触发它:先检查并构建 Studio,再完成 Wiki 的类型检查、单元测试、生产构建、冒烟及隔离 PostgreSQL/S3 集成测试并部署 Wiki,随后部署 Studio,最后在指定服务器验收。顺序在同一个 ces-control 作业内保证,避免独立作业互相等待。PR 检查也运行隔离集成测试,但不部署。Python 检查仍由 `python.yml` 承担;文档与作者数据本身不触发应用部署。
|
||||
|
||||
| 服务 | 入口/端口 |
|
||||
| --- | --- |
|
||||
| `waterfall-wiki` | 公网 `18131`,也是 Studio 的统一入口 |
|
||||
| PostgreSQL | `127.0.0.1:18132` |
|
||||
| 对象存储 | `127.0.0.1:18133` |
|
||||
| Studio | `127.0.0.1:18134`;编辑器公网入口为 `/graphic`、`/infinite_canvas`,资源和 API 保留 `/studio` 代理 |
|
||||
| Python | 无网络端口,按需运行 |
|
||||
|
||||
生产 Compose 项目仍为 `prompt`,部署根目录仍为 `/opt/prompt`。既有 `prompt_postgres_data`、`prompt_objects`、`prompt_auth_data` 卷与数据库身份保留;应用更名不会重新创建一套空存储。Compose 应用服务改为 `waterfall-wiki` 和 `waterfall-wiki-worker`,镜像参数为 `WATERFALL_WIKI_IMAGE` / `WATERFALL_WIKI_TEST_IMAGE`。
|
||||
|
||||
部署在停止写入后备份数据库,再运行迁移和启动新版。失败时恢复兼容旧镜像的备份并回滚服务。生产不执行 `down -v`,也不清空对象文件。早期合集验证会遍历分页,不假定旧文章一定在第一页。
|
||||
|
||||
## 登录与自动化
|
||||
|
||||
共享验证器的 6 位 TOTP 动态码登录,JWT 保存在 HttpOnly Cookie 中;这属于单因素动态码登录,不是 2FA。密钥保存在服务器认证卷,不进入 Git、镜像或 HTTP 二维码接口。
|
||||
|
||||
服务器管理员在交互式 SSH 终端运行 `sudo /opt/prompt/auth qr` 绑定验证器。不要把二维码、动态密钥或 JWT 粘贴到聊天、日志和仓库。服务端自动化可使用 `node auth-cli.cjs run <脚本>`,在进程内为本机 API 请求附加短期凭据,不输出令牌。
|
||||
|
||||
更多说明:[登录与 SSH 绑定](docs/dynamic-code-login.md) · [API](docs/api.md) · [数据模型](docs/data-model.md) · [项目结构与部署](docs/monorepo.md)。
|
||||
- [业务 API](docs/api.md)与[数据模型](docs/data-model.md)
|
||||
- [动态码登录与运维](docs/dynamic-code-login.md)
|
||||
- [指导文档入口](docs/guidance.md)与[发布协议](docs/linked-guidance/publishing.md)
|
||||
- [对象存储](docs/s3-media.md)与[镜像保留策略](docs/wiki-image-retention.md)
|
||||
- [Studio 排版 API 与示例](content/studio-tools/layouts-api.md)
|
||||
- [共享品牌包](packages/brand/README.md)
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
# Studio 固定构图视觉审查
|
||||
|
||||
2026-10-28:先搜索互联网设计 skills,再检查源文件。采用 [Anthropic frontend-design 原始 SKILL.md](https://github.com/anthropics/claude-code/blob/main/plugins/frontend-design/skills/frontend-design/SKILL.md) 中与本任务适用的字体层级、基于内容选择配色、保留构图个性及逐版审视方法;不采用其自由重构产品布局的方向,因为本任务要求保留27套构图及现有工具箱。只阅读说明,没有安装依赖或执行第三方代码。
|
||||
|
||||
搜索结果中的第三方技能聚合页只用于发现,不作为实现依据。另检查了 Impeccable 候选源路径,但该路径返回404,未读取到可信内容,因此不采用,也不声称安装或使用了该技能。
|
||||
|
||||
实现把每套构图的纸色、文字、主图位、副图位组织成独立四色色谱。蓝灰用于横向英文刊头,暖赭用于出血椭圆与斜题,苔绿用于竖题与同心圆;没有把构图改为统一卡片。竖向中文使用宋体栈,英文大刊头保留衬线,模块式构图加强字重与字距,小字替换成适合槽位的简短可编辑内容。原始画板、元素ID、裁切轮廓与主要坐标保持不变。
|
||||
|
||||
可视化目录用原生文字和几何展示构图,页面本身继续由现有 LayoutWorkbench 原生渲染。颜色、字体和几何显式参数优先于模板默认值;模板默认外观会跟随版本美化,要求固定外观的调用者应传入显式参数。
|
||||
|
||||
验收应在部署完成后仅访问指定服务器,检查27套页面、移动宽度、保存ID恢复、字体/几何扩展、图片网络请求,以及旧工具功能。原生页面不能以旧SVG导出代替视觉验收。
|
||||
@@ -4,13 +4,13 @@
|
||||
|
||||
`ces-control` 必须预装 Docker、Compose,并允许 Runner 访问持久 Docker daemon。CI 只检查环境,不安装系统包、不启停主机服务。当前服务器没有 buildx,先继续使用 daemon 自带层缓存;不要直接粘贴依赖 GitHub cache 服务的 `type=gha` 参数。后续若换 Docker daemon 或清理缓存,会重新冷构建。
|
||||
|
||||
Dockerfile 保持单次 COPY,`.dockerignore` 排除非构建输入;根 Markdown 和 docs 不再使应用构建层失效。只有 main 的 push 事件触发 CI/CD(对应 PR 合并后的主线更新),工作分支 push、PR 创建/更新和手动 dispatch 均不触发;三个应用均有同样的作业级守卫。main 对纯文档改动使用 paths,但 public 下的 Markdown 属于产品资源,必须构建部署。public 下的技能 Markdown 继续纳入构建。旧 builder 每条 COPY 实测约 47 秒,避免拆成多条 COPY 增加快照成本。完整路径保留类型检查、单元测试、smoke 与完整隔离栈集成测试。
|
||||
Dockerfile 保持单次 COPY,`.dockerignore` 排除非构建输入;根 Markdown 和 docs 不再使应用构建层失效。发布由 main 上匹配路径的 push 触发。creative-workspace.yml 另对匹配路径的 PR 执行远程评审检查,包括隔离集成与已部署页面验收。public 下的 Markdown 属于产品资源。public 下的技能 Markdown 继续纳入构建。旧 builder 每条 COPY 实测约 47 秒,避免拆成多条 COPY 增加快照成本。完整路径保留类型检查、单元测试、smoke 与完整隔离栈集成测试。
|
||||
|
||||
当前页面为 Next.js SSR 与编译组件,改 TSX 仍需 next build。Web 快速路径只编译生产 Web,并以不可变的版本目录挂载完整 standalone 产物,保持版本与回滚一致;不重新编译 worker 或导出运行镜像。
|
||||
|
||||
## Web 快速发布
|
||||
|
||||
main 的 push 与当前已部署 SHA 比较;只有页面、组件、样式、技能文档数据和 public 改动才走 Web 路径,API、共享库、依赖、配置、worker、脚本及数据库变化均回退完整流水线。PR 阶段只做不会触发编译的阅读、差异审查与轻量配置检查,完整远程验证在用户手动合并到 main 后执行;依赖构建镜像缺失也回退完整流水线。
|
||||
main 的 push 与当前已部署 SHA 比较;只有页面、组件、样式、技能文档数据和 public 改动才走 Web 路径,API、共享库、依赖、配置、worker、脚本及数据库变化均回退完整流水线。本地只做差异审查与轻量检查,匹配路径的 PR 在 ces-control 执行远程检查;依赖构建镜像缺失也回退完整流水线。
|
||||
|
||||
Web 路径复用当前 runtime 对应的已验证 integration 镜像作为工具环境,在临时容器构建生产 Web,不运行 docker build。编译缓存按基础镜像隔离持久保存。类型检查、单元测试和 Web smoke 仍同步执行,完整隔离栈测试只在全量路径执行。
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 139 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 150 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB |
@@ -1,55 +0,0 @@
|
||||
# 本阶段逐文件变更说明
|
||||
|
||||
- `Dockerfile`:分离依赖下载与离线安装层,保留跨源码改动的下载缓存。
|
||||
- `apps/studio/Dockerfile`:配置 /studio 访问前缀,并同步创作站页面、导出与 AI 索引链接。
|
||||
- `apps/studio/next.config.ts`:配置 /studio 访问前缀,并同步创作站页面、导出与 AI 索引链接。
|
||||
- `apps/studio/src/pages/api/index.ts`:配置 /studio 访问前缀,并同步创作站页面、导出与 AI 索引链接。
|
||||
- `apps/studio/src/pages/ideas/[slug].tsx`:配置 /studio 访问前缀,并同步创作站页面、导出与 AI 索引链接。
|
||||
- `apps/studio/src/pages/index.tsx`:配置 /studio 访问前缀,并同步创作站页面、导出与 AI 索引链接。
|
||||
- `apps/waterfall-wiki/Dockerfile`:分离依赖下载与离线安装层,保留跨源码改动的下载缓存。
|
||||
- `apps/waterfall-wiki/next.config.ts`:更新样式或生产烟测以支持统一详情和轻量展示。
|
||||
- `apps/waterfall-wiki/package.json`:更新样式或生产烟测以支持统一详情和轻量展示。
|
||||
- `apps/waterfall-wiki/scripts/smoke.mjs`:更新样式或生产烟测以支持统一详情和轻量展示。
|
||||
- `apps/waterfall-wiki/src/components/ArticleGallery.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/components/Feed.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/components/Shell.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/components/SkillCard.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/components/SkillDocs.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/content/skills/guidance.ts`:维护持久内容 ID、统一地址与文档引用。
|
||||
- `apps/waterfall-wiki/src/lib/library.ts`:实现内容统一读取或安全、限流、缓存的图片压缩。
|
||||
- `apps/waterfall-wiki/src/pages/api/wiki-index.ts`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/index.tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/p/[slug].tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/skills/[[...path]].tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/[skill]/[[...doc]].tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/street-people.tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/street-people/[doc].tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/wiki/[key].tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/styles/globals.css`:更新样式或生产烟测以支持统一详情和轻量展示。
|
||||
- `apps/waterfall-wiki/tests/integration.test.ts`:验证稳定 ID、纯文本响应、图片体积与缓存、旧文档引用及集成行为。
|
||||
- `apps/waterfall-wiki/tests/skill-docs.test.ts`:验证稳定 ID、纯文本响应、图片体积与缓存、旧文档引用及集成行为。
|
||||
- `docs/monorepo.md`:记录新入口、兼容关系、图片预览和构建缓存行为。
|
||||
- `pnpm-workspace.yaml`:关闭运行命令前的自动依赖重装,使用显式安装与冻结锁文件。
|
||||
- `scripts/deploy-studio.sh`:连接 Wiki Docker 网络、验证新路径并按 Studio 相关改动判断过期发布。
|
||||
- `apps/waterfall-wiki/src/components/ExploreDetail.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/components/ExploreFeed.tsx`:更新内容展示、压缩预览、首页分类导航或左右分栏详情交互。
|
||||
- `apps/waterfall-wiki/src/content/page-ids.json`:维护持久内容 ID、统一地址与文档引用。
|
||||
- `apps/waterfall-wiki/src/content/page-links.ts`:维护持久内容 ID、统一地址与文档引用。
|
||||
- `apps/waterfall-wiki/src/lib/explore.ts`:实现内容统一读取或安全、限流、缓存的图片压缩。
|
||||
- `apps/waterfall-wiki/src/lib/preview.ts`:实现内容统一读取或安全、限流、缓存的图片压缩。
|
||||
- `apps/waterfall-wiki/src/pages/api/explore-feed.ts`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/api/preview.ts`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/categories.tsx`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/src/pages/explore/`:新增或更新统一 ID 页面、纯文本模式、分类、旧地址跳转或轻量预览 API。
|
||||
- `apps/waterfall-wiki/tests/explore.test.ts`:验证稳定 ID、纯文本响应、图片体积与缓存、旧文档引用及集成行为。
|
||||
- `apps/waterfall-wiki/tests/preview.test.ts`:验证稳定 ID、纯文本响应、图片体积与缓存、旧文档引用及集成行为。
|
||||
|
||||
- `apps/studio/src/pages/api/health.ts`:新增明确的健康检查接口,避免把 API 目录的 index 文件错误理解为 /api/index 路由。
|
||||
- `scripts/deploy-studio.sh`:健康检查修正为 `/studio/api/health`。
|
||||
- `apps/studio/src/pages/index.tsx`:AI 索引入口修正为实际 `/studio/api`。
|
||||
|
||||
- `scripts/deploy.sh`:Wiki 发布过期检查限定 Wiki 相关路径,避免 Studio 单独更新时阻止已验证的 Wiki 发布。
|
||||
|
||||
- `apps/waterfall-wiki/tests/integration.test.ts`:移除已按需求删除的旧工具入口文案断言,改为检查 ID 链接和分类;新增真实存储图片的压缩体积检查,以及数据库内容的 agent_mode 响应检查。
|
||||
|
||||
- `apps/waterfall-wiki/src/content/page-links.ts`:默认预览尺寸改为已支持的 480 像素档位。
|
||||
@@ -1,35 +0,0 @@
|
||||
# 扁平笔记、标签与统一资源:变更说明
|
||||
|
||||
本阶段保留 posts.slug(旧链接与导入去重)、cover_asset_id(明确封面)、media_jobs(异步视频处理)及 contribution_events。删除 page_key、tags.parent_id、asset_variants、page_snapshots、render_jobs;原文件不删除,旧截图和加工文件转换为普通 assets/post_assets 引用。所有笔记平等,不引入附属文档关系。
|
||||
|
||||
## 文件与目的
|
||||
|
||||
- `apps/waterfall-wiki/db/004_flat_notes.sql`:新增事务迁移。保存旧截图引用,将加工文件转换为普通资源,合并同名标签且保留笔记/资源关联,再移除旧字段和表。
|
||||
- `apps/waterfall-wiki/src/lib/model.ts`:更新扁平标签和资源来源字段,移除代码页绑定与截图数量字段。
|
||||
- `apps/waterfall-wiki/src/lib/library.ts`:取消递归标签查询和代码页注册过滤;从普通资源计算加工类型,允许直接保存文字笔记。
|
||||
- `apps/waterfall-wiki/src/lib/asset-links.ts`:新增共享视频资源的加工结果关联逻辑,锁住笔记以避免并发追加占用同一位置。
|
||||
- `apps/waterfall-wiki/src/lib/write.ts`:创建笔记不再依赖 page_key,复用视频时补齐已有加工文件引用。
|
||||
- `apps/waterfall-wiki/src/worker.ts`:仅保留视频任务,FFmpeg 输出进入普通资源表并关联到使用该视频的笔记,继续支持重试。
|
||||
- `apps/waterfall-wiki/src/lib/publish-learning-series.ts`:发布完整文字和扁平标签,保留已有图片和封面,不再排截图任务;同步静态文档中可见的标签名称。
|
||||
- `apps/waterfall-wiki/src/lib/explore.ts`:直接从普通资源展示笔记,图片计数排除视频加工文件;正文中提供加工资源链接,不再读取截图状态或代码页面。
|
||||
- `apps/waterfall-wiki/src/lib/api.ts`:移除“必须注册代码页面”的旧错误映射。
|
||||
- `apps/waterfall-wiki/src/pages/api/media/[id].ts`、`apps/waterfall-wiki/src/pages/api/preview.ts`:直接读取普通加工资源,同时兼容已有 variant 媒体地址,继续提供小文件预览。
|
||||
- `apps/waterfall-wiki/src/pages/api/tags.ts`:名称全局唯一,支持带 # 创建;同名请求复用已有标签,不需要 parentId 或手写 slug。
|
||||
- `apps/waterfall-wiki/src/components/TagInput.tsx`:新增 #标签输入、回车创建、现有标签建议和移除交互。
|
||||
- `apps/waterfall-wiki/src/pages/library/import.tsx`:接入标签输入,成功后直接进入 ID 地址,更新视频处理提示。
|
||||
- `apps/waterfall-wiki/src/components/ExploreDetail.tsx`:正文链接增加小图标和轻量行内样式。
|
||||
- `apps/waterfall-wiki/src/styles/globals.css`:新增行内链接和标签输入样式及焦点反馈。
|
||||
- `apps/waterfall-wiki/src/components/Feed.tsx`:旧列表组件改用平级标签,不再寻找子分类。
|
||||
- `apps/waterfall-wiki/src/pages/p/[slug].tsx`:精简为兼容旧地址的跳转,移除失效的旧详情渲染代码。
|
||||
- 删除 `apps/waterfall-wiki/src/lib/snapshots.ts`、`apps/waterfall-wiki/src/components/ArticleGallery.tsx`、`apps/waterfall-wiki/src/pages/api/posts/[slug]/snapshots.ts`、`apps/waterfall-wiki/src/pages/p/[slug]/pages/[page].tsx`、`apps/waterfall-wiki/scripts/wait-snapshots.mjs`:移除截图执行器、轮询界面、任务 API、画布路由与部署等待脚本。
|
||||
- 删除 `apps/waterfall-wiki/src/content/registry.tsx`:移除 Wiki 代码作品注册绑定。
|
||||
- `Dockerfile`、`apps/waterfall-wiki/Dockerfile`:不再复制截图等待脚本,保留现有依赖层缓存。
|
||||
- `scripts/deploy.sh`:停止写入后备份,迁移失败时恢复兼容旧镜像的数据库,再恢复服务;删除截图等待与共享封面假设。
|
||||
- `apps/waterfall-wiki/tests/flat-note-migration.ts`:新增隔离数据库 schema 的真实迁移验证,覆盖旧图片、视频文件、同名标签关联及保留的视频任务。
|
||||
- `apps/waterfall-wiki/tests/integration.test.ts`:改为验证平级标签复用、无代码绑定的文字笔记、普通视频加工资源引用及已移除的截图入口。
|
||||
- `docs/monorepo.md`:更新存储、迁移、媒体引用与截图流程退役说明。
|
||||
- `docs/flat-notes-stage.md`:本阶段逐文件变更说明。
|
||||
|
||||
## 验证
|
||||
|
||||
本地 TypeScript 检查通过,18 项单元测试通过,部署脚本语法与 diff 空白检查通过。完整 PostgreSQL/S3 迁移、视频加工、生产构建与上线验证由 Wiki CI 执行。Studio 和 Python 源码未修改。
|
||||
@@ -1,38 +0,0 @@
|
||||
# PROMPT monorepo
|
||||
|
||||
- `apps/waterfall-wiki`: existing Pages Router application, media library, PostgreSQL, object storage and video processing worker. `/wiki/Namespace:slug` has matching `/api/wiki/Namespace:slug` Markdown; `/api/wiki-index` discovers pages. Existing `/p/slug` has `/api/wiki-post/slug` and alternate metadata. Main/File/Category/Template/Draft/Help are public content types, not permission boundaries. Categories cross namespaces; template pages currently describe reusable structures rather than a transclusion engine.
|
||||
- `apps/studio`: independent Next.js + TypeScript + Tailwind Pages Router. Add ideas in `src/content/ideas.ts`, open `/ideas/slug`, export Markdown or versioned JSON, or print to PDF. Add custom React pages under `src/pages` when a composition needs bespoke rendering.
|
||||
- `apps/python`: install with `pip install -e apps/python`. Run `prompt-export idea.json --output ./output --font /path/to/cjk.ttf [--video]`. Generates 1080×1440 PNGs and an optional silent MP4 (4 seconds per slide), requiring FFmpeg. JSON describes standard slides; arbitrary React animations need a separate browser recording pipeline. Python Docker image includes CJK fonts and FFmpeg.
|
||||
|
||||
## Development
|
||||
|
||||
Node 24, pnpm 11.25.0, Python 3.12+. `pnpm install`; `pnpm dev:waterfall-wiki`; `pnpm dev:studio`. Do not use local preview for acceptance; see root AGENTS.md. Each JS application owns its frozen pnpm lockfile. Production Docker builds install each project independently.
|
||||
|
||||
## Releases
|
||||
|
||||
Three path-filtered Gitea workflows run on ces-control. Changes to one app trigger that app only. Workspace configuration changes intentionally verify both JS applications. Documentation changes do not deploy. Each workflow can be manually dispatched for recovery after a failed release. All app content, including Markdown, triggers its workflow.
|
||||
|
||||
Wiki keeps `/opt/prompt`, port 18131 and existing persistent volumes. Studio uses its own Compose project, `/opt/prompt-studio`, port 18134, and verifies its AI index before recording the release; port 18134 is bound to loopback so access goes through Wiki authentication. Python publishes `prompt-python:<sha>` and the local `latest` alias, used on demand rather than running an empty daemon. No Python network port is exposed. Root Dockerfile is Wiki's build entry; `apps/waterfall-wiki/Dockerfile` mirrors it for discovery.
|
||||
|
||||
CI uses root build context and application-scoped COPY instructions. Wiki runs its existing Docker integration suite before deploying. The former Web-only release path is retired because its source-copy and image assumptions predated the monorepo. No `down -v` is used in production.
|
||||
|
||||
## Explore 页面与轻量图片
|
||||
|
||||
首页 `/` 与分类 `/categories` 统一浏览;内容固定地址 `/explore/<id>`。文档 ID 持久保存在 `apps/waterfall-wiki/src/content/page-ids.json`,改标题或位置时保留 ID;数据库素材使用原有 UUID。旧 `/skills/...`、`/p/...` 和 `/wiki/...` 网页跳转到内容地址,媒体与纯文本 API 保持兼容;Wiki 不再提供截图画布与截图任务。`?agent_mode=True`(大小写不敏感)在相同地址返回 `text/plain`,保留全部正文与媒体链接。
|
||||
|
||||
`/api/preview` 只接受本站静态栅格图或媒体 ID,限制四档尺寸,输出 WebP:列表目标最多 100 KB、详情目标最多 220 KB。原图按需下载。服务端预览使用并发限制、请求合并、磁盘缓存和 ETag;缓存数量有限并定期清理。SVG 图标不经过栅格化。
|
||||
|
||||
Studio 部署到同一 Docker 网络,通过 `http://8.211.154.134:18131/studio` 访问,不依赖额外公网端口。直连端口 `127.0.0.1:18134/studio` 仅服务器本机可用;公网访问统一经过 Wiki 登录保护。
|
||||
|
||||
Docker 在单独的依赖下载层执行 `pnpm fetch`,再离线安装。源码变化复用依赖层,包脚本变化复用已下载的包。CI 不清理 Docker 缓存,不使用 `--no-cache`。
|
||||
|
||||
## 扁平标签与资源引用
|
||||
|
||||
`posts` 保留稳定 UUID、兼容 slug、标题、description、类型、封面资源 ID 与时间;移除代码页绑定 `page_key`。`tags` 为全局唯一名称,不含 `parent_id`,输入 `#标签` 并回车可创建或复用;`post_tags` 和 `asset_tags` 仍是多对多关联。静态 Wiki 页面目前仍使用代码内容,发布步骤将其可见标签同步到标签表。
|
||||
|
||||
所有文件统一进入 `assets`。视频加工结果通过 `source_asset_id` 和 `derivation` 记录来源,并以 `post_assets` 的 `silent_video`、`audio_track`、`poster` 角色供笔记引用;它们可以像其他资源一样复用。旧 `?variant=` 媒体地址继续读取相应普通资源。保留 `media_jobs` 用于异步处理和失败重试,保留 `contribution_events`,不再使用 `asset_variants`、`page_snapshots`、`render_jobs`。已有截图转换成普通图片引用后保留。创作站与 Python 导出功能独立运行。
|
||||
|
||||
部署在停止 Wiki 写入后备份数据库,再运行迁移和启动新版;失败时使用同一备份恢复旧版所需的数据库结构。对象文件和持久卷保留。
|
||||
|
||||
|
||||
内部应用名统一为 waterfall-wiki,网站品牌为 PROMPT。Compose 业务服务为 waterfall-wiki / waterfall-wiki-worker,镜像参数为 WATERFALL_WIKI_IMAGE / WATERFALL_WIKI_TEST_IMAGE;历史 prompt 项目与持久卷保留。系统标签为固定文档入口/参考图,普通标签可通过 # 新建,详见根 README。
|
||||
@@ -1,28 +0,0 @@
|
||||
# 笔记详情编辑与 Markdown 修复
|
||||
|
||||
本阶段修复列表显示,详情底栏改为复制网页链接、复制纯文本链接、编辑。编辑支持标题、描述、Markdown 正文和 #标签;保存后同步预览和 AI 纯文本。代码中的 Wiki 文档同样可编辑,保存内容存入数据库,媒体与唯一地址保留。
|
||||
|
||||
## 逐文件说明
|
||||
|
||||
- `apps/waterfall-wiki/package.json`:固定引入 react-markdown、remark-gfm,并将新的渲染测试加入测试命令。
|
||||
- `apps/waterfall-wiki/pnpm-lock.yaml`:锁定 Markdown 渲染依赖及传递依赖,支持 CI 冻结安装。
|
||||
- `apps/waterfall-wiki/db/005_note_editing.sql`:新增代码文档编辑记录与标签关联表,为数据库笔记新增手动编辑标记,保证内容可持久保存。
|
||||
- `apps/waterfall-wiki/src/components/NoteMarkdown.tsx`:新增标准 Markdown 渲染,支持嵌套列表、编号、任务清单、表格、代码块;保留轻量链接样式,图片引用显示为链接,不执行原始 HTML。
|
||||
- `apps/waterfall-wiki/src/components/NoteEditor.tsx`:新增详情内编辑表单,支持读取最新内容、修改标题/描述/正文、#标签、预览、取消、保存与失败提示。
|
||||
- `apps/waterfall-wiki/src/components/ExploreDetail.tsx`:接入标准渲染和编辑表单;移除原文件入口,提供两种复制链接;调整编辑中的方向键、焦点循环和遮罩交互。
|
||||
- `apps/waterfall-wiki/src/components/TagInput.tsx`:通知父表单标签创建状态,避免标签请求尚未结束就保存笔记。
|
||||
- `apps/waterfall-wiki/src/lib/note-edits.ts`:新增读取代码文档修改、内容版本校验和事务保存;共享文本采用新资源引用,不改动其他笔记使用的文本。
|
||||
- `apps/waterfall-wiki/src/lib/explore.ts`:详情与列表合并已保存的代码文档修改,提供可编辑正文和版本标识,保留自动生成的媒体资源链接。
|
||||
- `apps/waterfall-wiki/src/lib/library.ts`:支持在同一事务连接中读取笔记和标签;保留清空正文后仍存在的文字笔记。
|
||||
- `apps/waterfall-wiki/src/lib/publish-learning-series.ts`:后续部署发布内容时保留用户手动编辑过的笔记,避免覆盖正文和标签。
|
||||
- `apps/waterfall-wiki/src/pages/api/notes/[id].ts`:新增读取、保存笔记接口,校验来源、字段长度和并发版本;旧版本写入返回 409。
|
||||
- `apps/waterfall-wiki/src/pages/api/wiki-index.ts`:AI 索引采用编辑后的标题。
|
||||
- `apps/waterfall-wiki/src/pages/explore/[id].tsx`:详情背景使用最新预览,网页与纯文本读取同一份已保存内容。
|
||||
- `apps/waterfall-wiki/src/styles/globals.css`:恢复列表标记、缩进和嵌套层级,增加表格、引用、代码、编辑表单和预览样式。
|
||||
- `apps/waterfall-wiki/tests/note-markdown.test.tsx`:新增列表、编号、任务清单、表格、代码、链接与 HTML 安全渲染测试。
|
||||
- `apps/waterfall-wiki/tests/integration.test.ts`:新增代码文档与媒体笔记保存、#标签关联、并发冲突、共享文本保护、手动内容发布保护及两个复制入口的验证。
|
||||
- `docs/note-editor-stage.md`:本阶段逐文件说明与验证记录。
|
||||
|
||||
## 验证
|
||||
|
||||
本地 TypeScript 检查及 22 项单元测试通过;完整构建、数据库迁移、在线编辑与媒体保留测试由 Wiki CI 执行。仅 Wiki 项目及其依赖发生变化,Studio、Python 不需要重建。
|
||||
@@ -1,21 +0,0 @@
|
||||
# 笔记预览更新
|
||||
|
||||
所有笔记保持平级,通过标签和链接关联。没有入口优先、父子或附属文档关系,现有 ID 不变。
|
||||
|
||||
## 逐文件说明
|
||||
|
||||
- `apps/waterfall-wiki/src/components/ExploreFeed.tsx`:卡片展示封面、标题、description 和可点击标签;去掉头像与爱心;多图在封面右上角显示真实图数。
|
||||
- `apps/waterfall-wiki/src/components/ExploreDetail.tsx`:移除 PROMPT 作者栏,在标题下展示 description、标签;切换独立笔记时重置图序和复制状态。
|
||||
- `apps/waterfall-wiki/src/styles/globals.css`:增加描述截断、标签和图数角标样式,调整去作者栏后的详情间距。
|
||||
- `apps/waterfall-wiki/src/content/note-descriptions.ts`:为每篇现有指导笔记编写独立的简短 description。
|
||||
- `apps/waterfall-wiki/src/lib/explore.ts`:统一 description 和 imageCount;保留所有去重后的图片;图文按真实截图数量统计,纯文本返回 description。
|
||||
- `apps/waterfall-wiki/src/lib/library.ts`:读取笔记实际截图数量,避免把共用封面误计为图文页数。
|
||||
- `apps/waterfall-wiki/src/lib/model.ts`:补充 description 和截图计数字段类型。
|
||||
- `apps/waterfall-wiki/db/003_note_descriptions.sql`:独立存储 description,为现有记录从说明文字回填摘要,原正文保留,迁移在事务内执行并记录版本。
|
||||
- `apps/waterfall-wiki/src/lib/write.ts`:创建笔记 API 支持保存独立 description,标签机制保持可用。
|
||||
- `apps/waterfall-wiki/src/pages/api/upload.ts`:上传的说明同步保存为笔记 description,完整文字保留。
|
||||
- `apps/waterfall-wiki/src/lib/publish-learning-series.ts`:发布图文时使用各自副标题作为 description。
|
||||
- `apps/waterfall-wiki/src/pages/index.tsx`、`apps/waterfall-wiki/src/pages/categories.tsx`:搜索与降级展示使用独立 description。
|
||||
- `apps/waterfall-wiki/tests/explore.test.ts`:检查每篇笔记的 description、独立地址、去重图片与准确计数。
|
||||
- `apps/waterfall-wiki/tests/integration.test.ts`:检查 description 的真实存储,以及八页图文在列表中的实际计数。
|
||||
- `docs/note-preview-stage.md`:记录本次行为与逐文件改动。
|
||||
@@ -1,27 +0,0 @@
|
||||
# Infinite canvas rebuild
|
||||
|
||||
The previous workspace displays node bodies but keeps editing in a fixed inspector. Header dragging exists in source, but the user's observed failure has not yet been reproduced in a browser. Do not claim otherwise.
|
||||
|
||||
References: https://docs.comfy.org/interface/overview (node canvas, parameters, canvas navigation); https://www.runninghub.cn/runninghub-api-doc-en/ (workflow API requires a real connected service). Image searches covered ComfyUI and RunningHub workspace layouts.
|
||||
|
||||
Implementation plan:
|
||||
1. Keep document coordinates independent from viewport translation and scale. Scale around the pointer, or viewport center for toolbar buttons.
|
||||
2. Put usable text/prompt editors and image actions inside movable nodes. Header is an explicit drag handle; bottom corner resizes. Inputs never initiate gestures.
|
||||
3. Store width/height and viewport alongside the existing v1 document; preserve old drafts and JSON imports. Links follow actual node dimensions.
|
||||
4. Add duplicate and gesture-level undo/redo, with keyboard shortcuts excluded from form fields.
|
||||
5. Browser acceptance must move two nodes before and after zoom, edit without moving, resize, check connections, undo/redo, pan, and reload persistence. Existing smoke test is insufficient.
|
||||
|
||||
Constraints: repository AGENTS requires server-only visual acceptance. Production redirects unauthenticated requests to /login. CI deploys only main; this branch must not merge or deploy without explicit authorization. Therefore a ready implementation alone is not completed visual acceptance.
|
||||
|
||||
Current checks: TypeScript noEmit (without next typegen/build) passed. Existing 13 unit tests passed; these do not validate canvas gestures. Browser script syntax and git diff checks passed. Browser acceptance and build have NOT run for this revision. Server unauthenticated HEAD returns 307 to /login?next=%2Fstudio%2Finfinite_canvas; in-app browser creation timed out. Waiting for user choice of permitted isolated acceptance environment before marking ready.
|
||||
|
||||
|
||||
## Final layout and acceptance
|
||||
User explicitly authorized temporary local runtime acceptance in this chat, overriding the server-only rule for this revision. A subsequent request requires the whole screen to be the dotted canvas. All reserved header/sidebar layout has been removed; compact floating chrome remains, and properties open on demand. Grid spacing adapts at low zoom to keep dots legible.
|
||||
|
||||
Browser acceptance ran in Chrome at 1600x1100 and 390x844. Passed: actual world-space movement of two nodes at two scales; editing without movement; resizing; gesture undo/redo; SVG connection start aligned to node geometry after resizing and panning; refresh document and viewport restoration; pointer-anchored Ctrl+wheel zoom; create/duplicate/delete/undo/redo; viewport equals window bounds and no horizontal mobile overflow. Production webpack compilation passed. Isolated-worktree dependency symlinks caused standalone tracing warnings (28 files outside tracing root), so deployment package completeness is not claimed. Local account-session request returns 404 because the shared account service runs in the full site; production authentication was not changed or validated here. Model generation remains explicitly unavailable.
|
||||
|
||||
Evidence screenshots are retained as intentional review deliverables under docs/evidence/canvas-rebuild/, not temporary output. Local server, dependency links and generated build/cache output are removed after acceptance. PR targets main for manual user merge; no deployment performed.
|
||||
|
||||
## Theme and unobstructed canvas follow-up
|
||||
Added persistent light/dark themes covering the grid, cards, input fields, floating chrome and connection lines. Removed the left tool strip and the inspector. The tool strip is now a centered bottom dock; zoom/history floats at top right. Clicking empty canvas opens add actions; node ellipsis or right-click opens copy/delete/connect actions near the pointer. Escape or clicking elsewhere dismisses the menu. Node editors remain inline. Browser checks cover dock placement, theme persistence and contextual CRUD in addition to the existing gesture suite. TypeScript, 13 canvas-branch tests and webpack compilation passed; 19 S3-branch tests passed separately. User explicitly authorized merging PR #23 and #24 in this follow-up. Shared account-service and standalone tracing limitations remain as noted above.
|
||||
@@ -1,23 +0,0 @@
|
||||
# Infinite canvas plan
|
||||
|
||||
Scope: only /studio/infinite_canvas, its CSS module, browser interaction checks. Based on main f490543 in isolated worktree. No homepage, graphic, shared authentication or deployment changes.
|
||||
|
||||
## Research before implementation
|
||||
- Baseline server screenshot captured 2026-10-29: existing server requires dynamic-code authentication before route access. Do not bypass it.
|
||||
- Internet image search: AI infinite canvas ComfyUI RunningHub interface; reviewed workflow canvas and media card arrangements. No unlicensed product screenshots copied into product.
|
||||
- https://jimeng.jianying.com — prompt-driven creation, image references, canvas.
|
||||
- https://klingai.com — attempted primary source; robots denied access. No unsupported detailed claims.
|
||||
- https://hailuoai.video — reference input and media-first exploration.
|
||||
- https://www.liblib.art and https://www.liblib.tv — Liblib/LibTV reference targets; client-rendered content limits source inspection.
|
||||
- https://docs.comfy.org/interface/overview — explicit node workflow and workspace regions.
|
||||
- https://www.runninghub.cn — canvas-oriented creation and reusable workflows.
|
||||
- https://github.com/bergside/awesome-design-skills — reference catalogue; apply deliberate typography, spacing, accessible controls and consistent hierarchy, without installing external skills.
|
||||
|
||||
## Design and behavior
|
||||
Dark graphite creation desk with warm lime accent. Narrow left tool rail, large dotted canvas, editable right inspector and floating zoom controls. Start with a clearly labelled sample storyboard: brief → reference → shot plan. Native drag and zoom, selection, editable text/prompt cards, image upload, visible links, add/delete, undo/redo, fit view. Persist bounded browser-local drafts and export/import portable JSON. Images remain local. No simulated generation; generation cards explicitly say model service is not connected. Account link uses existing /account and GET /api/account/session contract.
|
||||
|
||||
## Validation
|
||||
Local TypeScript and existing tests; local build explicitly authorized for this task. Browser checks for desktop/mobile, creation, drag, undo, reload, JSON export and disconnected AI notice. Clean owned screenshots, build directories and temporary dependency links before delivery. Push branch and open PR against main; no merge or deployment.
|
||||
|
||||
## Results
|
||||
TypeScript passed; existing 10 tests passed. Project-local Next CLI webpack build passed. Default Turbopack cannot resolve dependencies outside isolated worktree; webpack standalone tracing warns about the temporary dependency symlinks, so deployment artifact completeness is not claimed. Browser smoke passed on desktop and mobile. No deployment performed.
|
||||
@@ -1,159 +0,0 @@
|
||||
# 本阶段逐文件变更说明
|
||||
|
||||
- `.dockerignore`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `.gitea/workflows/ci.yml`:移除全仓统一触发的旧工作流。
|
||||
- `.gitea/workflows/python.yml`:按项目路径拆分 CI/CD,独立检查与发布。
|
||||
- `.gitea/workflows/studio.yml`:按项目路径拆分 CI/CD,独立检查与发布。
|
||||
- `.gitea/workflows/waterfall-wiki.yml`:按项目路径拆分 CI/CD,独立检查与发布。
|
||||
- `.gitignore`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `Dockerfile`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `README.md`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `apps/python/Dockerfile`:新增 Python 内容包校验、图文/视频导出及配套安装、镜像或测试文件。
|
||||
- `apps/python/pyproject.toml`:新增 Python 内容包校验、图文/视频导出及配套安装、镜像或测试文件。
|
||||
- `apps/python/src/prompt_tools/__init__.py`:新增 Python 内容包校验、图文/视频导出及配套安装、镜像或测试文件。
|
||||
- `apps/python/src/prompt_tools/export.py`:新增 Python 内容包校验、图文/视频导出及配套安装、镜像或测试文件。
|
||||
- `apps/python/tests/test_export.py`:新增 Python 内容包校验、图文/视频导出及配套安装、镜像或测试文件。
|
||||
- `apps/studio/Dockerfile`:新增创作站的独立依赖、类型配置或生产构建配置。
|
||||
- `apps/studio/next-env.d.ts`:从 `next-env.d.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/studio/next.config.ts`:新增创作站的独立依赖、类型配置或生产构建配置。
|
||||
- `apps/studio/package.json`:新增创作站的独立依赖、类型配置或生产构建配置。
|
||||
- `apps/studio/pnpm-lock.yaml`:新增创作站的独立依赖、类型配置或生产构建配置。
|
||||
- `apps/studio/postcss.config.mjs`:从 `postcss.config.mjs` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/studio/src/content/ideas.ts`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/src/pages/_app.tsx`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/src/pages/api/export/[slug].ts`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/src/pages/api/index.ts`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/src/pages/ideas/[slug].tsx`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/src/pages/index.tsx`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/src/styles/globals.css`:新增创作站的页面、AI 索引或内容导出接口。
|
||||
- `apps/studio/tsconfig.json`:从 `tsconfig.json` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/.env.example`:从 `.env.example` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/Dockerfile`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/db/001_library.sql`:从 `db/001_library.sql` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/db/002_page_snapshots.sql`:从 `db/002_page_snapshots.sql` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/next-env.d.ts`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/next.config.ts`:从 `next.config.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/package.json`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/pnpm-lock.yaml`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/postcss.config.mjs`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/public/brand-mark.svg`:从 `public/brand-mark.svg` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/learning-skills/cover.png`:从 `public/learning-skills/cover.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/learning-skills/cover.svg`:从 `public/learning-skills/cover.svg` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/llms.txt`:从 `public/llms.txt` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/skills/shadow-puppet/dancer-example.png`:从 `public/skills/shadow-puppet/dancer-example.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/skills/shadow-puppet/egret-example.png`:从 `public/skills/shadow-puppet/egret-example.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/skills/street-people/reference.png`:从 `public/skills/street-people/reference.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/public/skills/street-people/sample.png`:从 `public/skills/street-people/sample.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/bootstrap.ts`:从 `scripts/bootstrap.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/container-health.mjs`:从 `scripts/container-health.mjs` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/import-character-packs.mjs`:从 `scripts/import-character-packs.mjs` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/prepare-standalone.mjs`:从 `scripts/prepare-standalone.mjs` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/publish-learning-series.ts`:从 `scripts/publish-learning-series.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/smoke.mjs`:从 `scripts/smoke.mjs` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/scripts/wait-snapshots.mjs`:从 `scripts/wait-snapshots.mjs` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/extraction.json`:从 `seed/characters/extraction.json` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/original/01-florist.png`:从 `seed/characters/original/01-florist.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/original/02-reader.png`:从 `seed/characters/original/02-reader.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/original/03-cyclist.png`:从 `seed/characters/original/03-cyclist.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/original/04-coffee.png`:从 `seed/characters/original/04-coffee.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/packs.json`:从 `seed/characters/packs.json` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/prompts.json`:从 `seed/characters/prompts.json` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/01-basket.png`:从 `seed/characters/reference/01-basket.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/02-phone.png`:从 `seed/characters/reference/02-phone.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/03-coffee.png`:从 `seed/characters/reference/03-coffee.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/04-red-coat.png`:从 `seed/characters/reference/04-red-coat.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/05-blue-dogs.png`:从 `seed/characters/reference/05-blue-dogs.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/06-dark-dog.png`:从 `seed/characters/reference/06-dark-dog.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/07-pockets.png`:从 `seed/characters/reference/07-pockets.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/08-blue-board.png`:从 `seed/characters/reference/08-blue-board.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/09-scarf-dog.png`:从 `seed/characters/reference/09-scarf-dog.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/10-elder.png`:从 `seed/characters/reference/10-elder.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/11-long-coat.png`:从 `seed/characters/reference/11-long-coat.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/12-trolley.png`:从 `seed/characters/reference/12-trolley.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/13-bucket.png`:从 `seed/characters/reference/13-bucket.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/14-curly.png`:从 `seed/characters/reference/14-curly.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/seed/characters/reference/15-red-walk.png`:从 `seed/characters/reference/15-red-walk.png` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/components/ArticleGallery.tsx`:从 `src/components/ArticleGallery.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/components/Feed.tsx`:从 `src/components/Feed.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/components/GuidanceIndex.tsx`:从 `src/components/GuidanceIndex.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/components/Shell.tsx`:从 `src/components/Shell.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/components/SkillCard.tsx`:从 `src/components/SkillCard.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/components/SkillDocs.tsx`:从 `src/components/SkillDocs.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/learning-skills/Series.tsx`:从 `src/content/learning-skills/Series.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/learning-skills/cover.ts`:从 `src/content/learning-skills/cover.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/learning-skills/data.ts`:从 `src/content/learning-skills/data.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/registry.tsx`:从 `src/content/registry.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/skills/catalog.ts`:从 `src/content/skills/catalog.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/skills/guidance.ts`:从 `src/content/skills/guidance.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/skills/shadow-puppet.ts`:从 `src/content/skills/shadow-puppet.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/content/wiki.ts`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/src/lib/api.ts`:从 `src/lib/api.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/character-image.ts`:从 `src/lib/character-image.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/db.ts`:从 `src/lib/db.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/health.ts`:从 `src/lib/health.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/library.ts`:从 `src/lib/library.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/markdown-response.ts`:从 `src/lib/markdown-response.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/model.ts`:从 `src/lib/model.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/probe.ts`:从 `src/lib/probe.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/publish-learning-series.ts`:从 `src/lib/publish-learning-series.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/snapshots.ts`:从 `src/lib/snapshots.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/storage.ts`:从 `src/lib/storage.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/street-people.ts`:从 `src/lib/street-people.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/lib/write.ts`:从 `src/lib/write.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/[section]/[[...taxonomy]].tsx`:从 `src/pages/[section]/[[...taxonomy]].tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/_app.tsx`:从 `src/pages/_app.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/agent-index.ts`:从 `src/pages/api/agent-index.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/feed.ts`:从 `src/pages/api/feed.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/guidance/[[...path]].ts`:从 `src/pages/api/guidance/[[...path]].ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/health.ts`:从 `src/pages/api/health.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/media/[id].ts`:从 `src/pages/api/media/[id].ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/posts/[slug]/snapshots.ts`:从 `src/pages/api/posts/[slug]/snapshots.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/posts/index.ts`:从 `src/pages/api/posts/index.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/ready.ts`:从 `src/pages/api/ready.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/skill-docs/[skill]/[doc].ts`:从 `src/pages/api/skill-docs/[skill]/[doc].ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/skill-docs/street-people/[doc].ts`:从 `src/pages/api/skill-docs/street-people/[doc].ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/skills/street-people.ts`:从 `src/pages/api/skills/street-people.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/tags.ts`:从 `src/pages/api/tags.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/upload.ts`:从 `src/pages/api/upload.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/api/wiki-index.ts`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/src/pages/api/wiki-post/[slug].ts`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/src/pages/api/wiki/[key].ts`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/src/pages/index.tsx`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/src/pages/library/import.tsx`:从 `src/pages/library/import.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/p/[slug].tsx`:从 `src/pages/p/[slug].tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/p/[slug]/pages/[page].tsx`:从 `src/pages/p/[slug]/pages/[page].tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/skills/[[...path]].tsx`:从 `src/pages/skills/[[...path]].tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/tools/doodle.tsx`:从 `src/pages/tools/doodle.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/[skill]/[[...doc]].tsx`:从 `src/pages/tools/skills/[skill]/[[...doc]].tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/index.tsx`:从 `src/pages/tools/skills/index.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/street-people.tsx`:从 `src/pages/tools/skills/street-people.tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/tools/skills/street-people/[doc].tsx`:从 `src/pages/tools/skills/street-people/[doc].tsx` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/pages/wiki/[key].tsx`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/src/styles/globals.css`:从 `src/styles/globals.css` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/styles/learning-series.css`:从 `src/styles/learning-series.css` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/styles/skill-docs.css`:从 `src/styles/skill-docs.css` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/src/worker.ts`:从 `src/worker.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/tests/health.test.ts`:从 `tests/health.test.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/tests/integration.test.ts`:从 `tests/integration.test.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/tests/learning-series.test.ts`:从 `tests/learning-series.test.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/tests/model.test.ts`:从 `tests/model.test.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/tests/skill-docs.test.ts`:从 `tests/skill-docs.test.ts` 迁移到 Wiki 项目,保留原功能并隔离构建范围。
|
||||
- `apps/waterfall-wiki/tests/wiki.test.ts`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `apps/waterfall-wiki/tsconfig.json`:Wiki 名字空间、AI 正文、发现页或配套依赖与验证配置。
|
||||
- `docs/monorepo.md`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `package-lock.json`:移除旧目录入口或不再适用的 Web-only 发布逻辑。
|
||||
- `package.json`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `pnpm-lock.yaml`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `pnpm-workspace.yaml`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `scripts/deploy-python.sh`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `scripts/deploy-studio.sh`:更新 monorepo 工作区、部署构建、忽略规则或使用说明。
|
||||
- `scripts/deploy-web.sh`:移除旧目录入口或不再适用的 Web-only 发布逻辑。
|
||||
- `scripts/release-mode.sh`:移除旧目录入口或不再适用的 Web-only 发布逻辑。
|
||||
- `src/pages/index.tsx`:移除旧目录入口或不再适用的 Web-only 发布逻辑。
|
||||
- `tests/release-mode.sh`:移除旧目录入口或不再适用的 Web-only 发布逻辑。
|
||||
|
||||
后续校正:`.gitea/workflows/waterfall-wiki.yml`、`studio.yml`、`python.yml` 将根目录部署脚本也精确归属到对应项目,防止修改 Studio/Python 部署脚本时错误运行 Wiki CI。
|
||||
|
||||
后续构建修复:`Dockerfile`、`apps/waterfall-wiki/Dockerfile`、`apps/studio/Dockerfile` 将 pnpm 下载超时提高到 300 秒,并发限制为 8,处理服务器下载 Next.js / SWC 大文件超时的问题。
|
||||
|
||||
构建许可修复:`pnpm-workspace.yaml` 改用 pnpm 11 的 `allowBuilds`,明确允许 esbuild、sharp 安装脚本;`Dockerfile`、`apps/waterfall-wiki/Dockerfile`、`apps/studio/Dockerfile` 在依赖安装层读取同一许可策略,解决独立镜像中缺失许可导致构建失败的问题。
|
||||
@@ -1,31 +0,0 @@
|
||||
# Studio Graphic 实施计划
|
||||
|
||||
## 研究与范围
|
||||
- 改造前证据:ProjectMedia/studio-editor-workspace-qa.png(2026-10-27);本次在线截图因内置浏览器超时未成功,不当作最新截图。
|
||||
- https://github.com/bergside/awesome-design-skills :参考 token、组件规范、可访问性与质量检查组织方法;其 Stitch 风格不等同于 Google Stitch 产品界面。
|
||||
- https://codelabs.developers.google.com/design-to-code-with-antigravity-stitch :官方界面图参考。
|
||||
- https://moda.app/blog/google-stitch-review :图片搜索找到的多画板与设计系统截图,仅作视觉参考。
|
||||
- Figma 的三栏编辑器布局:图层、画布、属性。采用白色工具栏、冷灰点阵底、蓝紫选中态、集中式底部工具条。
|
||||
|
||||
## 五个交付阶段
|
||||
1. 阅读现有代码、引用 chat,独立分支,协调 infinite_canvas。
|
||||
2. 收集参考与截图、明确设计与复用边界,记录计划。
|
||||
3. /studio/graphic 实现可编辑画板、图层、历史、保存、导出与同站邮箱账户。
|
||||
4. 本地类型、行为、构建和视觉检查;记录真实结果及限制。
|
||||
5. 检查完整差异,提交、推送、创建 PR;清理临时产物,等待人工合并。
|
||||
|
||||
## 清理边界
|
||||
Studio 首页不再展示旧 27 套项目。保留旧路由与数据库,避免破坏现有链接与用户作品;不删除其他 chat 文件。新工作台默认空白,预设只能由用户显式插入。浏览器草稿明确标识本机保存,邮箱账户使用已有 /api/account/* 服务,避免另建身份系统。未配置模型时不提供虚假 AI 生成。
|
||||
|
||||
## 分工
|
||||
Infinite Canvas 独立 chat 01a18775-33e3-7770-ba63-64b4a6a00c89,仅负责 /studio/infinite_canvas 与专属文件。两分支完成后再评估集成,不自动合并 main。
|
||||
|
||||
## 验证记录
|
||||
- 用户已确认只清理入口、保留历史数据。
|
||||
- 13 项单元测试和 TypeScript 通过。webpack 生产构建通过;默认 Turbopack 被本地 CSS 工作进程端口权限阻止。
|
||||
- 自动浏览器检查通过:新增文字/矩形、文字修改、撤销/重做、刷新恢复、SVG 下载、账户弹窗、390px 无横向溢出。截图布局已检查,交付前清理截图。
|
||||
- 账户 session 使用访客 fixture;真实邮件注册登录未在本次验证。独立 Studio 本地进程没有账户后端,部署后复用同域 /api/account 服务。
|
||||
- 单画板与本机草稿,无云端设计同步、协作或 AI 生成。完整属性编辑以桌面为主。
|
||||
- Infinite Canvas 独立 PR #19 已由外部操作合入 main;本分支交付前同步该主线,检查共存。
|
||||
|
||||
- standalone 兼容检查通过:27 套历史页面、保存作品读取、旧重定向与渲染 API;测试脚本支持本地 monorepo standalone 路径。
|
||||
@@ -7,7 +7,7 @@ import subprocess
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
SCRIPT = Path(__file__).with_name('cleanup-integration.sh')
|
||||
SCRIPT = Path(__file__).resolve().parents[1] / 'scripts/cleanup-integration.sh'
|
||||
FAKE_DOCKER = '''#!/usr/bin/env python3
|
||||
import json, os, sys
|
||||
args = sys.argv[1:]
|
||||
@@ -7,7 +7,7 @@ import subprocess
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
SCRIPT = Path(__file__).with_name('cleanup-review-images.sh')
|
||||
SCRIPT = Path(__file__).resolve().parents[1] / 'scripts/cleanup-review-images.sh'
|
||||
SHA = 'a' * 40
|
||||
FAKE_DOCKER = '''#!/usr/bin/env python3
|
||||
import json, os, sys
|
||||
Reference in New Issue
Block a user