200 lines
15 KiB
Markdown
200 lines
15 KiB
Markdown
# TASKS
|
||
|
||
## Current
|
||
|
||
### `feat/community-finalization`
|
||
|
||
Status: done
|
||
|
||
Goal:
|
||
- довести `crank-community` до окончательного самостоятельного состояния как открытой `REST-only` редакции;
|
||
- убрать transitional split-логику, legacy premium ballast и скрытые assumptions из эпохи общего репозитория.
|
||
|
||
Main code areas:
|
||
- `TASKS.md`
|
||
- `docs/community-source-whitelist.md`
|
||
- `docs/implementation-plan.md`
|
||
- `docs/repository-split-map.md`
|
||
- `docs/community-release-checklist.md`
|
||
- `docs/commercial-boundaries.md`
|
||
- workspace manifests
|
||
- Community backend/UI tests and fixtures
|
||
- Community UI copy and localization
|
||
|
||
Implementation slices:
|
||
1. привести документацию и backlog к реальному состоянию `crank-community`;
|
||
2. убрать premium зависимости из Community workspace manifests;
|
||
3. очистить Community test boundary и убрать зависимость от `test = false` как способа скрывать legacy tests;
|
||
4. удалить premium backend ballast, который больше не относится к Community;
|
||
5. дочистить UI, локализацию и e2e fixtures до честного Community surface;
|
||
6. пройти финальную верификацию Community release path.
|
||
|
||
DoD:
|
||
- `crank-community` описывает себя как самостоятельный public repository, а не как промежуточный этап split;
|
||
- Community manifests и workspace dependencies соответствуют `REST-only` product boundary;
|
||
- Community tests и fixtures проверяют только Community functionality;
|
||
- UI и docs не содержат рабочих premium flows и misleading copy;
|
||
- Community release path воспроизводим и проверяем без ссылок на transitional import procedure.
|
||
|
||
Verification:
|
||
- docs consistency pass;
|
||
- `cargo metadata --no-deps`;
|
||
- `just fmt`
|
||
- `just check`
|
||
- `just test`
|
||
- UI build and Community-targeted smoke/e2e pass.
|
||
|
||
Progress:
|
||
- done:
|
||
- `deploy/community/*` already acts as the canonical Community delivery contour
|
||
- Community capability model is already constrained to:
|
||
- `REST`
|
||
- static agent key
|
||
- `security_level = standard`
|
||
- public wizard HTML surface is already reduced to the Community `REST` flow
|
||
- transitional docs and backlog now describe `crank-community` as the current source of truth instead of a future split artifact
|
||
- premium protocol toolchain dependencies have been removed from the Community workspace manifest while keeping the `REST-only` workspace green under `cargo check`
|
||
- Community backend crates no longer rely on `test = false`; `just test` now runs against a real Community-only test surface on the isolated local test database
|
||
- premium protocol and streaming ballast has been removed from Community backend test/dev paths, and Community demo expectations now match the actual `REST-only` demo seed
|
||
- dormant premium UI modules, fixtures, and translation strings have been removed, while the remaining Community wizard and admin pages stay green under local Playwright smoke
|
||
- final Community verification pass completed:
|
||
- `cargo metadata --no-deps`
|
||
- `just fmt`
|
||
- `just check`
|
||
- `just test`
|
||
- `apps/ui` build
|
||
- Community-targeted Playwright smoke
|
||
|
||
## Next
|
||
|
||
### `feat/community-release-hardening`
|
||
|
||
Status: done
|
||
|
||
Goal:
|
||
- закрепить воспроизводимый Community release path и release checklist без скрытых переходных допущений.
|
||
|
||
Main code areas:
|
||
- `.github/workflows/ci.yml`
|
||
- `.github/workflows/deploy.yml`
|
||
- `deploy/community/*`
|
||
- `docs/community-release-checklist.md`
|
||
- `docs/deploy-and-staging-smoke.md`
|
||
- `docs/authenticated-staging-pass.md`
|
||
- `docs/public-smoke-targets.md`
|
||
- `docs/staging-regression-notes.md`
|
||
- `scripts/staging-smoke.sh`
|
||
- `scripts/authenticated-staging-smoke.sh`
|
||
- `scripts/staging-note-block.sh`
|
||
|
||
Implementation slices:
|
||
1. проверить соответствие CI Community manifests;
|
||
2. зафиксировать Community-only smoke baseline;
|
||
3. обновить release checklist после финальной cleanup-фазы.
|
||
|
||
DoD:
|
||
- Community release path не зависит от private repositories;
|
||
- checklist соответствует реальному Community deploy surface;
|
||
- пост-деплойная проверка повторяема.
|
||
|
||
Verification:
|
||
- `python3` YAML parse for `.github/workflows/ci.yml`
|
||
- `docker compose -f deploy/community/docker-compose.yml --env-file deploy/community/.env.example config -q`
|
||
- `docker compose -f deploy/community/docker-compose.yml --env-file deploy/community/.env.example --profile cache config -q`
|
||
- `just check`
|
||
- `apps/ui` build
|
||
- Community-targeted Playwright smoke including `staging-authenticated.spec.js`
|
||
|
||
Progress:
|
||
- done:
|
||
- `UI Checks` in `CI` now run real `npm ci` and `npm run build` before the container image build
|
||
- Community release docs and helper scripts now describe only the real `REST-only` deploy smoke baseline
|
||
- staging templates and regression notes no longer require `GraphQL`, `gRPC`, `WebSocket`, `SOAP`, or streaming scenarios in Community
|
||
- Community public smoke targets are reduced to the canonical `REST -> Open-Meteo` path
|
||
- obsolete split-helper artifact `scripts/export-community.sh` and stale premium smoke payloads have been removed from the public repo
|
||
|
||
### `feat/common-public-improvements`
|
||
|
||
Status: in_progress
|
||
|
||
Goal:
|
||
- вносить общие улучшения в публичную базу, которые потом синхронно переносятся в `enterprise` и `cloud`.
|
||
- начать Wave 1 modularization из `modular_decomposition.xml` без изменения поведения Community runtime.
|
||
|
||
Main code areas:
|
||
- общий Community runtime/UI/API surface
|
||
- `crates/crank-core`
|
||
- `apps/mcp-server`
|
||
- `docs/modular_decomposition.xml`
|
||
|
||
Implementation slices:
|
||
1. выполнять общие изменения сначала в `crank-community`;
|
||
2. брать архитектурные slices из `modular_decomposition.xml`, а не из legacy cleanup backlog;
|
||
3. после стабилизации базовой границы подтягивать ее в private repos по зафиксированной sync model.
|
||
|
||
DoD:
|
||
- общий функционал не расходится между тремя редакциями без необходимости;
|
||
- Community остается source base для общей open-core логики.
|
||
|
||
Verification:
|
||
- `cargo check --workspace`
|
||
- таргетные compile/test checks для затронутого бинаря или crate
|
||
|
||
Progress:
|
||
- done:
|
||
- Phase 0 / task `0.1`: создан `crank-core::ext` module skeleton
|
||
- Phase 0 / task `0.2`: `MachineCredentialVerifier` и связанные типы вынесены из `apps/mcp-server` в public seam `crank_core::ext::auth`
|
||
- Phase 0 / task `0.3`: введены `MachineTokenIssuer`, `NoMachineTokenIssuer`, `TokenIssuerActor` и `TokenIssuerError` в public seam `crank_core::ext::auth`
|
||
- Phase 0 / task `0.4`: введены `IdentityProvider`, `IdentityProviderKind`, `IdentityError`, `LoginPayload`, `LoginOutcome` и public forwarder type `AuthenticatedIdentity` в `crank_core::ext::auth`
|
||
- Phase 0 / task `0.5`: введены `PolicyEngine`, `SessionActor`, `PolicyAction`, `PolicyScope`, `PolicyDecision` и default `OwnerOnlyPolicyEngine` в public seam `crank_core::ext::access`
|
||
- Phase 0 / task `0.6`: введены `AuditSink`, `NoopAuditSink`, `AuditEventId` и базовые audit-типы в public seam `crank_core::ext::audit`
|
||
- Phase 0 / task `0.7`: введены `CapabilityProfile` и `CommunityCapabilityProfile`, а `admin-api` capability payload теперь собирается через public seam вместо локального literal
|
||
- Phase 0 / task `0.8`: введены `ProtocolAdapter`, `ProtocolAdapterError`, `AdapterRegistry` и базовые transport-типы (`PreparedRequest`, `AdapterResponse`, `WindowExecutionResult`, `RuntimeRequestContext`) в `crank_core::ext::protocol`
|
||
- Phase 0 / task `0.9`: `crank-adapter-rest::RestAdapter` реализует новый `ProtocolAdapter` contract, а seam дополнен явным `Target` и window parameters для реального adapter wiring
|
||
- Phase 0 / task `0.10`: `RuntimeExecutor` переведен с hardcoded adapter fields на `AdapterRegistry`, `crank-runtime` больше не держит protocol feature flags, а общий `PreparedRequest` seam дополнен `timeout_ms` для корректного runtime dispatch
|
||
- Phase 0 / task `0.11`: добавлены `RuntimeExecutorBuilder` и `community_default()`, а default community runtime wiring вынесен из `RuntimeExecutor` в отдельный builder layer
|
||
- Phase 0 / task `0.12`: `apps/admin-api` и `apps/mcp-server` переведены на `community_default().with_limits(...).with_response_cache(...).build()` вместо прямой сборки runtime через `RuntimeExecutor::with_limits(...)`
|
||
- Phase 0 / task `0.13`: введены `RegistryExtension`, `ExtensionMigration` и `apply_extension_migrations(...)` в `crank-registry` как отдельный public seam для additive private migrations
|
||
- Phase 0 / task `0.14`: добавлены `AdminServiceBuilder`, seam slots (`identity_provider`, `policy_engine`, `audit_sink`, `token_issuer`, `capability_profile`) и community defaults для них; `apps/admin-api/src/main.rs` переведен на builder
|
||
- Phase 0 / task `0.15`: route delegation переведен на public seams — `capabilities` route идет через `capability_profile`, write handlers в `routes/access.rs` проверяют `policy_engine` и пишут generic audit events через `audit_sink`, а `machine_auth` route использует `token_issuer` seam и сохраняет текущий Community `403` contract
|
||
- Phase 0 / task `0.16`: phase verification gate пройден — `just fmt`, `just check`, `just test`, таргетные Community machine-auth tests и MCP initialize smoke (`requires_initialized_notification_before_tool_methods`) зеленые; runtime regression test обновлен под новый `RuntimeError::ProtocolAdapter` contract
|
||
- Phase 1 / tasks `1.1`–`1.3`: strict-REST Community cleanup уже был закрыт ранее — non-REST adapters и `crank-proto` удалены из workspace, descriptor/premium UI surface убран из Community build, wizard и i18n приведены к REST-only baseline
|
||
- Phase 1 / task `1.4`: создан crate `crank-community-auth`; в него вынесены password hashing/session cookie primitives и `PasswordIdentityProvider`, `admin-api` переключен на этот crate, а `login()` теперь реально делегирует credential check через `IdentityProvider` seam
|
||
- Phase 1 / task `1.5`: создан crate `crank-community-mcp`; в него вынесены `build_app`, `catalog`, `jsonrpc`, `session` и `auth` из `apps/mcp-server`, а `apps/mcp-server/src/main.rs` стал thin launcher с env parsing и DI wiring
|
||
- Phase 1 / task `1.6`: Community test surface уже приведен к честному baseline — `test = false` удален ранее, premium-only tests вычищены, `just verify` проходит на текущем составе workspace
|
||
- Phase 1 / task `1.7`: workspace version bumped to `0.2.0`; release gate пройден (`just verify`, `npm run build`, `npm run e2e`), release commit и tag `v0.2.0` подготовлены в `crank-community`
|
||
- Phase 2 dependency slice: `IdentityProvider` seam widened to cover `SSO/TOTP` with default `NotSupportedForProvider` methods and shared public DTOs for authorize/callback/two-factor flows; workspace version bumped to `0.3.0` for downstream enterprise consumption
|
||
- Phase 2 dependency slice: `apps/admin-api` now exposes a reusable lib target (`src/lib.rs`), so downstream private repos can depend on `build_app`, `AppState`, `AdminServiceBuilder`, and auth/state modules without copying the Community admin app
|
||
- Phase 3 dependency slice: added public tenancy seam in `crank-core` — `TenantId`, `TenantResolutionContext`, `TenantController`, `TenancyError`, and `SingleTenantController` — so `cloud` can build hosted tenant routing without bypassing the shared extension model
|
||
- Phase 3 dependency slice: added public metering seam in `crank-core` — `MeteringEvent`, `MeteringSink`, `SharedMeteringSink`, and `NoopMeteringSink` — so `cloud` can add hosted usage capture without introducing private-only contracts
|
||
- Phase 3 dependency slice: added public billing seam in `crank-core` — `BillingHook`, `BillingGate`, `BillingError`, `SharedBillingHook`, and `NoopBillingHook` — so `cloud` can layer billing policy without private-only contracts in the base repo
|
||
- Phase 3 runtime slice: `RuntimeRequestContext` now carries optional metering context (`workspace_id`, `agent_id`, `source`), `RuntimeExecutorBuilder` accepts a `MeteringSink`, and `RuntimeExecutor` emits `MeteringEvent` on invocation completion while Community apps keep using the default `NoopMeteringSink`
|
||
- Phase 3 dependency slice: added `CacheBackendFactory` in `crank-runtime` with `BuiltinCacheBackendFactory`; unlike the original draft, the seam lives in runtime rather than core to avoid a `crank-core -> crank-runtime` dependency cycle around `RuntimeCacheStores`
|
||
- Phase 5 / task `5.1`: added Community UI overlay foundation — `slot-registry.js`, `overlay-loader.js`, optional `CRANK_UI_OVERLAY_DIR` copy path in the UI build, settings slot mounts, and wizard protocol-card slot mounts; Community build stays noop without any private overlay package
|
||
- backward-compatible alias `CommunityMachineCredentialVerifier` сохранен, поведение Community не изменено
|
||
|
||
### `feat/community-release-pipeline`
|
||
|
||
Status: in_progress
|
||
|
||
Goal:
|
||
- закрыть `Phase 6.1` и сделать reproducible tag-release flow для `crank-community`.
|
||
|
||
Main code areas:
|
||
- `.github/workflows/release.yml`
|
||
- `apps/admin-api/Dockerfile`
|
||
- `apps/mcp-server/Dockerfile`
|
||
- `apps/ui/Dockerfile`
|
||
|
||
Implementation slices:
|
||
1. build release binaries and UI dist on `push tag v*`;
|
||
2. publish Community images to `GHCR`;
|
||
3. attach checksums and SBOM to GitHub Release.
|
||
|
||
DoD:
|
||
- `crank-community` выпускается из собственного repo без private inputs;
|
||
- tag push `v*` produces GitHub Release artifacts and container images.
|
||
|
||
Verification:
|
||
- `python3` YAML parse for `.github/workflows/release.yml`
|