Commit Graph

156 Commits

Author SHA1 Message Date
bastien
e2425ca79d feat(client-handover): 6-chapter doc — promote scores + NAP chapters
Restructure deliverable from 4 to 6 chapters:
- §2 (new): score table promoted from technical annex to top of doc for
  immediate visual proof of impact (tested with local-business clients —
  converts "what did I pay for?" doubt within 30 seconds).
- §4 (new): NAP table promoted from §7 annex so client reads identity
  values (name, address, phone, hours, categories, short description)
  BEFORE attacking §5 todo list. Prevents 10-different-description drift
  across external platforms that degrades Google's NAP-consistency signal.
- §5 (todo) and §6 (tech details) renumbered; §7/§8 annexes still optional.

Pandoc bumped to gfm+gfm_auto_identifiers so internal anchor links like
[§4](nap) resolve in the rendered HTML/PDF.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:09:01 +02:00
bastien
864612ff7b fix(client-handover): kill PDF text superposition (URL dupe + list page-break)
Two distinct render bugs producing overlapping text on multi-page PDFs:

1. Bare-URL duplication. The print stylesheet injects `(href)` after every
   external link via `a[href^="http"]::after`. When pandoc/marked
   auto-links a bare URL or renders `[X](X)`, the visible text already
   equals the href, so the pseudo-element produces "URL (URL)" and the
   trailing duplicate wraps onto the next line, colliding with the
   following block (e.g. "https://pagespeed.web.dev/ (https://...)" then
   "• Ouvrir, taper l'URL...").
   Fix: post-process the body HTML in handover-to-pdf.sh; tag every
   `<a href="X">X</a>` (text == href, ignoring trailing slash + case)
   with `class="bare-url"`, and exclude `a.bare-url::after` from the
   URL-injection rule. Named links still get `(URL)` for print legibility.
   Belt-and-braces: add `white-space: nowrap` and `break-inside: avoid`
   on the remaining `::after` so future long URLs cannot wrap across
   page boundaries either.

2. List item splitting across page boundary. `li` had only
   `orphans/widows: 3` and no `break-inside`, so a long item could put
   its bullet on page N and its text on page N+1, overlapping unrelated
   content. Heading-to-first-block adjacency was also unprotected, so
   "heading at bottom of page A / intro paragraph or first bullet at top
   of page B" could produce visual overlap during reflow.
   Fix: add `li { page-break-inside: avoid; break-inside: avoid; }` and
   `h{1..4} + p|ul|ol { break-before: avoid; }` so list items stay
   intact and intros stay glued to their heading.

Verified end-to-end: rendered sample md with bare URL + named link +
heading-followed-by-list straddling a page break; pdftotext shows each
URL once, no orphaned bullets, no `::after` warning from weasyprint.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 20:23:14 +02:00
bastien
17ef213548 docs(memory): BDR-012 + LRN-013 + 2026-05-07 journal append
- BDR-012 — `/client-handover` cover: white bg + green-forest accents +
  PNG logo default. Captures iteration (cream → green-dark rejected →
  white-pure final). Why: light theme matches zenquality.fr without
  overpowering long client-facing text. Solid green-dark reserved for
  marketing covers, not deliverables.
- LRN-013 — marked CLI 16.x ignores stdin and dumps own cli.js source.
  Pattern: do not assume marked CLI accepts stdin like awk/jq/sed.
  Always pass `-i FILE`. Smoke-test MD→HTML output for known content.
- Journal — appends bugfix subsection under 2026-05-07 with the three
  bugs, root causes, fixes, verified output (164 KB / 19 pages).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 19:57:20 +02:00
bastien
b447a892b1 fix(client-handover): PDF render bugs — marked CLI, white cover, PNG logo
Three bugs surfaced on the LIVRAISON.pdf test render:

1. **MD→HTML conversion** — host had no pandoc, no python-markdown, fell
   back to `npx marked < "$src"`. marked CLI 16.x ignores stdin and
   dumps its own cli.js source. Resulting PDF body = marked's binary
   source (`#!/usr/bin/env node`, `Marked CLI`, copyright). Fix:
   `npx --yes marked --gfm -i "$src"` (file path via -i, not stdin).

2. **Cover background** — original cream `#F5F0EB` + 8mm green stripe
   was washed out. Iterated to white-pure bg with subtle radial
   sage/forest tints, black-deep title, green-forest accents
   (eyebrow, meta labels, footer, border). Solid green-dark tried
   first then rejected (too heavy for long client-facing doc).

3. **Default logo** — SVG `logo-horizontal.svg` rendered cream-toned,
   blended into bg. Switched LOGO_URL default to
   `https://zenquality.fr/assets/logo-horizontal-1024.png`.

Also added test-artifact gitignore rules for LIVRAISON.* / HANDOVER.*
project-local renders.

Verified: regenerated LIVRAISON.pdf → 164 KB, 19 pages, full content
rendered, white cover with black title + green-forest accents +
visible PNG logo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 19:57:08 +02:00
bastien
591a035ec6 docs(memory): BDR-011 + LRN-012 + 2026-05-07 journal append 2026-05-07 19:11:44 +02:00
bastien
a963faa764 feat(client-handover): 4-chapter doc structure + branded HTML/PDF rendering 2026-05-07 19:08:59 +02:00
bastien
5d8103f595 docs(memory): BDR-010 + LRN-011 + 2026-05-07 journal entry 2026-05-07 18:39:16 +02:00
bastien
c99308f0a7 feat(client-handover): split SEO + GEO scores, gate GEO at ≥17/20 2026-05-07 18:34:59 +02:00
bastien
64cef26e50 docs(darwin-skill): audit report + LRN-008/009/010 + journal entry 2026-05-06 18:39:12 +02:00
bastien
69348d0463 Revert "optimize(doc): add resources/templates/README.md.tpl + DEPLOY.md.tpl + reference (d6 target)"
This reverts commit b26a94d779.
2026-05-06 18:32:54 +02:00
bastien
ae49ca99a8 optimize(onboard): tighten frontmatter description — verb-forward, EN consistency (d1 target) 2026-05-06 18:32:45 +02:00
bastien
b26a94d779 optimize(doc): add resources/templates/README.md.tpl + DEPLOY.md.tpl + reference (d6 target) 2026-05-06 18:32:16 +02:00
bastien
8df5f2c6ca Revert "optimize(code-clean): empty-approval branch — record audit + skip Phase 2 cleanly (d3 target)"
This reverts commit f514308305.
2026-05-06 18:31:40 +02:00
bastien
f514308305 optimize(code-clean): empty-approval branch — record audit + skip Phase 2 cleanly (d3 target) 2026-05-06 18:31:03 +02:00
bastien
f36be7e4ba optimize(seo): add resources/depth-matrix.md (depth/weights/dedup/envelope) + reference from SKILL.md (d6 target) 2026-05-06 18:30:25 +02:00
bastien
7fd5ac860c optimize(client-handover): add EDGE CASES table for zero commits, malformed audit, missing URL, .memory absent (d3 target) 2026-05-06 18:29:19 +02:00
bastien
ad92360bce optimize(plugin-check): rollback on partial toggle failure + pre-recommendation validation checkpoint (d4 target) 2026-05-06 18:28:31 +02:00
bastien
44fab4c9e3 optimize(validate): add RETRY POLICY with exp backoff + cache reuse + WAVE quota path (d4 target) 2026-05-06 18:27:43 +02:00
bastien
e2faf322f2 optimize(ship-feature): add FAILURE PATHS table for orchestrator-level error handling (d6 target) 2026-05-06 18:26:51 +02:00
bastien
9ad12d9680 optimize(init-project): add PROGRESS PROTOCOL header per step + plain-language recap before status table (d8 target) 2026-05-06 18:26:01 +02:00
bastien
a471d1c3f0 optimize(feat): add concrete scope-check decision rules table + worked examples (d8 target) 2026-05-06 18:25:03 +02:00
bastien
b96d0cc4e5 optimize(bugfix): add STEP 5 pre-commit confirmation gate + concrete test detection cascade (d4 target) 2026-05-06 18:24:19 +02:00
bastien
bd9134ab4c optimize(commit-change): add Phase 2.5 mandatory approval checkpoint before commit execution (d4 target) 2026-05-06 18:23:40 +02:00
bastien
9ae62546d5 optimize(status): add ERROR HANDLING section with permission-denied + partial-data fallbacks (d7 target) 2026-05-06 18:23:02 +02:00
bastien
257e78317a optimize(geo): add QUICK REFERENCE typical findings section + 5 worked examples (d8 target) 2026-05-06 18:22:19 +02:00
bastien
8560e9197c optimize(hotfix): add pre-flight, smoke check, regression-revert branch (d6 target) 2026-05-06 18:20:59 +02:00
bastien
88cc7b1c90 optimize(skills-perso): tri-signal detection (marker/agent-ref/allowlist) + empty fallback (d8 target) 2026-05-06 18:16:57 +02:00
bastien
22bee3aeaa optimize(refactor): add worked examples + counter-example to refactorer.md (d5 target) 2026-05-06 17:57:07 +02:00
bastien
e87b628ba8 optimize(analyze): add EDGE CASES section to analyzer.md (d3 target) 2026-05-06 17:53:56 +02:00
bastien
735ece3a0b test(darwin-skill): add baseline test-prompts.json for 18 personal skills 2026-05-06 17:53:51 +02:00
bastien
e52b1b7d1c feat(client-handover): add ship-and-handover orchestrator skill
End-to-end pipeline that hardens the project, commits, pauses for
deploy, validates the live site, then generates a non-technical client
deliverable (LIVRAISON.md / HANDOVER.md):

1. /seo (SEO+GEO) and /harden run in parallel with auto-fix loops
   until each scores >=17/20.
2. /commit-change + push if changes were made.
3. Pause to tell the user what to deploy and wait for confirmation.
4. /validate against the live site.
5. Per-audit gate >=17/20 — stop and analyze if any below.
6. Write client doc with before/after score table + owner-maintenance
   checklist.

Reads git history + .claude/memory/ registries for context. For
local-business projects, appends a manual NAP-consistency platform
checklist (Google Business, Pages Jaunes, Yelp, Facebook, Instagram,
TikTok, Apple Maps, Bing Places, TripAdvisor). Optional build/deploy
chapter on prompt.

Adds skills/client-handover/SKILL.md (slash-command entrypoint),
skills/client-handover/checklists/seo-geo-manual.md (NAP checklist),
agents/client-handover-writer.md (orchestrator agent).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:09:40 +02:00
bastien
7841a53102 chore(memory): capitalize LRN-007 from toggle-external fix
Pattern: toggle scripts for tools with separate install + symlink steps
must check 3 states (disabled-dir, enabled-dir, source-only), not 2.
Source-only branch creates symlink in place rather than failing. Error
messages name the path checked, not just the abstract tool name, so
callers can diagnose install vs symlink state without rereading the
script. Symmetric pairs (enable/disable) must both cover the same
lifecycle states — missing state in one half = silent dead end.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:09:28 +02:00
bastien
4535cce700 fix(toggle-external): handle source-only state in enable
`enable <tool>` for npx/external skills (darwin-skill, find-skills,
emil-design-eng) only handled two states: symlink in skills-disabled/
(move) and symlink in skills/ (already enabled). Missed the state
right after `make plugin` where the source dir exists at
~/.agents/skills/<tool> but no symlink has been created yet — first
run errored "not installed — run: make plugin" misleadingly.

Add a third branch: when the resolved source dir exists, create the
symlink in place. Resolve source path per tool (skills-external for
emil-design-eng, ~/.agents/skills for darwin-skill/find-skills). Error
message now names the path checked so the caller can verify install
vs symlink state without rereading the script.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:09:21 +02:00
bastien
b2a5b5a602 feat(doc-syncer): stack-aware audit with deploy-doc gating
Auto-discover what the project actually has instead of a fixed doc list:
root files (incl. DEPLOY.md, SECURITY.md, ARCHITECTURE.md, ROADMAP.md),
docs/**, and .claude/{tasks,audits,memory}/.

Detect stack (Node/Python/Rust/Go/Ruby/PHP/Dart/.NET) and deploy
complexity (NONE/TRIVIAL/NON_TRIVIAL) to drive doc-needs:
- Propose DEPLOY.md only when non-trivial (Docker, fly.toml, k8s,
  multi-stage CI).
- Propose inlining/removing DEPLOY.md when deploy is trivial.
- Enforce README presence with typical GitHub layout.

Add CREATE/REMOVE proposal categories to the validation gate. Update
auto-mode to map deploy artifacts to DEPLOY.md and decisions.md
architectural changes back to CLAUDE.md/README.

Sync skills/doc/SKILL.md description + triggers to match.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:09:12 +02:00
bastien
863fc0b646 chore(plugins): swap ui-ux-pro-max for pr-review-toolkit
Disable ui-ux-pro-max (off-profile for current work) and enable
pr-review-toolkit so /review and the toolkit subagents are available.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:09:02 +02:00
bastien
858e7a7fc7 fix(settings): scope graphify pretool hook to Bash search commands
Matcher was Glob|Grep — those tool inputs have no `command` field, so
the hint never fired. Switch to Bash matcher and gate on the actual
command substring (grep, rg, ripgrep, find, fd, ack, ag) so the
graphify hint only injects when Claude is about to scan raw files.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:08:57 +02:00
bastien
c26d8adcdd docs(claude): add graphify navigation rules
Tell Claude to read graphify-out/GRAPH_REPORT.md before answering
architecture questions, prefer graphify query/path/explain over grep
for cross-module questions, and run graphify update . after code edits.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:08:52 +02:00
bastien
d50763e04c chore(graphify): bump skill to 0.7.0
- GitHub URL clone support (single + multi-repo merge)
- uv tool detection ahead of pipx shebang
- Optional Kimi K2.6 backend via MOONSHOT_API_KEY
- Discrete confidence rubric (0.55/0.65/0.75/0.85/0.95) replaces continuous range
- Aggregated community view for graphs >5000 nodes
- Manifest persistence after --update so next run diffs against current state
- Video file support, rationale-as-attribute (not separate node)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-06 17:08:47 +02:00
bastien
d5677f67c9 chore(memory): capitalize BDR-009 from caveman format mandate
Append BDR-009 entry + Index update in decisions.md, plus 2026-05-05
heading in journal.md covering the 4-commit batch.

Catches Index up to BDR-008 (was missing 007/008 entries despite
already-written sections).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-05 23:50:07 +02:00
bastien
ee00f8c32f chore(gitignore): exclude *.original.md compress backups
/caveman:compress writes a human-readable backup as <file>.original.md
before overwriting. Backups are recoverable via git history (the
pre-compression state lives in the previous commit), so committing
them duplicates content and bloats the repo.

Globbing on *.original.md catches all compressed registries plus
CLAUDE.original.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-05 23:46:47 +02:00
bastien
4364e2b351 chore(memory): compress 5 registries to caveman format
Apply CLAUDE.md "Format — registries ALWAYS caveman" rule to existing
entries via /caveman:compress. Drops articles, filler, and hedging
while preserving:

  - Technical terms (rtk, claude plugin install, framer-motion, etc.)
  - IDs unchanged (BDR-XXX, LRN-XXX, BLK-XXX, EVAL-XXX)
  - Dates unchanged (2026-04-22 etc.)
  - Code blocks and quoted error strings exact
  - Commit refs (892de28, 7b57b2e, d3c79f0, 64d6ca7)

Files: decisions.md, learnings.md, blockers.md, journal.md, evals.md.
Token reduction: ~40% on session-start memory load.

Pre-compression backups saved as *.original.md (gitignored next).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-05 23:46:23 +02:00
bastien
4181bdc9cf docs(memory): mandate caveman format for registries
Add "Format — registries ALWAYS caveman" rule alongside existing
English-only rule. All writes to .claude/memory/*.md (decisions,
learnings, blockers, journal, evals) must drop articles/filler/hedging
while preserving technical terms, IDs, dates, and code blocks exact.

Rationale: registries load every session start — caveman cuts ~40%
input tokens with zero loss of substance. Applies to direct writes and
skill-driven CAPITALIZE steps (close, ship-feature, feat, bugfix,
hotfix, commit-change). Existing entries: compress on demand via
/caveman:compress <file>.

Self-applied: CLAUDE.md prose itself compressed in same pass.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-05 23:46:15 +02:00
bastien
15fa120942 chore(settings): disable example-skills plugin
Toggle example-skills@anthropic-agent-skills off — not used in active
profiles, reduces session-start skill enumeration.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-05 23:46:06 +02:00
bastien
d694a9e0da chore(memory): capitalize BDR-007 + BDR-008 from profile system
- BDR-007: Skill profiles partition gstack by usage (v1, skill-only).
  Decision to ship lib/profile.sh + symlink-based toggle for skills,
  with plugin/MCP entries advisory in v1. Rationale: the existing
  toggle-external.sh enable|disable gstack is too coarse — it
  disables checkpoint/ship/learn alongside design skills. Profiles
  hide the irrelevant skills without uninstalling the gstack repo.
  Alternatives rejected: forking SKILL.md to strip the gstack
  preamble (re-fork on every upgrade — preamble already degrades
  gracefully via `|| true`); per-skill toggle via claude plugin
  enable/disable (gstack skills are not marketplace plugins);
  removing symlinks (lossy if user has local edits).

- BDR-008: Profile system v2 — extend to plugins + MCPs + CLIs.
  Reverses the "advisory only" stance from BDR-007 alternative #4.
  User feedback: pure-skill toggling left ui-ux-pro-max/magic always
  loaded regardless of profile, so passive token cost didn't drop
  enough on profile switch. Solution: real claude plugin enable/
  disable for an explicit MANAGED_PLUGINS allowlist (3 entries) +
  PROTECTED_PLUGINS denylist for always-on (caveman, security-
  guidance, superpowers). MCP magic delegated to toggle-external.sh.
  Other MCPs stay advisory because each needs specific config. Adds
  4 new profiles: web, seo, web-full, backend.

- Journal: 2026-05-04 entry summarizing the v1 ship, then a follow-up
  block for the v2 extension (new profiles, plugin auto-toggle, tie-
  breaker for `current`).

- TODO.md: marked done — v1 (Skill profiles) section and v2 (Profile
  system v2 — extension plugins/MCPs/CLIs) section, both with their
  full subtask lists.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 02:09:51 +02:00
bastien
239d91db67 feat(profile): partition skills/plugins/MCPs/CLIs by usage profile
Ship lib/profile.sh + 9 profiles in lib/profiles/. A profile is a
plain-text file listing items + types (gstack | personal | external |
plugin@<marketplace> | mcp | cli). `profile set <name>` enables the
listed items and disables the rest:

  - gstack/personal/external skills: symlink toggle skills/ ↔
    skills-disabled/ (gstack__<name> prefix to avoid collisions; no
    prefix for personal/external).
  - plugins typed `plugin@<marketplace>`: actually toggled via
    `claude plugin enable|disable <name>@<marketplace>`. Allowlist:
    MANAGED_PLUGINS = ui-ux-pro-max, plugin-dev, pr-review-toolkit.
    Denylist: PROTECTED_PLUGINS = caveman, security-guidance,
    superpowers (always-on, never disabled even if absent from a
    profile).
  - mcp magic: delegated to lib/toggle-external.sh which already
    handles the MAGIC_API_KEY env lookup. Other MCPs stay advisory.
  - cli (rtk, gsd, ctx7, graphify): status-only, never auto-installed.

Profiles shipped:
  web        public website work — frontend + content + light dev
  seo        SEO + GEO + W3C audit (search/AI indexability + a11y)
  web-full   production website end-to-end (web ∪ seo ∪ qa-only/canary)
  backend    backend / API / system dev — no design, no SEO
  design     visual QA, design systems, mockups, polish
  dev        daily code work — features, fixes, refactor, ship
  qa         site testing, perf, canary, validation
  audit      comprehensive audit — security + SEO + perf + health
  minimal    strip all gstack skills (quiet session)

Commands:
  profile list / show <name> / current / apply <name> / set <name> /
  reset / diff <a> <b>

`current` heuristic returns "full" when nothing is disabled, otherwise
picks the profile with the highest available-ratio (counts both
"enabled" and "installed" — the latter for CLIs). Tiebreaker: larger
profile total wins, so web-full beats web at a 100% tie.

`reset` re-enables every gstack skill but does NOT touch plugins —
the user re-enables a managed plugin manually or via `apply <profile>`.
This is documented in the trailing info line.

Integration:
  - skills/profile/SKILL.md — `/profile` slash command, lists profiles,
    documents the per-type mechanism, points at lib/profile.sh.
  - agents/plugin-advisor.md — DETECT phase calls `profile current`,
    OUTPUT adds a PROFILE line, and TOGGLING EXTERNAL TOOLS gains a
    "Skill profiles" section with a signal → profile recommendation
    table.
  - lib/toggle-external.sh — header pointer to profile.sh for fine-
    grained activation (toggle-external still owns whole-gstack and
    magic-MCP toggles).
  - Makefile — `make profile cmd="set <name>"`, profile-list,
    profile-current, profile-reset.

Tested end-to-end: `set web` enables ui-ux-pro-max + magic; `set seo`
disables ui-ux-pro-max; `set minimal` disables ui-ux-pro-max but
spares always-on plugins; `reset` restores all 64 skills; shellcheck
clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 02:09:28 +02:00
bastien
d8ad38b131 chore(memory): capitalize BDR-006 + LRN-005 + LRN-006 from caveman session
- BDR-006: Caveman as 4th always-on plugin (output compression, sym
  with rtk's input compression). Full install rationale, alternatives
  rejected, caveats around path normalization + gitignore.
- LRN-005: claude plugin install does NOT enable — explicit
  claude plugin enable required for ALWAYS-ON plugins. Pattern: read
  enabledPlugins, never hardcode plugin names in status displays.
- LRN-006: caveman-shrink (and any MCP middleware proxy) needs an
  upstream wrapper. Bare registration fails health checks. Pattern:
  register under derived names (proxy-upstream), don't auto-register.
- Journal: 2026-05-03 entry summarizing the session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 23:06:26 +02:00
bastien
64d6ca7843 fix(install,session-start): enable always-on plugins + truthful banner
Two interlocked bugs masking each other:

1. install-plugins.sh installed but never enabled marketplace plugins.
   `claude plugin install` only writes to ~/.claude/plugins/cache; without
   a separate `claude plugin enable` the plugin sits dormant in the
   user's enabledPlugins map. security-guidance and superpowers shipped
   as ALWAYS-ON in CLAUDE.md/README/installer banner but in practice
   landed disabled on every fresh install.

2. session-start.sh hardcoded the literal "security-guidance rtk
   superpowers" in the  ON row, so the misleading banner agreed with
   the misleading documentation. The bug stayed invisible.

Fixes:
  - install-plugins.sh now calls enable_plugin (added in the caveman
    commit) for security-guidance and superpowers immediately after
    install. Idempotent: skips if already in enabledPlugins.
  - session-start.sh builds the ALWAYS-ON row dynamically from RTK
    binary detection + plugin_enabled() lookups against
    settings.json. Plugins that are not enabled are omitted, so the
    banner reflects reality. Wider strings split across two lines like
    the toggle row.
  - settings.json: ship security-guidance and superpowers in
    enabledPlugins so this user's machine matches the contract until
    install-plugins.sh runs again.

Out of scope (separate bug, not addressed here): the marketplace-aware
detect_security_guidance / detect_plugin_dev cache scans miss plugins
nested under cache/<marketplace>/<plugin>/<version>/. They aren't on
the always-on path so the symptom is hidden — left for a follow-up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 23:03:21 +02:00
bastien
e4f4edc121 feat(caveman): full install — plugin + standalone hooks + MCP scaffold
Wires JuliusBrussee/caveman into the always-on tier alongside
security-guidance and superpowers. Caveman compresses Claude's output
tokens (~75%) by speaking like a caveman while keeping technical
substance. Three layers:

  1. Plugin (caveman@caveman, marketplace JuliusBrussee/caveman)
     — adds /caveman, /caveman-commit, /caveman-review, /caveman-stats,
       /caveman-help, /cavecrew, /compress + 3 cavecrew agents +
       SessionStart/UserPromptSubmit hooks from the plugin path.
  2. Standalone hooks (statusline + stats badge) deployed by
     caveman's own hooks/install.sh into ~/.claude/hooks/. Paths in
     settings.json normalized to ~/.claude/hooks/... so this user's
     home dir doesn't leak across machines.
  3. caveman-shrink MCP proxy — NOT auto-registered. The bare proxy
     fails health checks because it requires an upstream MCP server
     to wrap. install-plugins.sh STEP 5.5 prints a snippet showing how
     to register a wrapped entry (e.g. caveman-shrink-fs) when the user
     decides which upstream to compress.

New helper enable_plugin() for explicit always-on activation —
'claude plugin install' only copies into cache, doesn't write
enabledPlugins. Idempotent via Python json check.

doctor.sh adds detect_caveman / detect_caveman_hooks / detect_caveman_shrink
checks plus a 300t passive-cost adder. update-all.sh refreshes hook
files via the upstream installer's --force mode.

.gitignore covers caveman runtime files materialized into hooks/
because ~/.claude/hooks is symlinked to this repo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 23:02:47 +02:00
bastien
94b79d2ebb fix(doctor): guard gstack find against set -euo pipefail
doctor.sh exited at the gstack-skills-count step on machines where
~/.claude/skills/gstack does not contain a skills/ subdirectory (e.g.
when the gstack submodule layout puts skills directly at root). Under
set -o pipefail, find's non-zero exit propagated through wc | tr,
killing the script before it reached the prerequisites/plugins/budget
sections.

Wrap the find in a brace group with `|| true` so the pipe stays
zero-exit and downstream sections run.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 23:00:11 +02:00
bastien
4d3fb6a661 chore(memory): capitalize BDR-005 + LRN-004 from animation lib auto-install
BDR-005: motion as default animation library; plugin-advisor stays
read-only (orchestrators own install).

LRN-004: framer-motion was rebranded `motion` in Nov 2024 — single
package for React/Svelte/vanilla, separate `motion-v` for Vue. React
Native still needs react-native-reanimated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 15:32:55 +02:00