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

12 KiB
Raw Blame History

Task Board

Updated: 2026-05-05

🟢 [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: Рекурсивный профит unlockedtool-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


🟢 [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


🟢 [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


🟡 [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


[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