# 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` сначала пытается тянуть `//.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 --- ## 🟢 [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 ---