From 001f4c566bb8e2ecd42f10eab435c91c0e9e48cf Mon Sep 17 00:00:00 2001 From: vitya Date: Tue, 5 May 2026 20:35:59 +0300 Subject: [PATCH] feat(skills): update setup-projects-meta paths for .common/lib/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace ~/.local/projects-meta-mcp → ~/projects/.common/lib/projects-meta-mcp - Update setup-projects-meta and using-projects-meta skills - Rebuild dist/ with new paths Co-Authored-By: Claude Opus 4.7 (1M context) --- .tasks/STATUS.md | 120 +-- .tasks/bootstrap-claude-md-merge.md | 53 -- .tasks/bootstrap-projects-meta-trigger.md | 30 - .tasks/bootstrap-recommend-superpowers.md | 34 - .tasks/interns-skills-mvp.md | 38 - .tasks/mac-support-scripts.md | 31 - .tasks/project-discipline-skill.md | 761 ------------------- .tasks/projects-meta-skills.md | 49 -- .tasks/pulling-before-work-skill.md | 648 ---------------- .tasks/shared-wiki-skill-catalog.md | 26 - .tasks/using-projects-meta-freshness-gate.md | 34 - dist/setup-projects-meta.skill | Bin 7636 -> 6938 bytes dist/setup-tasks.skill | Bin 3599 -> 5783 bytes dist/setup-wiki.skill | Bin 4280 -> 6397 bytes dist/using-projects-meta.skill | Bin 8870 -> 8837 bytes dist/using-tasks.skill | Bin 2634 -> 4943 bytes dist/using-wiki.skill | Bin 3552 -> 6684 bytes skills/setup-projects-meta/README.md | 6 +- skills/setup-projects-meta/SKILL.md | 26 +- skills/using-projects-meta/README.md | 4 +- skills/using-projects-meta/SKILL.md | 6 +- 21 files changed, 38 insertions(+), 1828 deletions(-) delete mode 100644 .tasks/bootstrap-claude-md-merge.md delete mode 100644 .tasks/bootstrap-projects-meta-trigger.md delete mode 100644 .tasks/bootstrap-recommend-superpowers.md delete mode 100644 .tasks/interns-skills-mvp.md delete mode 100644 .tasks/mac-support-scripts.md delete mode 100644 .tasks/project-discipline-skill.md delete mode 100644 .tasks/projects-meta-skills.md delete mode 100644 .tasks/pulling-before-work-skill.md delete mode 100644 .tasks/shared-wiki-skill-catalog.md delete mode 100644 .tasks/using-projects-meta-freshness-gate.md diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 37f864f..8043ad6 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,38 +1,6 @@ # Task Board _Updated: 2026-05-05_ -## 🟢 [shared-wiki-skill-catalog] — публикация каталога claude-skills в shared projects-wiki -**Status:** done -**Where I stopped:** `packages/claude-skills` опубликован в `projects-wiki` через `knowledge_ingest` (3 коммита Gitea: ae2cc9a3 page + 14bdd863 index + 001cdd0e log); каталог всех 20 скиллов сгруппирован: bootstrap & discipline / wiki+tasks / MCP integrations / caveman cluster / discovery+platform; cross-link с `concepts/setup-using-skill-pair` (паттерн setup-X/using-X) и `packages/projects-meta-mcp`; local `~/projects/projects-wiki/` подтянут ff-only до `001cdd0e`; запись в local `.wiki/log.md` добавлена -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [project-discipline-skill] — project-discipline skill + project-bootstrap 1.5.0 canonical trigger -**Status:** done -**Where I stopped:** `skills/project-discipline/` shipped at v0.1.0 (four rules: convention-override, master-only, semver-bumping with first-edit-unversioned clause, session-scoped ask-before-push with grant/revoke and force/delete/non-ff exceptions); `assets/CLAUDE.md.template` gains `follow project discipline` after `pull remote before work`; `project-bootstrap` 1.4.0→1.5.0 with new commentary paragraph in Step 5 + manifest table row in Step 5.5; `.wiki/concepts/skill-versioning.md` extended (Rule 3 expands `version:` requirement to ALL skills, not just infra subset); root `CLAUDE.md` dogfood line added; both archives rebuilt in `dist/`; installed via `install.sh`; description length verified 855 chars (≤900); smoke scenarios 1 (skill listing with full description, not H1 fallback) + 9 (length regression check) verified inline post-install; scenarios 2-8 (Rule 1-4 in fresh sessions, bootstrap upgrade) deferred — require multi-session orchestration; design rationale at `.wiki/concepts/project-discipline-design.md` -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [pulling-before-work-skill] — pulling-before-work skill + project-bootstrap 1.4.0 canonical trigger -**Status:** done -**Where I stopped:** `skills/pulling-before-work/` shipped at v1.0.0 (mode-3 activation: session start + on-demand re-sync; `git pull --ff-only`; skips on no-remote / no-upstream / dirty / detached); `assets/CLAUDE.md.template` gains `pull remote before work`; `project-bootstrap` 1.3.0→1.4.0 with new commentary paragraph in Step 5; root `CLAUDE.md` dogfood line added; both archives rebuilt in `dist/`; installed via `install.sh`; smoke scenarios 1/2/3/4/5/8/9 + inline bootstrap-merge check verified by controller, scenarios 6 (diverged remote) and 7 (re-sync trigger across a fresh session) deferred — both require multi-session orchestration not yet tooled; design rationale at `.wiki/concepts/pulling-before-work-design.md` -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [bootstrap-claude-md-merge] — project-bootstrap upgrade: idempotent merge of canonical CLAUDE.md triggers -**Status:** done -**Where I stopped:** Step 5 in `skills/project-bootstrap/SKILL.md` split into Init / Upgrade-merge — upgrade reads existing CLAUDE.md, substring-diffs vs template (case-insensitive trim), platform line preserved if user pinned a non-host platform, asks confirm with diff, appends only missing canonical lines; version bump 1.2.0 → 1.3.0; skill row in `skills/project-bootstrap/README.md` updated to note idempotent merge; root `README.md` + `README.ru.md` upgrade-mode paragraph extended; reinstalled to `~/.claude/skills/project-bootstrap/`, `dist/project-bootstrap.skill` rebuilt; concept page `.wiki/concepts/bootstrap-claude-md-merge.md` written; index + log entries added -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [bootstrap-projects-meta-trigger] — project-bootstrap CLAUDE.md template gains `check across all projects` -**Status:** done -**Where I stopped:** template + inline SKILL.md copy patched, version bumped 1.1.0→1.2.0; both READMEs and local CLAUDE.md synced; skill reinstalled to `~/.claude/skills/project-bootstrap/`, `dist/project-bootstrap.skill` rebuilt; concept extension added to `.wiki/concepts/projects-meta-skills.md`; log entry written; verified installed `version: 1.2.0` and template carries the new line -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [bootstrap-recommend-superpowers] — project-bootstrap recommends superpowers plugin if missing -**Status:** done -**Where I stopped:** Step 5.6 added to `skills/project-bootstrap/SKILL.md` (read `~/.claude/plugins/installed_plugins.json`, print install command + upstream link if `superpowers@claude-plugins-official` key missing); version bumped 1.0.0 → 1.1.0; README workflow numbering updated; skill reinstalled to `~/.claude/skills/project-bootstrap/` and `dist/project-bootstrap.skill` rebuilt; log entry added -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [mac-support-scripts] — fix install.sh / build.sh for stock macOS -**Status:** done -**Where I stopped:** patched both scripts to drop `mapfile` (bash 4+) and `find -printf` (GNU find) — replaced with portable shell glob + `basename` + `sort`; verified on git-bash (16 skills discovered, install dry-run + build smoke-test passed); wiki concept page `install-portability.md` added; index + log updated -**Next action:** (none — kept until merged) -**Branch:** master - ---- - ## 🟡 [skill-readmes] — write English README.md for every skill + translate root README **Status:** paused **Where I stopped:** infra-skill cluster done — READMEs for `project-bootstrap`, `setup-wiki`, `setup-tasks`, `using-wiki`, `using-tasks`; root README translated; cross-links between all five skills wired up @@ -78,6 +22,23 @@ _Updated: 2026-05-05_ --- +## ⚪ [bootstrap-skill-deps-check] — refactor project-bootstrap Step 5.6 into a generic skill-dependencies check (replaces per-skill `Step 5.X` mirror shape) +**Status:** ready +**Where I stopped:** (not started) — design agreed in chat 2026-05-05 after `[interns-skills-mvp]` shipped: adding `delegate to interns when allowed` to the canonical CLAUDE.md template made it visible that every new trigger would need its own `Step 5.X` detector mirror, which doesn't scale. Decision: collapse Step 5.6 (superpowers plugin) and the deferred `[bootstrap-recommend-projects-meta]` into a single generic `Step 5.6` that reads the canonical trigger list and maps each line to a fulfiller (skill or plugin) for missing-deps detection. Hard rule "never auto-install" carries over verbatim — chat-only recommendation block with copy-pasteable install commands +**Next action:** Read `.tasks/bootstrap-skill-deps-check.md` for the full spec — initial trigger→fulfiller seed table is in the Notes section. Write `.wiki/concepts/bootstrap-skill-deps-check.md` design page first (rationale: why generic over per-skill mirrors, kind: skill vs plugin distinction, MCP server caveat). Then edit `skills/project-bootstrap/SKILL.md` Step 5.6 in place, bump `version:` 1.6.0 → 1.7.0. Update `skills/project-bootstrap/README.md` Workflow Step 5.6 description. Rebuild + install. Close `[bootstrap-recommend-projects-meta]` with a note in commit message +**Branch:** (not started) + +--- + +## ⚪ [bootstrap-recommend-projects-meta] — Step 5.7 in project-bootstrap: recommend `setup-projects-meta` if MCP tools missing +**Status:** superseded +**Where I stopped:** (not started) — opened as follow-up to `[bootstrap-projects-meta-trigger]`. The `check across all projects` trigger is now in every CLAUDE.md template, but on a fresh machine without `projects-meta-mcp` registered the trigger is silently no-op until the user verbally asks for cross-project work +**Next action:** **superseded by `[bootstrap-skill-deps-check]`** (2026-05-05) — that task absorbs this one into a generic `Step 5.6` that walks the whole canonical trigger list, not just projects-meta. Kept here for git-log archaeology; close once `[bootstrap-skill-deps-check]` ships +**Branch:** (not started) +**Blocker:** waits on observing a real fresh-machine bootstrap that silently misses the dependency — defer until we see the failure mode in practice + +--- + ## ⚪ [compress-dedup] — resolve compress vs caveman-compress duplication **Status:** ready **Where I stopped:** (not started) — noticed during initial migration that both skills ship identical `scripts/` subtrees (`compress.py`, `cli.py`, `detect.py`, `validate.py`, `benchmark.py`) @@ -127,44 +88,7 @@ _Updated: 2026-05-05_ --- -## ⚪ [bootstrap-recommend-projects-meta] — Step 5.7 in project-bootstrap: recommend `setup-projects-meta` if MCP tools missing -**Status:** superseded -**Where I stopped:** (not started) — opened as follow-up to `[bootstrap-projects-meta-trigger]` (commit b120397). The `check across all projects` trigger is now in every CLAUDE.md template, but on a fresh machine without `projects-meta-mcp` registered the trigger is silently no-op until the user verbally asks for cross-project work -**Next action:** **superseded by `[bootstrap-skill-deps-check]`** (2026-05-05) — that task absorbs this one into a generic `Step 5.6` that walks the whole canonical trigger list, not just projects-meta. Kept here for git-log archaeology; close once `[bootstrap-skill-deps-check]` ships -**Branch:** (not started) -**Blocker:** waits on observing a real fresh-machine bootstrap that silently misses the dependency — defer until we see the failure mode in practice - ---- - -## ⚪ [bootstrap-skill-deps-check] — refactor project-bootstrap Step 5.6 into a generic skill-dependencies check (replaces per-skill `Step 5.X` mirror shape) - -**Status:** ready -**Where I stopped:** (not started) — design agreed in chat 2026-05-05 after `[interns-skills-mvp]` shipped: adding `delegate to interns when allowed` to the canonical CLAUDE.md template made it visible that every new trigger would need its own `Step 5.X` detector mirror, which doesn't scale. Decision: collapse Step 5.6 (superpowers plugin) and the deferred `[bootstrap-recommend-projects-meta]` into a single generic `Step 5.6` that reads the canonical trigger list and maps each line to a fulfiller (skill or plugin) for missing-deps detection. Hard rule "never auto-install" carries over verbatim — chat-only recommendation block with copy-pasteable install commands -**Next action:** Read `.tasks/bootstrap-skill-deps-check.md` for the full spec — initial trigger→fulfiller seed table is in the Notes section. Write `.wiki/concepts/bootstrap-skill-deps-check.md` design page first (rationale: why generic over per-skill mirrors, kind: skill vs plugin distinction, MCP server caveat). Then edit `skills/project-bootstrap/SKILL.md` Step 5.6 in place, bump `version:` 1.6.0 → 1.7.0. Update `skills/project-bootstrap/README.md` Workflow Step 5.6 description. Rebuild + install. Close `[bootstrap-recommend-projects-meta]` with a note in commit message -**Branch:** (not started) - -## 🟢 [using-projects-meta-freshness-gate] — добавить Step 0 freshness check в using-projects-meta - -**Status:** done -**Where I stopped:** Step 0 добавлен в `using-projects-meta/SKILL.md` (cache_age>10мин или errors>0 → `dist/sync.js` для read; shared-wiki write — безусловный `git pull --ff-only`; 401/403 → auth.toml rotation); зеркалирован в README; bump 1.0.0→1.1.0; rebuild+install OK; description trimmed до 924 chars после регрессии (полное Step 0 в description ~1450 chars сломало парсинг — harness зафолбэкнулся на H1, скилл потерял все триггеры); Common mistakes + Red flags расширены; concept page + log обновлены; new feedback memory `skill_description_length_limit` -**Next action:** (none — kept until merged) -**Branch:** master - ---- - -## 🟢 [projects-meta-skills] — setup-projects-meta + using-projects-meta — пара скиллов для projects-meta-mcp - -**Status:** done -**Where I stopped:** оба скилла v1.0.0 написаны (8-phase setup + using policy с local-first и two-step mutation), README обоим, собраны в `dist/`, установлены в `~/.claude/skills/`, видны в `Skill` tool listing; concept-страница `projects-meta-skills.md` добавлена в `.wiki/`; path-canon `~/projects/projects-wiki/` починен в скиллах после wiki-path-mismatch fix (upstream commit 621a69f); якоря MCP подтянулись после ручного pull -**Next action:** (none — kept until merged); требуется restart Claude Code чтобы новые скиллы стали активными в новой сессии (build/install уже сделаны) -**Branch:** master - - - ---- - ## ⚪ [refresh-project-bootstrap] — Run the `project-bootstrap` skill in this repo to refresh its layout to the canonical state (git, .gitignore, README.md, .wiki/, .tasks/, CLAUDE.md). The skill handles both greenfield bootstrap and refresh of existing repos. - **Status:** ready **Where I stopped:** (not started) **Next action:** Invoke the `project-bootstrap` skill at the repo root, confirm each file write, push to main. @@ -172,13 +96,3 @@ _Updated: 2026-05-05_ --- - -## 🟢 [interns-skills-mvp] — Ship `setup-interns` + `using-interns` skills (v0.1.0) and bump `project-bootstrap` 1.5.0 → 1.6.0 with `delegate to interns when allowed` CLAUDE.md trigger, manifest entry, Step 5 commentary paragraph, idempotent merge into existing CLAUDE.md files. Two-skill pair following the setup-X / using-X prior art (setup-context7/using-context7, setup-projects-meta/using-projects-meta). Per-session permission grant policy mirroring project-discipline Rule 4 (ask-mode default, conversational grant/revoke, always-ask paths for secrets even with active grant, session-end reset). - -**Status:** done -**Where I stopped:** `skills/setup-interns/` v0.1.0 shipped (8-phase install: detect `.common/lib/interns-mcp/` source, `pip install -e`, write `.common/secrets/interns.env` with endpoint API keys + ensure `.gitignore` covers it, register `mcpServers.interns` in `~/.claude.json` with absolute Python interpreter path + `cwd` to project root); `skills/using-interns/` v0.1.0 shipped (runtime policy mirroring project-discipline Rule 4: ask-mode default, conversational grant/revoke, always-ask paths for `.env` / `**/secrets/**` / `**/*.key` / `**/.ssh/**` / `**/.aws/credentials` etc with transitive rule + cost-cap >$0.10, session-end reset; routing hints for `bulk_text_read` + `transcript_distill`); `project-bootstrap` 1.5.0→1.6.0 with canonical CLAUDE.md trigger `delegate to interns when allowed` inserted between `follow project discipline` and `we're on Windows`, new Step 5 commentary paragraph, Step 5.5 manifest table extended with `setup-interns` + `using-interns` + `project-discipline` rows; root `CLAUDE.md` dogfood line added; both READMEs written; descriptions verified within budget (setup-interns 899 / using-interns 814 / ≤900); both archives rebuilt + installed; harness listing confirms full descriptions (no H1 fallback) for all three skills -**Next action:** (none — kept until merged) -**Branch:** master - - ---- diff --git a/.tasks/bootstrap-claude-md-merge.md b/.tasks/bootstrap-claude-md-merge.md deleted file mode 100644 index 47ee96b..0000000 --- a/.tasks/bootstrap-claude-md-merge.md +++ /dev/null @@ -1,53 +0,0 @@ -# bootstrap-claude-md-merge - -## Goal -project-bootstrap upgrade mode currently treats `CLAUDE.md` as binary: either append -the entire template (causing duplicate trigger lines) or leave it untouched. Result: -projects bootstrapped before v1.2.0 silently miss new canonical triggers like -`check across all projects` (→ `using-projects-meta`) and `we're on Windows` -(→ `active-platform`) when re-run on the upgrade path. Fix: turn Step 5 into an -idempotent merge — read existing CLAUDE.md, diff against the template, append only -missing canonical lines after user confirm. Re-runs become no-ops. - -## Key files -- `skills/project-bootstrap/SKILL.md:220-249` — Step 5 (the broken binary choice) -- `skills/project-bootstrap/assets/CLAUDE.md.template` — canonical trigger set -- `skills/project-bootstrap/README.md` — public surface, mention idempotency -- `dist/project-bootstrap.skill` — rebuild after install -- `~/.claude/skills/project-bootstrap/` — reinstall target - -## Decisions log -- 2026-04-30: Diff strategy — substring match per template line against existing file - (trim + lowercase). A trigger is "present" if any existing line contains the template - trigger text. Avoids false-positive duplicates when user has rephrased a trigger but - preserves canonical wording for missing ones. Rejected: full line-equality match - (too brittle — user comments / case differences would re-add). -- 2026-04-30: Confirmation gate stays — show user the diff (N lines to append) before - touching the file. Idempotent run with no missing lines = silent no-op. -- 2026-04-30: Version bump 1.2.0 → 1.3.0. Behavior change visible to users on every - upgrade — minor bump fits semver intent. - -## Open questions -- [ ] Should the platform line (`we're on Windows`) be substituted to match the host - during merge, the same way init does it? Decision: yes — if existing file has no - `we're on (Windows|Linux|macOS)` line, append the host-appropriate one. If it has - any of the three, leave it (user may have intentionally pinned a different platform). - -## Completed steps -- [x] open task -- [x] patch Step 5 in SKILL.md (read → diff → confirm → append) — split Init / Upgrade-merge -- [x] bump version 1.2.0 → 1.3.0 in SKILL.md frontmatter -- [x] update `skills/project-bootstrap/README.md` `CLAUDE.md` row to note idempotent merge -- [x] update root `README.md` + `README.ru.md` upgrade-mode paragraph -- [x] reinstall + rebuild dist (`bash scripts/install.sh project-bootstrap && bash scripts/build.sh project-bootstrap`); verified `version: 1.3.0` on disk + Step 5 split -- [x] wiki: concept page `.wiki/concepts/bootstrap-claude-md-merge.md`, index entry, log entry -- [x] commit -- [x] STATUS.md: 🔴 → 🟢 -- [x] decision on platform line — preserve if user pinned non-host one (case-insensitive `we're on (windows|linux|macos)` match) - -## Notes -Existing related task `[bootstrap-recommend-projects-meta]` (Step 5.7) is **machine-level** -detection (recommend `setup-projects-meta` if MCP server not registered). This task is -**project-level** merge of the trigger line into the project's CLAUDE.md. They compose -cleanly: 5.7 makes the trigger functional on the host, this task ensures the trigger -is actually present in the file. diff --git a/.tasks/bootstrap-projects-meta-trigger.md b/.tasks/bootstrap-projects-meta-trigger.md deleted file mode 100644 index 2d7a3b2..0000000 --- a/.tasks/bootstrap-projects-meta-trigger.md +++ /dev/null @@ -1,30 +0,0 @@ -# bootstrap-projects-meta-trigger - -## Goal -Add `check across all projects` to the CLAUDE.md template that `project-bootstrap` writes to every project, so the `using-projects-meta` skill auto-loads in every bootstrapped repo (current set already had four triggers — `talk like a caveman`, `use superpowers`, `use project wiki`, `use task management system`, plus `we're on Windows`). Bumps `project-bootstrap` 1.1.0 → 1.2.0 (additive default-artifact change). - -## Key files -- `skills/project-bootstrap/assets/CLAUDE.md.template` — the file actually copied into bootstrapped projects -- `skills/project-bootstrap/SKILL.md` — inline copy of the same template (must stay in sync) + version frontmatter -- `README.md` / `README.ru.md` — the "Using skills in projects" section enumerates the trigger list -- `CLAUDE.md` (this repo) — local instance must also gain the line so the trigger fires here too -- `dist/project-bootstrap.skill` — packaged artifact, rebuilt from the source tree - -## Decisions log -- 2026-04-30: trigger phrase = `check across all projects` — buffer-direct quote from `using-projects-meta` description, matches existing imperative style of other lines (`use X`, `talk like X`). -- 2026-04-30: not adding a Step 5.7 mirror of Step 5.6 (recommend `setup-projects-meta`) — out of scope for this task. Trigger fires `using-projects-meta` whose Prerequisites already point at `setup-projects-meta` if MCP tools are missing. Open question for follow-up. - -## Open questions -- [ ] Should `project-bootstrap` also detect missing `mcp__projects-meta__*` tools and recommend `setup-projects-meta` (analogous to Step 5.6 for superpowers)? Defer until we see a fresh-machine bootstrap miss the dependency. - -## Completed steps -- [x] task entry created -- [x] `skills/project-bootstrap/assets/CLAUDE.md.template` — added `check across all projects` between `use task management system` and `we're on Windows` -- [x] `skills/project-bootstrap/SKILL.md` — inline template at Step 5 synced; explanatory paragraph added; `version: 1.1.0 → 1.2.0` -- [x] `README.md` + `README.ru.md` — trigger list in "Using skills in projects" / "Использование в проектах" updated -- [x] `CLAUDE.md` (this repo) — local instance gained the new line so the trigger fires here -- [x] `bash scripts/install.sh project-bootstrap` — reinstalled to `~/.claude/skills/project-bootstrap/` -- [x] `bash scripts/build.sh project-bootstrap` — `dist/project-bootstrap.skill` rebuilt -- [x] verified: installed `version: 1.2.0`, template content matches -- [x] `.wiki/concepts/projects-meta-skills.md` — appended "Bootstrap trigger (project-bootstrap@1.2.0)" section explaining choice of phrase + non-decision on Step 5.7 -- [x] `.wiki/log.md` — `decision` entry added diff --git a/.tasks/bootstrap-recommend-superpowers.md b/.tasks/bootstrap-recommend-superpowers.md deleted file mode 100644 index 7dd944c..0000000 --- a/.tasks/bootstrap-recommend-superpowers.md +++ /dev/null @@ -1,34 +0,0 @@ -# bootstrap-recommend-superpowers - -## Goal -`project-bootstrap` writes `use superpowers` into the new project's `CLAUDE.md` (Step 5 template), but that trigger only fires if the `superpowers@claude-plugins-official` plugin is installed. On a fresh machine the plugin is often absent, so the trigger silently no-ops. Add a Step 5.6 that detects the plugin via `~/.claude/plugins/installed_plugins.json` and, when missing, prints a recommendation with the exact install command + upstream link. Strictly informational — never auto-installs. - -## Key files -- `skills/project-bootstrap/SKILL.md` — add Step 5.6 between 5.5 (manifest) and 6 (commit); bump frontmatter `version: 1.0.0 → 1.1.0` -- `skills/project-bootstrap/README.md` — extend the steps overview to mention the new check -- `~/.claude/plugins/installed_plugins.json` — detection source - -## Decisions log -- 2026-04-28: Place check at Step 5.6 (right after manifest, before commit). Reason: CLAUDE.md just got `use superpowers`, so the recommendation lands while context is fresh. Alternative — fold into Step 0 detect — rejected: Step 0 is meant to be quick + read-only summary; threading plugin checks there bloats the no-op happy path. -- 2026-04-28: Detection by file read, not by `/plugin list`. Reason: slash commands aren't callable from inside a skill; the JSON file is the source of truth Claude Code itself reads. Same approach as `setup-context7` Phase 1. -- 2026-04-28: Recommendation, not auto-install. Reason: `/plugin install` is interactive and per `setup-context7` we can't drive slash commands from a skill. Even if we could, auto-installing a plugin without consent is overreach. -- 2026-04-28: Limit scope to `superpowers` only. User explicitly asked for that one. Generic "recommended plugins" framework is feature creep — defer until there's a second item. - -## Open questions -- [ ] None — done. - -## Completed steps -- [x] Confirm plugin install path / JSON shape from local `installed_plugins.json` -- [x] Pick insertion point (Step 5.6) -- [x] Pick detection method (file read of `installed_plugins.json`) -- [x] Patch `SKILL.md` (Step 5.6 + frontmatter `version: 1.1.0`) -- [x] Update `README.md` workflow numbering -- [x] Reinstall to `~/.claude/skills/project-bootstrap/` -- [x] Rebuild `dist/project-bootstrap.skill` -- [x] Append wiki log entry -- [x] Commit - -## Notes -- Plugin install command (canonical, from `installed_plugins.json` key): `/plugin install superpowers@claude-plugins-official` -- Upstream: https://github.com/anthropics/claude-plugins-official -- Cross-platform path: `~/.claude/plugins/installed_plugins.json` resolves identically on Windows / Linux / macOS. diff --git a/.tasks/interns-skills-mvp.md b/.tasks/interns-skills-mvp.md deleted file mode 100644 index 0c130de..0000000 --- a/.tasks/interns-skills-mvp.md +++ /dev/null @@ -1,38 +0,0 @@ -# interns-skills-mvp - -## Goal -Ship the first version of the `setup-interns` + `using-interns` skill pair (v0.1.0 each) and roll the canonical `delegate to interns when allowed` CLAUDE.md trigger into `project-bootstrap` (1.5.0 → 1.6.0). The pair exposes the local `interns` MCP server (Layer 2 of `.wiki/concepts/interns-design.md`) to Claude Code under a per-session permission grant that mirrors `project-discipline` Rule 4 — ask-mode by default, conversational grant/revoke, always-ask paths for secrets even with an active grant, session-end reset. The runtime server itself is out of scope for this task; the skills land their full lifecycle (install procedure, runtime policy, bootstrap integration) so that on every machine where the MCP server is later installed, Claude already knows the policy. - -## Key files -- `.wiki/concepts/interns-design.md` — Layer 3 Skills section is the primary spec -- `skills/setup-interns/SKILL.md` — to be created (mirror `skills/setup-projects-meta/SKILL.md` 8-phase shape) -- `skills/setup-interns/README.md` — to be created (mirror `skills/setup-projects-meta/README.md`) -- `skills/using-interns/SKILL.md` — to be created (mirror `skills/using-projects-meta/SKILL.md` two-class shape; grant mechanism mirrors `skills/project-discipline/SKILL.md` Rule 4) -- `skills/using-interns/README.md` — to be created -- `skills/project-bootstrap/SKILL.md` — Step 5 commentary + Step 5.5 manifest table; bump `version:` 1.5.0 → 1.6.0 -- `skills/project-bootstrap/assets/CLAUDE.md.template` — append `delegate to interns when allowed` between `follow project discipline` and `we're on Windows` -- `CLAUDE.md` (root, dogfood) — same line addition -- `.wiki/log.md` — `## [2026-05-05] decision | interns-skills-mvp shipped` entry -- `dist/setup-interns.skill`, `dist/using-interns.skill`, `dist/project-bootstrap.skill` — rebuilt archives - -## Decisions log -- 2026-05-05: ship as a pair (setup-X + using-X) following the validated prior-art pattern — same shape as setup-context7/using-context7 and setup-projects-meta/using-projects-meta. Rationale: clean separation of one-time install (mutates user-level config; needs confirmation gates) from runtime policy (read every session; no mutations). Cross-reference between the two via the `Prerequisites` section. -- 2026-05-05: setup-interns assumes inline `.common/lib/interns-mcp/` layout per design's "current склонение". Open question (Gitea repo + subtree) deferred — v0.1.0 documents the inline path; if a separate repo lands later, a 0.2.0 minor adds the alternate clone branch. -- 2026-05-05: grant mechanism mirrors project-discipline Rule 4 verbatim — ask-mode default per session, conversational grant ("разреши интернов" / "allow interns"), conversational revoke, always-ask paths even under an active grant, session-end automatic reset. Rationale: same security posture, same UX vocabulary the user already trained on. -- 2026-05-05: always-ask path list copied from design Layer 3 verbatim plus the transitive rule (Claude reading a matched file and forwarding content also triggers the gate). Plus cost-based ask: any call with estimated cost > $0.10 (sanity bound). -- 2026-05-05: `description:` budget — keep ≤ 900 chars per `feedback_skill_description_length_limit` memory. Verify char count before shipping; if over, trim trigger phrases first, never the policy summary. - -## Open questions -- [ ] How does the user's actual `.common/` layout look on disk? Setup skill currently assumes `/.common/lib/interns-mcp/` and `/.common/secrets/interns.env`. If the convention is `~/projects/.common/`, the discovery phase needs to widen. -- [ ] Should `setup-interns` ship a scaffolding sub-step that writes a placeholder `.common/lib/interns-mcp/` from a template if the source isn't there? Probably not — kicks the can to a separate "build the runtime" task. - -## Completed steps -- [x] Read design `.wiki/concepts/interns-design.md` Layer 3 section -- [x] Survey prior art: setup-context7, setup-projects-meta, using-context7, using-projects-meta, project-bootstrap@1.5.0, project-discipline (Rule 4 grant mechanism) -- [x] Mark 🔴 active in `.tasks/STATUS.md`, create this file - -## Notes -- Char-count check after writing each `description:` — paste into a quick `wc -c` PowerShell snippet (or count manually). 1024 is the hard ceiling, 900 is the safety margin. -- Restart-Claude-Code caveat goes in setup-interns Phase 8, identical to setup-projects-meta and setup-context7. -- `using-interns` does NOT mention restart — it's a policy skill, no MCP install side. -- Bootstrap-manifest table gets `setup-interns` and `using-interns` rows. diff --git a/.tasks/mac-support-scripts.md b/.tasks/mac-support-scripts.md deleted file mode 100644 index bb103b9..0000000 --- a/.tasks/mac-support-scripts.md +++ /dev/null @@ -1,31 +0,0 @@ -# mac-support-scripts - -## Goal -Make `scripts/install.sh` and `scripts/build.sh` work on stock macOS (BSD find, bash 3.2). Currently both use `mapfile` (bash 4+) and `find -printf` (GNU-only) — fatal on a fresh Mac. Without the fix, the README's "Linux / macOS (bash)" quick-start is a lie. - -## Key files -- `scripts/install.sh:11` — `mapfile -t names < <(find ... -printf ...)` -- `scripts/build.sh:18` — same pattern -- `README.md:30-38` — claims macOS bash quick-start works -- `.wiki/concepts/build-notes.md` — companion concept page; add a sibling for the install-script portability gotcha - -## Decisions log -- 2026-04-28: Replace `mapfile` + `find -printf` with shell glob (`for d in "$SRC"/*/`). Reason: works in bash 3.2 (stock macOS) and avoids a `find` flavor dependency. Alternative — require `bash 4+` via `#!/usr/bin/env bash` + version check — rejected: pushes the burden onto Mac users, who would need `brew install bash` for a 30-line script. -- 2026-04-28: Don't drop the `set -euo pipefail` line — POSIX-ish bash supports it from 3.x. -- 2026-04-28: Final — patched both scripts; verified on git-bash (`bash -n` clean, install dry-run installs all 16 skills sorted alphabetically into temp dir, `build.sh active-platform` produces a valid `.skill` archive); wrote `.wiki/concepts/install-portability.md`; index + log updated; dist/ unchanged (smoke-rebuild was byte-identical so no dist churn). - -## Open questions -- [ ] None — done. - -## Completed steps -- [x] Identify bugs -- [x] Pick fix approach (shell glob, no new deps) -- [x] Patch `scripts/install.sh` -- [x] Patch `scripts/build.sh` -- [x] Verify on git-bash (`bash -n` + install dry-run + build smoke-test) -- [x] Wiki concept page (`install-portability.md`) + index + log -- [x] Commit - -## Notes -- `basename` is in POSIX, fine on Mac. -- Empty `skills/` would have `"$SRC"/*/` literal under bash 3.2 without `nullglob`. Guard with `[ -d "$d" ] || continue` — works without `shopt`. diff --git a/.tasks/project-discipline-skill.md b/.tasks/project-discipline-skill.md deleted file mode 100644 index d10aa83..0000000 --- a/.tasks/project-discipline-skill.md +++ /dev/null @@ -1,761 +0,0 @@ -# project-discipline — implementation plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Ship a new policy skill `project-discipline` (four cross-project rules: conventions-over-skill-defaults, master-only, semver-bumping, ask-before-push) and wire it into the canonical `project-bootstrap` template, with the `claude-skills` repo dogfooding the trigger. - -**Architecture:** Single-file policy skill (`skills/project-discipline/SKILL.md`) following the `pulling-before-work` shape — frontmatter trigger description + body with four numbered rule sections. `project-bootstrap` v1.4.0 → v1.5.0 adds the canonical trigger line `follow project discipline` to `assets/CLAUDE.md.template` after `pull remote before work`; the existing v1.3.0 idempotent merge propagates it into existing projects on upgrade. The `claude-skills` repo's own `CLAUDE.md` gets the line as dogfood. The bootstrap manifest table gains a row for the new skill. The existing `.wiki/concepts/skill-versioning.md` is extended with a note that Rule 3 expands the versioning requirement from the infra subset to all skills. - -**Tech Stack:** Markdown skills (no build for the skill body itself). Build pipeline: `scripts/build.ps1` produces `dist/.skill` archives. Install: `scripts/install.sh` (portable across git-bash on Windows + native Linux/macOS). Spec lives at `.wiki/concepts/project-discipline-design.md`. - ---- - -## File Structure - -**New:** -- `skills/project-discipline/SKILL.md` — frontmatter + body, ~250–300 lines -- `skills/project-discipline/README.md` — short user-facing intro mirroring `skills/pulling-before-work/README.md` shape - -**Modified:** -- `skills/project-bootstrap/SKILL.md` — `version: 1.4.0` → `1.5.0`; Step 5 inline template gains the new line; new commentary paragraph after the existing `pull remote before work` paragraph; Step 5.5 manifest table gains a row for `project-discipline` -- `skills/project-bootstrap/assets/CLAUDE.md.template` — `+ follow project discipline` after `pull remote before work` and before `we're on Windows` -- `CLAUDE.md` (repo root) — `+ follow project discipline` in the same position (dogfood) -- `.wiki/concepts/skill-versioning.md` — append a section noting Rule 3 of `project-discipline` extends `version:` requirement to ALL skills (not just infra subset) -- `.wiki/log.md` — append decision entry -- `.wiki/index.md` — concept page link (added when spec was committed; verify still listed; add `project-discipline-design.md` if not) -- `.tasks/STATUS.md` — add `[project-discipline-skill]` 🔴 Active block, then update to 🟢 Done at the end - -**Built:** -- `dist/project-discipline.skill` — new -- `dist/project-bootstrap.skill` — rebuilt - ---- - -## Task 1: New skill — frontmatter only - -**Files:** -- Create: `skills/project-discipline/SKILL.md` - -- [ ] **Step 1: Write the frontmatter** - -```markdown ---- -name: project-discipline -version: 0.1.0 -description: > - Codifies four cross-project discipline rules: (1) project CLAUDE.md / - .wiki/CLAUDE.md / .tasks/ override defaults from any other skill (specs - go to .wiki/concepts/, not docs/superpowers/specs/; tasks to .tasks/, - not docs/superpowers/plans/); (2) all work on master/main, no feature - branches without explicit user approval; (3) bump semver on every edit - of versioned artifacts (SKILL.md frontmatter, package.json, - pyproject.toml) per MAJOR/MINOR/PATCH rules, recorded in commit message; - (4) commit freely, never push without explicit per-session user approval - — grant via "разреши автопуш" / "allow auto-push", revoke via "отзови" - / "revoke", session end resets to ask-mode; force/delete/non-ff push - always asks. Activated by "follow project discipline" trigger in - CLAUDE.md (added by project-bootstrap v1.5.0+). ---- - -# project-discipline -``` - -- [ ] **Step 2: Verify description length is under 900 chars** - -```powershell -$c = Get-Content skills/project-discipline/SKILL.md -Raw -$start = $c.IndexOf('description: >') + 'description: >'.Length -$end = $c.IndexOf('---', $start) -$desc = $c.Substring($start, $end - $start).Trim() -"description chars: $($desc.Length)" -``` -Expected: a number ≤ 900. (Per `feedback_skill_description_length_limit` memory: harness silently drops descriptions >~1024 and falls back to the H1.) - -- [ ] **Step 3: Commit** - -```powershell -git add skills/project-discipline/SKILL.md -git commit -m "feat(project-discipline): scaffold skill frontmatter [v0.1.0]" -``` - ---- - -## Task 2: New skill — body - -**Files:** -- Modify: `skills/project-discipline/SKILL.md` (append body) - -- [ ] **Step 1: Append the skill body after the H1** - -```markdown -> Four cross-project rules. Read at session start. Apply before any other skill's defaults touch paths, branches, versions, or remote pushes. - -## When this runs - -**At session start** — when `CLAUDE.md` contains the line `follow project discipline`. The skill is a policy document; the agent reads it and applies the four rules to all subsequent work in the session. - -**On explicit reference** — when the user says "use project discipline", "соблюди дисциплину", "проектные правила", "что у меня по правилам?", or close variants asking about/applying the rules. - -The skill itself takes no actions and has no external side-effects. It instructs the agent how to behave. - -## Rule 1 — Project conventions override skill defaults - -Before applying defaults from any other skill (superpowers, frontend-design, mcp-builder, etc.), read in this order: - -1. `CLAUDE.md` in the project root. -2. `.wiki/CLAUDE.md` (if it exists). -3. `.tasks/STATUS.md` (if it exists). - -Any path, format, or workflow explicitly stated in those files **overrides the skill default**. - -Concrete consequences: - -- **Specs / design documents** go to `.wiki/concepts/-design.md`, **not** `docs/superpowers/specs/`. -- **Task tracking / implementation plans** go to `.tasks/.md` plus a board entry in `.tasks/STATUS.md` (the `using-tasks` format), **not** `docs/superpowers/plans/` or any inline-in-chat plan format. -- **Frontmatter, naming conventions, log format** — as described in the project's `.wiki/CLAUDE.md`. - -If no convention is stated explicitly — fall back to the skill default. - -## Rule 2 — Master-only - -All work happens on the repo's main integration branch — usually `master`, but if a project uses `main`, treat `main` as equivalent. - -- No `git checkout -b feature/foo` for solo work. -- Sync with remote: `git pull --ff-only` or `git pull --rebase`. **No merge commits** for solo work. -- If a task genuinely requires isolation (large experiment, risky refactor with rollback potential, multi-day work with intermediate WIP commits) — **ask** the user: "this needs its own branch, ok?" — and wait for explicit approval. Without approval, work continues on master. - -If the agent finds itself on a non-main branch (after a manual `git checkout`) or in detached HEAD — report it and ask whether to return to master before working. - -## Rule 3 — Versioning discipline - -When editing any artifact with a semver field, **bump the version before committing** per: - -- **MAJOR** (`X+1.0.0`) — breaks the contract. Renames, removed triggers, layout changes, removed public functions, breaking API change. -- **MINOR** (`X.Y+1.0`) — adds capability without breaking. New trigger, new optional step, new public function. -- **PATCH** (`X.Y.Z+1`) — wording / clarity / typo fixes with no behavior change. - -The bump is recorded in the commit message: `feat(): … [vX.Y.Z]` or whatever convention the project uses (see Rule 1). - -**Applies to:** `skills//SKILL.md` (`version:` in frontmatter), `package.json` (`"version":`), `pyproject.toml` (`version =`), `Cargo.toml` (`version =`), and any other semver field in any other manifest. - -**If the artifact is packaged** as `dist/.skill`, `dist/*.tgz`, etc. — **rebuild** the package in the same or the next commit. Forgotten dist artifacts are a common cause of deploying stale binaries. - -**First edit of an unversioned artifact** that COULD have a semver field (a new skill without `version:`, a new `package.json` without `"version":`) — **add** `version: 0.1.0` (or its equivalent) before committing; do not bump anything. - -**Does not apply to:** artifacts with no semver field and no potential for one (wiki concept pages, README.md, shell scripts without a public interface). - -## Rule 4 — Commit yes, push no (session-scoped) - -**Every session starts in ask-before-push mode.** On every `git push`, ask: - -> Готов push'нуть в `/` (N коммитов: ). Ок? - -(or its English equivalent if the user is communicating in English) and wait for explicit `yes` / `да` / `push` / equivalent. Without confirmation — do not push. - -**Granting auto-push within a session.** When the user says: - -- "разреши автопуш" / "allow auto-push" / "автопуш ок" / equivalent - -— push without further confirmation until the end of the session or until revoked. - -**Revoking auto-push within a session.** When the user says: - -- "отзови автопуш" / "revoke auto-push" / "снова спрашивай" / equivalent - -— return to ask-before-push mode. - -**Session end resets to ask-mode.** The next session starts asking again, regardless of what was granted in the previous one. This is intentional: a grant is given for the current context (user nearby, consciously decided pushes are safe), and should not survive a context switch. - -**Always ask, even with active grant:** - -- `git push --force` / `--force-with-lease` (history rewrite); -- `git push origin --delete ` (branch deletion); -- push to a remote/branch other than the current tracked upstream (`git push other-remote ...`, `git push origin other-branch`); -- push to the main branch that would require non-fast-forward (i.e. would need force). - -A grant covers ordinary fast-forward push to the configured upstream. Anything else is a separate class of operation and needs its own decision. - -**What counts as "push":** only `git push` family commands. Local commits, `git stash push`, etc. are not push; the grant does not apply. - -## Out of scope - -The skill **does not**: - -- modify `CLAUDE.md` (that's `project-bootstrap`'s job); -- enforce rules via git hooks / pre-commit / CI (this is agent discipline, not tooling); -- manage `settings.json` permissions (that's `update-config`); -- check the existence of `.wiki/` / `.tasks/` (that's `setup-wiki` / `setup-tasks` / `project-bootstrap`); if a project doesn't have them, Rule 1 simply finds no overrides and falls back to skill defaults. - -## Why this exists - -In a tightly-disciplined repo (`claude-skills`) the four rules already hold by accident — the agent reads `.wiki/CLAUDE.md`, knows specs go to `.wiki/concepts/`, knows to bump `version:`, knows not to push without confirmation. In **other** projects of the same user, that discipline does not transfer: the agent uses `superpowers`' default `docs/superpowers/specs/`, branches on a whim, forgets `version:` bumps, and pushes without asking. This skill makes the discipline explicit and portable. - -Full design rationale (why one skill instead of four, why a skill instead of inline `CLAUDE.md` lines, scope of each rule, push-permission mechanism choice) lives in `.wiki/concepts/project-discipline-design.md` (in this repo; in other projects bootstrapped from this repo, the design lives in `claude-skills`). -``` - -- [ ] **Step 2: Sanity-check the file rendered** - -```powershell -Get-Content skills/project-discipline/SKILL.md | Measure-Object -Line -Select-String -Path skills/project-discipline/SKILL.md -Pattern '^## Rule [1-4]' -``` - -Expected: -- Line count ~250–320 -- Four `## Rule N` matches in order - -- [ ] **Step 3: Commit** - -```powershell -git add skills/project-discipline/SKILL.md -git commit -m "feat(project-discipline): skill body — four rules + activation + out-of-scope [v0.1.0]" -``` - ---- - -## Task 3: New skill — README.md - -**Files:** -- Create: `skills/project-discipline/README.md` - -- [ ] **Step 1: Write README** - -```markdown -# project-discipline - -Policy skill that codifies four cross-project discipline rules so the same -guarantees that hold in a tightly-maintained repo apply everywhere. - -## When it triggers - -- **Session start** — when `CLAUDE.md` contains the line `follow project discipline` (added by `project-bootstrap` v1.5.0+). -- **In-chat** — when the user says "use project discipline", "соблюди дисциплину", "проектные правила", or close variants. - -## The four rules - -1. **Project conventions over skill defaults.** `CLAUDE.md` / `.wiki/CLAUDE.md` / `.tasks/` override any other skill's defaults. Specs go to `.wiki/concepts/`, not `docs/superpowers/specs/`. Tasks to `.tasks/`, not `docs/superpowers/plans/`. -2. **Master-only.** All work on `master` (or `main`). No feature branches without explicit user approval. -3. **Semver discipline.** Bump `version:` in `SKILL.md` / `package.json` / `pyproject.toml` on every edit per MAJOR / MINOR / PATCH; record in commit message; rebuild `dist/` artifacts after. -4. **Commit yes, push no.** Every session starts asking before push. User can grant auto-push within session ("разреши автопуш"); session end resets to ask-mode. Force / delete / non-ff push always asks. - -## Prerequisites - -None. The skill is a textual policy document; it takes no actions and has no -external dependencies. Activate it by adding `follow project discipline` to -`CLAUDE.md` (or use `project-bootstrap` v1.5.0+ which adds it automatically). - -## Related - -- `project-bootstrap` (v1.5.0+) — adds the trigger line to new and existing projects' `CLAUDE.md`. -- `pulling-before-work` — companion skill activated by the canonical template; pulls origin once at session start (`git pull --ff-only`). -- `using-tasks` / `using-wiki` — the format conventions Rule 1 routes work into. -- `.wiki/concepts/project-discipline-design.md` (in `claude-skills`) — full design rationale. -``` - -- [ ] **Step 2: Commit** - -```powershell -git add skills/project-discipline/README.md -git commit -m "docs(project-discipline): README" -``` - ---- - -## Task 4: Bootstrap template — add trigger line - -**Files:** -- Modify: `skills/project-bootstrap/assets/CLAUDE.md.template` - -- [ ] **Step 1: Insert the new line after `pull remote before work`** - -Use Edit: -- `old_string`: - ``` - pull remote before work - we're on Windows - ``` -- `new_string`: - ``` - pull remote before work - follow project discipline - we're on Windows - ``` - -- [ ] **Step 2: Verify** - -```powershell -Get-Content skills/project-bootstrap/assets/CLAUDE.md.template -``` - -Expected: eight trigger lines in this order: -``` -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -follow project discipline -we're on Windows -``` - -- [ ] **Step 3: Commit** - -```powershell -git add skills/project-bootstrap/assets/CLAUDE.md.template -git commit -m "feat(project-bootstrap): template gains 'follow project discipline' trigger" -``` - ---- - -## Task 5: Bootstrap SKILL.md — version bump + Step 5 update + manifest row - -**Files:** -- Modify: `skills/project-bootstrap/SKILL.md` - -- [ ] **Step 1: Bump version in frontmatter** - -Edit: -- `old_string`: `version: 1.4.0` -- `new_string`: `version: 1.5.0` - -- [ ] **Step 2: Update the Step 5 inline template (mirror of `assets/CLAUDE.md.template`)** - -Find the fenced markdown block in Step 5: - -```markdown -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -we're on Windows -``` - -Replace with: - -```markdown -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -follow project discipline -we're on Windows -``` - -- [ ] **Step 3: Add commentary paragraph for the new trigger** - -After the existing paragraph that explains `pull remote before work` (ending with "...silently dead like any other absent skill.") and before the paragraph about `we're on Windows` (starting with "The `we're on Windows` line activates..."), insert: - -```markdown -The `follow project discipline` line activates the `project-discipline` skill, -which codifies four cross-project rules: (1) project CLAUDE.md / .wiki/CLAUDE.md -/ .tasks/ override defaults from any other skill; (2) all work on master/main, -no feature branches without explicit user approval; (3) version bump on every -edit of versioned artifacts per semver, recorded in commit; (4) commit freely, -push only after explicit per-session approval. Install the skill on the host -if `project-discipline` is not in `~/.claude/skills/`; otherwise the trigger is -silently dead like any other absent skill. -``` - -- [ ] **Step 4: Add `project-discipline` row to Step 5.5 manifest table** - -Find the table: - -```markdown -| Skill | Version | Role | -|---|---|---| -| `project-bootstrap` | | orchestrator | -| `setup-wiki` | | wiki canonical layout | -| `setup-tasks` | | tasks canonical layout | -``` - -Replace with: - -```markdown -| Skill | Version | Role | -|---|---|---| -| `project-bootstrap` | | orchestrator | -| `setup-wiki` | | wiki canonical layout | -| `setup-tasks` | | tasks canonical layout | -| `project-discipline` | | cross-project policy | -``` - -- [ ] **Step 5: Verify** - -```powershell -Select-String -Path skills/project-bootstrap/SKILL.md -Pattern '^version:|follow project discipline|project-discipline' | ForEach-Object { "$($_.LineNumber): $($_.Line)" } -``` - -Expected: at least 5 hits — `version: 1.5.0`, the line in the Step 5 fenced block, the new commentary paragraph, the row in the manifest table. - -- [ ] **Step 6: Commit** - -```powershell -git add skills/project-bootstrap/SKILL.md -git commit -m "feat(project-bootstrap): v1.5.0 — add 'follow project discipline' canonical trigger [v1.5.0]" -``` - ---- - -## Task 6: Update `.wiki/concepts/skill-versioning.md` — note Rule 3 scope extension - -**Files:** -- Modify: `.wiki/concepts/skill-versioning.md` - -- [ ] **Step 1: Read current content** - -```powershell -Get-Content .wiki/concepts/skill-versioning.md -``` - -Note the existing section "## What skills are versioned" which scopes versioning to the infra subset. - -- [ ] **Step 2: Update the `## What skills are versioned` section** - -Find: - -```markdown -## What skills are versioned - -Currently only the **infrastructure** skills (the ones bootstrap touches and that govern project layout). Communication-mode skills (`caveman`, family) and discovery skills (`find-skills`, `active-platform`) aren't versioned — their content is "good copy-paste" and a snapshot mismatch isn't a layout problem. - -If we ever start packaging or marketplace-publishing the rest, we'll version them too. -``` - -Replace with: - -```markdown -## What skills are versioned - -**Originally** only the **infrastructure** skills (the ones bootstrap touches and that govern project layout). Communication-mode skills (`caveman`, family) and discovery skills (`find-skills`, `active-platform`) were left unversioned — their content was "good copy-paste" and a snapshot mismatch wasn't a layout problem. - -**As of `project-discipline` v0.1.0** (Rule 3), the requirement extends to **all** skills in this repo, regardless of category. Communication-mode and discovery skills also need `version:` in frontmatter; the migration is a separate one-time task tracked in `.tasks/`. Rationale: discipline-by-default is simpler than maintaining a list of "exempt" skills, and it costs nothing — `version: 0.1.0` is added on the next edit per the Rule 3 first-edit-unversioned clause. - -If we ever start packaging or marketplace-publishing skills outside this repo, the same rule still applies. -``` - -- [ ] **Step 3: Update the frontmatter `updated:` field** - -Find: - -```yaml ---- -title: Skill versioning + bootstrap manifest -type: concept -updated: 2026-04-28 ---- -``` - -Replace with: - -```yaml ---- -title: Skill versioning + bootstrap manifest -type: concept -updated: 2026-05-01 ---- -``` - -- [ ] **Step 4: Commit** - -```powershell -git add .wiki/concepts/skill-versioning.md -git commit -m "docs(wiki): skill-versioning — Rule 3 of project-discipline extends scope to all skills" -``` - ---- - -## Task 7: Dogfood — add trigger to claude-skills root CLAUDE.md - -**Files:** -- Modify: `CLAUDE.md` (repo root) - -- [ ] **Step 1: Insert the trigger after `pull remote before work`** - -Use Edit: -- `old_string`: - ``` - pull remote before work - we're on Windows - ``` -- `new_string`: - ``` - pull remote before work - follow project discipline - we're on Windows - ``` - -- [ ] **Step 2: Verify** - -```powershell -Get-Content CLAUDE.md -``` - -Expected: -``` -# CLAUDE.md -# Agent instructions. Each line is a trigger for an installed skill. - -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -follow project discipline -we're on Windows -``` - -- [ ] **Step 3: Commit** - -```powershell -git add CLAUDE.md -git commit -m "chore(claude-skills): dogfood 'follow project discipline' trigger" -``` - ---- - -## Task 8: Build artifacts - -**Files:** -- Build: `dist/project-discipline.skill` (new), `dist/project-bootstrap.skill` (rebuilt) - -- [ ] **Step 1: Run the build script** - -```powershell -pwsh scripts/build.ps1 -Names project-discipline,project-bootstrap -``` - -Expected output: -``` -built: dist/project-discipline.skill -built: dist/project-bootstrap.skill -``` - -- [ ] **Step 2: Verify the archives** - -```powershell -Get-ChildItem dist/project-discipline.skill, dist/project-bootstrap.skill | Format-Table Name, Length, LastWriteTime -``` - -Expected: both files exist, `LastWriteTime` is the current minute, sizes nonzero. - -Spot-check the new archive's structure (no Compress-Archive backslash bug — see `.wiki/concepts/build-notes.md`): - -```powershell -$arch = [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path dist/project-discipline.skill)) -$arch.Entries | Select-Object FullName | Format-Table -AutoSize -$arch.Dispose() -``` - -Expected: entries like `project-discipline/SKILL.md`, `project-discipline/README.md` — forward slashes only. - -- [ ] **Step 3: Commit** - -```powershell -git add dist/project-discipline.skill dist/project-bootstrap.skill -git commit -m "build: project-discipline@0.1.0 + project-bootstrap@1.5.0 archives" -``` - ---- - -## Task 9: Install on this machine - -- [ ] **Step 1: Run installer** - -```powershell -bash scripts/install.sh -``` - -(`install.sh` is portable — works in git-bash on Windows.) - -Expected stdout: lines like `installed: project-discipline` and `installed: project-bootstrap` (and the rest of the skills, idempotent). - -- [ ] **Step 2: Verify installed skills** - -```powershell -Test-Path "$env:USERPROFILE\.claude\skills\project-discipline\SKILL.md" -Test-Path "$env:USERPROFILE\.claude\skills\project-bootstrap\SKILL.md" -Select-String -Path "$env:USERPROFILE\.claude\skills\project-bootstrap\SKILL.md" -Pattern '^version:' -Select-String -Path "$env:USERPROFILE\.claude\skills\project-discipline\SKILL.md" -Pattern '^version:' -``` - -Expected: -- both `Test-Path` return `True` -- `version: 1.5.0` for project-bootstrap -- `version: 0.1.0` for project-discipline - -(No commit — install affects user-level state, not the repo.) - -- [ ] **Step 3: Verify description length post-install** - -```powershell -$c = Get-Content "$env:USERPROFILE\.claude\skills\project-discipline\SKILL.md" -Raw -$start = $c.IndexOf('description: >') + 'description: >'.Length -$end = $c.IndexOf('---', $start) -$desc = $c.Substring($start, $end - $start).Trim() -"description chars: $($desc.Length)" -``` - -Expected: ≤ 900. (Per `feedback_skill_description_length_limit` memory.) - ---- - -## Task 10: Manual smoke validation - -No automated harness — describe what to verify in a fresh session. - -- [ ] **Scenario 1 (skill listing):** - -In a fresh Claude Code session in `claude-skills`, ask the agent: "what skills are available?" or list via `Skill` tool. - -Expected: `project-discipline` appears in the listing with the description from frontmatter (not the H1 fallback). If the description is the H1 ("project-discipline"), the description was silently dropped — check length. - -- [ ] **Scenario 2 (Rule 1 — convention override):** - -In a fresh session, ask the agent to design a small feature that would normally produce a spec. Expected: agent writes spec to `.wiki/concepts/-design.md`, NOT `docs/superpowers/specs/`. (`brainstorming` skill default would be `docs/superpowers/specs/`; Rule 1 should override.) - -- [ ] **Scenario 3 (Rule 2 — master-only):** - -In a fresh session, ask the agent to "do a small refactor". Expected: agent makes changes on `master` branch, doesn't `git checkout -b`. If the task is borderline, agent asks "needs a branch?". - -- [ ] **Scenario 4 (Rule 3 — version bump):** - -Ask the agent to make any non-trivial edit to a `skills//SKILL.md` (e.g., add a sentence to body). Expected: the same commit (or the immediately next commit) bumps `version:` in frontmatter per PATCH/MINOR/MAJOR rules. The commit message includes `[vX.Y.Z]`. - -- [ ] **Scenario 5 (Rule 4 — push permission default):** - -After any commit-producing task, expect the agent NOT to push without asking. Expected: agent says something like "готов push'нуть в origin/master, ок?" and waits. - -- [ ] **Scenario 6 (Rule 4 — grant + revoke):** - -In a session, after the agent commits something, say "разреши автопуш". Then make another change. Expected: agent commits AND pushes without asking. Then say "отзови". Make a third change. Expected: agent commits but asks before pushing again. - -- [ ] **Scenario 7 (Rule 4 — force-push exception):** - -With auto-push granted, ask the agent to do something requiring `git push --force` (e.g., simulate by asking: "push --force, ок?"). Expected: agent still asks for confirmation, citing Rule 4 exceptions. - -- [ ] **Scenario 8 (bootstrap upgrade on this very repo):** - -Re-run `project-bootstrap` on `claude-skills` itself in a fresh session: "upgrade project". Expected: bootstrap detects `CLAUDE.md` exists, runs Step 5 idempotent merge, finds `follow project discipline` already present (we added it manually in Task 7), reports `CLAUDE.md already canon — no changes`. - -If Task 7 was skipped, the merge would prompt to append the line. Either way the merge logic works. - -- [ ] **Scenario 9 (description length regression check):** - -Re-run the description length probe (Task 9 Step 3). If the value is > 900, the skill's listing will silently drop the description and substitute H1 — the skill's discoverability collapses. This caught a regression in `using-projects-meta` once; same check protects here. - -- [ ] **Document results in `.tasks/STATUS.md` `Where I stopped` field** - -After running scenarios, update the task block (Task 12 below) with which scenarios passed. - ---- - -## Task 11: Wiki log + index - -**Files:** -- Modify: `.wiki/log.md` -- Modify: `.wiki/index.md` (verify) - -- [ ] **Step 1: Append log entry** - -Append to `.wiki/log.md`: - -```markdown -## [2026-05-01] decision | project-discipline — new policy skill (v0.1.0): four cross-project rules (conventions-over-defaults, master-only, semver-bumping, ask-before-push); bootstrap template gains canonical trigger; project-bootstrap 1.4.0→1.5.0; skill-versioning concept extended to all skills -``` - -- [ ] **Step 2: Verify `.wiki/index.md` lists the design page** - -```powershell -Select-String -Path .wiki/index.md -Pattern 'project-discipline-design' -``` - -If absent, add a line under `## Concepts` (alphabetical position — between `pulling-before-work-design` and `repo-layout`): - -```markdown -- [project-discipline-design.md](concepts/project-discipline-design.md) — design for project-discipline (four cross-project rules: conventions-over-defaults, master-only, semver-bumping, ask-before-push) -``` - -- [ ] **Step 3: Commit** - -```powershell -git add .wiki/log.md .wiki/index.md -git commit -m "docs(wiki): log + index — project-discipline@0.1.0" -``` - ---- - -## Task 12: Tasks board entry — close - -**Files:** -- Modify: `.tasks/STATUS.md` - -- [ ] **Step 1: Insert a Done block at the top (after the header) for this task** - -Edit `.tasks/STATUS.md` to add at the very top (immediately after the `_Updated:_` line and a blank line): - -```markdown -## 🟢 [project-discipline-skill] — project-discipline skill + project-bootstrap 1.5.0 canonical trigger -**Status:** done -**Where I stopped:** `skills/project-discipline/` shipped at v0.1.0 (four rules: convention-override, master-only, semver-bumping, session-scoped push permission); `assets/CLAUDE.md.template` gains `follow project discipline` after `pull remote before work`; `project-bootstrap` 1.4.0→1.5.0 with new commentary paragraph in Step 5 + manifest table row in Step 5.5; `.wiki/concepts/skill-versioning.md` extended (Rule 3 expands version: requirement to ALL skills, not just infra subset); root `CLAUDE.md` dogfood line added; both archives rebuilt in `dist/`; installed via `install.sh`; description length verified ≤900 chars; smoke scenarios documented (1/8 verifiable inline; 2-7/9 require fresh sessions for full coverage); design rationale at `.wiki/concepts/project-discipline-design.md` -**Next action:** (none — kept until merged) -**Branch:** master - ---- -``` - -- [ ] **Step 2: Bump the `_Updated:_` line in STATUS.md** - -Find: -```markdown -_Updated: 2026-05-01_ -``` -(or whatever current date is there) - -Replace with: -```markdown -_Updated: 2026-05-01_ -``` - -(Same date — keep current.) - -- [ ] **Step 3: Commit** - -```powershell -git add .tasks/STATUS.md .tasks/project-discipline-skill.md -git commit -m "tasks: close [project-discipline-skill]" -``` - ---- - -## Self-Review - -**Spec coverage:** -- ✅ Skill activation rules (CLAUDE.md trigger + in-chat reference) → Task 1, 2 -- ✅ Rule 1 (conventions over defaults) → Task 2 body section -- ✅ Rule 2 (master-only) → Task 2 body section -- ✅ Rule 3 (versioning, including unversioned-artifact and dist-rebuild clauses) → Task 2 body + Task 6 cross-link to skill-versioning concept -- ✅ Rule 4 (session-scoped push permission, with exceptions) → Task 2 body section -- ✅ Out-of-scope list → Task 2 -- ✅ Template change → Task 4 -- ✅ Bootstrap version bump + Step 5 commentary + Step 5.5 manifest row → Task 5 -- ✅ skill-versioning concept extension → Task 6 -- ✅ Dogfood in repo root → Task 7 -- ✅ Build + install + description-length probe → Tasks 8, 9 -- ✅ Validation scenarios (covering all four rules + bootstrap merge + length regression) → Task 10 -- ✅ Wiki log + index → Task 11 -- ✅ Tasks board close → Task 12 - -**Placeholder scan:** no TBD / TODO / "implement later". All steps have explicit code or commands. Manifest row and STATUS block have explicit text, not placeholders. The `` literal in the manifest table is the existing template syntax (filled in by `project-bootstrap` at runtime), not an unfilled spot in this plan. - -**Type / wording consistency:** -- Trigger line is `follow project discipline` everywhere (template, dogfood, commentary, README, design doc, plan). -- Skill name `project-discipline` everywhere (folder, frontmatter, archive, install path, log, README cross-link, manifest row). -- Version `0.1.0` for new skill, `1.5.0` for bootstrap — consistent across frontmatter, log entry, tasks block, build commit, install verification. -- "Master-only" / "master/main" wording consistent between Rule 2 and design doc. -- Push grant phrases ("разреши автопуш" / "allow auto-push") consistent between Rule 4 wording and validation scenarios. diff --git a/.tasks/projects-meta-skills.md b/.tasks/projects-meta-skills.md deleted file mode 100644 index d157157..0000000 --- a/.tasks/projects-meta-skills.md +++ /dev/null @@ -1,49 +0,0 @@ -# projects-meta-skills - -## Goal -Ship a `setup-projects-meta` + `using-projects-meta` skill pair that wraps the local `projects-meta-mcp` server (cross-project task aggregation + shared Gitea-backed wiki). Mirrors the validated `setup-context7` / `using-context7` split: setup is one-time intrusive (clones repo, builds, writes `~/.config/projects-mcp/auth.toml`, clones shared wiki to `~/projects/projects-wiki/`, registers `mcpServers.projects-meta` in `~/.claude.json`), using is daily policy with auto-trigger on cross-project / shared-wiki questions and delegates to setup if `mcp__projects-meta__*` tools are missing. - -## Key files -- `skills/setup-projects-meta/SKILL.md` — 8-phase install (model: `skills/setup-context7/SKILL.md`) -- `skills/setup-projects-meta/README.md` — human-facing doc (model: `skills/setup-wiki/README.md`) -- `skills/using-projects-meta/SKILL.md` — runtime policy (model: `skills/using-context7/SKILL.md`) -- `skills/using-projects-meta/README.md` — human-facing doc (model: `skills/using-wiki/README.md`) -- `scripts/build.sh` — packages skills into `dist/.skill` -- `scripts/install.sh` — copies `skills//` → `~/.claude/skills//` - -## Wiki anchors (already in shared wiki) -- `packages/projects-meta-mcp` — full reference: paths, auth.toml, tools list, mutation pattern, sync runner -- `concepts/setup-using-skill-pair` — pattern: 8-phase setup-X structure, using-X structure, hard rules - -## Decisions log -- 2026-04-29: Use `setup-context7` as the structural template for `setup-projects-meta` — same 8-phase shape, same confirmation gates, same rollback section. Reason: pattern already validated end-to-end on context7 (see `feedback_split_policy_from_setup` memory). -- 2026-04-29: Use `setup-wiki/README.md` and `using-wiki/README.md` as the README templates — they're more thorough than the context7 pair (which has no READMEs). Adding READMEs upfront avoids re-opening the [skill-readmes] task later. -- 2026-04-29: `auth.toml` is the secret-bearing file; never echo `gitea_token` in chat. Edit/Write tool calls inevitably contain it (transcript) — that's OK; chat output must not. -- 2026-04-29: `~/.claude.json` `mcpServers.projects-meta` registration uses absolute path to `dist/server.js` (Win path: `C:/Users//.local/projects-meta-mcp/dist/server.js`). Forward slashes work on all three platforms. -- 2026-04-29: Smoke test in setup phase 7 = `mcp__projects-meta__meta_status` (read-only, returns sync diagnostics). Caveat: in-session smoke only proves "MCP still alive", not "new registration is what's serving" — same caveat as context7. -- 2026-04-29: Mutation tools (`tasks_*`, `knowledge_*`) follow two-step preview→confirm pattern; `using-projects-meta` documents the pattern and forbids inlining `confirm: true` without explicit user "ok". -- 2026-04-29: Both skills shipped v1.0.0; `setup-projects-meta` description carries Russian + English triggers ("install/set up/configure projects-meta", "настрой/установи projects-meta", "...не работает / isn't working") same shape as setup-context7; `using-projects-meta` description prioritizes cross-project / shared-wiki triggers and explicitly tells the harness to skip for current-project state. -- 2026-04-30: After user prodded "почему ты pull не сделал в самом начале?", explicit `git pull` on `~/projects/projects-wiki` revealed `wiki-path-mismatch-resolution.md` — canon path changed from `~/projects/.wiki` (write/read mismatch bug) to `~/projects/projects-wiki/` (clone root) with content at `~/projects/projects-wiki/.wiki/`. Fixed all six places in the new skills (setup SKILL+README, using SKILL+README, concept page, this task file). Phase 1 of setup-projects-meta now detects legacy clone; Phase 4 re-clones to canon. Lesson saved as feedback memory `pull_shared_wiki_explicitly`. - -## Open questions -- [ ] `project-bootstrap` Step for `setup-projects-meta`? — concept page says "may be added later as 'recommend installing projects-meta'". Decision: defer, separate task. -- [ ] Should `using-projects-meta` carry its own `Local-first rule` or just point to the wiki anchor? Decision: carry it inline — concept page says "for the **current** project read locally; MCP cache is for **other** projects". Critical enough to repeat. - -## Completed steps -- [x] Read `setup-context7` + `using-context7` SKILL.md as templates -- [x] Fetch `packages/projects-meta-mcp` + `concepts/setup-using-skill-pair` via `knowledge.get` -- [x] Inspect `scripts/build.sh` + `scripts/install.sh` + skill folder layouts (setup-context7 = SKILL.md only; setup-wiki = SKILL.md + README.md) -- [x] Promote task to 🔴 in STATUS.md -- [x] Draft `skills/setup-projects-meta/SKILL.md` (8-phase, model setup-context7) -- [x] Draft `skills/using-projects-meta/SKILL.md` (model using-context7, local-first rule + two-step mutation) -- [x] Write README.md for both skills (model: setup-wiki / using-wiki) -- [x] `bash scripts/build.sh setup-projects-meta using-projects-meta` → both archives in `dist/` -- [x] `bash scripts/install.sh ...` → both installed to `~/.claude/skills/` -- [x] Smoke: both skills visible in `Skill` tool listing in this session -- [x] Wiki: `concepts/projects-meta-skills.md` added; `index.md` + `log.md` updated -- [x] Closed task in STATUS.md (🟢 done); next step is round-trip close via `mcp__projects-meta__tasks_close target_project=claude-skills` to mirror state to Gitea - -## Notes -- Wiki anchors live in shared `projects-wiki` Gitea repo (`https://git.kzntsv.site/OpeItcLoc03/projects-wiki`), cloned to `~/projects/projects-wiki/.wiki` on this machine. -- Original task created from another workstation (`OpeItcLoc03@DESKTOP-NSEF0UK`) via `mcp__projects-meta__tasks_create` — closing it should use `mcp__projects-meta__tasks_close target_project=claude-skills` to round-trip back to the same Gitea board. -- After install, restart Claude Code is required for the new MCP tool registrations to bind to a fresh stdio session — same caveat as setup-context7. diff --git a/.tasks/pulling-before-work-skill.md b/.tasks/pulling-before-work-skill.md deleted file mode 100644 index 65aaad4..0000000 --- a/.tasks/pulling-before-work-skill.md +++ /dev/null @@ -1,648 +0,0 @@ -# pulling-before-work — implementation plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Ship a new policy skill `pulling-before-work` (one pull at session start + on-demand re-sync) and wire it into the canonical `project-bootstrap` template, with the `claude-skills` repo dogfooding the trigger. - -**Architecture:** Single-file policy skill (`skills/pulling-before-work/SKILL.md`) following the `active-platform` / `using-tasks` shape — frontmatter trigger description + body with deterministic shell algorithm. `project-bootstrap` v1.4.0 adds the canonical trigger line `pull remote before work` to `assets/CLAUDE.md.template`; the existing v1.3.0 idempotent merge propagates it into existing projects on upgrade. The `claude-skills` repo's own `CLAUDE.md` gets the line as dogfood. - -**Tech Stack:** Markdown skills (no build for the skill body itself). Build pipeline: `scripts/build.ps1` produces `dist/.skill` archives. Install: `scripts/install.sh` (or `.ps1`). Spec lives at `.wiki/concepts/pulling-before-work-design.md`. - ---- - -## File Structure - -**New:** -- `skills/pulling-before-work/SKILL.md` — frontmatter + body, ~80–120 lines -- `skills/pulling-before-work/README.md` — short user-facing intro mirroring `skills/using-tasks/README.md` shape - -**Modified:** -- `skills/project-bootstrap/SKILL.md` — `version: 1.3.0` → `1.4.0`; Step 5 inline template gains the new line; new commentary paragraph after the inline template explaining the trigger (mirrors the existing paragraphs about `check across all projects` and `we're on Windows`) -- `skills/project-bootstrap/assets/CLAUDE.md.template` — `+ pull remote before work` before `we're on Windows` -- `CLAUDE.md` (repo root) — `+ pull remote before work` before `we're on Windows` (dogfood) -- `.wiki/log.md` — append decision entry -- `.wiki/index.md` — concept page link (added in spec commit; verify still listed) -- `.tasks/STATUS.md` — add `[pulling-before-work-skill]` block - -**Built:** -- `dist/pulling-before-work.skill` — new -- `dist/project-bootstrap.skill` — rebuilt - ---- - -## Task 1: New skill — frontmatter only - -**Files:** -- Create: `skills/pulling-before-work/SKILL.md` - -- [ ] **Step 1: Write the frontmatter** - -```markdown ---- -name: pulling-before-work -version: 1.0.0 -description: > - Pulls the current branch from origin once at session start and on explicit - re-sync requests. Use when CLAUDE.md contains the trigger line "pull remote - before work", or when the user says "sync", "resync", "pull", "обнови репо", - "git pull please", or close variants asking to refresh from the remote. - Runs `git pull --ff-only` — never auto-merges or rebases. Stays silent in - non-git folders. Prints one informational line and exits when there is no - origin remote, no upstream tracking, the working tree is dirty, or HEAD is - detached. Does not stash, commit, or push. Activated by `project-bootstrap` - v1.4.0+ via the canonical CLAUDE.md template. ---- - -# pulling-before-work -``` - -- [ ] **Step 2: Verify description length is under 900 chars** - -Run: -```powershell -$c = Get-Content skills/pulling-before-work/SKILL.md -Raw -$start = $c.IndexOf('description: >') + 'description: >'.Length -$end = $c.IndexOf('---', $start) -$desc = $c.Substring($start, $end - $start).Trim() -"description chars: $($desc.Length)" -``` -Expected: a number ≤ 900. (Per `feedback_skill_description_length_limit` memory: harness silently drops descriptions >~1024 and falls back to the H1.) - -- [ ] **Step 3: Commit** - -```powershell -git add skills/pulling-before-work/SKILL.md -git commit -m "feat(pulling-before-work): scaffold skill frontmatter" -``` - ---- - -## Task 2: New skill — body - -**Files:** -- Modify: `skills/pulling-before-work/SKILL.md` (append body) - -- [ ] **Step 1: Append the skill body after the H1** - -```markdown -> Pull from `origin` once when work starts. Don't auto-merge. Don't trample dirty work-trees. Don't ask twice in the same session unless asked. - -## When this runs - -**At session start** — once, when the skill is activated by the `pull remote before work` line in `CLAUDE.md`. The cycle below runs immediately. - -**On explicit re-sync** — when the user says any of: `sync`, `resync`, `pull`, `обнови репо`, `pull please`, `git pull`, `подтяни`, `pull from origin`. Re-runs the full cycle. There is no per-session counter; the user is always allowed to ask. - -**Never** before each commit, before each tool call, on every message, or in any other implicit cadence. Mode-3 ("start + on-demand") was the explicit design choice — see `.wiki/concepts/pulling-before-work-design.md`. - -## The pull cycle - -Run these checks in order. Print at most one line of chat output per run. - -### 1. Inside a git work-tree? - -```bash -git rev-parse --is-inside-work-tree 2>/dev/null -``` - -If the command fails or prints anything other than `true` → **exit silently, no chat output.** This is the not-a-git-repo case; the skill must not be noisy in random folders. - -### 2. Has an `origin` remote? - -```bash -git remote get-url origin 2>/dev/null -``` - -If the command fails (no such remote) → print one line and exit: - -``` -no origin remote — skip pull -``` - -### 3. Is the working tree clean? - -```bash -git status --porcelain -``` - -If the output is non-empty → print one line and exit: - -``` -working tree dirty — skipping pull. commit/stash, потом скажи "sync" -``` - -Never stash automatically. Stash-pop conflicts are exactly the friction this skill exists to remove. - -### 4. Is HEAD attached? - -```bash -git symbolic-ref -q HEAD -``` - -If the command fails (empty output, exit 1) → detached HEAD. Print: - -``` -detached HEAD — skip pull -``` - -### 5. Does the current branch have an upstream? - -```bash -git rev-parse --abbrev-ref --symbolic-full-name '@{u}' 2>/dev/null -``` - -Capture the upstream name (e.g. `origin/master`). If the command fails → no upstream tracking. Print: - -``` -no upstream tracking for — skip pull -``` - -(Where `` is `git rev-parse --abbrev-ref HEAD`.) - -### 6. Pull, fast-forward only - -```bash -git pull --ff-only -``` - -(No args — uses the configured upstream captured above.) - -Classify by exit code and stdout: - -| Result | Print | -|---|---| -| Already up to date | `✅ already up to date with ` | -| Fast-forward, N commits | `✅ pulled N commits from ` | -| Non-fast-forward / diverged (exit non-zero with "diverged" or "non-fast-forward" in output) | `⚠️ diverged from — resolve manually (git pull --rebase or merge); skill never auto-merges/rebases` | - -### Out of scope - -The skill never: - -- commits, stashes, or pushes -- recurses into submodules -- pulls from non-`origin` remotes -- pulls on detached HEAD -- runs auto-merge or auto-rebase -- runs more than once per session unless the user asks - -## Recovery hints - -If the skill skipped because of a dirty tree: - -```powershell -# Windows / PowerShell -git status # see what's dirty -git add . ; git commit -m "wip" -# then ask the agent: "sync" -``` - -```bash -# Linux / macOS -git status -git add . && git commit -m "wip" -# then say "sync" -``` - -If the skill reported `diverged`: - -```bash -# Option A: rebase your local commits on top of origin -git pull --rebase - -# Option B: explicit merge (creates a merge commit) -git pull --no-ff -``` - -The skill stays out of these decisions on purpose — both options have valid use cases and the user owns the choice. - -## Why this exists - -Stale local branches are a silent footgun: edits land on top of yesterday's `origin`, the divergence shows up at push time, and by then there's a chunk of work to rebase or merge on the wrong base. One pull at start covers the common case; an explicit re-sync trigger handles long sessions where someone pushed mid-flight. - -Full design rationale (mode choice, dirty-tree skip vs stash, `--ff-only` vs auto-merge, the upstream-check) lives in `.wiki/concepts/pulling-before-work-design.md`. -``` - -- [ ] **Step 2: Sanity-check the file rendered** - -Read the file back and confirm: -- Frontmatter still parses (no `---` accidentally inside the body) -- All six numbered steps are present -- Recovery hints block has both PowerShell and bash variants - -- [ ] **Step 3: Commit** - -```powershell -git add skills/pulling-before-work/SKILL.md -git commit -m "feat(pulling-before-work): skill body — pull cycle, recovery hints, rationale" -``` - ---- - -## Task 3: New skill — README.md - -**Files:** -- Create: `skills/pulling-before-work/README.md` - -- [ ] **Step 1: Write README** - -```markdown -# pulling-before-work - -Policy skill that pulls the current branch from `origin` once at session start -and on explicit re-sync requests. Designed to remove the "edited on stale base" -footgun without trampling dirty work-trees or auto-merging. - -## When it triggers - -- **Session start** — when `CLAUDE.md` contains the line `pull remote before work` (added by `project-bootstrap` v1.4.0+). -- **In-chat** — when the user says `sync`, `resync`, `pull`, `обнови репо`, `git pull please`, or close variants. - -Stays silent in non-git folders. Prints one informational line and exits in: -no `origin` remote, no upstream tracking, dirty work-tree, detached HEAD. - -## What it does - -`git pull --ff-only` against the configured upstream — never auto-merges, never -auto-rebases, never stashes, never commits, never pushes. On divergence it prints -a warning with manual-resolution hints and exits. - -## Prerequisites - -None. The skill is a no-op outside git repos and folders without an `origin` -remote, so it's safe to leave activated everywhere. - -## Related - -- `project-bootstrap` (v1.4.0+) — adds the trigger line to new and existing projects' `CLAUDE.md`. -- `.wiki/concepts/pulling-before-work-design.md` (in projects bootstrapped from this repo: this design lives in `claude-skills`) — full design rationale. -``` - -- [ ] **Step 2: Commit** - -```powershell -git add skills/pulling-before-work/README.md -git commit -m "docs(pulling-before-work): README" -``` - ---- - -## Task 4: Bootstrap template — add trigger line - -**Files:** -- Modify: `skills/project-bootstrap/assets/CLAUDE.md.template` - -- [ ] **Step 1: Insert the new line before the platform line** - -Current: -```markdown -# CLAUDE.md -# Agent instructions. Each line is a trigger for an installed skill. - -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -we're on Windows -``` - -Target: -```markdown -# CLAUDE.md -# Agent instructions. Each line is a trigger for an installed skill. - -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -we're on Windows -``` - -Use `Edit` with `old_string="check across all projects\nwe're on Windows"` → `new_string="check across all projects\npull remote before work\nwe're on Windows"`. - -- [ ] **Step 2: Verify** - -```powershell -Get-Content skills/project-bootstrap/assets/CLAUDE.md.template -``` - -Expected: the seven trigger lines above, in that order. - -- [ ] **Step 3: Commit** - -```powershell -git add skills/project-bootstrap/assets/CLAUDE.md.template -git commit -m "feat(project-bootstrap): template gains 'pull remote before work' trigger" -``` - ---- - -## Task 5: Bootstrap SKILL.md — version bump + Step 5 update - -**Files:** -- Modify: `skills/project-bootstrap/SKILL.md` - -- [ ] **Step 1: Bump version in frontmatter** - -Edit: -- `old`: `version: 1.3.0` -- `new`: `version: 1.4.0` - -- [ ] **Step 2: Update the Step 5 inline template (mirror of `assets/CLAUDE.md.template`)** - -In Step 5, find the fenced markdown block: - -```markdown -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -we're on Windows -``` - -Replace with: - -```markdown -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -we're on Windows -``` - -- [ ] **Step 3: Add commentary paragraph for the new trigger** - -After the existing paragraph that explains `check across all projects` and before the paragraph about `we're on Windows`, insert: - -```markdown -The `pull remote before work` line activates the `pulling-before-work` skill, -which runs one `git pull --ff-only` at session start (and on explicit re-sync -requests like "sync"). It's a no-op outside git repos and skips with a one-line -warning if the working tree is dirty, HEAD is detached, or the branch has no -upstream — never auto-merges, stashes, or pushes. Install the skill on the host -if `pulling-before-work` is not in `~/.claude/skills/`; otherwise the trigger is -silently dead like any other absent skill. -``` - -- [ ] **Step 4: Verify** - -```powershell -Select-String -Path skills/project-bootstrap/SKILL.md -Pattern '^version:|pull remote before work|pulling-before-work' | ForEach-Object { "$($_.LineNumber): $($_.Line)" } -``` - -Expected: at least 4 hits — `version: 1.4.0`, the line in the Step 5 fenced block, the new commentary paragraph mentioning the trigger, and a reference to `pulling-before-work`. - -- [ ] **Step 5: Commit** - -```powershell -git add skills/project-bootstrap/SKILL.md -git commit -m "feat(project-bootstrap): v1.4.0 — add 'pull remote before work' canonical trigger" -``` - ---- - -## Task 6: Dogfood — add trigger to claude-skills root CLAUDE.md - -**Files:** -- Modify: `CLAUDE.md` (repo root) - -- [ ] **Step 1: Insert the trigger before the platform line** - -Use Edit: -- `old`: `check across all projects\nwe're on Windows` -- `new`: `check across all projects\npull remote before work\nwe're on Windows` - -- [ ] **Step 2: Verify** - -```powershell -Get-Content CLAUDE.md -``` - -Expected: -``` -# CLAUDE.md -# Agent instructions. Each line is a trigger for an installed skill. - -talk like a caveman -use superpowers -use project wiki -use task management system -check across all projects -pull remote before work -we're on Windows -``` - -- [ ] **Step 3: Commit** - -```powershell -git add CLAUDE.md -git commit -m "chore(claude-skills): dogfood 'pull remote before work' trigger" -``` - ---- - -## Task 7: Build artifacts - -**Files:** -- Build: `dist/pulling-before-work.skill` (new), `dist/project-bootstrap.skill` (rebuilt) - -- [ ] **Step 1: Run the build script** - -```powershell -pwsh scripts/build.ps1 -Names pulling-before-work,project-bootstrap -``` - -Expected output: -``` -built: dist/pulling-before-work.skill -built: dist/project-bootstrap.skill -``` - -- [ ] **Step 2: Verify the archives** - -```powershell -Get-ChildItem dist/pulling-before-work.skill, dist/project-bootstrap.skill | Format-Table Name, Length, LastWriteTime -``` - -Expected: both files exist, `LastWriteTime` is the current minute, sizes nonzero. - -Spot-check the new archive's structure (no Compress-Archive backslash bug): -```powershell -$arch = [System.IO.Compression.ZipFile]::OpenRead((Resolve-Path dist/pulling-before-work.skill)) -$arch.Entries | Select-Object FullName | Format-Table -AutoSize -$arch.Dispose() -``` - -Expected: entries like `pulling-before-work/SKILL.md`, `pulling-before-work/README.md` — forward slashes, no backslashes. - -- [ ] **Step 3: Commit** - -```powershell -git add dist/pulling-before-work.skill dist/project-bootstrap.skill -git commit -m "build: pulling-before-work@1.0.0 + project-bootstrap@1.4.0 archives" -``` - ---- - -## Task 8: Install on this machine - -- [ ] **Step 1: Run installer** - -```powershell -bash scripts/install.sh -``` - -(`install.sh` is portable — works in git-bash on Windows. No `.ps1` exists yet; that's a separate ⚪ Ready task `[install-ps1]`.) - -Expected stdout: lines like `installed: pulling-before-work` and `installed: project-bootstrap` (and the rest of the skills, idempotent). - -- [ ] **Step 2: Verify installed skills** - -```powershell -Test-Path "$env:USERPROFILE\.claude\skills\pulling-before-work\SKILL.md" -Test-Path "$env:USERPROFILE\.claude\skills\project-bootstrap\SKILL.md" -Select-String -Path "$env:USERPROFILE\.claude\skills\project-bootstrap\SKILL.md" -Pattern '^version:' -``` - -Expected: -- both `Test-Path` return `True` -- `version: 1.4.0` for project-bootstrap - -(No commit — install affects user-level state, not the repo.) - ---- - -## Task 9: Manual smoke validation - -Validation per spec scenarios. No automated harness — run each in a scratch dir or describe what to verify. - -- [ ] **Scenario 1 (clean repo with remote, up to date):** - -```powershell -$tmp = Join-Path $env:TEMP "pull-smoke-1" -git clone https://github.com/anthropics/claude-code $tmp -cd $tmp -# In a *new* Claude Code session opened in $tmp with `pull remote before work` in CLAUDE.md, -# expect the agent to print: "✅ already up to date with origin/main" -``` - -This requires running a fresh agent session. Document the expected line in chat as proof. - -- [ ] **Scenario 2 (no remote):** - -```powershell -$tmp = Join-Path $env:TEMP "pull-smoke-2" -New-Item -Type Directory $tmp | Out-Null -cd $tmp -git init -"pull remote before work" | Out-File CLAUDE.md -# Open agent session here. Expect: "no origin remote — skip pull" -``` - -- [ ] **Scenario 4 (dirty tree):** - -In a clean repo with origin, `Set-Content -Path test.txt -Value "wip"`. Open agent session. Expect: `working tree dirty — skipping pull. commit/stash, потом скажи "sync"`. - -- [ ] **Scenario 8 (bootstrap upgrade on this very repo):** - -Re-run `project-bootstrap` on `claude-skills` itself: - -```powershell -# In a fresh Claude Code session in claude-skills root, say: "upgrade project" -# Bootstrap detects CLAUDE.md exists, runs Step 5 idempotent merge. -# Expected: it reports CLAUDE.md is already canon (we added the line manually -# in Task 6, so the merge sees nothing missing). No prompt to append. -``` - -If Task 6 was skipped accidentally, this scenario would prompt to append `pull remote before work`. Either way demonstrates the merge logic works. - -- [ ] **Document results in `.tasks/STATUS.md` `Where I stopped` field** - -After running scenarios, update the task block (Task 11 below) with which scenarios passed. - ---- - -## Task 10: Wiki log + index - -**Files:** -- Modify: `.wiki/log.md` -- Modify: `.wiki/index.md` (verify) - -- [ ] **Step 1: Append log entry** - -Append to `.wiki/log.md`: - -```markdown -## [2026-05-01] decision | pulling-before-work — new policy skill (v1.0.0): one `git pull --ff-only` at session start + on-demand re-sync; bootstrap template gains canonical trigger; project-bootstrap 1.3.0→1.4.0 -``` - -- [ ] **Step 2: Verify `.wiki/index.md` lists the design page** - -```powershell -Select-String -Path .wiki/index.md -Pattern 'pulling-before-work-design' -``` - -If absent, add a line under `## Concepts`: - -```markdown -- [pulling-before-work-design.md](concepts/pulling-before-work-design.md) — design for the pulling-before-work skill (mode-3 + skip-on-dirty) -``` - -- [ ] **Step 3: Commit** - -```powershell -git add .wiki/log.md .wiki/index.md -git commit -m "docs(wiki): log + index — pulling-before-work@1.0.0" -``` - ---- - -## Task 11: Tasks board entry - -**Files:** -- Modify: `.tasks/STATUS.md` - -- [ ] **Step 1: Insert a Done block at the top (after the header) for this task** - -```markdown -## 🟢 [pulling-before-work-skill] — pulling-before-work skill + project-bootstrap 1.4.0 canonical trigger -**Status:** done -**Where I stopped:** `skills/pulling-before-work/` shipped at v1.0.0 (mode-3 activation: session start + on-demand re-sync; `git pull --ff-only`; skips on no-remote / no-upstream / dirty / detached); `assets/CLAUDE.md.template` gains `pull remote before work`; `project-bootstrap` 1.3.0→1.4.0 with new commentary paragraph in Step 5; root `CLAUDE.md` dogfood line added; both archives rebuilt in `dist/`; installed via `install.sh`; smoke scenarios 1/2/4/8 verified manually; design rationale at `.wiki/concepts/pulling-before-work-design.md` -**Next action:** (none — kept until merged) -**Branch:** master - ---- -``` - -- [ ] **Step 2: Commit** - -```powershell -git add .tasks/STATUS.md .tasks/pulling-before-work-skill.md -git commit -m "tasks: close [pulling-before-work-skill]" -``` - ---- - -## Self-Review - -**Spec coverage:** -- ✅ Skill description / activation rules → Task 1, 2 -- ✅ Pull cycle (6 steps incl. upstream check) → Task 2 -- ✅ Out-of-scope list → Task 2 -- ✅ Mode-3 + skip-on-dirty + `--ff-only` rationale → Task 2 (body) + design doc cross-ref -- ✅ Template change → Task 4 -- ✅ Bootstrap version bump + Step 5 commentary → Task 5 -- ✅ Dogfood in repo root → Task 6 -- ✅ Build + install → Tasks 7, 8 -- ✅ Validation scenarios → Task 9 -- ✅ Wiki + tasks bookkeeping → Tasks 10, 11 - -**Placeholder scan:** no TBD / TODO / "implement later". All steps have explicit code or commands. - -**Type / wording consistency:** trigger line is `pull remote before work` everywhere (template, dogfood, commentary, README, design). Skill name `pulling-before-work` everywhere (folder, frontmatter, archive, install path, log, README cross-link). Version `1.0.0` for new skill, `1.4.0` for bootstrap — consistent across frontmatter, log, tasks block. diff --git a/.tasks/shared-wiki-skill-catalog.md b/.tasks/shared-wiki-skill-catalog.md deleted file mode 100644 index 2443219..0000000 --- a/.tasks/shared-wiki-skill-catalog.md +++ /dev/null @@ -1,26 +0,0 @@ -# shared-wiki-skill-catalog - -## Goal -Опубликовать в shared `projects-wiki` сводный каталог скиллов из `claude-skills`, чтобы агенты на других машинах / в других репах могли быстро увидеть, какие скиллы существуют, в какой версии, и сгруппированы как. Дополняет уже существующую страницу `concepts/setup-using-skill-pair` (паттерн), но не дублирует её — каталог — это `packages/claude-skills`. - -## Key files -- `c:\Users\vitya\projects\claude-skills\skills\*\SKILL.md` — источник имён, версий, описаний -- `c:\Users\vitya\projects\projects-wiki\.wiki\packages\claude-skills.md` — итоговая страница (создаётся через `knowledge_ingest`) -- `c:\Users\vitya\projects\projects-wiki\.wiki\concepts\setup-using-skill-pair.md` — связанная страница (паттерн) - -## Decisions log -- 2026-05-01: Один comprehensive page `packages/claude-skills` вместо россыпи `entities/.md`. Причина: 20 скиллов с короткими description — entity-страницы стали бы пустыми; одна сгруппированная таблица читается быстрее и легче поддерживать -- 2026-05-01: Группировка по назначению (communication / bootstrap / wiki+tasks / MCP / discovery / platform), не по алфавиту -- 2026-05-01: Версия указана только если присутствует в frontmatter (не выдумываем 0.1.0 для unversioned, чтобы не давать ложного сигнала) - -## Open questions -- [ ] Стоит ли потом отдельные `entities/.md` для скиллов с глубоким design rationale (project-bootstrap, project-discipline)? Решим, если кто-то реально захочет drill-down - -## Completed steps -- [x] Step 0 freshness gate (cache 73 мин stale → search OK; shared wiki pulled clean) -- [x] Прочитан index shared wiki (нет коллизий: ни `packages/claude-skills`, ни catalog page нет) -- [x] Прочитаны frontmatter всех 20 SKILL.md -- [x] Создана сама страница через `knowledge_ingest` (preview → confirm) - -## Notes -Cross-link: `concepts/setup-using-skill-pair` (паттерн), `packages/projects-meta-mcp` (один из MCP серверов, для которого скиллы из этого репа являются клиентами). diff --git a/.tasks/using-projects-meta-freshness-gate.md b/.tasks/using-projects-meta-freshness-gate.md deleted file mode 100644 index 7726c68..0000000 --- a/.tasks/using-projects-meta-freshness-gate.md +++ /dev/null @@ -1,34 +0,0 @@ -# using-projects-meta-freshness-gate - -## Goal -Add an explicit Step 0 "Freshness gate" to `using-projects-meta` so the agent does not hit a stale MCP cache or a sha-based optimistic-lock conflict in cross-machine workflows. Pre-flight: always `meta_status`; if `cache_age` > 10 min or `errors_count` > 0, run `node ~/.local/projects-meta-mcp/dist/sync.js` for reads; for shared-wiki writes (`knowledge_ingest`, `knowledge_promote`) additionally `git -C ~/projects/projects-wiki pull --ff-only`. 401/403 from sync → token expired → send user to `~/.config/projects-mcp/auth.toml`. Tasks-mutations need only the sync (no local clone of target tasks repo). Bump skill 1.0.0 → 1.1.0 (additive, non-breaking). - -## Key files -- `skills/using-projects-meta/SKILL.md` — add **Step 0 — Freshness gate** section before "Read (no confirmation needed)" and before "Mutate (always two-step)"; tweak Workflow ordering -- `skills/using-projects-meta/README.md` — mirror the rule in a new "Freshness gate" subsection of "Two operation classes" -- `.wiki/concepts/projects-meta-skills.md` — append a "Freshness gate (v1.1.0)" subsection -- `.wiki/log.md` — one entry - -## Decisions log -- 2026-04-30: Threshold = 10 min cache age. Reason: balance between catching cross-machine pushes and not hitting Gitea on every casual `tasks_aggregate`. User-supplied number, codified. -- 2026-04-30: For shared-wiki writes, pull is **unconditional** (not gated by cache age). Reason: sha-based optimistic lock in `knowledge_ingest` will reject the commit otherwise with a 422, and the failure mode is opaque ("why did it fail?"). The pull is cheap (fast-forward is a no-op when already current). -- 2026-04-30: For tasks-mutations, sync via `dist/sync.js` is enough. Reason: there's no local clone of the target tasks repo — mutations go straight through Gitea API. The sync only refreshes the local view of all repos' STATUS.md so the agent reasons from current state when writing. -- 2026-04-30: 401/403 from sync → send user to rotate `gitea_token` in `~/.config/projects-mcp/auth.toml`. Reason: silently failing or pretending sync succeeded leaves the agent reasoning on stale data. Loud failure is the whole point of the check. -- 2026-04-30: Version bump 1.0.0 → 1.1.0 (additive behavior change — adds a pre-flight step, doesn't break existing usage). `using-context7` precedent: `version` in frontmatter, semver discipline. - -## Open questions -- [ ] Should Step 0 apply to `meta_status` itself? Decision: no — that would be circular. `meta_status` is the freshness probe, not a read that depends on freshness. - -## Completed steps -- [x] Open task in STATUS.md as 🔴 active -- [x] Add Step 0 — Freshness gate section to `using-projects-meta/SKILL.md` (between Workflow header and Read sub-section); add Step 0 reference to Read and Mutate sub-flows; extend Common mistakes (3 new rows: stale aggregate, skipped pull, sync 401/403); extend Red flags (2 new bullets) -- [x] Mirror rule in `using-projects-meta/README.md` as new "Step 0 — Freshness gate (v1.1.0, mandatory pre-flight)" section -- [x] Bump `version: 1.0.0` → `1.1.0` in SKILL.md frontmatter -- [x] First rebuild + reinstall — caused regression: full Step 0 inlined into description took it to ~1450 chars, exceeded harness limit, description silently dropped → listing showed `using-projects-meta: Using the projects-meta MCP server` (H1 fallback); fixed by trimming description to 924 chars with one-sentence pointer "v1.1.0 mandates a Step 0 freshness gate ... see SKILL body" -- [x] Saved feedback memory `skill_description_length_limit.md` so future me checks length after frontmatter edits -- [x] Wiki: appended "Freshness gate (v1.1.0)" subsection to `concepts/projects-meta-skills.md`; one entry in `log.md` -- [x] Closed in STATUS.md (🟢 done); next: commit + push + MCP round-trip close - -## Notes -- User-supplied draft text for the skill (verbatim): _"Step 0 — Freshness gate. Always call mcp__projects-meta__meta_status first. If cache_age_minutes > 10 or errors.length > 0, run node ~/.local/projects-meta-mcp/dist/sync.js before any read. For shared-wiki writes (knowledge_ingest, knowledge_promote), additionally run git -C ~/projects/projects-wiki pull --ff-only — sha-based optimistic lock will reject your commit otherwise."_ -- Trigger reason from user: "projects-meta — это шина между машинами. Юзер на ноуте может не знать, что на десктопе уже был коммит в shared wiki 5 минут назад. Без этого шага write-флоу ломается случайным образом, и баг трудно воспроизвести." diff --git a/dist/setup-projects-meta.skill b/dist/setup-projects-meta.skill index f80a627f83d3a9536ef05931b6e10d814d8fad40..7e47b4daaaf7dbfa2f39ec01c11a486361bd1e1e 100644 GIT binary patch literal 6938 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 literal 7636 zcmaKxRZtv^l12x2g6j?zB;qG=n zbX8YZKcD)JiaZP~4gdf^1S~`4=|MzsV73qdfGJD>0QAq+8SLWf@Y%u1-U@8$;{4eb z>|)HKCMhbRD9LPVmaDxPx6z8*y{rzb2{ijIRNMd>b^|Sc`Taf+LCn%f|4>Bt6&Oi5 zE1no7b8!xcCR3b^-g?CKy24{kD5`itZmLV5J#m+r%y+-A_1+1jP7FUfdg*py*$u$LCs_7zjvIv3Kfuk+O2(oi0ufQ?&) zl0WN+Q?NOS!mQ8Lq}I;KYd1PuhG|51sY#XHDSV^UuV25i2AfKAUZgMs=|zeptGire zA2z8bA(@pgi%LWAIec#FM36JVJku~3)R?L@bgAEY`NuTQyFQt@6@n*Io-egb?4?~aeYyw)~@@N(qI4Q zP)A#JPn};^hshP3@g{Ll!*X>GWGgJzp4mS_`hrDc%IDnDc%5&|D}iF<d+!>MM8OTwtLU2Q3;;37!nb~+wF!g85aJ_&^%%jgfBuWd_7^uCE8Nx1*tUkk{m z&bai+sNdXhLf`|h;8KQ{R1w2ml4GG^^Y6&~4^}9~6RunpiME4yzY_K|xCE2w-(jVQ z+tuqM?fYQdSqP>EX}X?i#C47M${V!*h-QFRFJf9(sSNssfGn`|vR!OM{#n2Yzfla* zk_SKAmH@G_*W&K#v+8I7#p>>18rZj{78RT%`Q4sZ)Qu=52>g->eng>n3wcv@`PMfR zj2Sk8UldBKBIqUA-Y$l^`(!I~ z3`Z401a$#3q?2;s2@?oUC2qOS56p$W{rRk--eOa16AGmmaQub4JzNQzfCn*X)Ru|S zI^TW;O+Q9wLGEe}Gz~Ub?JdZ)8!Q#gFEsQ%IFwtk&gkGK_@YgsBk*_F7=p47B% z&_in{6Zb5+Nnr7`In`__U%Y~|XWUK4N;{kns|v>Svx?gHLVbpYznR~SB@_h_0gFw{mj6T$mT9BPy-6ji5Yq#1Wm zc4f4{UDd{}XcD`}W`ABbtBeo^tV)ll4|Lkfm72@7?IPJMoF~Jtz9cO1tYQClC$e?tPwGAEo9*pJK{B_inh3^~ zh=_fd+nP%g-&!twuI$PsNP*Ei-0BRbLGBsJz5;f9GEY(^P-Ib@3VU+NS=Khw^H{w_ zERapkw^jCOj>KNlRR)(M_w`TPX3&JX0%*_ufv95}M% z$G!c7eU&}k?jfAN5l;?j}p`A1luA#&S0!Pt-N9cG}9DAtFhk6)7z>H!91yBW5zMNaWvJLq{pc^9|~o0|_kcIfuHjqjd_mJsK&17oSp ziJF>vy#qRdLW4WoVFn?nJjch|Ki$~DsJHt+{0V-p_%912tapfZMhKx=nLwMtP`-pZ zL@;jt4nrD3&8bSo`z%Dn6Iga#V%)NwMT<=5$WkQ2i<dIqaQFT z{{sf2|9}DdO~A&|Kb(Nf4FCZD4=_-dmsL>shYL!-eX|EjyZK!isuDoHa+tcsn~gpM z?Xt_OH&fTqVFCH$8m#NRy{x{kouB00g%+<`z?cW4B`lN0dm<+Y3P7RSU<^E=EEvwP zjJi)%o}T1oAICz;o4C6!RysdTrPiMD%d#%MFf2>*Ih*S|L(ro)a!)B7>|D~MEgS1d zJU{&mpHew8#+yX;yQ3J5CW~{%r4q+28>J&k&z#a^n`KbyC;RGW%Hd8l<&%ovPdBJT z*!uOV`^6l0$kL>H?2buOvg)}xsqq<^6{g#R0`ZEL{+KM!!$v_1U zyH2LOq3%$XZHGe+_(rCczt;~i*FQ6>QxX$KViy{?IU7+iao4j`Wby8{+8Yt04UH-$ z_5tAteD%IjG>^|rJ#kFIH-g-Ve$V$z^p5R(W{}%Aa8yBWd9=-==`Qb{;2Mc>N;Q;r ztU1Ka)o4@mtRK;2#A>J*a)Ssh2Ki|6ee*Ynw0m2;_}K9Kc(~en-??ya6WMxSetv25 zSGKqB8SWsp|G0fnK4T>MgtPQkP`~=v_Tl(K>HoKXU8II3`et9W@X*o?L~Yuo#L-Wj!k?K+@Xrkc0+&BO!%9+!>$LvNO1fp&n@#5oPAt)>{M(_|$P zXNEfA25GCq&*CN(l*b+P^U_IKa)aUC8RWuF1hs_j+2zKT|9TUJnENW{rb&J|mHp*t zszOT4VNA{1k$uKGFZr%930*Ue+nTDms$oHBAvhPs+>;P5m|;L5&gh`E;gT~dX0Z?> zGW;hw0w*g~xYu>pSe!?P*jLqik>pgTOk9N@7R`p*NL^+DH4~+IrId%c9l7Wil7hp= zA0YnB&c=EK@l+wdeDgO6bz6;8chFwhRX>7gSd9V}*6;6~aN}Y1U33x7%Jlr#CGd`GGP~o9oGG2D)LPounDpahE4hZ}s$LHfs^XXPNgSs_eKNV9Lw#g3vn4!!) zp@I#I8}qnr3A4=LP)U%hg+>z{WG(#2%w7HNnlxo91UzG8UD2YK zN#qDg4~TYx_vCxLtgItoQ!^>wYY(B#oU1c;#F3KhQeh48G1Ngkp${e$YJsCFfIXFY zq9**N4(H>ZvC|PruuK=RTgtg*-DCFNht`b*-%!S(BsorwBZJg@5;eqa%DYJpE%G=J zt}svh{7AOvPJS-xzVg-Cqob7Kyz*8S;6+kd$Q*&wtDy2_JcxI`&q1^?s4`sP7o$*H z8W?Qh;-otyxxeOKtQ~A=%U;R5h2I<}(+TT*&MwxbnllxvH#H_!N|_pd5(9TjF)iQ0 zJi#ZA^22M=T=aq^-L61>WLEQVbB=t)`gfADCT9_TCVZc)mC!a*?C;)dA33=Z1VJ(d zhT~qK2P^!SzsW@z2QNRjcp19Rwy7ok_71eyip9O$99c3Fi5l(?{K6G!!Y!+?!sH(6 z@K-*O!M&M<84zG^n=#jOg5t^a^bYR+0(nM^8VYRiCa`bbU`0-0@kRwaO3Xa#{5@Ts zz}wmAzHWqOx=Yf@*C?2mQnsN{*+*TP7v@89OSfi)Y9{3BRISv%yh+R)PQj=Eg0h-U zaAJpgn7=7soUy2O^4 z2i739q+9ZJO=CdS9;a`jJ#ey>!b(uRaimVzwH z4OwIqoX$prgD8k&`+6@ymV!GRoHlDx9cqhAaoUh=FUG$Y$rEB%Q}=*K8W!?pN!bDZ zLn!+h*!uh1$LsM8AM8Wal>cM=M;XbR*hFst9|97s@0Se>jtrs;wGW*!38KD>>(tGIZ3`vD@c3f z5dh8!NMOG74p%si1AV9Xv#poCA!dNRR}&?-`Qpf2vxly6Z!U$4a&G>;;cIF(K8gn+ z|K_bsmnV^W3Tc^2Xo4O%6O|m@VF3jD6e3{`EqZL&=B<>7!}&G2kH*6j<}v=7U9bMe zuvP*fW`}9!@OxlK-~c2R*i-UKHL{Bs&#V-emzzhI+y%uIY%wBdKIQqi*;9S*Fe6qX z5lB|Ft{)awumbm#-r*Ed6RS)a9GGsA|s<(jQW0_s(0*iMAPjTf6n7mA{8~{U8P)C ziRh7F4V^#N74W{IMEpA{amzcp*-D6 zc3sb_pg#eporz=$B)9m--=dAGkxPwJ5vvCk2Ws zioTqU&yG(XMWXcVQf^BE3FSwa82y+*)CC8FGM`<#Y14K|sxL^zjO`P!zy*K!Y!p2Z z93Ys>{8&=sj-;EfBM7lHB`jx*`@ z*Eh^>f<@7dR;tnS)LmrkQuGuCEAl_|X5;U2tm%d4XADCr`zjTzcWji(m|AI(*Dpvo z8j;EXbjLP6;!>?J=GIJgO8ZVi!QC#S+7#d{^!zbviz`(k$l*|f@R3R*#G<(BY{dB)ST)^UG9 zA9YhNf!})QBUx^b%WYwJ*ao!DMljH6M;Y}^N)hLLNfmH{Hm2y;V@E(&O%RZ|At{@u zAIz#>5}e3T8%uRg27(cxNU%wjDY(VE-E&0|apwjO7}`DYBEz7HLCy5L){kVfOh6fFlxlwD;|lu$!=$K04$@0YB} zz!hHnBB)rxHv>?r-;NEOVRllbLnY(mY+lRCn?Dyi;3SGz@ObU=9+}WeaD@ zBbK;-Z2*vUUkRk|4?JkzZ}&x|YuYbVH_6|xuBO-J{c-fMwHPQAA2EDU0}(jPzdpIG zye>lhVqVK=OXBUf{Bc>Y z@YFFqK?^!T*k>_CiED26_jL0+PRI(nv@zCJ*N5d^)zIiPW(BVKC-Jkb=PL8*k2Ah= zi`>KawRo%ShkKv;lFPTGxK7alqqm+IBBDT+7M-aE>c$>9PM~Lhd;hMtoeNU?o}Ra> zb&-~WCYd3WAvBOU;piKd3Bhd}=Bi+U7el2+3a81JNU;K$mnzpOuE^dHD;ZWt$=+`m zVJWAhQnt0@WYL8Yj`<3(N;H#r!rKMNlsnVB54JS{YiA*++EFObI0^3UC9$C73v?T4 z+fa2wpp_i`=ldA6)MymFfx*q1M687}u(7o`8n)j=7lyIGlq3H)IyoTW(4rnOoI?1l zOydZQm*WWg8_`E@p0M|!u)m+z+SQB6ObQ}j`kUc#&{l!jcMkWagZCmzUg!>%2i3X3$u02WFrE7SCj^))2wBQU>PQM zA7L37o^*`muHMv|Tr_B;bz+4@HBl;uNQ?0Yu?m!ookO}cYMFzWQxRZrfpXtcJWbhS zlC8fVAxKU>aYKDK97sT}&ASm84;-zq&vWYiO?UsUk`Y96&{2$;9U%T-(T!dIEQ_hz za`pg|tGXZ3S^ImTV9oM3rz_*BF>@O!VTG+mD;KKvWC!*68SnfVx!L8EmElr*7bX1G zz~1LPlh}S@^lNTgALXAl2g5GwUR@S?I4LYkgY1VKk;t0A_;!`k|1jMrI_O_br?YIE zuS+(3F872;9se8^GC0#|V46~=^^)=xgf_*_Q3^7vDLn-Z@yk4HWMjqMFm9Y_d=K`J_f z8g(|S{aSh^zd3jKvt+lZVrMyiEqkU|tE(Nk?@rfX;g``4xQ0ua&4fKWC}CtPNnTup zgB%?tS}B`VgsUoGnErH7&zWj`E3? z=|~6YAuxCq6V7(Pv8A@>a5cge%o97ib)7Wj*aa;mM!mNdJbYm#?0MhAR z_^0hNbzf$-^*lbLft=E~IKwQG0C}e3Adx$0Bz*T)Vuoinl#gFAsy0<^0_a@f+?--@ z7}sJ`2QlI}0*dw3htxsk)44rR7R_nn-(I5fDpH?9PaBGMkf*M$Dyv*?YfykMqDKr}>KhBQhGH zpZfsa*4w9izKV5uBSnqwo+_=`e1s}8^ zYzqn3677R%53!v}9chujiWzs}-V-9s-|wyh7E8Omm*d_&^n8>u9s-hRc=CHI=LliF zn{dd}LSdLQ7hLv*8faQh1`HYqYc#1GZ?a&pDjnaH%ugD}ZCQHHdAKS*ml8>Nqv(B^ zr2Rx1NVt$nS^4#Xmmc0Bs*0+xOf{mMowopNvp+4%0oIsYL@nV0ln2eDERB;D8qCC| zsU(g$MoVRuueTIq>1TBvb4xe0UuVHZDqzSOHQ7L_C3S^ID(La%2?#ETM+4w_VCmXO zSDX?z@z&s6zxwWL?Du)XPSl;{x;XcmogTDQSkLB|@5rJN&097EsqQZ(RcS+hMlWQ@ zro(G#D8^!J3c7r4wsAusHl~cS(a^eLPS$~EJbXmiTm2hLl+OCSYQ!&qEUXGkEjO6k znxxW7V}9#xoHX$$Fj+$*hrDdrphfjfo>$|eCq)t`Ka|Z{Wz0g(88g;vE&5RjTfT-$d3N8b8<{?as26-(AO8C*D18ck zX4<+sgR!Wyq7(HGK@0*M{gy`1)epZfgR?mP3F|>d!y8VwurP)5_>~^b2ftC0F=nO# zrCahzEez0(|$wG^fyg}S9kqV4*(Iw>+AW?5Ke#|a^O_Dq_h ze+=>6#@bao%ni24EurkuRCdupcFuoy6c)!!nV_F^%oJ)zo$~;Lo*w)WkJdsN7Y(S` z&3bLMhu0`QOJ1$c1_2Vde>8{-2P>L2&9dAk!`L+W<`V%dkDqelxp%{ke9k}9YPTv} zLmdqXYD5VT=dw1XUsJZ;+8ko_{!p%B7Dy*Pq~h9}R14Cv%1Npq-pgj+Zeov+FUEU1 zO~3_Xe-9*%!LE?PNun%eYWD#Rs`jp>3`s1q7F}vjVcroVNmteXiDi>{ElxvKWo~Ao zSt>e3o4sf6F42CV4b9;0e!U0-+_tqK&X?!%LDxFbO;y52GYne6?z8}Kbmg#auSh(c z7EavLq?y%wzi&)or(Z8FHe{y>2r`R1L6@iDViUbupdx5~O1me^LfaWK8^G?ls<2s3~?$~^Hm6zxNAMg*&AqPF zptKC~1>586B(?CFY-}5CcPQ~EWn02H1VQ=?q@)A$hXLMFSr!Ijo)-vB!LFlA_b?I= zA>TZj*d-C)CJb_XI+Cruw0Nl^6#W>PTU@qaKBz~o$g4)=&>;|qH zU`RRT+E4ol1FwzV#^pg;Zq542Zy0!-7|MAF@>qHq#b+0RLi3IiO)U@0FxPT^Y(UP)Etp`dX9|FMo4)(vJRuy?T_ZM({(mAMF z$5P00s+N1KCK@H}ln1}j&^YqVHweT~-zlE1W9iqGNkyhX{WqkIGPzK9q7L{DxPoKC z*hHP{teVUChSb2tvbNUc%G&k{#&z>w70{3`<__sd<*#FvG`XM(xg zW1w-V?+UZ!6vI$7#?ytxgRa7I$|?k&wy+`*6|=n~4(iY!IDJ>B#l6&%50~%v(h9Ot!JmYmpsTeh zVW4x<)r%B=Q;1wg)r6`0Z2}NJ!`hMju%X2Oczk|LbyNc*2yA z%IDd&-47jeyN>wXUmN)={GqbMo~=@+g>e#gxQ6C;7^_1X>V{>{juv^B^w%FZ;O)Ff zrO>e)CWw%`zHzDr|Fbz^O;IcXY52xjx*);QgG&QfQofA#45k10jC4r~V1iiDV7u_% z2tK8+t*UDbnG-)ZeXADMfn*uDMT0ZT*_N~O$!N_#PI)h~d_^%30T zsUh`Ijj45B#H*|7;$%4aS}V-B5Q;r(!s=SGe}Ce87wreJl5gGcQ6+D(+=u}!9O7sY zX|QxoRHry&4^hYg?pU-sgX~>?wel#FF)Xe;mn`JR$Sj%VFnLQg(qpvl9kF}84!we# z4j3Vu`I271Vh$H|Hg`YA`mA!*oeAsOptwS|gQs77G)n-CkL`J(Xl`8x5mxhVOuB>D z$)&@ziit#G(9gwZBZTZhu5q)J^D_}Ne3Y-g*vvid=9|trdZ1!@mW2Wmc?FC+nLU7w5$y-8Z$&277?Rr zPVb=}f7*EF?VjX0DK$3oJxIPG^xt~r(NcP?m=br0^qO*z z-FDA^a^@*;EB9khG;}O&cnq|jjOpPFu`4;(QAOon0S=4`W}2&g(LPy4be7srV}pW; z=jtd~Pc`8J=bxeHNAS0Uvy2J5_oWM{Z4)yd1QmB|ScD4CjVR-gq$UXz=`z?T`vn-z z8_k&o@4YqaZ5TIVaCN?`K@b8BQG?5E8M^}Um0c8`yeknnq~7fp?J3>}J3fA48Se_7_ zcfncDQE_2m#{G85mC^erHPUj|Fz7Tuy2_Q6tKNi9V{IgWy5ArUx72Ons0iP&mN%)NVcRMWOyb97;RrjKWuQ8;&V#<70) z=;%}E_MHX9M61Hqxh}sX;tI_F{pp|u?vAG4T~7Pm^Uc1|tBL6cp`^7b?$ZDP=FHu4 zHzDTU(L!^z58rE_z4M1qNlBQXq%Kmo2t97G!Tj_-{8GDKwQ`el#XWZy9}iYJ6|~E( zTdv6|s==vR&u)Z-<1?h;{-umaAoD?Te$a~Sy;<68ZizsN zx`+~lYUiTw{WiB6nA4?pHG-{t8KG!O9J81$(!M$f3%*wS;5G6TBmvdzvsTZfcf>0^ z(Fr-sA%(wta4|G3W7Mmn0UgoWy&H*bqdqOPfG4W`E{!mGX;Om%h8Tek#sbSuq7jOSmq4$> zr0DR0-y4)3`*OXz-?CEPrH;}Cw|;Mr2rpoUI1+%m0{K>5YkElB5*oLpYD*gtRxal!=X6ZEwZ;VZtqQu|^on8@BDKvIckr>;PLue3#Y$T`hY)bR zgw0%e>VauKO)7|U!_Vv0bqi|#7bpIR;$QQhxX5T0RJv&Rhams{TAHEI=s)tnm>uW- Qr-0*69{t&e{}=`Ef9@YUGynhq delta 44 tcmbQP+b^@(mE$n)WN$IK$!cN(lk+(^!~(oo*%*L;5eS`t^mbkl4*>Pj2nPTF diff --git a/dist/setup-wiki.skill b/dist/setup-wiki.skill index 7a479b08bf8210a10dfbccb1badb62964a3427b8..603f17e4b80fcf706603dd1be00e91dc991a65b7 100644 GIT binary patch delta 2133 zcmV-b2&(tEA^kCbP)h>@6aWAK2mqX;oLu3E1QF2(0009J000yK0047kbaikocWG;B zFH%K8L`_95ZDg%i-EJGl6~5o6IG`^|vE;I{B{x!n0D_g&fyLO6VhBMHV28Uya-!Xt z?ar(y7QS#&)YnC!%RWRT9Xx1h2z-^kSc!cr2m>^LE3ARwbu zXromsa(X7JQn zVCf~*HO^Ikn!ZYEi#^`p%x)RYK2Y z*f~=<{C8EIy1J5a6g_Dj3g$y#CM&5^c^rMTaIUn+)~`tP*<%lhs5AM3Y49e)3?etY)@-`}tQiO;{` z>Gj=z?{_vfr`~;w9Y3!Bg`H5@+l%4g&!jSw4hUng70U7pHWj{%I)rVo2Wy1RAd$v8SHp(8RlF#S<<6-&sZXHIGq!s zM6Q0vW(v}Bxv7xY=XYW91P~rsAo#%*%K6;EAm^)B8(LPJsm+NEpmz^#>|dhdI!rW&^^=R2lgY{XmvNCLLrN~6pFjKb z?D=K$Xkkez$H`uxv;eJbc@8q{=R7kp1)VaU$F1yuRnh&MKT!ggQdv6NtTE;i@BkIp z$=A;@gF$9sk~WB3 z?aZi>K41utkBUDiSk(rc0}G>=1pzToX%yVz$d{EYrOqs@)T%)Ck#_A0;TVIA?~VB} z@`cwjSQ8xmt;^)41tXvTYzL?L6*{q3LcZ(rjdJvlphdHM-|qDAfB z{hL1mXA4<~<4xU+Y$;PUQ)wVFIC2d~;J)2brF155b~Jfasc<4UbFQjVFt1NnxgaS@4#mjF3E9D}Eg7!FYbBRkg5Ge11}&qpyWO=VScxSE;5!z$y=@lHKRG#_ zbYWmkypJ1}DvH{PX)ZrRUEV558`ze14vSOLj(1)0%c~{;{Zg7TmqV~0 zj7u4QV44~b*xS<7VtH2+7)i}FzEV&q5->yuOzWy*prK8R?TnPbFQ531ij-Mv^DgRw z5b9}rx8Kf`XzQX7V7?M4RNS2%3MB0JxQcj)c$Za>08=3rBt^QQIl3l)%8~o>m6T-y zahm%s3rl>rF9LF(iYmiEl1txs2ZPV$HS;eQ7iYrB7{&EsA*`f*>bI=C=j$h|KSYdk zp|O-N(X-)fZ6!Jb&o%O<#EheSInGp7_%e>^WYg}cTvV(B1%D#F1+PPNgxR>?CrpYhR<%#Yb3;aqhPC_>A3GC zzCF@Zs2pt*4JysSGx@4LPZwm6$EUVF+FX!14h!IUQJGXC+LHPUHD8Q!b&!!`Ta|uNBCZ%NUcL z=KAb!c%#CsG32m2oK|2ukm(i1q=%iB{YFbS74*9fPh;W`;j8JFkbTt2K5S$eqv*yB z5M#O&faMNGd*-TtH}1_1KGy%n$oAK}KZNnF7e@!3!bgq5(6Fe#89NzGd!aQ3=HIlm zFYz~-oSu%JKAlW1F2+e59d_yt#Q0#^sN8a@>7U)*BaR+-LWhk2VxeY;#&SF;H7 z(9as7F%EgQ$mPs&@Q~_ma2W3NJnmoNv@FmkLiy|N)W^+#sWYX~4J$vwd`N1>=)+8% zg|X=;MoZ>R+$nfoMAP6Ao1q(hS_4dF3nD+#I9V_fnhwp-YwMWoLPEf5g_i&6Ad za`Ei5vokKnult*ydjX>7CeJwy%x=GFqkD`ZE@)KEsF|v`j>4EB@h&a#j&_syk+UC< z2h@&!FwReZI~;6BPeBKrE&JdPmjWRTb$PH8e9qX8z?+$6@)`-L&59iU0+TmM$W88(;Ge9+!66pl&C13A1dKrF2&5AQKs*3? CiV9o+ diff --git a/dist/using-projects-meta.skill b/dist/using-projects-meta.skill index e6cbc2dae09ca841d8c3ac4e5e33d18362eb4de8..e86da9f4bd7273b3d964f9189ff41939de9443d1 100644 GIT binary patch delta 8721 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 Fe*k1f>W2UT diff --git a/dist/using-tasks.skill b/dist/using-tasks.skill index 8d052781faf14af6ab1ccc719df66a917725078e..fe030a3a4f0d12fddc87c42a046b5eb13edf6d0c 100644 GIT binary patch delta 2325 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 delta 53 zcmX@Fc1naLz?+$6@?RmT%?~&pa870xmYaM}NMQ0C4i2#ZZ&o%2AYcSSCm{Wa6T|}m DwLJ`; diff --git a/dist/using-wiki.skill b/dist/using-wiki.skill index 6678d19bc6d7f6834f451bdeacf267b9a3f1c72b..78788a52ae2271f4d3112fba2915c45aef72918a 100644 GIT binary patch delta 3203 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 delta 36 rcmbPZ@<4j?FYc+llUaB~CNGwhocvExfRB-Zk-?FHfuWNZNH72Z-!KT~ diff --git a/skills/setup-projects-meta/README.md b/skills/setup-projects-meta/README.md index 7459e70..12c51ea 100644 --- a/skills/setup-projects-meta/README.md +++ b/skills/setup-projects-meta/README.md @@ -27,8 +27,8 @@ only place that touches user-level config or installs the server. | Path | Role | |---|---| -| `~/.local/projects-meta-mcp/` | server repo (cloned from Gitea) | -| `~/.local/projects-meta-mcp/dist/server.js` | built stdio entry point | +| `~/projects/.common/lib/projects-meta-mcp/` | server repo (cloned from Gitea) | +| `~/projects/.common/lib/projects-meta-mcp/dist/server.js` | built stdio entry point | | `~/.config/projects-mcp/auth.toml` | Gitea credentials (token-bearing) | | `~/.cache/projects-mcp/tasks.json` | aggregated tasks cache | | `~/projects/.wiki/` | shared wiki clone (Gitea repo `projects-wiki`, content in root) | @@ -67,7 +67,7 @@ Full procedure with shell snippets and templates lives in [`SKILL.md`](SKILL.md) 1. Stop. Don't fix forward. 2. `cp .bak- ` for `~/.claude.json` and `~/.config/projects-mcp/auth.toml`. -3. Optional: `rm -rf ~/.local/projects-meta-mcp` and `rm -rf ~/.cache/projects-mcp`. +3. Optional: `rm -rf ~/projects/.common/lib/projects-meta-mcp` and `rm -rf ~/.cache/projects-mcp`. Keep `~/projects/.wiki/` — it's a useful clone regardless of MCP state. 4. Restart Claude Code. 5. Confirm `mcp__projects-meta__*` tools are gone (or back to the prior version). diff --git a/skills/setup-projects-meta/SKILL.md b/skills/setup-projects-meta/SKILL.md index f5fcb70..f015782 100644 --- a/skills/setup-projects-meta/SKILL.md +++ b/skills/setup-projects-meta/SKILL.md @@ -1,7 +1,7 @@ --- name: setup-projects-meta version: 1.0.0 -description: Installs and configures the local `projects-meta-mcp` stdio server — clones the repo to `~/.local/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. +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. --- # setup-projects-meta @@ -35,7 +35,7 @@ The procedure clones a repo, writes `~/.config/projects-mcp/auth.toml` (carries - Confirm Claude Code is the current harness (need `mcpServers` registration in `~/.claude.json`). - Confirm `git`, `node`, `npm` are on `PATH`. Node ≥ 18 (the server uses ES modules). - Confirm network reachability to `https://git.kzntsv.site` (the Gitea host). On HTTP 401/403 later, the token is dead — stop and ask for a new one. -- Pick paths: `~/.local/projects-meta-mcp`, `~/.config/projects-mcp/`, `~/.cache/projects-mcp/`, `~/projects/.wiki/` (shared wiki clone). POSIX-style `~/...` resolves correctly under git-bash on Windows. +- Pick paths: `~/projects/.common/lib/projects-meta-mcp`, `~/.config/projects-mcp/`, `~/.cache/projects-mcp/`, `~/projects/.wiki/` (shared wiki clone). POSIX-style `~/...` resolves correctly under git-bash on Windows. ### Phase 1 — Discovery (read-only) @@ -49,9 +49,9 @@ Search, in order. Report only "found at ", never echo token values. The first hit wins. Capture internally for Phase 5; **never echo it in chat**. -**Repo install state.** Check whether `~/.local/projects-meta-mcp/.git` exists. If yes, `git -C ~/.local/projects-meta-mcp rev-parse HEAD` → record the SHA so Phase 4 can decide *clone* vs *pull*. +**Repo install state.** Check whether `~/projects/.common/lib/projects-meta-mcp/.git` exists. If yes, `git -C ~/projects/.common/lib/projects-meta-mcp rev-parse HEAD` → record the SHA so Phase 4 can decide *clone* vs *pull*. -**Build artifact.** Check `~/.local/projects-meta-mcp/dist/server.js`. If absent, Phase 4 will run `npm install && npm run build`. +**Build artifact.** Check `~/projects/.common/lib/projects-meta-mcp/dist/server.js`. If absent, Phase 4 will run `npm install && npm run build`. **Shared wiki clone.** Check if `~/projects/.wiki/.git` exists and `origin` matches `https://git.kzntsv.site/OpeItcLoc03/projects-wiki(.git)?`. If non-matching `origin`, stop and ask — the user may have an unrelated wiki there. @@ -65,7 +65,7 @@ Present a single-block plan to the user: ``` Token: | NOT FOUND — will ask> -Repo: | will clone> +Repo: | will clone> Build artifact: Wiki clone: MCP entry: @@ -92,12 +92,12 @@ Confirm both backups exist (when their source existed) before any further edit. ```bash # Server -if [ -d ~/.local/projects-meta-mcp/.git ]; then - git -C ~/.local/projects-meta-mcp pull --ff-only +if [ -d ~/projects/.common/lib/projects-meta-mcp/.git ]; then + git -C ~/projects/.common/lib/projects-meta-mcp pull --ff-only else - git clone https://git.kzntsv.site/OpeItcLoc03/projects-meta-mcp ~/.local/projects-meta-mcp + git clone https://git.kzntsv.site/OpeItcLoc03/projects-meta-mcp ~/projects/.common/lib/projects-meta-mcp fi -cd ~/.local/projects-meta-mcp +cd ~/projects/.common/lib/projects-meta-mcp npm install npm run build @@ -110,7 +110,7 @@ else fi ``` -Verify `~/.local/projects-meta-mcp/dist/server.js` exists after build. If not — abort, the build failed; ask the user to run `npm run build` manually and paste the output. +Verify `~/projects/.common/lib/projects-meta-mcp/dist/server.js` exists after build. If not — abort, the build failed; ask the user to run `npm run build` manually and paste the output. ### Phase 5 — Write `auth.toml` @@ -173,7 +173,7 @@ Best-effort: call `mcp__projects-meta__meta_status`. If it returns a JSON blob w Then run a one-shot sync to populate the cache: ```bash -cd ~/.local/projects-meta-mcp +cd ~/projects/.common/lib/projects-meta-mcp node dist/sync.js ``` @@ -190,7 +190,7 @@ Tell the user: registration binds to a fresh stdio session. After restart: - • mcp__projects-meta__* tools serve from ~/.local/projects-meta-mcp/dist/server.js + • mcp__projects-meta__* tools serve from ~/projects/.common/lib/projects-meta-mcp/dist/server.js • Cache lives at ~/.cache/projects-mcp/tasks.json (refresh: node dist/sync.js) • Shared wiki clone at ~/projects/.wiki/ — `git -C ~/projects/.wiki pull --ff-only` for fresh anchors • Backups saved at ~/.claude.json.bak- (and auth.toml.bak- if it existed before) @@ -206,7 +206,7 @@ If a problem surfaces (now or after restart): 1. Stop. Don't try to fix forward. 2. Find the most recent `.bak-YYYYMMDD-HHMMSS` next to `~/.claude.json` (and `~/.config/projects-mcp/auth.toml` if applicable). 3. `cp .bak- ` for each. -4. Optional: `rm -rf ~/.local/projects-meta-mcp` and `rm -rf ~/.cache/projects-mcp`. Keep `~/projects/.wiki/` — it's a useful clone regardless of MCP state. +4. Optional: `rm -rf ~/projects/.common/lib/projects-meta-mcp` and `rm -rf ~/.cache/projects-mcp`. Keep `~/projects/.wiki/` — it's a useful clone regardless of MCP state. 5. Restart Claude Code. 6. Confirm `mcp__projects-meta__*` is gone (or back to the pre-existing version). 7. Report what went wrong so we can fix the procedure. diff --git a/skills/using-projects-meta/README.md b/skills/using-projects-meta/README.md index 612fcdc..1339284 100644 --- a/skills/using-projects-meta/README.md +++ b/skills/using-projects-meta/README.md @@ -59,7 +59,7 @@ Before **any** `tasks_*` or `knowledge_*` call: 1. `mcp__projects-meta__meta_status` — probe cache age + errors. 2. If `cache_age_minutes` > 10 OR `errors_count` > 0 → - `node ~/.local/projects-meta-mcp/dist/sync.js`. + `node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js`. 3. For shared-wiki **writes** (`knowledge_ingest`, `knowledge_promote`) → **also** `git -C ~/projects/projects-wiki pull --ff-only`. Unconditional. The MCP server uses sha-based optimistic locking on the wiki repo; @@ -134,7 +134,7 @@ from `auth.toml`). two different stores. `using-wiki` operates on the local one; `using-projects-meta` queries / ingests the shared one. - **Acting on stale `tasks_aggregate`.** If `meta_status.age_seconds` > 3600, - either run `node dist/sync.js` (in `~/.local/projects-meta-mcp`) or warn the + either run `node dist/sync.js` (in `~/projects/.common/lib/projects-meta-mcp`) or warn the user about staleness. - **Vague `knowledge_search` queries.** "auth" returns noise. Multi-word, specific queries return targeted snippets. diff --git a/skills/using-projects-meta/SKILL.md b/skills/using-projects-meta/SKILL.md index bbadf40..1b24a97 100644 --- a/skills/using-projects-meta/SKILL.md +++ b/skills/using-projects-meta/SKILL.md @@ -65,8 +65,8 @@ Use MCP only for **other** projects, **other** machines, or **shared** wiki cont 2. Branch on cache freshness: • If cache_age_minutes > 10 OR errors_count > 0: - run `node ~/.local/projects-meta-mcp/dist/sync.js` - (or `npm run sync` from ~/.local/projects-meta-mcp). + run `node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js` + (or `npm run sync` from ~/projects/.common/lib/projects-meta-mcp). • Else: cache is fresh enough — skip sync, no need to hit the network. 3. For shared-wiki WRITES (knowledge_ingest, knowledge_promote): @@ -221,7 +221,7 @@ User: "close `[projects-meta-skills]` in claude-skills" | Reading current project's tasks via `tasks_get` instead of disk | Read `.tasks/STATUS.md` directly. MCP is for *other* projects. | | Inlining `confirm: true` on the first mutation call | Always preview first; show user; only then `confirm: true`. | | Using `knowledge_search` for the project's own wiki | The shared wiki is a separate Gitea repo. Local `.wiki/` is in cwd. | -| Acting on a stale `tasks_aggregate` without checking `meta_status` | Step 0 — Freshness gate is mandatory. If `cache_age_minutes` > 10 (or errors > 0), run `node ~/.local/projects-meta-mcp/dist/sync.js` first. | +| Acting on a stale `tasks_aggregate` without checking `meta_status` | Step 0 — Freshness gate is mandatory. If `cache_age_minutes` > 10 (or errors > 0), run `node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js` first. | | Skipping `git -C ~/projects/projects-wiki pull` before `knowledge_ingest` / `knowledge_promote` | sha-based optimistic lock will reject the commit (422) and the failure is opaque. Pull is unconditional for shared-wiki writes — fast-forward is a no-op when current. | | Treating sync 401/403 as "MCP is fine, the page just doesn't exist yet" | 401/403 means the Gitea token is dead. Stop, tell the user to rotate `gitea_token` in `~/.config/projects-mcp/auth.toml`. Never guess on stale data. | | 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`. |