Skip to content

v0.15.0: install semantics & honest status (S0+S1)#16

Draft
typelicious wants to merge 11 commits into
mainfrom
feature/v015-s0-install-semantics
Draft

v0.15.0: install semantics & honest status (S0+S1)#16
typelicious wants to merge 11 commits into
mainfrom
feature/v015-s0-install-semantics

Conversation

@typelicious

Copy link
Copy Markdown
Collaborator

v0.15.0 — Install semantics & honest status (S0+S1 of ops-stabilization-v0143)

Review-only integration PR. Do not merge until VER-002 (attended 8-client
walkthrough) passes
— the v0.15.0 version bump + tag + brew release are the
attended release step that follows this merge.

Scope (10 tasks, GS0+GS1 automated gates PASSED)

Task Defect Summary
STAB-003 V5 Runtime gate before MCP config writes; go≠npx; doctor uvx .venv fix
STAB-005 V6 Kind-placement contract — mcp/bundle never in skills dirs
STAB-002 V14 Transactional remove with rollback journal
STAB-008 V12 Queue-based submit response parsing
UP-001 V8 cap hold/unhold + update drift guard
STAB-001 V13 Multi-skill bundle inference + member links + subtree install
STAB-004 V10 Go build-from-local-package pipeline
STAB-006 V7 Explicit project scope for cursor (--project)
STAB-007 V11+ env materialization + secret indirection
UP-002 blocked-but-honest status for upstream-broken caps

Verification

  • capacium: 860 passed, ruff clean
  • capacium-test-lab: 689 passed, 4 skipped (companion PR)
  • Config fingerprint unchanged before/after the full run (96aac5ea…)

Companion PRs

  • capacium-test-lab: fixtures + regression suites for the above
  • capacium-docs: adapter write-scopes + korotovsky Slack activation guide

Attended remainder (not in this PR)

  1. VER-002: live walkthrough of all 8 clients on the real machine
  2. v0.15.0 version bump (pyproject + README), CHANGELOG prepend
    (draft: .skillweave/release/v0.15.0-changelog.md), tag + brew release
  3. Upstream Perplexity PR (draft: .skillweave/handoff/up-001-pr-draft.md)

André Lange added 11 commits June 12, 2026 12:07
- McpConfigPatcher gates every entry build on RuntimeResolver: unmet
  runtime raises RuntimeUnavailableError with install hint, before any
  backup or config write (korotovsky/karldane regression class)
- go.mod wins over package.json in entry auto-detection — Go projects
  are never configured as npx/node, and npm-deps install is skipped for
  Go packages with stray docs package.json
- cap install aborts with the hint on first gated adapter (0 writes);
  --skip-runtime-check propagates via CAPACIUM_SKIP_RUNTIME_CHECK
- doctor --deep: .venv-missing is no longer reported for uvx/pipx-based
  packages (ephemeral envs, V5 false positive)
- SKILL_LAYER_KINDS contract in models: only skill/prompt/template/
  workflow/tool/resource may materialize as skills-dir links
- create_framework_symlinks filters non-skill-layer kinds — fixes the
  Antigravity regression where --all-frameworks fanned mcp-servers
  (mempalace/perplexity/slack) out as skills links
- FrameworkAdapter.install_capability: bundle/connector-pack roots are
  containers (no client artifacts); removal stays tolerant for legacy links
- bundle member installs now honor --all-frameworks (threaded through
  _install_bundle_members/_install_single_sub_cap)
- _RemovalSnapshot records every write surface before mutation: client
  config files (byte-exact), skills-dir links (incl. owner-prefix and
  .md command links), package trees (parked via rename, purged only on
  commit), registry rows and bundle memberships
- registry change happens strictly after all adapter steps; any failure
  restores the complete pre-remove state and reports the rollback
- bundle member removal journals into the same snapshot (depth-first)
- missing client dirs remain a skip, never a crash (V14)
/v2/submit returns 202 + {job_id, canonical_hint, status} — the CLI
assumed a synchronous schema and printed 'unknown' for every field
(lum1104 case). cap submit now polls /v2/submit/{job_id} until
completed/failed, decorates with kind/trust from the listing detail,
and shows the raw response with a warning on unknown schemas instead
of fabricated values. Legacy synchronous schema still parses.
- holds.json under ~/.capacium records reason, version and fingerprint
  at hold time; cap update skips held packages with a notice
- fingerprint drift (local patch) without a hold suppresses the
  newer-version force-reinstall and points to 'cap hold' instead of
  silently wiping local modifications
- CLI: cap hold <cap> [--reason] [--list], cap unhold <cap>
…STAB-001/V13)

- infer_multi_skill_members detects skills/*/SKILL.md, plugin layouts
  (<dir>/skills/*/SKILL.md) and >=2 sibling SKILL.md dirs; manifest
  detection and auto-generated manifests model these repos as bundles
  with member skills instead of one undiscoverable root skill
- 3-part IDs (owner/repo/skill, owner/repo::skill) install only the
  member subtree: correct owner/name/version layout, member-sized
  package, direct links, correct registry row (V13b)
- static guard: kind=skill without root SKILL.md is refused when nested
  member skills exist (mis-modeled multi-skill repo) and warned
  otherwise — no more dead root links (V13a)
…V10)

- install builds bin/<name> via 'go build' (entrypoint by cmd/<name>,
  first cmd/* with main.go, or root main.go) — korotovsky parity with
  the manual 2026-06-11 build
- entry builder prefers the built binary; 'go run ...@latest' is
  rewritten to the local package (never a network fetch)
- missing toolchain stays a hard error unless --skip-runtime-check;
  no brew calls from the build step (provisioning is preflight-only,
  CAPACIUM_SANDBOX-safe)
- cursor resolves project paths ONLY from an explicit project root
  (cap install --project / CAPACIUM_PROJECT_ROOT) — never Path.cwd();
  without it, skills are cached with a notice and MCP entries go to the
  global ~/.cursor/mcp.json (regression: mcp.json/.bak files written
  into package dirs whenever cwd contained a .cursor folder)
- framework skills-dir map: cursor registered only with a project root;
  opencode is global (~/.opencode/skills) — no more links in foreign
  repo cwds via the omni-symlink fan-out
- also: align P0-005 ExchangeClient fixture with capacium-mcp v0.3.0
  kwarg (exchange_url) — pre-existing drift surfaced by the env
- manifest mcp.env blocks are sanitized into every client config entry:
  empty values become ${KEY} indirections, secret-looking keys with
  literal values are redacted to ${KEY} (static guard — no plaintext
  secret ever lands in a client config; resolution via launchd/envctl)
- install warns when a declared env var never appears in the package
  source (korotovsky class: manifest SLACK_BOT_TOKEN vs server
  SLACK_MCP_XOXP_TOKEN — silently unauthenticated servers)
- dev machine: korotovsky manifest corrected to SLACK_MCP_XOXP/XOXB_TOKEN
- cap block <cap> --reason [--issue]: per-adapter status 'blocked' with
  the upstream reason; cap unblock clears it
- cap list --details shows blocked + reason; doctor's handshake check
  reports blocked caps separately (expected non-responders) instead of
  counting them as failed probes — blocked (upstream) != broken (capacium)
- dev machine: karldane/slack-mcp (go.mod replace on author machine) and
  elementeer/elementeer-mcp (@elementeer/shared unpublished) blocked
Two tests passed on macOS local but failed on Linux CI:
- TestCursorAdapterSkills::test_skills_dir_created asserted the old
  cwd-write behavior removed by STAB-006; now uses the explicit
  project_root fixture (passed locally only via a stale repo .cursor/)
- transactional-remove installed_mcp fixture hardcoded the macOS
  claude-desktop config path; on Linux the adapter writes to
  ~/.config/Claude. Derive the path from ClaudeDesktopAdapter
  ._resolve_config_path() so it is platform-correct.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant