From c4912689af3edeba6e45bc61b3cd7fb150304be5 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Tue, 07 Jul 2026 12:14:48 +0800
Subject: [PATCH] chore: close initialization blockers
---
.gitignore | 1
K1.业务知识/README.md | 13 ++
K2.项目管理/项目经理-经验与教训.md | 15 +++
K3.运营与发布资料/Screenshots/render_marketing_screenshots.py | 5
CODE_GOVERNANCE.md | 58 +++++-----
K2.项目管理/README.md | 14 ++
K2.项目管理/QA成果地图.md | 25 +++++
K3.运营与发布资料/Screenshots/render_marketing_screenshots.mjs | 41 ++++++--
AGENTS.md | 6
K2.项目管理/新窗口接手指南.md | 20 +++-
K2.项目管理/研发交付验收流程.md | 23 ++++
K3.运营与发布资料/Release/AppStore-8.3.5-20260702.1046/RELEASE_EVIDENCE_ERRATA.md | 37 +++++++
K3.运营与发布资料/README.md | 33 ++++++
13 files changed, 240 insertions(+), 51 deletions(-)
diff --git a/.gitignore b/.gitignore
index 6d3f3ab..0256be8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
.DS_Store
+._*
# Root-local runtime/build byproducts. App build outputs are generated under src/build/.
/build/
diff --git a/AGENTS.md b/AGENTS.md
index 64a23dc..45e04ff 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -36,13 +36,13 @@
## 命令输出保护
-任何输出未知或可能很大的命令都必须限制输出:
+任何输出未知或可能很大的命令都必须控制范围。标准验证命令在文档、规则、CODEGRAPH 或交接材料中必须保持原始可执行形式;执行时优先使用工具输出上限,或把完整输出写入日志并保留原始命令退出码。
```bash
-COMMAND 2>&1 | head -c 6000
+COMMAND
```
-搜索优先用 `rg` / `rg --files`。不要无上限打印大文件、构建日志或目录树。
+搜索优先用 `rg` / `rg --files`。不要无上限打印大文件、构建日志或目录树;临时查看大输出时可以由执行工具限制输出,不要把截断管道写进标准命令。
## 对话记忆保存规则
diff --git a/CODE_GOVERNANCE.md b/CODE_GOVERNANCE.md
index 77f2545..46b9b86 100644
--- a/CODE_GOVERNANCE.md
+++ b/CODE_GOVERNANCE.md
@@ -15,9 +15,9 @@
- 开始任何代码、文档、发布或迁移任务前,必须先执行并检查:
```bash
-git status --short 2>&1 | head -c 6000
-git branch --show-current 2>&1 | head -c 2000
-git worktree list --porcelain 2>&1 | head -c 6000
+git status --short
+git branch --show-current
+git worktree list --porcelain
```
- 如果工作区已有改动,必须区分改动来源:
@@ -46,9 +46,9 @@
- 提交前必须确认:
```bash
-git status --short 2>&1 | head -c 6000
-git diff --stat 2>&1 | head -c 6000
-git diff --cached --stat 2>&1 | head -c 6000
+git status --short
+git diff --stat
+git diff --cached --stat
```
- 提交信息使用简洁英文或项目已有风格,示例:
@@ -90,9 +90,9 @@
- 任务完成后必须执行:
```bash
-git worktree remove WORKTREE_PATH 2>&1 | head -c 6000
-git worktree prune 2>&1 | head -c 6000
-git worktree list --porcelain 2>&1 | head -c 6000
+git worktree remove WORKTREE_PATH
+git worktree prune
+git worktree list --porcelain
```
- 如果 worktree 有未提交改动,禁止直接删除;必须先确认归属和处理方式。
@@ -109,10 +109,10 @@
接手旧线程、长期任务、发布任务或迁移任务时,必须先完成以下检查,不得等待旧线程:
```bash
-git status --short 2>&1 | head -c 6000
-git branch --show-current 2>&1 | head -c 2000
-git log --oneline --decorate --graph --max-count=12 2>&1 | head -c 6000
-git worktree list --porcelain 2>&1 | head -c 6000
+git status --short
+git branch --show-current
+git log --oneline --decorate --graph --max-count=12
+git worktree list --porcelain
```
- 必须读取最近会话记录,确认未完成项、已完成项、阻塞项和用户最新指令。
@@ -182,15 +182,15 @@
## 11. 命令输出保护
-任何未知或可能很大的命令输出都必须 byte-cap:
+任何未知或可能很大的命令输出都必须控制范围。规则、CODEGRAPH、交接材料和标准验证命令必须保留原始可执行形式,不能为了展示输出而追加 `head -c`、`2>&1 | head` 等截断管道。执行时通过工具输出上限控制展示,或把完整输出写入日志文件并保留原始命令退出码。
```bash
-COMMAND 2>&1 | head -c 6000
+COMMAND
```
-- 构建、测试、目录遍历、日志、Git diff、搜索结果都应限制输出。
+- 构建、测试、目录遍历、日志、Git diff、搜索结果都应控制展示范围。
- 搜索优先用 `rg` / `rg --files`。
-- 不无上限打印大文件、构建日志、目录树或二进制信息。
+- 不无上限打印大文件、构建日志、目录树或二进制信息;需要压缩展示时由执行工具限制输出,不把截断管道写进标准命令。
## 12. 禁止事项
@@ -206,22 +206,22 @@
## 13. 常用检查命令
```bash
-git status --short 2>&1 | head -c 6000
-git branch --show-current 2>&1 | head -c 2000
-git log --oneline --decorate --graph --max-count=12 2>&1 | head -c 6000
-git worktree list --porcelain 2>&1 | head -c 6000
-git diff --stat 2>&1 | head -c 6000
-git diff --cached --stat 2>&1 | head -c 6000
-git ls-files C1.source 2>&1 | wc -l | head -c 2000
+git status --short
+git branch --show-current
+git log --oneline --decorate --graph --max-count=12
+git worktree list --porcelain
+git diff --stat
+git diff --cached --stat
+git ls-files C1.source | wc -l
```
从源码根目录运行 QA:
```bash
cd /Users/ar/Projects/Taglauncher/03-O/C1.source
-bash Scripts/apple_default_apps_resource_qa.sh 2>&1 | head -c 12000
-bash Scripts/apple_default_note_policy_qa.sh 2>&1 | head -c 12000
-bash Scripts/smartstart_catalog_resource_qa.sh 2>&1 | head -c 12000
-bash Scripts/quick_search_app_name_qa.sh 2>&1 | head -c 12000
-bash Scripts/quick_search_system_app_qa.sh 2>&1 | head -c 12000
+bash Scripts/apple_default_apps_resource_qa.sh
+bash Scripts/apple_default_note_policy_qa.sh
+bash Scripts/smartstart_catalog_resource_qa.sh
+bash Scripts/quick_search_app_name_qa.sh
+bash Scripts/quick_search_system_app_qa.sh
```
diff --git "a/K1.\344\270\232\345\212\241\347\237\245\350\257\206/README.md" "b/K1.\344\270\232\345\212\241\347\237\245\350\257\206/README.md"
new file mode 100644
index 0000000..bb4768f
--- /dev/null
+++ "b/K1.\344\270\232\345\212\241\347\237\245\350\257\206/README.md"
@@ -0,0 +1,13 @@
+# K1.业务知识
+
+本目录保存长期有效的产品、领域和系统行为知识。
+
+适合放入这里的内容:
+
+- Taglauncher 长期产品决策。
+- 用户任务、领域规则、系统能力和限制。
+- 可复用的错误文案、验收口径和领域知识。
+- 长期有效的技术约束、状态模型和系统行为知识。
+- `成果地图.md` 中索引到的稳定成果和事实源。
+
+不放 Round 过程记录;过程记录留在 `02-P/`。
diff --git "a/K2.\351\241\271\347\233\256\347\256\241\347\220\206/QA\346\210\220\346\236\234\345\234\260\345\233\276.md" "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/QA\346\210\220\346\236\234\345\234\260\345\233\276.md"
new file mode 100644
index 0000000..476e501
--- /dev/null
+++ "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/QA\346\210\220\346\236\234\345\234\260\345\233\276.md"
@@ -0,0 +1,25 @@
+# Taglauncher QA 成果地图
+
+最后整理:2026-07-05
+
+## 当前状态
+
+Taglauncher 当前源码工程位于 `03-O/C1.source`,Git 根位于 `03-O`。本文件记录 QA 门禁和验证入口;迁移接收验证通过不等同正式发布 QA PASS。
+
+## 当前已建立入口
+
+| 类型 | 路径 | 状态 |
+| --- | --- | --- |
+| 当前验收口径 | `02-P/Round00-Foundation/04-QA与验收.md` | 已建立 |
+| 工程地图入口 | `03-O/CODEGRAPH.md` | 已建立 |
+| 构建产物根 | `03-O/C2.builds/` | 已建立 |
+| 工具脚本根 | `03-O/C3.tools/` | 已建立 |
+| Release evidence errata | `03-O/K3.运营与发布资料/Release/AppStore-8.3.5-20260702.1046/RELEASE_EVIDENCE_ERRATA.md` | 已建立,作为发布前 gate 输入 |
+
+## 后续应补
+
+- 下一次源码变更或发布前的真实构建命令复核。
+- 下一次源码变更或发布前的真实测试命令复核。
+- 主 UI / 主流程 / 数据层 / 发布前检查门禁。
+- 发布前重新绑定当前可解析 Git commit、manifest、tag、SHA256、metadata、review notes 和截图。
+- 截图素材恢复:`03-O/K3.运营与发布资料/Screenshots/localized-content.mjs` 与 `assets/`。
diff --git "a/K2.\351\241\271\347\233\256\347\256\241\347\220\206/README.md" "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/README.md"
new file mode 100644
index 0000000..04153be
--- /dev/null
+++ "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/README.md"
@@ -0,0 +1,14 @@
+# K2.项目管理
+
+本目录保存长期有效的项目管理、协作、复盘和交付经验。
+
+适合放入这里的内容:
+
+- Taglauncher 项目级 SOP。
+- QA 门禁和验证地图。
+- 阶段复盘。
+- 交付验收经验。
+- 新 Agent / 新 session 接手指南。
+- 多角色协作规则的项目特例。
+
+不复制全局规则;全局规则只在本项目有特例时才补充说明。
diff --git "a/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\346\226\260\347\252\227\345\217\243\346\216\245\346\211\213\346\214\207\345\215\227.md" "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\346\226\260\347\252\227\345\217\243\346\216\245\346\211\213\346\214\207\345\215\227.md"
index 2966895..97d1634 100644
--- "a/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\346\226\260\347\252\227\345\217\243\346\216\245\346\211\213\346\214\207\345\215\227.md"
+++ "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\346\226\260\347\252\227\345\217\243\346\216\245\346\211\213\346\214\207\345\215\227.md"
@@ -9,10 +9,12 @@
1. `/Users/ar/Projects/Taglauncher/AGENTS.md`
2. `/Users/ar/Projects/Taglauncher/PROJECT.md`
3. `/Users/ar/Projects/Taglauncher/INDEX.md`
-4. `/Users/ar/Projects/Taglauncher/02-P/进度地图.md`
-5. `/Users/ar/Projects/Taglauncher/03-O/CODEGRAPH.md`
-6. `/Users/ar/Projects/Taglauncher/03-O/CODE_GOVERNANCE.md`
-7. `/Users/ar/Projects/Taglauncher/.codex-sessionhistory/00-Topics.md`
+4. `/Users/ar/Projects/Taglauncher/00-H/初心与Go-No-Go.md`
+5. `/Users/ar/Projects/Taglauncher/02-P/进度地图.md`
+6. `/Users/ar/Projects/Taglauncher/02-P/角色协作宪章.md`
+7. `/Users/ar/Projects/Taglauncher/03-O/CODEGRAPH.md`
+8. `/Users/ar/Projects/Taglauncher/03-O/CODE_GOVERNANCE.md`
+9. `/Users/ar/Projects/Taglauncher/.codex-sessionhistory/00-Topics.md`
## 自检命令
@@ -34,7 +36,13 @@
- 当前迁移基线:`2309264` / `v8.3.5-build20260702.1046`
- 当前源码根:`03-O/C1.source`
+- 当前 HIPO 根结构:`00-H / 01-I / 02-P / 03-O`
+- 当前初心 / Go-No-Go 入口:`00-H/初心与Go-No-Go.md`
- 当前统一台账:`02-P/进度地图.md`
+- 当前角色启动入口:`02-P/角色会话启动清单.md`
+- 当前 PMO 收件箱:`02-P/PMO_INBOX.md`
+- 当前 PMO active assignment:`02-P/pmo-active-assignments.json`
+- 当前 PMO 事件日志:`02-P/pmo-events.jsonl`
- 当前工程地图:`03-O/CODEGRAPH.md`
- 当前最新迁入 release 资料:`03-O/K3.运营与发布资料/Release/AppStore-8.3.5-20260702.1046`
- 当前最新迁入 release 包:`03-O/C2.builds/AppStore-8.3.5-20260702.1046`
@@ -43,9 +51,11 @@
旧完整 Git 对象、旧 worktree、历史构建包、旧截图原图、帮助 PDF 副本、promo codes、备份目录和系统噪声不在当前正文中。
+补充旧资料根 `/Users/ar/Downloads/0702codex-move/02-project2/26.0705-Archive-taglauncher` 只读使用,不作为当前执行路径。
+
## 成功判定
-新会话能说明项目是什么、当前基线是什么、代码在哪里、任务从哪里领取、QA 和发布入口在哪里、哪些历史材料不能直接当当前事实。
+新会话能说明项目是什么、当前基线是什么、代码在哪里、任务从哪里领取、PMO 和角色启动入口在哪里、QA 和发布入口在哪里、哪些历史材料不能直接当当前事实。
## 接手演练结果
diff --git "a/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\347\240\224\345\217\221\344\272\244\344\273\230\351\252\214\346\224\266\346\265\201\347\250\213.md" "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\347\240\224\345\217\221\344\272\244\344\273\230\351\252\214\346\224\266\346\265\201\347\250\213.md"
new file mode 100644
index 0000000..4dd1030
--- /dev/null
+++ "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\347\240\224\345\217\221\344\272\244\344\273\230\351\252\214\346\224\266\346\265\201\347\250\213.md"
@@ -0,0 +1,23 @@
+# Taglauncher 研发交付验收流程
+
+最后整理:2026-07-05
+
+## 标准链路
+
+```text
+目标对齐
+ -> 当前 Round 包
+ -> 技术方案
+ -> 实现
+ -> 代码审核
+ -> QA
+ -> 发布准备
+ -> 用户 / Owner 验收
+```
+
+## 规则
+
+- 不跳过 `02-P/进度地图.md` 直接派工。
+- 不跳过技术方案直接进入非平凡实现。
+- 不跳过 QA 直接进入发布准备。
+- 交付结论必须落在文档,而不是只留在会话中。
diff --git "a/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\351\241\271\347\233\256\347\273\217\347\220\206-\347\273\217\351\252\214\344\270\216\346\225\231\350\256\255.md" "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\351\241\271\347\233\256\347\273\217\347\220\206-\347\273\217\351\252\214\344\270\216\346\225\231\350\256\255.md"
new file mode 100644
index 0000000..1e2bba6
--- /dev/null
+++ "b/K2.\351\241\271\347\233\256\347\256\241\347\220\206/\351\241\271\347\233\256\347\273\217\347\220\206-\347\273\217\351\252\214\344\270\216\346\225\231\350\256\255.md"
@@ -0,0 +1,15 @@
+# Taglauncher 项目经理-经验与教训
+
+最后整理:2026-07-05
+
+## 当前状态
+
+项目尚处初始化阶段,暂无长期有效经验教训。
+
+## 后续记录范围
+
+- 计划失真原因
+- 交接失败原因
+- 文档入口失效原因
+- 规则树冗余或缺口
+- 哪些流程在真实执行中有效,哪些只是纸面结构
diff --git "a/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/README.md" "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/README.md"
new file mode 100644
index 0000000..83cf355
--- /dev/null
+++ "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/README.md"
@@ -0,0 +1,33 @@
+# K3.运营与发布资料
+
+本目录保存 TagLauncher 的官网、商店、营销、支持和法务资料。当前目录来自轻量迁移包,包含可复核的 8.3.5 包体证据,也包含若干历史版本资料;发布前必须先区分当前证据和历史参考。
+
+## 当前状态
+
+- 当前迁入 release 证据包:`Release/AppStore-8.3.5-20260702.1046/`
+- 当前迁入 DMG / PKG:`../C2.builds/AppStore-8.3.5-20260702.1046/`
+- 8.3.5 包体 hash 已与 `Release/AppStore-8.3.5-20260702.1046/SHA256SUMS.txt` 核对一致。
+- 8.3.5 manifest 中的 `Git commit: 01bab54` 在当前迁移仓库不可解析;证据边界见 `Release/AppStore-8.3.5-20260702.1046/RELEASE_EVIDENCE_ERRATA.md`。
+- 本目录不能单独作为 App Store 发布 PASS;发布前仍需 QA / release gate。
+
+## 子目录
+
+- `Website/`:官网页面、素材、站点脚本。
+- `AppStoreConnect/`:渠道元数据、审核说明、商店材料;当前 metadata 仍是历史 7.9.1 口径,不能直接用于 8.3.5 或后续提交。
+- `Marketing/`:营销图、演示图、传播素材;历史文章保留为参考,不自动代表当前审核文案。
+- `Screenshots/`:截图脚本和截图清单;当前脚本已迁移到本目录路径,但仍缺本地 `localized-content.mjs` 和 `assets/`,需要恢复素材后才能生成新图。
+- `Release/`:发布证据、历史手工清单和 release gate 输入。
+- `Support-Legal/`:支持、隐私、协议、法务资料。
+
+## 历史资料边界
+
+- `AppStore_Submission.md` 和 `AppStore_TODO_7.3.5_744.md` 是 7.3.5 / Build 744 历史提交资料。
+- `Release/APP_STORE_RELEASE_MANUAL_TODO.md` 是 7.6.0 历史清单。
+- `AppStoreConnect/ASC审核提交SOP.md` 包含 7.9.1 历史提交流程。
+- 上述文件只作证据和复盘参考,不能直接复制为当前 ASC 提交材料。
+
+## 发布前必做
+
+- 重新生成目标版本的 App Store metadata、What’s New、review notes 和截图清单。
+- 修复或恢复 `Screenshots/localized-content.mjs` 与 `Screenshots/assets/` 后再运行截图脚本。
+- 重新执行 QA / release gate,绑定当前可解析 Git commit、manifest、tag 和 SHA256。
diff --git "a/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Release/AppStore-8.3.5-20260702.1046/RELEASE_EVIDENCE_ERRATA.md" "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Release/AppStore-8.3.5-20260702.1046/RELEASE_EVIDENCE_ERRATA.md"
new file mode 100644
index 0000000..0948977
--- /dev/null
+++ "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Release/AppStore-8.3.5-20260702.1046/RELEASE_EVIDENCE_ERRATA.md"
@@ -0,0 +1,37 @@
+# TagLauncher 8.3.5 Release Evidence Errata
+
+Date: 2026-07-07
+
+This file records the migration-era evidence gap for the 8.3.5 package. It does not replace `RELEASE_MANIFEST.md` and does not declare App Store release PASS.
+
+## Current Evidence
+
+- Package version: `8.3.5`
+- Package build: `20260702.1046`
+- Migrated baseline commit: `2309264ee94daca4b9abe3592d84602c98b77690`
+- Migrated project handoff commit: `5dbabdb9df401b30e8c92cfb3fb089a0fe1b4f9b`
+- Release tag available in this repository: `v8.3.5-build20260702.1046 -> 2309264ee94daca4b9abe3592d84602c98b77690`
+- Manifest commit recorded in `RELEASE_MANIFEST.md`: `01bab54`
+- Current repository lookup for `01bab54`: not resolvable in this migrated repository.
+
+## Artifact Hash Check
+
+The migrated DMG and PKG match `SHA256SUMS.txt`:
+
+```text
+c378548b9f5186e2e71de08a2b0efc6e33bc84e2785dd98fc62e05903026a729 Archive/TagLauncher-8.3.5-build20260702.1046.dmg
+647b64ba420d60f4df1b72daff50f3174ab4c5da61b513ed0d9dc2d7eee2a417 Upload/TagLauncher-8.3.5-build20260702.1046.pkg
+```
+
+## Interpretation
+
+- The package files are hash-consistent with the migrated release evidence.
+- The exact source commit recorded by the original manifest is not available from the current migrated Git history.
+- For project handoff and code management, `boborobots/main` is aligned to the migrated project handoff commit `5dbabdb9df401b30e8c92cfb3fb089a0fe1b4f9b`.
+- For release audit, this package remains a migrated release evidence package and must go through a fresh QA / release gate before any new App Store submission or public distribution claim.
+
+## Required Before Release Use
+
+- Resolve whether old Git history containing `01bab54` should be restored as historical evidence, or accept this errata as the migration-era evidence boundary.
+- Rebuild or re-freeze from a current, resolvable Git commit before calling a package a new formal release package.
+- Regenerate App Store metadata, review notes, screenshots, and the manual release checklist for the target submission version.
diff --git "a/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.mjs" "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.mjs"
index cbb3ebd..5fdf85a 100644
--- "a/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.mjs"
+++ "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.mjs"
@@ -2,23 +2,42 @@
import fs from "node:fs/promises";
import path from "node:path";
import { createRequire } from "node:module";
-import { fileURLToPath } from "node:url";
-import {
- LOCALES,
- getCopy,
- loadAppStrings,
- modeLabels
-} from "../../../docs/scripts/localized-content.mjs";
+import { fileURLToPath, pathToFileURL } from "node:url";
const require = createRequire(import.meta.url);
const { chromium } = require("playwright");
const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
-const ROOT = path.resolve(SCRIPT_DIR, "../../..");
-const ASSETS = path.join(ROOT, "docs/assets");
-const OUT_ROOT = path.join(ROOT, "Docs/X-Op资料/Screenshots/AppStore-Marketing");
+const REPO_ROOT = path.resolve(SCRIPT_DIR, "../..");
+const SOURCE_ROOT = path.join(REPO_ROOT, "C1.source");
+const LOCALIZED_CONTENT = path.join(SCRIPT_DIR, "localized-content.mjs");
+const ASSETS = path.join(SCRIPT_DIR, "assets");
+const OUT_ROOT = path.join(SCRIPT_DIR, "AppStore-Marketing");
const W = 2880;
const H = 1800;
+
+if (!fsSync.existsSync(LOCALIZED_CONTENT)) {
+ throw new Error([
+ "Missing localized screenshot copy module.",
+ `Expected: ${LOCALIZED_CONTENT}`,
+ "Restore or regenerate this file before rendering App Store screenshots."
+ ].join("\n"));
+}
+
+if (!fsSync.existsSync(ASSETS)) {
+ throw new Error([
+ "Missing screenshot asset directory.",
+ `Expected: ${ASSETS}`,
+ "Restore image assets before rendering App Store screenshots."
+ ].join("\n"));
+}
+
+const {
+ LOCALES,
+ getCopy,
+ loadAppStrings,
+ modeLabels
+} = await import(pathToFileURL(LOCALIZED_CONTENT).href);
function esc(value) {
return String(value ?? "")
@@ -389,7 +408,7 @@
async function renderLocale(browser, locale) {
const copy = getCopy(locale.code);
- const app = loadAppStrings(ROOT, locale);
+ const app = loadAppStrings(SOURCE_ROOT, locale);
const modes = modeLabels(app);
const outDir = path.join(OUT_ROOT, locale.code);
await cleanGeneratedPngs(outDir);
diff --git "a/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.py" "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.py"
index df54462..7480314 100644
--- "a/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.py"
+++ "b/K3.\350\277\220\350\220\245\344\270\216\345\217\221\345\270\203\350\265\204\346\226\231/Screenshots/render_marketing_screenshots.py"
@@ -6,11 +6,10 @@
import sys
-ROOT = Path("/Users/ar/Projects/Taglauncher")
+SCRIPT = Path(__file__).resolve().with_suffix(".mjs")
RUNTIME = Path("/Users/ar/.cache/codex-runtimes/codex-primary-runtime/dependencies")
NODE = RUNTIME / "node/bin/node"
NODE_MODULES = RUNTIME / "node/node_modules"
-SCRIPT = ROOT / "Docs/X-Op资料/Screenshots/render_marketing_screenshots.mjs"
def main() -> int:
@@ -23,7 +22,7 @@
existing = env.get("NODE_PATH")
env["NODE_PATH"] = str(NODE_MODULES) if not existing else f"{NODE_MODULES}{os.pathsep}{existing}"
- completed = subprocess.run([node, str(SCRIPT)], cwd=str(ROOT), env=env)
+ completed = subprocess.run([node, str(SCRIPT)], cwd=str(SCRIPT.parent), env=env)
return completed.returncode
--
Gitblit v1.9.3