fix(skills): meta-host-routing v0.3.0 — naming is meta-<project>, not <project>

v0.2.0 wrongly said the dedicated meta-host shares the project's name. Per
meta-out-of-repo design the convention is meta-<project> (e.g.
OpeItcLoc03/meta-yt-tools), so the bare <project> name stays free for a code
mirror. Fixed resolve step, example, and bootstrap instruction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 12:45:19 +03:00
parent 4355c34c18
commit b065496deb

View File

@@ -1,6 +1,6 @@
--- ---
name: meta-host-routing name: meta-host-routing
version: 0.2.0 version: 0.3.0
description: > description: >
Use before any tasks_create / knowledge_ingest / brainstorm-promotion against Use before any tasks_create / knowledge_ingest / brainstorm-promotion against
a project — resolve WHERE that project's meta lives before writing. A a project — resolve WHERE that project's meta lives before writing. A
@@ -38,7 +38,7 @@ Per the `meta-out-of-repo` design: `.tasks/`, `.wiki/`, `.claude/` must not be c
1. **Detect.** Check the target's local remote (`git remote -v`) and/or a `projects-meta` dry-run. Github remote OR "not in cache" → meta-out-of-repo project; continue. Otherwise → direct Gitea route, this skill does not apply. 1. **Detect.** Check the target's local remote (`git remote -v`) and/or a `projects-meta` dry-run. Github remote OR "not in cache" → meta-out-of-repo project; continue. Otherwise → direct Gitea route, this skill does not apply.
2. **Resolve the meta-host**, in priority order: 2. **Resolve the meta-host**, in priority order:
- **(a) Dedicated meta-host (preferred).** Is there a Gitea repo with the **same name** as the project, holding only `.wiki/`+`.tasks/` (no code)? That is its meta-host. Once synced, `projects-meta` tracks it as a project of that name — `meta_status` / a `tasks_create` dry-run against `<owner>/<project>` resolves. Canonical example: code `github.com/OpeItcLoc03/yt-tools` → meta-host **Gitea `OpeItcLoc03/yt-tools`** (a meta-only repo, same name, code on github). - **(a) Dedicated meta-host (preferred).** Is there a Gitea repo named **`meta-<project>`**, holding only `.wiki/`+`.tasks/` (no code)? That is its meta-host. Once synced, `projects-meta` tracks it as a project `<owner>/meta-<project>` a `tasks_create` dry-run against that resolves. Canonical example: code `github.com/OpeItcLoc03/yt-tools` → meta-host **Gitea `OpeItcLoc03/meta-yt-tools`**. **Naming is `meta-<project>`, NOT `<project>`** — per the `meta-out-of-repo` design: the bare `<project>` name on Gitea must stay free for a possible code **mirror** of the github repo. (Local clone convention, if ever needed: `~/projects/.meta/<project>/`.)
- **(b) Shared host (transitional).** No dedicated host yet → grep sibling Gitea repos, **start with `.common`** (`~/projects/.common/`), for the project name: - **(b) Shared host (transitional).** No dedicated host yet → grep sibling Gitea repos, **start with `.common`** (`~/projects/.common/`), for the project name:
``` ```
grep -ril "<project-name>" ~/projects/.common/.tasks/ ~/projects/.common/.wiki/ grep -ril "<project-name>" ~/projects/.common/.tasks/ ~/projects/.common/.wiki/
@@ -46,9 +46,9 @@ Per the `meta-out-of-repo` design: `.tasks/`, `.wiki/`, `.claude/` must not be c
The host is whichever Gitea repo already holds that project's tasks/wiki. The host is whichever Gitea repo already holds that project's tasks/wiki.
- **(c) Neither** → the project has no meta-host yet (Failure modes — STOP and ask, or bootstrap one per "Bootstrapping a new meta-host"). - **(c) Neither** → the project has no meta-host yet (Failure modes — STOP and ask, or bootstrap one per "Bootstrapping a new meta-host").
> Note: `.common` was yt-tools' shared host until 2026-05-27, when yt-tools graduated to its own dedicated host (`OpeItcLoc03/yt-tools`). `.common` now holds only yt-tools' done-task archive. Prefer giving a maturing project its own host over piling onto `.common`. > Note: `.common` was yt-tools' shared host until 2026-05-27, when yt-tools graduated to its own dedicated host (`OpeItcLoc03/meta-yt-tools`). `.common` now holds only yt-tools' done-task archive. Prefer giving a maturing project its own host over piling onto `.common`.
3. **Route there.** Send every `tasks_create` / `knowledge_ingest` to the host's qualified `<owner>/<repo>` (a dedicated host = `<owner>/<project>`; a shared host = e.g. `OpeItcLoc03/common`). On a shared host, namespace entries with a `<project>-` slug prefix. 3. **Route there.** Send every `tasks_create` / `knowledge_ingest` to the host's qualified `<owner>/<repo>` (a dedicated host = `<owner>/meta-<project>`; a shared host = e.g. `OpeItcLoc03/common`). On a shared host, namespace entries with a `<project>-` slug prefix.
4. **Never** write `.tasks/`/`.wiki/` files into the github working tree, and **never** invent a target when resolution is ambiguous (Failure modes below). 4. **Never** write `.tasks/`/`.wiki/` files into the github working tree, and **never** invent a target when resolution is ambiguous (Failure modes below).
@@ -56,7 +56,7 @@ Per the `meta-out-of-repo` design: `.tasks/`, `.wiki/`, `.claude/` must not be c
When a project graduates to its own dedicated host (or a github project needs one): When a project graduates to its own dedicated host (or a github project needs one):
1. Create a Gitea repo named after the project (meta-only, `auto_init:false`) via the API with the admin token (`~/.config/projects-mcp/auth.toml`). 1. Create a Gitea repo named **`meta-<project>`** (meta-only, `auto_init:false`) via the API with the admin token (`~/.config/projects-mcp/auth.toml`). Do **not** use the bare `<project>` name — keep it free for a code mirror.
2. Clone it, build canonical `.wiki/` (CLAUDE.md, index.md, log.md, overview.md, raw/, concepts/, entities/, packages/, sources/) + `.tasks/STATUS.md` (emoji legend header). 2. Clone it, build canonical `.wiki/` (CLAUDE.md, index.md, log.md, overview.md, raw/, concepts/, entities/, packages/, sources/) + `.tasks/STATUS.md` (emoji legend header).
3. **`git add -f .wiki .tasks`** — the global `core.excludesFile` (`~/.config/git/ignore`) ignores `.wiki/`/`.tasks/`. Existing hosts track them because they were added *before* that ignore existed; a fresh clone needs `-f` or `git add -A` silently stages nothing. This is the one gotcha that will waste a commit if missed. 3. **`git add -f .wiki .tasks`** — the global `core.excludesFile` (`~/.config/git/ignore`) ignores `.wiki/`/`.tasks/`. Existing hosts track them because they were added *before* that ignore existed; a fresh clone needs `-f` or `git add -A` silently stages nothing. This is the one gotcha that will waste a commit if missed.
4. Commit, push. `projects-meta` picks it up on its next sync (it may not be in cache until then — see Failure modes). 4. Commit, push. `projects-meta` picks it up on its next sync (it may not be in cache until then — see Failure modes).