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>
148 lines
12 KiB
Markdown
148 lines
12 KiB
Markdown
# 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 -->
|
||
|
||
---
|