Files
board-viewer/tests/fixtures/real-projects-meta-mcp-STATUS.md
vitya d093693795 feat(reader): Gitea client + config + board orchestrator
closes board-viewer-gitea-reader

- src/gitea.ts: HTTP client (getFile, getLatestCommitIso, rawUrl); DI'd fetch
- src/reader.ts: readBoard(client, repos) → TaskRecord[]
- src/config.ts: TOML config loader with board_viewer_repos whitelist
- 25 tests total (9 parser incl. 3 real-repo fixtures, 7 gitea, 5 reader, 4 config)
- emoji contract 🔴🟡🔵🟢 (open/in_progress/paused/blocked/done)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:48:37 +03:00

148 lines
12 KiB
Markdown
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.
# Task Board
_Updated: 2026-05-05_
<!-- tool-description-routing-hint: closed 2026-05-01, ingested as projects-wiki@d98d62c. См. .tasks/tool-description-routing-hint.md -->
<!-- bootstrap-implementation: closed 2026-04-29, merged on main. См. .tasks/bootstrap-implementation.md -->
<!--
Add one block per task, sorted by priority. Use the emoji status legend below.
Per-task deep context lives in .tasks/<task-slug>.md (created on demand by using-tasks).
Block format:
## 🔴 [task-slug] — short description
**Status:** active
**Where I stopped:** one sentence — the exact thought or action interrupted
**Next action:** one concrete step to resume immediately
**Blocker:** (only if blocked) what is preventing progress
**Branch:** git branch name
---
Status legend:
🔴 Active — only one at a time
🟡 Paused — in progress, resumable
⚪ Ready — defined, not started
🟢 Done — kept until merged
🔵 Blocked — waiting on external input
-->
## 🟢 [mvp1-meta-pseudo-project] — локальный `_meta` pseudo-project (DONE)
**Status:** done
**Where I stopped:** имплементировано на main: `~/projects/.wiki/` (Karpathy-канон) + `~/projects/.tasks/STATUS.md` созданы; `config.ts` добавил `metaTasksDir`; `sync-runner.ts` инжектит `_meta` через optional `readMetaTasks` dep; `meta.ts` отдаёт `meta_present`/`meta_tasks_active`/`meta_tasks_total`/`meta_tasks_dir`. 63 теста зелёные, e2e на реальной Gitea отдаёт 7 проектов включая `_meta`. Commit `0d6e05d`.
**Next action:** перезапустить Claude Code чтобы новая сессия видела новые поля `meta.status`; затем — MVP-2.
**Branch:** main
---
## 🟢 [mvp2-projects-tasks-repo] — Gitea-репо `projects-tasks` как источник `_meta` (DONE)
**Status:** done
**Where I stopped:** имплементировано на main: `AuthConfig.metaTasksRepo` (default `projects-tasks`, опционально override через auth.toml); `runSync` сначала пытается тянуть `<user>/<meta_tasks_repo>/.tasks/STATUS.md`, при отсутствии — fallback на локальный `~/projects/.tasks/STATUS.md`; meta-репо исключается из обычного списка проектов; `meta.status` отдаёт `meta_source` (`gitea`/`local`/`none`) и `meta_branch`. 72 теста зелёные. Commit `d1ac107`.
**Next action:** для cross-machine — создать Gitea-репо `projects-tasks` с `.tasks/STATUS.md`; вторая машина после `node dist/sync.js` увидит мета-доску. Сейчас `meta_source: 'local'` потому что репо нет.
**Branch:** main
---
## 🟢 [mvp3-write-api] — backend interface + `tasks_create` / `tasks_update` / `tasks_close` (DONE)
**Status:** done
**Where I stopped:** имплементировано на main: `Backend` interface (`src/lib/backend.ts`); `gitea.ts` рефакторен в `makeGiteaBackend` с `getFileWithSha` + `commitFile` (Contents API, base64, sha-lock); `status-md-writer.ts` (format/append/close/update + identity footer); 3 write-тула с hard confirm-gate и dry-run preview; routing-hint в read-тулах. `server.ts` грузит auth опционально. 107 тестов зелёные. Commit `a3aa8b8`.
**Next action:** smoke против реальной Gitea — создать `projects-tasks` репо, запустить sync, дёрнуть `tasks.create` для `_meta` в новой Claude-сессии.
**Branch:** main
---
## 🟢 [mvp4-knowledge-ingest] — `knowledge_ingest` / `knowledge_promote` через backend (DONE)
**Status:** done
**Where I stopped:** имплементировано на main: `wiki-writer.ts` (formatPage / insertIndexEntry / appendLogEntry / freshIndexMd / freshLogMd); `resolveTarget` вынесен в `lib/resolve-target.ts`; `AuthConfig.metaWikiRepo` (default `projects-wiki`); 2 новых тула с hard confirm-gate, тремя последовательными коммитами (page + index + log), partial-failure пробрасывается. 125 тестов зелёные. Commit `5b9e380`.
**Next action:** **Рекурсивный профит unlocked**`tool-description-routing-hint` теперь решается через `knowledge.ingest({target_project: "_meta", type: "concepts", slug: "tasks-routing-rule", body: "..."})`. Gitea-репо `projects-wiki` создан 2026-04-29 (пустой — нужен seed-коммит перед первым ingest).
**Branch:** main
---
## ⚪ [knowledge-getfrom-meta-alias] — `_meta` алиас в `knowledge.get_from`
**Status:** ready
**Where I stopped:** обнаружено при verify [tool-description-routing-hint] 2026-05-01. `ingest` принимает `_meta` (через `resolveTarget`), `get_from` — нет (находит проект через прямой `cache.projects.find`). Асимметрия read/write API.
**Next action:** прокинуть `metaWikiRepo` в `get_from` хендлер; заменить inline find на `resolveTarget(opts.cacheFile, input.project, opts.metaWikiRepo)` по образцу `ingest:384`. Тривиальный fix (~10 строк + tests).
**Branch:** main
---
## ⚪ [knowledge-search-reindex] — invalidate FTS-кэш после ingest/promote
**Status:** ready
**Where I stopped:** `knowledge.search` мемоизирует `cached: WikiPage[]` навсегда (knowledge.ts:133-138). После `ingest` страница лежит на диске + в Gitea, но in-memory FTS-индекс не обновляется — поиск пуст до рестарта MCP. `meta_status.wiki_pages_count` при этом обновляется (другой code path).
**Next action:** простой путь — invalidate `cached = null` в конце `ingest`/`promote` confirm-пути; архитектурный — `chokidar` watcher на `wikiRoot` для self-healing на внешний `git pull`. Решить scope, потом писать.
**Branch:** main
---
## 🟢 [tool-description-routing-hint] — расширить через knowledge.ingest (DONE)
**Status:** done
**Where I stopped:** `knowledge.ingest` дёрнут 2026-05-01 в `_meta/concepts/tasks-routing-rule` (3 коммита в `projects-wiki@main`: `d98d62c` + `be3fefe` + `5b4fe1b`). Верификация через `knowledge_get_from(projects-wiki, concepts/tasks-routing-rule)` — страница доступна. Хардкод routing-hint в `tasks.ts` (commit `a3aa8b8`, MVP-3) остаётся как safety net. Бас-механизм MVP-4 подтверждён.
**Next action:** (none — task closed). Discoveries during verify заведены отдельными тасками: `_meta`-алиас в `knowledge_get_from`, реиндекс search после ingest.
**Branch:** main
<!-- closed-by: vitya@local / 2026-05-01 -->
---
## 🟢 [wiki-path-mismatch] — knowledge.* read/write по одному пути (DONE)
**Status:** done
**Where I stopped:** fix `sharedWikiClone → ~/projects/projects-wiki/.wiki` смержен в main 2026-04-29 (PR #1 → merge commit `d4396b0`, fix commit `621a69f`). Локальная ветка fix/wiki-path-mismatch удалена. 125 тестов зелёные, build чистый.
**Next action:** (none — закрыто). Для применения fix в текущей Claude-сессии — рестарт (dist/server.js перечитать). После рестарта `knowledge.get packages/projects-meta-mcp` должен вернуть содержимое.
**Branch:** main
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: projects-meta-mcp / 2026-04-29T20:37:39.689Z -->
<!-- closed-by: vitya@local / 2026-05-01 -->
---
## 🟢 [refresh-project-bootstrap] — Refresh repo layout via `project-bootstrap@1.5.0` (DONE)
**Status:** done
**Where I stopped:** upgrade-mode reconciliation finished 2026-05-01: CLAUDE.md gained `pull remote before work` + `follow project discipline` triggers; `.wiki/concepts/bootstrap-manifest.md` bumped 1.2.0 → 1.5.0 with `project-discipline@0.1.0`; per-task file created. `.wiki/` and `.tasks/` already canon — no structural changes.
**Next action:** (none — task closed). Push deferred to next batched push along with `wiki-path-mismatch`.
**Branch:** main
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: projects-meta-mcp / 2026-05-01T09:03:57.750Z -->
<!-- closed-by: vitya@local / 2026-05-01 -->
---
## 🟡 [cross-platform-support] — Поддержка Linux и macOS
**Status:** paused
**Where I stopped:** запушены все изменения (commits 3fb3c02 + 0597322). README.md имеет OS-specific инструкции, sync.ts упрощён, tests pass (149/16), build clean. Остаток: тестирование на реальных Linux/macOS машинах или CI.
**Next action:** запушить изменения; проверить на Linux/macOS (или через CI); обновить per-task файл с decision log.
**Branch:** main
---
## 🟢 [migrate-to-common-lib] — Backlog: migrate `projects-meta-mcp` source from `~/projects/projects-meta-mcp/` into `.common/lib/projects-meta-mcp/` for layout uniformity with `interns-mcp` and any future MCP servers. Preserves git history; updates `~/.claude.json` MCP command path; updates `setup-projects-meta` install location. Layout uniformity across `lib/` was raised in interns design as a follow-up to the new `.common/lib/interns-mcp/` location.
**Status:** done
**Where I stopped:** discovered 2026-05-05 via `~/.claude.json` inspection — `mcpServers.projects-meta.command` already points to `~/projects/.common/lib/projects-meta-mcp/dist/server.js`, and `dist/` is built there. `node dist/sync.js` from that location returns `synced 13 projects, 0 errors`. Migration happened informally outside this task's tracking.
**Next action:** (none — closed). Follow-ups: (1) `[using-projects-meta-fix-paths]` in `claude-skills` updates the skill's stale `~/.local/projects-meta-mcp/` references; (2) decide separately whether `~/projects/projects-meta-mcp/` is a leftover working copy to remove, or remains as an active dev clone.
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: meeting-room / 2026-05-05T13:59:22.077Z -->
<!-- closed-by: vitya@local / 2026-05-05 -->
---
## ⚪ [bootstrap-upgrade-canonical-triggers] — Прогнать `project-bootstrap` v1.10.0 в upgrade-режиме на этом проекте. Цель — дописать в `CLAUDE.md` 3 недостающих канонических триггера: `follow tdd-criteria`, `delegate to interns when allowed`, `recommend, don't menu`. Уже присутствуют: `pull remote before work`, `follow project discipline`, `we're on Windows`. Аудит 2026-05-07 через `bulk_text_read`. Контекст — координатор `[bootstrap-rollout-canonical-triggers]` в `_meta` (commit dd933fd). Пилот на `books` подтвердил идемпотентность (158fc95). NB: репа под `OpeItcLoc03` но в кэше projects-meta отсутствует (sync пропустил как archived) — таска создана прямой записью в `.tasks/STATUS.md`.
**Status:** ready
**Where I stopped:** Unblocked 2026-05-07 после успешного прогона `pilonuxt` (commit `e5d45f9`: полный bootstrap — CLAUDE.md + `.wiki/concepts/bootstrap-manifest.md`, скил отработал корректно).
**Next action:** 1) `upgrade project` в `~/projects/projects-meta-mcp/`. **Запустить скил `project-bootstrap` v1.10.0** — не делать ручной Edit (incident на `pilonuxt` 2026-05-07). 2) Подтвердить план: 2 файла — `CLAUDE.md` (+3: `follow tdd-criteria`, `delegate to interns when allowed`, `recommend, don't menu`) + `.wiki/concepts/bootstrap-manifest.md` (manifest 1.x → 1.10.0). 3) Прогнать. 4) **Verify:** `git diff --stat` показывает 2 файла. Если 1 — переоткрыть. Reference: `books@5ca16d9`. 5) Коммит `chore(bootstrap): upgrade CLAUDE.md — add tdd-criteria, interns, recommend-dont-menu triggers` + body со скилами. 6) Повторный — no-op. 7) Закрыть вручную в `.tasks/STATUS.md` (cache-skip).
**Branch:** n/a
<!-- created-by: vitya@local / from: .meeting-room / 2026-05-07 / cache-skip-via-fs -->
<!-- unblocked-by: vitya@local / 2026-05-07 / pilot-pilonuxt-shipped -->
---