Operator capability to bring a NEW project online in one pass, fully
outside the runtime and the pipeline (src/** byte-exact, no kill-switch
needed — activation is an explicit human CLI run). Reference = the
orchestrator repo itself (ORCH-52b/c/d/e canons).
* onboarding/repo-skeleton/ — parametrized kit of a new repo: 6 agent
prompt templates per canon 52d/92 (5 ru + deployer en with the
shared-host guardrail frame), reviewer doc-gate (REQUEST_CHANGES),
CLAUDE.md passport, AGENTS.md, CONTRIBUTING.md, docs/ skeleton with
mandatory operations/INFRA.md, .env.example; {{NAME}} placeholders +
stdlib render, dictionary onboarding/placeholders.json (bijection
held by tests). Canon is NOT forked: docs/_templates + docs/_standards
are live-copied from the checkout at materialization time (BR-2/D3).
* scripts/onboard_project.py — plan (default, GET-only, zero mutations)
/ apply (idempotent ensure, no delete ops at all) / verify (registry
round-trip via the actual projects._parse_projects_json, all 22 state
names incl. fail-closed Confirm Deploy/STOP, labels, webhook, kit
completeness, unresolved-placeholder scan). Closed read-only src
import list (ADR D4); state groups fixed per ADR D5 (STOP→cancelled,
terminal groups only Done/Cancelled/STOP); Gitea webhook reuses the
single global ORCH_GITEA_WEBHOOK_SECRET (TR-6); initial push ONLY
into a freshly created empty repo (INV-4 untouched); never restarts
prod / never edits .env / deletes nothing (NFR-2); secrets masked
(NFR-3); Plane CE API gaps degrade to manual-step (fail-safe).
* docs/operations/ONBOARDING.md runbook + SETUP_WEBHOOKS.md generalized
per-repo; CLAUDE.md / docs/architecture/README.md / CHANGELOG.md
updated in the same PR (golden source).
* Anti-drift tests: test_onboarding_kit.py / test_onboarding_script.py
(mocked, no network) / test_onboarding_invariants.py (snapshots of
STAGE_TRANSITIONS/QG_CHECKS, closed CLI import list, reference
.openclaw/agents/ prompts untouched). Full regression: 1713 passed.
Refs: ORCH-009
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
63 lines
2.1 KiB
JSON
63 lines
2.1 KiB
JSON
{
|
||
"PROJECT_NAME": {
|
||
"description": "Человекочитаемое имя проекта (Plane-проект, README, паспорт)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "enduro-trails"
|
||
},
|
||
"PROJECT_DESCRIPTION": {
|
||
"description": "1–2 фразы «зачем проект» (README, PRODUCT_VISION, паспорт)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "Каталог эндуро-маршрутов с картой, треками и сезонностью"
|
||
},
|
||
"REPO": {
|
||
"description": "Имя Gitea-репозитория (== каталог под /repos)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "enduro-trails"
|
||
},
|
||
"GITEA_OWNER": {
|
||
"description": "Owner/организация репозитория в Gitea",
|
||
"required": true,
|
||
"default": "admin",
|
||
"example": "admin"
|
||
},
|
||
"WORK_ITEM_PREFIX": {
|
||
"description": "Префикс work-item проекта (идентификатор Plane-проекта, аналог ET)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "ET"
|
||
},
|
||
"PLANE_PROJECT_ID": {
|
||
"description": "UUID Plane-проекта (становится известен после Plane-шага apply)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "7a79f0a9-5278-49cd-9007-9a338f238f9c"
|
||
},
|
||
"STACK": {
|
||
"description": "Стек проекта, описательно (язык, фреймворк, БД)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "Python 3.12 + FastAPI + SQLite"
|
||
},
|
||
"TEST_CMD": {
|
||
"description": "Команда запуска тестов проекта (используется агентами developer/tester)",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "pytest tests/ -q"
|
||
},
|
||
"PROD_PORT": {
|
||
"description": "Порт прод-контейнера проекта",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "8600"
|
||
},
|
||
"STAGING_PORT": {
|
||
"description": "Порт staging-контейнера проекта",
|
||
"required": true,
|
||
"default": null,
|
||
"example": "8601"
|
||
}
|
||
}
|