ADR 0158: Forge Lens — overlay в CRS (issues/MR по текущему файлу)
Статус: Accepted · Implemented
Дата: 2026-06-09
Резюме
- Forge Lens в CIDE — read-only слой L2 в CRS (0156): issues и merge requests с code anchors на текущий repo-relative файл.
- Конфигурация только в
.cascade/workspace.toml→[workspace.forge](base_url,repo); Bearer — device login (как Intercom OAuth), не вечный PAT в env. - Канон API, якорей и MCP-write — вне репо: FORGE-ADR-0003 (agent-forge).
- Provenance в CRS:
forge_lens(отдельно отexplicit_toml,doc_scan, …).
Связанные ADR
| ADR | Роль |
|---|---|
| 0155 | Слои L0–L4, correspondence kinds |
| 0156 | CRS, reverse anchors, provenance |
| 0144 | OAuth Connect + secrets TOML (образец) |
| 0149 | api_token_env — только DEV override |
| 0028 | Секреты в %LocalAppData%\CascadeIDE\ |
| FORGE-ADR-0010 | forge auth login, ~/.forge/credentials.json |
| 0157 | cide://; forge:// — в FORGE-ADR-0003 |
| FORGE-ADR-0003 | Lens API, CodeAnchor, MCP-first write |
| 0159 | Bracket [FRG:…] + code-bracket display |
| FORGE-ADR-0012 | Forge storage / thin web round-trip |
Контекст
agent-forge хранит issues/MR с CodeAnchor (тот же контракт, что 0128). Без клиента в IDE артефакты forge остаются вне correspondence-контура CIDE.
В spike v0 появился клиент ForgeLensCorrespondenceClient и секция [workspace.forge], но с глобальным env-fallback (FORGE_BASE_URL, FORGE_REPO, FORGE_API_TOKEN). Это скопировано с mental model MCP-сервера forge (один процесс = один forge), а не с модели IDE (несколько workspace, разные repo).
Решение
1. Где живёт конфиг
| Поле | Где | Обязательность |
|---|---|---|
base_url |
[workspace.forge] в .cascade/workspace.toml |
да (для включения Lens) |
repo |
то же | да (имя forge-repo для этого workspace) |
api_token_env |
то же | нет; только DEV override (0149) |
Пример:
[workspace.forge]
base_url = "http://127.0.0.1:8770"
repo = "cascade-ide"
1.1 Auth (канон, v1.1)
По образцу Intercom (0144 §8):
| Шаг | Действие |
|---|---|
| Connect | forge_lens.connect (IDE MCP) или forge auth login (CLI) |
| Approve | браузер /view/auth/device или forge auth approve (bootstrap один раз) |
| Хранение CIDE | %LocalAppData%\CascadeIDE\forge-lens-secrets.toml |
| Interop CLI/MCP | ~/.forge/credentials.json (FORGE-ADR-0010) — читается, если CIDE secrets пусты |
Резолв Bearer для CRS (порядок):
forge-lens-secrets.tomlдляbase_url~/.forge/credentials.json(тот же host key)api_token_env→ env (DEV/CI)- без Bearer (forge за VPN без
FORGE_REQUIRE_AUTH)
2. CRS integration
- Эндпоинт:
GET /api/v1/repos/{repo}/lens?file={repoRelativePath}(контракт — FORGE-ADR-0003). - Результаты мержатся в
WorkspaceReverseAnchorItemsсProvenance = forge_lens. DocPathдля клика — URL issue/MR на forge (thin web / view); отдельныйforge://handler — не в scope v1.
3. Отклонено: глобальный env-fallback для base_url / repo
Не читаем FORGE_BASE_URL, FORGE_REPO как запасной источник, если TOML пуст.
| Причина | Пояснение |
|---|---|
| Workspace-scoped | У разных открытых solution разные forge-repo; глобальная env одна на машину |
| Канон CIDE | 0149: env — через явный *_env, не magic имена |
| Копируемость | workspace.toml коммитится в репо (без секрета); URL/repo — свойства проекта, не профиля ОС |
| Пилот без TOML | Достаточно одной секции в .cascade/workspace.toml; не нужен shell profile |
MCP forge по-прежнему может использовать FORGE_* в своём процессе — это другой продуктовый контур.
4. v1 вне scope
- Slash
/forge lens,/forge goto— FORGE-ADR-0003, отдельные задачи. - Запись anchors из CIDE — MCP forge, не HTTP из CRS.
- ERS-строка «forge reachable» — опционально позже.
Последствия
- Без
[workspace.forge]CRS не показывает forge-слой (молча, как без L1 map). - Для auth: один раз
forge_lens.connect; bootstrap на сервере — как для первого Intercom Connect, не PAT в launch profile. - Документация forge ↔ CIDE разделена: FORGE-ADR-0003 (протокол) + этот ADR (IDE overlay).
Реализация (v1)
| Компонент | Путь |
|---|---|
| TOML models | Features/Workspace/WorkspaceTomlModels.cs — RepositoryForgeToml |
| HTTP client | ForgeLensCorrespondenceClient.cs |
| Credentials | ForgeLensCredentialResolver.cs, ForgeLensSecretsStorage.cs, ForgeSharedCredentialReader.cs |
| Device login | ForgeLensDeviceConnectService.cs, forge_lens.connect |
| CRS merge | WorkspaceNavigationMapViewModel.Correspondence.cs |