`(& git log -1 --format='%b')` in PowerShell collapses multi-line subprocess
output into string[]. The threshold check used `$body.Length` which on a
string[] returns the line count, not char count — so the body>200 condition
was effectively comparing "more than 200 lines", which is much harder to
meet. Files-count saves it in practice for big commits, but small-file
big-message commits were under-detected.
Fix: join the array back into a single string with `-join "`n"` before
measuring length. Verified via stdin-pipe smoke against current HEAD:
body chars now report 1255 (vs 29 before — the line count).
POSIX `.sh` variant unaffected — `$()` collapses output and `${#var}` is
char count.
Bump 0.3.0 → 0.3.1 PATCH (bugfix, no behavior contract change).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hooks live in skills/session-handoff/hooks/:
- commit-detector.ps1 Windows/PowerShell
- commit-detector.sh POSIX (python3 for JSON parsing)
- README.md opt-in instructions, cross-platform settings.json
snippets, smoke procedure
Hook reads PostToolUse stdin, detects substantive `git commit` (prefix
not in meta/docs/style/chore + fix typo, AND body >200 chars OR files >3).
On hit, emits hookSpecificOutput.additionalContext so Claude Code
surfaces a system reminder next iteration. Silent skip on --amend, failed
commits, non-git cwd, trivial prefix, below thresholds.
install.sh deliberately does NOT mutate settings.json — opt-in via the
README hook config snippet, applied once per machine. SKILL.md body
mentions the hook as an optional alternative to the agent-side
behavioral heuristic.
Bump 0.2.1 -> 0.3.0 MINOR (new opt-in capability, backward-compatible —
SKILL keeps working without the hook).
Deferred (separate follow-ups if needed):
- live-hook e2e smoke (would interfere with current session commits)
- rebase/cherry-pick batch deduplication
Closes [session-handoff-posttooluse-hook] (partial: stdin smoke,
live-hook deferred).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CLAUDE.md.template gains `session handoff: read on start, write on end`
between `pull remote before work` and `follow project discipline`
(session-lifecycle clustering). Step 5.6 trigger->fulfiller table gains
the corresponding row (template ↔ table source-of-truth invariant).
Greenfield-bootstrap'ed projects now ship handoff trigger из коробки.
Existing projects unaffected — CLAUDE.md merge in Step 5 is idempotent
and respects user removals.
Bump 1.11.0 -> 1.12.0 MINOR (new canonical trigger = new capability,
backward-compatible). dist/project-bootstrap.skill rebuilt.
Closes [session-handoff-bootstrap-template-extend].
Unblocks [session-handoff-existing-projects-upgrade] Path B.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
MINOR bump — skeleton (v0.1.0) gets functional 6-section body. Source: .workshop/.archive/2026-05-24-session-handoff-skill.md (Round 1 design + Round 2 resolved Q1-Q10).
Body sections: When to use (read/write triggers + skip patterns), Inputs (read/write), Steps (read 5 + write 5), Failure modes (incl. secret-detection abort), Side effects (sliding overwrite + git-tracked, no global state), What NOT to do (no auto-execute, no append-with-archive, no cross-project, no SessionEnd-hook dependency).
Still skeleton from claude-skills/ POV: no install.sh run, no push, no hermes/mapping.yaml entry — those remain in baseline tasks (session-handoff-install / -hermes-mapping / -test-trigger / -bootstrap-template-extend / -review umbrella).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Promoted from .workshop/.brainstorm/session-handoff-skill.md (Round 1 design + Round 2 resolved 2026-05-24, Q1-Q10).
Skeleton only — header + empty 6-section body. Body filled in second pass from .workshop/.archive/2026-05-24-session-handoff-skill.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add 3 routing-table rows for the new deterministic `grep_audit` intern
per .wiki/concepts/interns-grep-audit-design.md §Layer 3:
- grep_audit row — deterministic, no LLM call, zero cost
- bulk_text_read vs grep_audit boundary — Q&A vs contains-check
- always-ask uniform reminder — server opens file even sans LLM
Consistency adds: new Overview catalog row, Tool quick reference row,
prose note marking grep_audit as the catalog's first LLM-free intern.
Version 0.2.2 -> 0.3.0 (MINOR — new routing capability).
Closes [interns-grep-audit-skill-updates] on the .tasks board.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Скил активируется при распознавании task-shape (3+ файлов /
>400 строк / transcript distill), не только на явной фразе.
Без этого описанный workflow «Identify candidate → ask» не
запускался у агента до явной просьбы пользователя.
Extends Karpathy LLM Wiki canon with two new artifact types alongside
existing entities/concepts/packages/sources. Inspired by community
discussion that highlighted explicit tracking of surfaced tensions and
unanswered questions as missing aggregation points in the canonical
layout — they currently get scattered into concepts/ or lost in log.md.
Scope is schema-level only — no new ingest behaviour prescribed. Policy
on when to escalate an inline `> **Противоречие:**` flag into a
contradictions/<slug>.md page (and the analogous flow for
open-questions) stays the user's call.
setup-wiki [v1.0.0 → v1.1.0, MINOR — additive page types]:
- Discovery (Phase 1) now requires 6 content dirs for `noop` mode
- Phase 2 plan blocks list new dirs in greenfield + migrate
- CLAUDE.md schema template gains two page-type entries with status
enums (contradictions: open|resolved|accepted-divergence;
open-questions: open|answered|obsolete)
- index.md template gains two empty sections
- Phase 4a .gitkeep list, Phase 4b mkdir + touch, Phase 5 verify count
(four → six dirs), Phase 6 report count all updated
- README.md layout tree + content-dirs sentence
using-wiki [v1.0.0 → v1.1.0, MINOR — additive type values]:
- Prerequisites: four → six content directories
- Page frontmatter type enum: + contradiction | open-question
- Per-type frontmatter extensions documented (status + affects/touches)
- File naming patterns: + contradictions/<slug>.md, open-questions/<slug>.md
- index.md sections-by-type list updated
- README.md mirrors SKILL.md changes
dist/: setup-wiki.skill + using-wiki.skill rebuilt.
project-bootstrap inline reference block intentionally untouched — it's
labelled "Reference (for context only — setup-wiki is the source of
truth)" and drift-tolerant by design.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Skeleton only — header + empty 6-section body. Mirror of using-synology-ops
for the Rusonyx VDS docker stack. Body fill-in is a follow-up pass.
Baseline tasks created in OpeItcLoc03/claude-skills:
- using-vds-ops-install
- using-vds-ops-hermes-mapping (mode=pending, MCP tools touched)
- using-vds-ops-test-trigger
- using-vds-ops-review (umbrella, blocked-by impl)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bug surfaced in field: agent in another session probed only legacy venv
location, found empty (post-pipx-migration), then took install-hint
verbatim and started recreating the venv we just deleted — destructive
cleanup paradox.
Three fixes:
- Add `~/.local/bin/yt-frames.exe` as known location #2 in probe chain
(between PATH and legacy venv). pipx is now recommended install per
yt-tools README; shim lives there.
- Rewrite install-hint to pipx-first (pip install --user pipx; pipx
ensurepath; pipx install --editable ~/projects/.common/lib/yt-tools).
- Add explicit 'NOT to do' rule: do NOT recreate deleted venv if
pipx-shim exists. Empty .venv/ + present pipx-shim means PATH issue
(run pipx ensurepath + restart shell), not missing package.
Failure-modes table updated to reflect three-step probe chain and the
recreate-venv anti-pattern.
Skill no longer aborts on bare `Get-Command yt-frames` miss — binaries
installed in project-local venv or winget cache (Gyan.FFmpeg_*) are
valid install sites, just not on PATH for fresh shells.
New Step 0 in both flows: probe PATH first, then known install
locations (venv Scripts/bin, winget Gyan.FFmpeg_*/ffmpeg-*-full_build/bin);
abort only if both empty. PATH-prepend pattern documented (full-path
to yt-frames.exe is insufficient — child yt-dlp/ffmpeg need prepend
too).
Failure modes table updated: removed 'restart CC session' advice —
agent can't restart itself, and resolve-fallback makes it unnecessary.
MINOR bump per project-discipline (behaviour change in resolve logic).
Prerequisites: explicit table with two options (activate venv vs full-path).
Steps: added step 0 (venv activation) to both Flow A and Flow B.
Acceptance: agent can now invoke CLI without "command not found" error.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes finding [using-yt-tools-frames-multiline-stdout]: the previous
"Last line каждого CLI's stdout — absolute path артефакта" wording matched
yt-transcript / yt-watch reality but quietly misled callers about yt-frames,
which emits one ``Wrote: <abs path>`` line per extracted frame (designed
that way per ``yt_tools/frames.py`` docstring so streaming consumers don't
have to parse a trailing summary; ``tests/test_cli_smoke.py:81`` enforces
the prefix).
Chose spec-fix over code-fix: changing yt-frames to bare paths would break
the existing piping/scraping contract — bigger surface than the docs typo
this finding actually is. SKILL.md now spells out per-CLI stdout shape and
notes warnings/errors go to stderr.
PATCH (wording clarification, no behavior change).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fill the v0.1.0 stub body. Description rewritten to document two distinct flows
(was iterative-only, even though triggers already listed targeted-frames phrases):
- Flow A — iterative-watch (transcript → pick anchors → frames): for "what's
in this video / summary / о чём ролик / video summary / youtube transcript"
- Flow B — targeted-frames (frames only, no transcript): for "посмотри 1:23 /
покажи кадр на N / что показано на N" — user already named timestamps,
transcript fetch would be pure waste
Body sections filled (6): When/Prereq/Inputs/Steps/Failure/Side/NOT — Flow A
and Flow B distinguished throughout. Failure modes table covers missing CLI,
missing yt-dlp/ffmpeg (with Windows winget+PATH note), network/private/age-
gated, subs-disabled. What NOT to do explicitly forbids the "always-iterative"
trap that the v0.1.0 description implicitly invited.
Bump version 0.1.0 → 0.2.0 (MINOR — documents new capability set). Description
744 chars (under 900-char soft budget; well below ~1024 hard limit). Installed
to ~/.claude/skills/using-yt-tools/ via scripts/install.ps1 — harness skill-
listing renders full description, not truncated to H1.
STATUS.md: closes new [using-yt-tools-skill-body-fill] 🟢 (filed+closed
in-place since this is one body-fill task, not a multi-session workstream).
[using-yt-tools-review] stays 🔵 — body-fill blocker removed, but still
blocked on [using-yt-tools-trigger-smoke-clean-session] (needs fresh CC
session). Caveat recorded: body-fill was done by implementer instead of the
'fresh agent' the review-task originally specified — explicit user approval.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Filled all sections from source docs:
- ~/projects/.workshop/.archive/2026-05-12-using-synology-ops-skill.md
- ~/projects/.wiki/concepts/synology-ops-mcp-design.md
Sections: When to use (triggers), Inputs, Steps (4 flows),
Failure modes, Side effects, What NOT to do (mistakes + red flags).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Behavioral fire-test of trigger phrases (10 parallel general-purpose subagents,
each phrase as isolated user message, META: skills_invoked= parsed) revealed
one false-positive: «restart-loop in books-pipeline» fired the skill despite
books-pipeline not being a NAS-hosted container — static-pass prediction
confirmed (implicit NAS-context discriminator, LLM keyed on `restart-loop`
without host check).
Tuning: extended skip-rule with non-NAS hosts examples
(`books-pipeline`, `vps-*` etc. — only the 6 listed above are NAS-hosted).
Description 941 chars / 1024 limit. PATCH bump (fix only, no new triggers).
Retest of NEG#3 → PASS (subagent quoted new skip-rule). Final 10/10.
Closes [using-synology-ops-test-trigger]; unblocks [using-synology-ops-review]
(ready, baseline tasks all 🟢, but body still <пусто> stub — separate debt).
dist-hermes/mcp/using-synology-ops/SKILL.md regenerated via build-hermes.py.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Step 1 now ships agent meta-paths inversions (`!.claude/`, `!.tasks/`,
`!.wiki/`, `!.brainstorm/`, `!.archive/`, `!.mcp/`, `!.mcp.json`,
`!MEMORY.md`) so own greenfield/upgrade projects re-enable visibility
against the global `core.excludesFile` cutter (`~/.config/git/ignore`)
that hides obvyaska from forks of upstream open-source. Without it any
fresh bootstrap landed an empty first commit on machines with the global
configured: setup-wiki/setup-tasks/Step 5 created .wiki/.tasks/CLAUDE.md
but git ignored them.
Two cases handled in Step 1:
- no .gitignore → write template (block included unconditionally)
- existing .gitignore → marker-based (`# AI обвеска — слой 2:`)
append-if-missing; idempotent on re-run
Smoke-tested in %TEMP%\test-bootstrap-meta-iso: all 3 acceptance
criteria pass + negative control (strip block → global hides) +
idempotency (re-run with marker present skips). Source concept:
workshop wiki concepts/meta-out-of-repo.md. Closes board task
[meta-isolation-bootstrap-skill-update].
MINOR bump (1.10.1 → 1.11.0) — new feature, backward-compat.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The interns-mcp source lives inside the `OpeItcLoc03/common` monorepo
(at ~/projects/.common/), not as a separate `interns-mcp` repo on Gitea.
The previous commit incorrectly wrote `git clone .../interns-mcp`.
Now the clone-fallback correctly:
- If ~/projects/.common/.git exists but lib/interns-mcp/ is missing:
git -C ~/projects/.common pull --ff-only (stale clone, needs fresh subdirs)
- If ~/projects/.common/ is absent:
git clone .../common.git ~/projects/.common (fresh clone of monorepo)
- Added "wrong repo" to Common mistakes section
- Added monorepo scope note to Out of scope section
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Replace all `<project-root>/.common/...` with `~/projects/.common/...`
(POSIX-absolute paths, mirroring setup-projects-meta after the
using-projects-meta-fix-paths fix). The cwd-relative form broke
when Claude was launched from System32 or another non-project dir.
- Add git clone fallback: when `interns-mcp` source is absent, clone
from `https://git.kzntsv.site/OpeItcLoc03/interns-mcp` instead of
stopping with "initialize first". Mirrors setup-projects-meta Phase 4.
- Remove "source must be in place" from Out of scope (now handled).
- Fix MCP registration cwd to `~/projects` (base dir containing .common/).
- Bump version 0.2.0 → 0.3.0 (MINOR — new capability: clone fallback).
Closes [setup-interns-fix-paths] + [setup-interns-clone-fallback].
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bug: v1.10.0 bump + Step 5.6 map added these 2 canonical triggers, but the
CLAUDE.md template literal (lines 339-342) and corresponding prose paragraphs
were not updated. Symptoms: upgrade-mode on repos missing these 2 triggers
detected "already canon" and skipped insertion, leaving gaps.
Fix:
- Template: added `follow tdd-criteria` after `follow project discipline`,
added `recommend, don't menu` after `delegate to interns when allowed`
- Prose: added 2 new paragraphs describing each trigger with install hints
- Version: 1.10.0 → 1.10.1 (PATCH — completing what 1.10.0 claimed)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Part A — Pre-close coverage gate. ### Task completion now lists acceptance
criteria from the per-task file before setting 🟢; missing evidence → ask
the user. New section ### Post-commit task closure prompt: after a feat:/fix:
commit the agent asks "эта работа закрывает таску <slug>?" so shipped code
doesn't sit under stale ⚪ blocks (cf. extend-project-discipline-brainstorm-
workspaces / project-creation-lifecycle-skill, both shipped before close).
Part B — Local-first recommendations at session-start / "what next" triggers.
cwd-project board (🔴 → 🟡 → ⚪) leads; cross-project urgents are at most one
footnote line. Explicit "по всем проектам" flips the order. Pairs with
using-projects-meta's local-first read rule.
Bump 1.0.0 → 1.1.0 (MINOR — adds two new operation types; task block
suggested PATCH but Rule 3 grades these as capability additions). Closes
[using-tasks-close-coverage-gate] (next commit).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Artifacts go to .brainstorm/ or global wiki only via explicit user
direction, never auto-promote by analogy. Fixes gap where brainstorm
outputs in meeting-room/. were incorrectly promoted to .wiki/concepts/
without user command.
Version 0.1.0 → 0.1.1 (MINOR — adds rule).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three modes now: greenfield-full (new + remote), add-remote, upgrade.
Step 0: detect git/remote/empty state for mode selection.
Step 1.5: Gitea API repo create + push.
Step 8: projects-meta sync for visibility.
Version 1.7.0 → 1.8.0 (MINOR).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
skills/compress/ was a byte-identical dupe of skills/caveman-compress/
(SHA256 match across all 7 scripts/ files; SKILL.md diff was name: +
Process step 2 only; descriptions textually identical = arbitrary
harness tie-break + double-counted listing budget).
Kept caveman-compress canonical: it carries README.md (benchmarks +
caveman-toolkit branding) and SECURITY.md (Snyk false-positive writeup),
and matches the caveman-* prefix invariant.
Ported the better Process-step wording from compress
(`cd <directory_containing_this_SKILL.md>`) into caveman-compress;
the prior `cd caveman-compress` form assumed cwd was the parent dir
and broke when invoked from ~/.claude/skills/caveman-compress/.
Added version: 1.0.0 to caveman-compress frontmatter
(first versioned release; aligns with skill-versioning concept).
Removed: skills/compress/, dist/compress.skill,
~/.claude/skills/compress/ (manual prune; install.sh has no prune step
yet -- future [install-ps1] task should add --prune).
Slash-command impact: /compress gone; /caveman-compress and
/caveman:compress (toolkit-canonical) remain.
Wiki: .wiki/concepts/compress-dedup.md (rationale + rejected
alternatives), index.md + log.md updated.
Tasks: [compress-dedup] flipped active -> done in same commit
(per-task file .tasks/compress-dedup.md created with full decisions
log).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Collapse Step 5.6 from a single-skill detector (only the
superpowers@claude-plugins-official plugin) into a generic
`trigger -> fulfiller` table walker that scales to every canonical
CLAUDE.md trigger.
Inline 9-row map in SKILL.md covers: caveman, superpowers (kind: plugin),
using-wiki, using-tasks, using-projects-meta, pulling-before-work,
project-discipline, using-interns, active-platform. The `kind` flag
(skill | plugin) drives which install command is emitted in the chat-only
recommendation block. Detection paths: ~/.claude/skills/<name>/SKILL.md
for skills, plugins.<id> in ~/.claude/plugins/installed_plugins.json
for plugins.
Algorithm: read project's CLAUDE.md -> match each non-comment line vs
map (substring + tolower, mirrors Step 5 idempotent merge) -> for each
canonical match check disk -> print one chat block listing every missing
fulfiller with copy-pasteable install commands, OR a single
"all dependencies satisfied" line. User-custom lines and removed
canonical lines are silently skipped. Hard rule "never auto-install"
preserved verbatim.
version: 1.6.0 -> 1.7.0 (MINOR per project-discipline Rule 3 -- adds
capability, absorbs prior superpowers-only detector cleanly).
Closes [bootstrap-skill-deps-check] (.tasks/STATUS.md done).
Closes [bootstrap-recommend-projects-meta] by absorption -- the deferred
mirror task was the seed of this generalization; the generic walker now
handles using-projects-meta along with everything else, no per-skill
mirror needed.
Design rationale at .wiki/concepts/bootstrap-skill-deps-check.md:
- why generic over per-skill mirrors (5x mirror explosion)
- skill vs plugin kind distinction
- MCP-server-backed skills (only check using-X policy skill;
setup-X self-fires via Prerequisites pointer)
- source-of-truth invariant: SKILL map + assets/CLAUDE.md.template
must stay in sync (a future CI lint could enforce)
SKILL.md Phase 5 platform-path table (lines 152-154) had stale
~/.local/projects-meta-mcp; replace with ~/projects/.common/lib/
projects-meta-mcp to match real install canon (body Phase 4 clone
target + ~/.claude.json mcpServers.projects-meta.args[0]).
version: 1.0.0 -> 1.0.1 (PATCH, doc consistency).
Closes [using-projects-meta-fix-paths] (.tasks/STATUS.md done).
Sibling task [migrate-to-common-lib] in projects-meta-mcp closed
the same day with matching path migration.
- 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) <noreply@anthropic.com>
setup-interns (v0.1.0) — 8-phase install of the local `interns` MCP server:
detect `.common/lib/interns-mcp/` source, `pip install -e`, write
`.common/secrets/interns.env` with endpoint API keys (gitignored), register
`mcpServers.interns` in `~/.claude.json` with absolute Python interpreter
path + `cwd` so the runtime resolves config relative to project root.
Mirrors setup-projects-meta / setup-context7 confirmation-gate shape.
Description 899 chars (under the 900 budget per
feedback_skill_description_length_limit).
using-interns (v0.1.0) — runtime policy for `mcp__interns__*`. Per-session
permission grant mirrors project-discipline Rule 4: ask-mode default,
conversational grant ("разреши интернов" / "allow interns"), conversational
revoke, always-ask paths for `**/.env`, `**/secrets/**`, `**/*.key`,
`**/.ssh/**`, `**/.aws/credentials` etc with transitive rule (Claude can't
bypass by reading the file with the local Read tool and forwarding content),
cost-cap >$0.10 always asks, session-end automatic reset. Routing hints for
`bulk_text_read` (3+ files or one file >400 lines) and `transcript_distill`
(before .wiki/log.md updates / session summaries). Description 814 chars.
project-bootstrap (1.5.0 -> 1.6.0, MINOR — capability added):
* assets/CLAUDE.md.template: insert `delegate to interns when allowed`
between `follow project discipline` and `we're on Windows`.
* SKILL.md Step 5: same insertion in inline template + new commentary
paragraph explaining the trigger, no-op semantics, install pointer.
* SKILL.md Step 5.5: bootstrap-manifest table extended with
`setup-interns`, `using-interns`, `project-discipline` rows.
* README.md: Workflow Step 5.5 description + See also section both pick up
the new skills.
Root CLAUDE.md dogfood: `delegate to interns when allowed` line added.
.wiki/log.md decision entry. .tasks/STATUS.md task moved to 🟢 done.
.tasks/interns-skills-mvp.md per-task file with goal / key-files /
decisions log / open questions.
Build + install verified: `dist/{setup-interns,using-interns,
project-bootstrap}.skill` rebuilt; `bash scripts/install.sh ...` succeeded;
harness skill listing shows full descriptions for all three (no H1
fallback) — confirms the description budget held.
Versioning per project-discipline Rule 3:
* setup-interns: 0.1.0 (first edit of unversioned artifact, MAJOR=0).
* using-interns: 0.1.0 (first edit of unversioned artifact, MAJOR=0).
* project-bootstrap: 1.5.0 -> 1.6.0 (MINOR — adds capability without
breaking existing CLAUDE.md merge or manifest consumers).
Server runtime itself (`.common/lib/interns-mcp/`) is out of scope for this
task — the skills land lifecycle, policy, and bootstrap integration so any
machine where the MCP server is later installed already has Claude's
policy in place.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Changed from ~/projects/projects-wiki/.wiki to ~/projects/.wiki/
- Removed legacy migration logic (no longer needed)
- Updated all script references and documentation
- Simplified Phase 4 detection (single canon path)
This aligns with projects-wiki repo changes where nested .wiki/
was removed and content now lives in root.