From 6a73bf6d5ba7fbeefc2cb2880c1234fd653c73ca Mon Sep 17 00:00:00 2001 From: chendelin1982 <16741975+chendelin1982@users.noreply.github.com> Date: Fri, 23 Oct 2026 07:55:49 +0000 Subject: [PATCH] chore: move build scripts to ci/scripts --- .github/workflows/appstore-publish.yml | 4 +- AGENTS.md | 2 +- CHANGELOG.md | 2 + .../__pycache__/fetch_catalog.cpython-312.pyc | Bin 7625 -> 0 bytes .../library_publish.cpython-312.pyc | Bin 36386 -> 0 bytes build/sync_contentful.py | 91 ------------------ {build => ci/scripts}/fetch_catalog.py | 0 {build => ci/scripts}/library_publish.py | 2 +- cli/README.md | 2 +- docs/appstore-release-spec.md | 2 +- docs/architecture.md | 3 +- docs/devops-spec.md | 2 +- docs/test.md | 2 +- tests/build/test_fetch_catalog.py | 2 +- tests/build/test_library_publish.py | 2 +- 15 files changed, 13 insertions(+), 103 deletions(-) delete mode 100644 build/__pycache__/fetch_catalog.cpython-312.pyc delete mode 100644 build/__pycache__/library_publish.cpython-312.pyc delete mode 100644 build/sync_contentful.py rename {build => ci/scripts}/fetch_catalog.py (100%) rename {build => ci/scripts}/library_publish.py (99%) diff --git a/.github/workflows/appstore-publish.yml b/.github/workflows/appstore-publish.yml index d60a62fb3..32776cefa 100644 --- a/.github/workflows/appstore-publish.yml +++ b/.github/workflows/appstore-publish.yml @@ -73,7 +73,7 @@ jobs: env: CONTENTFUL_GRAPHQL_TOKEN: ${{ secrets.CONTENTFUL_GRAPHQLTOKEN }} run: | - python build/fetch_catalog.py \ + python ci/scripts/fetch_catalog.py \ --channel "${{ steps.resolve_channel.outputs.channel }}" \ --output-dir dist/catalog-source @@ -140,7 +140,7 @@ jobs: elif [[ -n "${{ steps.release_base.outputs.from_ref }}" ]]; then args+=(--from-ref "${{ steps.release_base.outputs.from_ref }}") fi - python build/library_publish.py "${args[@]}" + python ci/scripts/library_publish.py "${args[@]}" - name: Generate changelog if: steps.resolve_channel.outputs.channel == 'release' diff --git a/AGENTS.md b/AGENTS.md index 7ac7c49f3..93175b268 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -54,7 +54,7 @@ Read in this order: - App metadata: `metadata/maintenance.yaml`, `metadata/archive.yaml` - Shared skills: `skills/` - Template: `metadata/templates/` -- Scripts: `ci/scripts/`, `build/` +- Scripts: `ci/scripts/` - Process docs: `docs/ai-sdlc/` - CI: `.github/workflows/` diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c26ad96e..454b9a101 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,14 @@ Project-level changes only: architecture, delivery model, tooling, CI, and relea ### Changed - Moved the opencode session cleanup script from `build/` to `ci/scripts/` and updated `make opencode-clear` to use it. +- Moved `fetch_catalog.py` and `library_publish.py` from `build/` to `ci/scripts/`; the `build/` directory is now removed. ### Removed - Removed the legacy `template/` directory; scaffolds and generated docs now use `metadata/templates/`. - Removed unused `build/update_readme.py`, `build/update_variables.py`, `build/test_apps.py`, and `build/get_apps_latest_version.py`. - Removed obsolete workflows: `build_files`, `pull_quest_test`, `pre_merge`, `release`, `release-dev`, `sync_php_files`, and `get_apps_latest_version`. - Removed `add_apps.json` and its template-scaffold workflow. +- Removed the unused `build/sync_contentful.py`; Contentful sync now uses `libs catalog-push`. ## 2026-09 diff --git a/build/__pycache__/fetch_catalog.cpython-312.pyc b/build/__pycache__/fetch_catalog.cpython-312.pyc deleted file mode 100644 index 579ce58edb8f1b85969112ef9e9eef8ec6dc9e99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7625 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 diff --git a/build/__pycache__/library_publish.cpython-312.pyc b/build/__pycache__/library_publish.cpython-312.pyc deleted file mode 100644 index 9f9dbf4553787e7c00667ed63ea7900fd3a8b962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36386 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 0: - print(f"Failed products: {failed_products}") \ No newline at end of file diff --git a/build/fetch_catalog.py b/ci/scripts/fetch_catalog.py similarity index 100% rename from build/fetch_catalog.py rename to ci/scripts/fetch_catalog.py diff --git a/build/library_publish.py b/ci/scripts/library_publish.py similarity index 99% rename from build/library_publish.py rename to ci/scripts/library_publish.py index 0c1f9b6a9..d2b1f30e8 100644 --- a/build/library_publish.py +++ b/ci/scripts/library_publish.py @@ -14,7 +14,7 @@ from zipfile import ZIP_DEFLATED, ZipFile -ROOT = Path(__file__).resolve().parent.parent +ROOT = Path(__file__).resolve().parents[2] APPS_DIR = ROOT / "apps" PACKAGE_ROOT_NAME = "library" CHANNEL_PACKAGE_NAMES = { diff --git a/cli/README.md b/cli/README.md index cee849810..0d3d5df8c 100644 --- a/cli/README.md +++ b/cli/README.md @@ -118,4 +118,4 @@ Credentials: - resolution order: command flag > explicit `--env-file` > environment variable > default provider file - CI keeps passing secrets as environment variables from GitHub Actions secrets; it does not use `.secrets/` -Run from the repository root or a subdirectory inside it. The CLI now refuses to run outside the repository so it cannot read or write the wrong `apps/` or `metadata/` tree by accident. CLI does not depend on `build/`. +Run from the repository root or a subdirectory inside it. The CLI now refuses to run outside the repository so it cannot read or write the wrong `apps/` or `metadata/` tree by accident. CLI does not depend on the publishing scripts under `ci/scripts/`. diff --git a/docs/appstore-release-spec.md b/docs/appstore-release-spec.md index 09e30ec9a..ae4e99830 100644 --- a/docs/appstore-release-spec.md +++ b/docs/appstore-release-spec.md @@ -563,7 +563,7 @@ artifact/appstore// 2. 解析 channel 3. 检查 R2 apps/ 是否为空 → 空则标记首次发布(--all-apps) 4. 从 Contentful 拉取 catalog 源数据 -5. 运行 library_publish.py 构建所有制品(v2 + legacy),并以仓库 variables.json 统一 product distribution 数据结构 +5. 运行 `ci/scripts/library_publish.py` 构建所有制品(v2 + legacy),并以仓库 variables.json 统一 product distribution 数据结构 6. 上传 v2 制品到新 R2 路径(`channel` 只由目录表达,full 固定入口统一为 `latest.zip`) 7. 上传 legacy 制品到旧 R2 路径(兼容旧消费者) 8. 清除 Cloudflare 缓存 diff --git a/docs/architecture.md b/docs/architecture.md index 34c99a571..be61185d9 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -9,8 +9,7 @@ Core layout: - `metadata/archive.yaml`: archived app metadata and external handoff flags - `skills/`: canonical shared skills for multiple agents - `metadata/templates/`: app scaffold, README, and catalog templates -- `ci/scripts/`: local and CI helper scripts -- `build/`: generation and publishing scripts +- `ci/scripts/`: local, CI, and publishing scripts - `docs/`: product, process, and maintainer docs - `.github/workflows/`: CI, release, and maintenance automation diff --git a/docs/devops-spec.md b/docs/devops-spec.md index 8124679e8..628dd4760 100644 --- a/docs/devops-spec.md +++ b/docs/devops-spec.md @@ -315,7 +315,7 @@ Those concerns belong to platform workflows or human process. Recommended order: -1. Normalize existing `build/*.py` inputs and outputs. +1. Normalize existing `ci/scripts/*.py` inputs and outputs. 2. Introduce a thin unified CLI. 3. Update workflows to call the CLI. 4. Add `make` only if maintainers need local shortcuts. diff --git a/docs/test.md b/docs/test.md index 6609cad44..8ac73a586 100644 --- a/docs/test.md +++ b/docs/test.md @@ -4,7 +4,7 @@ This repository uses five test layers: 1. Unit tests: `cli/libs` pure logic. 2. CLI contract tests: command input, JSON output, and exit code. -3. Metadata and template consistency tests: `metadata/`, templates, `build/` pipeline smoke, and repository facts. +3. Metadata and template consistency tests: `metadata/`, templates, publish pipeline smoke, and repository facts. 4. App deploy validation: changed apps only, high cost, not the default local loop. 5. Owner E2E: final human verification. diff --git a/tests/build/test_fetch_catalog.py b/tests/build/test_fetch_catalog.py index 22a820bf3..6f547cf16 100644 --- a/tests/build/test_fetch_catalog.py +++ b/tests/build/test_fetch_catalog.py @@ -4,7 +4,7 @@ from _helpers import REPO_ROOT, load_build_module -fetch_catalog = load_build_module("fetch_catalog_test", REPO_ROOT / "build" / "fetch_catalog.py") +fetch_catalog = load_build_module("fetch_catalog_test", REPO_ROOT / "ci" / "scripts" / "fetch_catalog.py") def test_fetch_catalog_entries_returns_collection_items(monkeypatch): diff --git a/tests/build/test_library_publish.py b/tests/build/test_library_publish.py index 79db585f1..e063517d4 100644 --- a/tests/build/test_library_publish.py +++ b/tests/build/test_library_publish.py @@ -8,7 +8,7 @@ from _helpers import REPO_ROOT, load_build_module -library_publish = load_build_module("library_publish_test", REPO_ROOT / "build" / "library_publish.py") +library_publish = load_build_module("library_publish_test", REPO_ROOT / "ci" / "scripts" / "library_publish.py") def test_hash_content_is_deterministic_and_input_sensitive():