Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ repos:
args: [--markdown-linebreak-ext=md]
- id: end-of-file-fixer
- id: check-yaml
# pnpm 12 起根 pnpm-lock.yaml 是多文档 YAML(packageManagerDependencies 独占首个
# 文档,见 ISSUE-175);只豁免这份机器产物,手写 YAML 仍受单文档校验约束。
exclude: ^pnpm-lock\.yaml$
- id: check-toml
- id: check-merge-conflict
- id: check-added-large-files
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
9 changes: 6 additions & 3 deletions apps/negentropy-influence/pipeline/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ $P/
│ ├── narration.json # 派生物(build_narration.py 生成)
│ └── storyboard.md # 分镜表(镜号↔句 id 区间↔画面↔动效)
├── scripts/*.py # 薄包装 → ../../pipeline/scripts/(保 CLI 契约)
├── video/ # Remotion 独立 pnpm 工程(--ignore-workspace 隔离
├── video/ # Remotion 独立 pnpm 工程(自带 pnpm-workspace.yaml,钉为独立 workspace 根
└── out/ # 渲染产物(gitignored)
```

Expand Down Expand Up @@ -137,7 +137,7 @@ schema、默认值与校验的单一事实源是 [scripts/config.py](./scripts/c
## 四、复用边界(显式权衡)

- **Python 脚本:集中共享(SSOT)**——三个纯文本变换工具,跨集零差异,中心化防 split-brain。
- **Remotion 工程原语:复制适配,不做共享包**——`timing.ts` / `Subtitle` / `cards.tsx` / `theme.ts` 等每集复制后按本集视觉契约修改。理由:每集工程须保持 pnpm `--ignore-workspace` 独立可渲染(嵌套 workspace 隔离 + Remotion 版本自由),共享 TS 包会把「一集的视觉改动」泄漏进其他集。**复制源头是 [templates/video-skeleton/](./templates/video-skeleton/)**(14 个 frozen 文件 + skeleton.toml 档位清单),新集用 `scaffold.py` 实例化、「改任何一处须同步」由 `verify_skeleton.py` 机器执法——此前「以任一既有集为模板」的说法等于给 391 行冻结基建设 4 个同权真理声明者,且纸面义务从未被执行过(详见 skeleton.toml 内注)。同类做法:`go mod vendor` + `go mod verify`(物理副本 + 校验门)、Copier(模板 + 应答记录)。
- **Remotion 工程原语:复制适配,不做共享包**——`timing.ts` / `Subtitle` / `cards.tsx` / `theme.ts` 等每集复制后按本集视觉契约修改。理由:每集工程须保持 pnpm `--ignore-workspace` 独立可渲染(嵌套 workspace 隔离 + Remotion 版本自由),共享 TS 包会把「一集的视觉改动」泄漏进其他集。**复制源头是 [templates/video-skeleton/](./templates/video-skeleton/)**(15 个 frozen 文件 + skeleton.toml 档位清单),新集用 `scaffold.py` 实例化、「改任何一处须同步」由 `verify_skeleton.py` 机器执法——此前「以任一既有集为模板」的说法等于给 391 行冻结基建设 4 个同权真理声明者,且纸面义务从未被执行过(详见 skeleton.toml 内注)。同类做法:`go mod vendor` + `go mod verify`(物理副本 + 校验门)、Copier(模板 + 应答记录)。
- **每集视觉契约独立设计**(色彩语义映射到本集核心概念),但底层规范复用:深色底 `#0E1116` 系、警示红 `#FF5C5C`、确认绿 `#7ED321`、金句卡衬线体、公式只作角标彩蛋。

## 五、音画同步机制(零手工对轨)
Expand All @@ -153,11 +153,14 @@ schema、默认值与校验的单一事实源是 [scripts/config.py](./scripts/c
uv run --no-project $R/scaffold.py <slug>-video --title "本集标题" \
--ref <样本名> --ref-sha1 <12位指纹> --style <档名>
```
scaffold 复制 14 个 frozen 文件 + 渲染 4 个模板(package.json / theme.ts / pipeline.toml / README),
scaffold 复制 15 个 frozen 文件 + 渲染 4 个模板(package.json / theme.ts / pipeline.toml / README),
**刻意不生成 scenes/**(样例留在模板里)、不改根 `.gitignore`(已通配到分集级)、不写 series.json。
跑完立刻 `uv run --no-project $R/verify_skeleton.py` 确认新集与模板零漂移。
2. `theme.ts` 换本集概念色;`video/src/scenes/*` 与 `Main.tsx` 注册表全部新写。
3. `cd video && pnpm install --ignore-workspace`(必须显式忽略根 workspace;`onlyBuiltDependencies: [esbuild]` 已在 package.json);装完检查根 lockfile 零变更。
> pnpm 12 起只声明 `--ignore-workspace` 不够:pnpm 仍会沿 `packageManager` 向上锚定到仓库根,
> **覆写根 `pnpm-lock.yaml`** 且当场不报错。隔离由 `video/pnpm-workspace.yaml` 真正兜住
> ([ISSUE-175](../../../docs/.agents/issue.md))。
> pnpm ≥ 11 会提示 `package.json` 的 `pnpm` 字段不再被读取,并报 `ERR_PNPM_IGNORED_BUILDS: esbuild`
> ([ISSUE-076](../../../docs/.agents/issue.md))。**已实测确认对本工程无害**:esbuild 的平台二进制
> 是 optionalDependency,落地不依赖 postinstall —— 旧写法下 `remotion bundle` 端到端通过。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ uv run --no-project $R/verify_skeleton.py --strict # 有未登记漂移即失

要点(详见 skeleton.toml 内注):

- **A 档 · frozen 逐字节保留**(14 个文件,含 `src/timing.ts` 的 computeTimeline + beatWindow + SCENE_FADE_FRAMES、`@remotion/media` 的 NarrationAudio、fitText 的 Subtitle、幕间呼吸淡入淡出的 SceneFade、cards、三份薄包装与全部工程配置)。改任何一处 = 改模板 + 改各集,`--strict` 会盯住。
- **A 档 · frozen 逐字节保留**(15 个文件,含 `src/timing.ts` 的 computeTimeline + beatWindow + SCENE_FADE_FRAMES、`@remotion/media` 的 NarrationAudio、fitText 的 Subtitle、幕间呼吸淡入淡出的 SceneFade、cards、三份薄包装与全部工程配置)。改任何一处 = 改模板 + 改各集,`--strict` 会盯住。
- **B 档 · overridable**:`src/timing.json`(时序常数 SSOT——timing.ts 与 Python 侧共读同一文件,**改常量只改此处**)。覆写许可存在但四集从未行使过。
- **regioned**:`src/Main.tsx` 区外冻结(每集内容只有场景 import 与 SCENE_COMPONENTS 注册表);**structured**:`package.json` 门住依赖零漂移、忽略 name/description。
- **每集改写**:`src/design/theme.ts`(本集色板)、`src/scenes/*`(全部重写;骨架样例见模板里的 scenes-EXAMPLE.tsx.txt)。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ baselineOf = "self-evolution"
[classes]
frozen = [
"video/.npmrc",
# 与 .npmrc 同属隔离契约:缺此文件时嵌套 install 会覆写根 lockfile(ISSUE-175)
"video/pnpm-workspace.yaml",
"video/tsconfig.json",
"video/remotion.config.ts",
"video/src/index.ts",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 把本工程钉成它自己的 pnpm workspace 根——这是本文件存在的唯一理由。
# pnpm 12 起仅靠 `--ignore-workspace` 不够:pnpm 仍会沿 packageManager 向上锚定到仓库根,
# 用本工程的解析结果覆写根 pnpm-lock.yaml(overrides 全丢)且当场不报错。见 ISSUE-175。
packages: []
6 changes: 5 additions & 1 deletion docker/frontend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ ARG TARGET_SERVICE=negentropy-ui
# ── Stage 1: Install dependencies ───────────────────────────────────────────
FROM node:22-slim AS deps

RUN corepack enable && corepack prepare pnpm@latest --activate
RUN corepack enable

WORKDIR /app

# 先复制 workspace 根文件(利用 Docker 层缓存)
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./

# pnpm 版本单一事实源=根 package.json#packageManager(`corepack install` 不带参数即读本地清单)。
# 勿改回 `corepack prepare pnpm@latest`:npm 的 latest 与 packageManager 会各自漂移(ISSUE-175)。
RUN corepack install

# 复制所有 package.json(workspace resolution 需要)
COPY packages/agents-chat-core/package.json ./packages/agents-chat-core/package.json
COPY apps/negentropy-ui/package.json ./apps/negentropy-ui/package.json
Expand Down
7 changes: 6 additions & 1 deletion docker/wiki/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,17 @@
# ── Stage 1: Install dependencies ────────────────────────────────────────────
FROM node:22-slim AS deps

RUN corepack enable && corepack prepare pnpm@latest --activate
RUN corepack enable

WORKDIR /app

# 复制 workspace 根文件(层缓存)
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./

# pnpm 版本单一事实源=根 package.json#packageManager(与 docker/frontend/Dockerfile 同构)。
# 勿改回 `corepack prepare pnpm@latest`:npm 的 latest 与 packageManager 会各自漂移(ISSUE-175)。
RUN corepack install

# 复制 workspace 内相关 package.json(与 frontend Dockerfile 同集合,确保 frozen-lockfile 解析稳定)
COPY packages/agents-chat-core/package.json ./packages/agents-chat-core/package.json
COPY apps/negentropy-ui/package.json ./apps/negentropy-ui/package.json
Expand Down
Loading
Loading