From 1e15a5319dcbb78b04454931a13f539db668b614 Mon Sep 17 00:00:00 2001 From: vitya Date: Sat, 9 May 2026 20:53:57 +0300 Subject: [PATCH] =?UTF-8?q?feat(skills):=20multi-owner=20v2.x=20sweep=20?= =?UTF-8?q?=E2=80=94=20using-projects-meta=20v1.2.0=20+=20setup-projects-m?= =?UTF-8?q?eta=20v1.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - using-projects-meta 1.1.0 → 1.2.0: examples qualified (`victor/books`, `OpeItcLoc03/claude-skills`), `target_project` description rewrites _meta → `agenda` literal + bare-name reject; new common-mistake row; cross-ref to `concepts/projects-meta-multi-owner`. - setup-projects-meta 1.0.1 → 1.1.0: auth.toml template now reflects v2.x schema (`gitea_owners`, `agenda_tasks_repo` qualified, optional `gitea_aggregate_skip_owners`); added schema-notes block with backwards-compat for legacy `gitea_user`-only installs. - closes [update-using-projects-meta-qualified-names] + [update-setup-projects-meta-auth-toml] (last 2 of 14 multi-owner umbrella blockers). Co-Authored-By: Claude Opus 4.7 (1M context) --- .tasks/STATUS.md | 20 +++++++++++--------- dist/setup-projects-meta.skill | Bin 6938 -> 7385 bytes dist/using-projects-meta.skill | Bin 8837 -> 9011 bytes skills/setup-projects-meta/SKILL.md | 21 +++++++++++++++------ skills/using-projects-meta/SKILL.md | 9 +++++---- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index db1560b..4dea294 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,5 +1,5 @@ # Task Board -_Updated: 2026-05-07 (bootstrap-fix-tdd-recommend-template + bootstrap-upgrade-canonical-triggers done)_ +_Updated: 2026-05-09 (multi-owner skill-side wrap-up: using-projects-meta v1.2.0 + setup-projects-meta v1.1.0 done)_ + --- -## 🔵 [update-setup-projects-meta-auth-toml] — Обновить SKILL.md скила `setup-projects-meta`: новая структура auth.toml — `gitea_owners = [...]` массив, `agenda_tasks_repo` qualified имя. Backwards-compat note: старый `gitea_user = "X"` без `gitea_owners` читается как `gitea_owners = ["X"]`. Часть миграции multi-owner (см. concept `projects-meta-multi-owner` в common wiki). +## 🟢 [update-setup-projects-meta-auth-toml] — Обновить SKILL.md скила `setup-projects-meta`: новая структура auth.toml — `gitea_owners = [...]` массив, `agenda_tasks_repo` qualified имя. Backwards-compat note: старый `gitea_user = "X"` без `gitea_owners` читается как `gitea_owners = ["X"]`. Часть миграции multi-owner (см. concept `projects-meta-multi-owner` в common wiki). -**Status:** blocked -**Where I stopped:** (not started) -**Next action:** Прочитать `~/projects/claude-skills/skills/setup-projects-meta/SKILL.md`. В шаблоне auth.toml: добавить `gitea_owners = ["victor", "cancel_music"]`, заменить `meta_tasks_repo = "projects-tasks"` на `agenda_tasks_repo = "OpeItcLoc03/agenda"`. Bump version (MINOR). Зависит от code-side `multi-owner-config` в common. +**Status:** done +**Where I stopped:** v1.0.1 → 1.1.0 — auth.toml template обновлён до v2.x схемы (`gitea_owners`, `agenda_tasks_repo` qualified, optional `gitea_aggregate_skip_owners`), schema notes блок добавлен с backwards-compat. +**Next action:** (none — kept until merged) **Blocker:** multi-owner-config **Branch:** n/a + --- diff --git a/dist/setup-projects-meta.skill b/dist/setup-projects-meta.skill index bcf2c532eae477e029e3341e55bd005c7a586afe..daf5c7d6cde1861bef935a2946809d97176533be 100644 GIT binary patch delta 5322 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 diff --git a/dist/using-projects-meta.skill b/dist/using-projects-meta.skill index e86da9f4bd7273b3d964f9189ff41939de9443d1..2f3913b1d0f0c226438c052dea0c4ee8284e492c 100644 GIT binary patch delta 5464 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 OlRqLr28bd60001W>X$(P delta 5308 zcmV;t6hrH?MukPNXAKfYq@`R$SzFUX6aWANGynh`0F(bB9)G1<>y8^ocK$z4QJ{aA zGa{QKTfqV|S{aIb8$`0S;yBtM2&RkOMY283u6AFB;$jf&I@lW!BtVe=3oMZTj$|uOi?B_JAY93gZsh$PHf7kNb-sweOel|oSRH7ZE=cMm5vHqmTFO_Rg$Mh`Kgr6 z@UKy}Pz#-{@V{uDWTsR<{PJHFzvEX`l`c<}p3Mp~)3l1}hl?mbIoa6N$q5ZBPxivy zfhy;^FtPe5sf->@baaX@%j7gspVy{Xsgc6YOj%ts(SK=Xm#K+oMkd1!%T*SsIMK7r zmQ@m!*SyI8FDqTuWw;xt<06^OAS*g*J}-2M)1}F&Q9UOVou-XEdIQy4&UN)R53lA% zO{^|rejd$Dbm|X9=b(qB(M2?G-XHqs?r2F?+3i;@etYr7`g?Wp4{H7G`px>gi+@(@ z@77dlRUR6qRYUsPnXX;Lf#H9k#pg=P4BdwcGLdwX89FbKBn5id{6 zR)2E~FH4g%L#7fZ@D2zp3}jdcVTJ(>9)-cq5T3mA7Tl72kyh9+S@rD63!I{WM`P4m z>N!5p4tI9Kjd4R*d#Dl;acU!-LTGVfJ8#3-mlg*ubDNdPBuSGhG3CL|&iw#qdUB&X zdZ{utxq$H$+JgGC%dopzzj8Gm^$TZ8itvLXnFoqV7o;0IpE4-1yY-;V-* zG-?kLvN2=N*#jSe&~-D}Q!# zCrnZ|z*c5sq4l?H8!M;4-&pC2gynx6ZH$63@m6506}jDwW1Y>xv#O$ws+u;ZOXxK^ z)qo_JC8mi?UeQO)#wLP~rLBvIKNWfzsIY}!Cwg_S`;g?%{z6!e83x@S1^l+&z%~~a zvgfzNe}kQ!F)yp^RAIZ-{J;sTAAioPDlZR4qghe~r@sJ5odspWs9&P#CKGm|9-r^bRG62cT_Y6^OApl*phIHxMpdiGN>7=RI+1cCs z(80V9V;&O8WeY+h2J;v}BdXF>fHPhJhjbVZ@M@Z*&@c9lh$xComwHu72xJMm$Vpi3 z!0OoJ7Vvqfp6M0hoPTViubve>-l4c)^zQ*#Ci#un7hEFQNhva9C31-v|R^SooSB_Vb`8*m!B zeyT24!z|=buh<4H#eK5dD@cWP^hNcVN-MokM@=F^a+lS+lz;nns_R~A7nLFtNrmHV<{yB**iNT>p7Es& zjv*~h;+Dp#R1;Pk#?AqwX~nR>5eyQX+odF{{xrKmYnh)sKkiuP@nw`J-(O}z<_Vb^ zKHnfeZS--rf^)NFl|Wbs#&NlBtndv+1<`sT*fkigH24e zG*FVa$bSHG7BfRGRpIdp)`EP>#h*oz)tphzY@l8_A7+X|s}ERXl;45mW-fAq-D_5Y z5KK-Gu43>*V({w0JMWZ2A2O@V>payNOAna@XS22-BQwKkn#|_az-2!T<&v)?{Ap^J z2;*TGQmXZYBg@Tj3eh5c_{&0P&;ax$rr)H@2Y)+CLE?WT8puB(0GSgnkVoqNzIy)B zdBjO%YuNWAwa;(SKcts1BOQ10gn*J9n~l%n1GP`CSIXftVq*cLPQAty>Ft z^?&l{_=BOTJy6{g z+J9p_6R|Q`JxjFeni4J9Q8ObsfCf5t$r&eWmXjS!Ss>q{xdfgmoD5XEpP8ksR+BSg ze8IB{Lw)?>D3IvF?9@dM4M|3F6|))&w3%EX16Bh+wt=ar_0RUqZeaU4KgT zVE;ZL@q_($`K;sP=PyLZvVLVx4aH$ac?+c?v(1V}lLnDIVv01jV1*YJ&|F5u#WA0u zOv;z$2#}H}K?>shx+iP#zDTVc=>c93vAJ{X>`|azS|&U*8hGM2<-GaUt@U~S1DGsR znsP+UB#A`$yKWXq;@~bpkDk15Ie)0ojSwbI{ru*E5j=#ER=$MA`rmra!vvSd8RZCrbD{H;Ec&7UMOqmx>Lq&NPbUL zc7J~;Nb3A`2}TZ1kq8+q*t{kh!5}hH2iFx>wYYjdbiqr-MKY}#kDb6uh<`7*S`QF8 z9wJlAOQwocS0Z=j`cf0{gH{H@0bQhpZ*Ejc!O}{TPF+zc@vOD2uX1H|z>P~%#R=%Lk89#+E(|W94j7S`!~ohkv`exs;?lx;^$~9oM2le(H46revMmlyz(ht_E_WL+ufH-4hI; zud<^(@&02{!{;@5RFjH!kbp~zREgnn=Xl5+6RKp*N_>A&7o>%5J;v2!?pQEkzd2Wr zsTLYl)G?9x-f6%w5_if`x6IyDHdM&XMEW$YC%`=dVVBsr>3`Y%?*WWnS0`GEp|{M= z#qIN^4@I9}>ZNKjUve#?EnXvixBD{Fc{#V$?)3{?QJnEdI3!l6!q_f!l2MBy1x4h= z#~n10*A5lJHs~RuE=fz?ab#v0Q{@2%cT@ee2LbokPQlC=JnyhQF9VVuec-w|C6NB` z4Rou%31$JLb$@+@{B8oNXM`$kqrltE({A<5*I7m(6*1yOnvT;g%#}HARP|fAZo?8+X66U)q?Ay*I2^wyf8ki zh1bClFyW)oLz?fAE0%}d%6XXD8GQ`g+Ukej{jS^3>~uLhz0Zv<=Uoon0izq-<;R}( z87QL)v4!pd$>-hRvin?mc{RBQ-Z;s11gybhq(Lq?bD};fWOG zm|ubKQ+`LaHiBx2$|L#0ILbgJai!DBa|PEAUh74kQnRz65=I_vlYVguZXp#1ce?@e zUazUA-GO9qnF;dyNv9Qc|D6rC!3DREkeTIFUv`WMN9vL`jpDE53LHL4JW>-{7b3ZV~7i|MEFqXK6*Tx*a4CWf8b!-}k9Dj9Y8}e*JnvKQ0;$U=$9A2S$}i!Pb&1q80mxG#VKTSQbp@x19rvB_BulJvwsh1 z_TeI#6?{@rY4=89?_m%GkN9~fFm61jf`U(W!d)+Z$7l}PT&|_joY39dO5)fMIEU-x zZ>~-W1v>fK(}6<5#-+=3&|@TBpmgyxFb1>iWuAQo2i{NQ1cG9$xBnh0^MxHk9nR$)F(RCrZQR3fS7@d`!nw@J)NFM}HkDLqhZL~h<27i!rGQv(PqrDk+ zQyT-WBlWjg&0V=}Ygmp*<;g9-@+xdf$K06lsl~bfu%N?EjB-7z(B~VhdrwICi_bYE zClpf8pF!cVL*U(zri@vLrAkTJN!D4qboch?hY56Y+DU)p7=NvC!mGf+UCC7a9tnkS zgtNeUoEYXNN~SPC>3?P{EeyiH;9BVtS-74B*FYk9sLpsTo3(>7o0LX2@}Z^iY&2UX zCpItHR_AXaO!Xp3X}xpxzPsq=t6prIZDorpzpkcrNS2{OH*q2j!?p%R_plkgG_wlB zk%AXm1@7k3OPURYyri2Uy`#5baBRHJ>F}?Q2R)8-nZ0zEoPTd8=myXEI{B0@Xt;Kw z-1?<9m-oJ{i%D`91RtX$H~cR5k?2lFuelMp-65C#6ipvuyN$Kkz^dl-s!bs>Zj#W+ zI_-7tSMW0eLnZwuvoaGY+9#!N)bf>$g(bNXd~j%Bs^dFg?jl4PH1gzS7#aXj18ThS zWgfW;x&(;4yMIrHZK(pGsoqZK^5XH+y4xQ~=I@IHO&qPc+kMU71~~LrpyYCg{B;c+ zX9e$*KwIjmsaABG;EF9bwj{fPh2h1w`DP1U%jt4Gf9K10@;p@g)^;=1z+bGoyrCdZ=Thl`n0009t OlkFlv2HGJ20002cWJPQM diff --git a/skills/setup-projects-meta/SKILL.md b/skills/setup-projects-meta/SKILL.md index ef535f8..9d9a62a 100644 --- a/skills/setup-projects-meta/SKILL.md +++ b/skills/setup-projects-meta/SKILL.md @@ -1,6 +1,6 @@ --- name: setup-projects-meta -version: 1.0.1 +version: 1.1.0 description: Installs and configures the local `projects-meta-mcp` stdio server — clones the repo to `~/projects/.common/lib/projects-meta-mcp`, builds it, writes `~/.config/projects-mcp/auth.toml` with the user's Gitea token, clones the shared wiki to `~/projects/.wiki/` (content lives in root), and registers `mcpServers.projects-meta` in `~/.claude.json`. Use this skill when the user says "install projects-meta", "set up projects-meta", "configure projects-meta", "настрой projects-meta", "установи projects-meta", "projects-meta не работает", "projects-meta isn't working", or whenever the `mcp__projects-meta__*` tools are missing in a session that needs cross-project task aggregation or the shared Gitea wiki. Cross-platform — Windows / Linux / macOS. Mutates user-level config and writes secrets; pauses for confirmation before every write. --- @@ -121,13 +121,22 @@ mkdir -p ~/.config/projects-mcp If `~/.config/projects-mcp/auth.toml` already exists and Phase 1 found a valid `gitea_token` line — skip the write. Otherwise, write the file with the token captured in Phase 1 (or freshly pasted in Phase 2): ```toml -gitea_url = "https://git.kzntsv.site" -gitea_user = "OpeItcLoc03" -gitea_token = "" -# meta_tasks_repo = "projects-tasks" # uncomment to override default -# meta_wiki_repo = "projects-wiki" # uncomment to override default +gitea_url = "https://git.kzntsv.site" +gitea_user = "OpeItcLoc03" # acting identity (commit author) +gitea_token = "" +gitea_owners = ["victor", "cancel_music"] # additional Gitea owners to sync +agenda_tasks_repo = "OpeItcLoc03/agenda" # cross-project meta-board (qualified) +# gitea_aggregate_skip_owners = ["OpeItcLoc03"] # opt: sync but hide from `tasks_aggregate` ``` +**Schema notes (v2.x server):** + +- `gitea_owners` is an array of owners whose repos are scanned by `sync.js` and surfaced in aggregation views. `gitea_user` is acting identity only (commit author footer), not necessarily aggregated. +- `agenda_tasks_repo` is **qualified** (`/`). The literal `agenda` in `target_project` resolves through this field. +- `gitea_aggregate_skip_owners` (optional, v2.2.0+) — visited by sync (so mutations work via cache lookup) but hidden from `tasks_aggregate` / `tasks_search`. Useful for keeping infra repos write-able without polluting the dashboard. +- Backwards-compat: legacy installs with only `gitea_user = "X"` and no `gitea_owners` → server reads as `gitea_owners = ["X"]`. +- Legacy `meta_tasks_repo` / `meta_wiki_repo` → renamed to `agenda_tasks_repo` / built-in `projects-wiki`. Old keys ignored on v2.x. + Permissions: on Linux / macOS run `chmod 600 ~/.config/projects-mcp/auth.toml`. On Windows the default ACL is per-user, no extra step. ### Phase 6 — Register in `~/.claude.json` diff --git a/skills/using-projects-meta/SKILL.md b/skills/using-projects-meta/SKILL.md index 1b24a97..c8ec4f2 100644 --- a/skills/using-projects-meta/SKILL.md +++ b/skills/using-projects-meta/SKILL.md @@ -1,6 +1,6 @@ --- name: using-projects-meta -version: 1.1.0 +version: 1.2.0 description: Use when working across multiple projects on one or many machines — cross-project task aggregation (`mcp__projects-meta__tasks_*`), shared Gitea-backed wiki query / ingest (`mcp__projects-meta__knowledge_*`), or sync diagnostics (`mcp__projects-meta__meta_status`). Triggers on phrases like "across all projects", "what's on the boards", "check shared wiki", "search projects-wiki", "ingest into shared wiki", "что у меня на досках", "по всем проектам", "общая вики", "cross-project status", or any time the user wants to see / mutate state in another repo than the current cwd. v1.1.0 mandates a Step 0 freshness gate (probe `meta_status`, sync if stale, pull `projects-wiki` before shared-wiki writes) — see SKILL body. Mutation tools require two-step preview → confirm. Skip for the **current** project's tasks/wiki — those live on disk in `.tasks/` / `.wiki/`. --- @@ -142,7 +142,7 @@ Use MCP only for **other** projects, **other** machines, or **shared** wiki cont | `mcp__projects-meta__knowledge_ingest` | `target_project`, `type`, `slug`, `body` (+ opt `frontmatter`, `source_project`) | Three commits: `/.md` + `index.md` + `log.md`. `type` ∈ entities / concepts / packages / sources / raw | | `mcp__projects-meta__knowledge_promote` | `target_project`, `slug`, `body` (+ opt `frontmatter`, `source_project`) | Move `raw/.md` → `sources/.md` with auto `raw_path` link | -`target_project` is either a Gitea repo name, or `_meta` (the dedicated meta-tasks / meta-wiki repos from `auth.toml`). +`target_project` is **qualified** `/` (e.g. `victor/books`, `OpeItcLoc03/claude-skills`), or the literal `agenda` for the cross-project meta-board (resolves via `agenda_tasks_repo` in `auth.toml`). Bare names (`books`) are rejected with a hint to use the qualified form. Cross-cutting design: shared wiki → `concepts/projects-meta-multi-owner`. ## Examples @@ -181,7 +181,7 @@ User: "заведи в проекте books задачу на миграцию ` ``` 1. mcp__projects-meta__tasks_create - target_project: "books" + target_project: "victor/books" slug: "settings-json-migration" description: "<...>" next_action: "<...>" @@ -203,7 +203,7 @@ User: "close `[projects-meta-skills]` in claude-skills" ``` 1. mcp__projects-meta__tasks_close - target_project: "claude-skills" + target_project: "OpeItcLoc03/claude-skills" slug: "projects-meta-skills" note: "" (no `confirm`) @@ -227,6 +227,7 @@ User: "close `[projects-meta-skills]` in claude-skills" | Calling `knowledge_ingest` with the wrong `type` | `type` must be one of `entities` / `concepts` / `packages` / `sources` / `raw`. Mis-typed pages land in the wrong section and break `index.md`. | | Vague `knowledge_search` queries ("auth", "config") | Specific multi-word queries return targeted snippets; vague ones return noise. | | Forgetting `domain="all"` when searching across families | Default `domain` is auto-detected from cwd; use `"all"` if the wiki page lives in a different family. | +| Passing bare project name (`target_project: "books"`) to mutation tools | v2.x rejects bare names. Use qualified `/` (e.g. `victor/books`, `OpeItcLoc03/claude-skills`). Literal `agenda` is the only exception (cross-project meta-board). | ## Red flags