Files
writer-work-flow/.github/workflows/ci.yml
Yaojia Wang dca4d45d4e refactor(agents): prompt 外置方案A — 21 prompt 散文外迁 .md + SpecResolver
把 21 个内置 agent 的 system_prompt 从 specs.py 的 Python 常量外置为
prompts/<spec.name>.md,import 期由 load_prompt 确定性加载;建立 SPECS 名册
+ SCHEMA_CATALOG(Pydantic 类型留 Python)+ 统一只读解析入口 SpecResolver。
纯重构、零功能/schema 变更,缓存断点前块字节级不变(不变量 #9)。

@llm packages/agents(步骤1-3)
- spec_model.py:抽出 AgentSpec(frozen,字段不变)
- prompt_loader.py:load_prompt = utf-8-sig 去BOM → LF 归一 → NFC → rstrip尾LF,
  内存缓存 + fail-fast(PromptNotFoundError),import 期确定性
- schema_catalog.py:SCHEMA_CATALOG[name]→output type 唯一真相源(refiner=None)
- prompts/*.md ×21:取常量「运行时值」程序化外迁(反斜杠折行已塌缩,
  物理换行≡运行时换行);文件名按 spec.name 连字符(style.md/character-gen.md 等)
- specs.py:删 21 常量 + AgentSpec 类;system_prompt=load_prompt(name)、
  output_schema=SCHEMA_CATALOG[name];建 SPECS + REVIEW_RESERVED_NAMES;
  *_spec 兼容期保留且 SPECS[name] is *_spec(同一实例)。804→337 行
- __init__.py:显式 __all__ 重导出(避 F401)

@backend packages/skills(步骤4-5)
- SpecResolver:内置 SPECS(纯内存、零 DB)+ 用户 SkillRegistry 统一 get;
  内置 name 永不触发 DB;output_schema_for 精确匹配
- skill_registry:保留命名空间守卫前移至入库校验,拒同名内置 → VALIDATION
- toolbox_registry:GeneratorTool.spec 改走 SPECS[...],删 12 个 *_spec 直接 import

@devops repo-root
- .gitattributes:prompts/*.md text eol=lf(修正:须用完整嵌套路径才匹配)
- packages/agents/pyproject:hatchling artifacts 纳入 prompts/*.md 随 wheel/sdist 分发
- ci.yml:新增 build wheel → 裸装 → import ww_agents.SPECS 冒烟

TDD 全程 mock 网关;门禁绿:ruff/format clean · mypy 209 files · pytest 744 passed
(含金标准 sha256 回归 / md↔spec↔catalog 一一对应 / fail-fast / BOM+NFC /
内置守卫 / 同一实例 / 编排器无回归 / apps/api import-smoke / 打包冒烟)
2026-06-24 04:49:44 +02:00

91 lines
3.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: CI
on:
push:
branches: [main]
pull_request:
jobs:
backend:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: writer
POSTGRES_PASSWORD: writer
POSTGRES_DB: writer
ports: ["5432:5432"]
options: >-
--health-cmd "pg_isready -U writer"
--health-interval 5s --health-timeout 3s --health-retries 10
env:
DATABASE_URL: postgresql+asyncpg://writer:writer@localhost:5432/writer
DATABASE_URL_SYNC: postgresql+psycopg://writer:writer@localhost:5432/writer
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
- run: uv sync
- name: ruff
run: uv run ruff check .
- name: mypy
run: uv run mypy packages apps
- name: alembic upgrade + drift check
run: |
uv run alembic upgrade head
uv run alembic check
- name: pytest
run: uv run pytest -q
# 打包冒烟:构建 ww-agents wheel → 装进裸 venv → import ww_agents 并断言 SPECS。
# 证明 prompts/*.md 随 wheel 分发(源码树 pytest 测不出此漏带——见
# docs/design/prompt-management.md §4/§6#16。load_prompt 在 import 期读盘,
# 若 .md 漏带则抛 PromptNotFoundError本步即红。
agents-wheel-smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
- name: build ww-agents wheel
run: uv build --wheel packages/agents --out-dir dist
- name: install into bare venv + import SPECS
run: |
uv venv .smoke-venv
# 工作区兄弟包按路径装解析其第三方依赖structlog 是 ww-llm-gateway
# import 期用到但未显式声明的传递依赖,显式补上以保证裸装可 import。
uv pip install --python .smoke-venv \
"ww-shared @ ./packages/shared" \
"ww-config @ ./packages/config" \
"ww-db @ ./packages/db" \
"ww-llm-gateway @ ./packages/llm_gateway" \
structlog
# 被测产物:装 wheel 本身,--no-deps 确保 import 的是它而非源码树。
uv pip install --python .smoke-venv --no-deps dist/ww_agents-*.whl
.smoke-venv/bin/python -c "import ww_agents; assert ww_agents.SPECS"
frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
- run: uv sync
- uses: actions/setup-node@v4
with:
node-version: 22
- run: corepack enable
- name: install
working-directory: apps/web
run: pnpm install --frozen-lockfile
- name: gen api types
working-directory: apps/web
run: pnpm gen:api
- name: lint
working-directory: apps/web
run: pnpm lint
- name: typecheck
working-directory: apps/web
run: pnpm typecheck
- name: test
working-directory: apps/web
run: pnpm test