From a0cad32f7412e77fb14b627775946e9efdbdcfb2 Mon Sep 17 00:00:00 2001 From: Daniel Ochoa Date: Mon, 26 Oct 2026 13:47:38 -0500 Subject: [PATCH] fix(vibe): point missing Clerk keys at just clerk-keys - Setup worker tells the person to run just clerk-keys instead of handling secrets - Ship vibe 1.0.85 with a contract test for the rule --- CHANGELOG.md | 5 +++++ plugins/vibe/.claude-plugin/plugin.json | 2 +- plugins/vibe/.codex-plugin/plugin.json | 2 +- plugins/vibe/README.md | 2 +- plugins/vibe/agents/vibe-setup-worker.md | 7 +++++++ ...est_vibe_1084_scope_change_ack_contract.py | 6 ------ ...test_vibe_1085_clerk_keys_hint_contract.py | 21 +++++++++++++++++++ 7 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 plugins/vibe/tools/python/test_vibe_1085_clerk_keys_hint_contract.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a9f2e3ba..82b47464 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to the claude-plugins project will be documented in this fil The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Entries are listed newest-first; each plugin section is treated as released when merged to `main`. +### vibe v1.0.85 + +#### Added +- `vibe-setup-worker` now handles a missing Clerk sign-in key: when the real Clerk stack is needed and `local.env` has no Clerk keys, it does not fetch or type secrets and tells the person to run `! just clerk-keys` (after `aws sso login` if needed), then continues. + ### vibe v1.0.84 A mid-run scope change or answer sent to a Claude writer is now acknowledged by id and watched, so a writer stuck in one long turn is caught within the hour instead of when the operator asks (ISS-13096). diff --git a/plugins/vibe/.claude-plugin/plugin.json b/plugins/vibe/.claude-plugin/plugin.json index 497b85f7..abb8aa69 100644 --- a/plugins/vibe/.claude-plugin/plugin.json +++ b/plugins/vibe/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "vibe", "description": "Vibe sessions, handoff, seed refresh, and ClosedLoop ticket workflows", - "version": "1.0.84", + "version": "1.0.85", "dependencies": ["closedloop-core"], "author": {"name": "ClosedLoop", "email": "support@closedloop.ai"} } diff --git a/plugins/vibe/.codex-plugin/plugin.json b/plugins/vibe/.codex-plugin/plugin.json index 6ee76448..55e27820 100644 --- a/plugins/vibe/.codex-plugin/plugin.json +++ b/plugins/vibe/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "vibe", - "version": "1.0.84", + "version": "1.0.85", "description": "Vibe sessions, handoff, seed refresh, and ClosedLoop ticket workflows", "author": {"name": "ClosedLoop", "email": "support@closedloop.ai"}, "homepage": "https://github.com/closedloop-ai/claude-plugins", diff --git a/plugins/vibe/README.md b/plugins/vibe/README.md index 2d6d9acd..4e8d11a3 100644 --- a/plugins/vibe/README.md +++ b/plugins/vibe/README.md @@ -523,7 +523,7 @@ harness switch instead of another worker doing its work. ## Runtime Files -Version `1.0.84` contains 12 skills, 16 agents, and one hook manifest +Version `1.0.85` contains 12 skills, 16 agents, and one hook manifest (`hooks/hooks.json`). It has no standalone commands, root-level shell scripts, or production Python tools under `tools/python/`; that directory contains the skill-contract test modules and diff --git a/plugins/vibe/agents/vibe-setup-worker.md b/plugins/vibe/agents/vibe-setup-worker.md index ad103666..09e3a30b 100644 --- a/plugins/vibe/agents/vibe-setup-worker.md +++ b/plugins/vibe/agents/vibe-setup-worker.md @@ -90,6 +90,13 @@ The checkout is the one the preflight remembered as `NEEDS_PERSON` in one plain line. When it is not configured at all, return `BLOCKED` saying the closedloop-graph connector is missing, for engineering. +- Real Clerk sign-in stack (for example `just dev`) needed and `local.env` has + no Clerk keys (`NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` or `CLERK_SECRET_KEY` + blank or absent): never fetch or type the secrets yourself. Tell the person + to run `! just clerk-keys` in the repository (after + `aws sso login --profile ` if needed), returned as + `NEEDS_PERSON` in one plain line, then continue. Agent verification stacks + run Clerk-free and never need this. - Bootstrap: run `./.closedloop-ai/loops-setup.sh` in the worktree; on failure read its output and fix the cause if it is a missing prerequisite. - Local Storybook: start it detached in the worktree on a free port from 6100 diff --git a/plugins/vibe/tools/python/test_vibe_1084_scope_change_ack_contract.py b/plugins/vibe/tools/python/test_vibe_1084_scope_change_ack_contract.py index aa1a09ab..bdf51125 100644 --- a/plugins/vibe/tools/python/test_vibe_1084_scope_change_ack_contract.py +++ b/plugins/vibe/tools/python/test_vibe_1084_scope_change_ack_contract.py @@ -2,7 +2,6 @@ from __future__ import annotations -import json from pathlib import Path @@ -15,11 +14,6 @@ def read(path: Path) -> str: return path.read_text() -def test_release_and_both_manifests_are_1084() -> None: - for manifest in (".claude-plugin/plugin.json", ".codex-plugin/plugin.json"): - assert json.loads(read(ROOT / manifest))["version"] == "1.0.84" - - def test_orchestrator_sends_scope_changes_through_the_board_and_acts_on_its_flags() -> None: skill = read(FLEET / "SKILL.md") assert "deliver --kind scope --to --text " in skill diff --git a/plugins/vibe/tools/python/test_vibe_1085_clerk_keys_hint_contract.py b/plugins/vibe/tools/python/test_vibe_1085_clerk_keys_hint_contract.py new file mode 100644 index 00000000..b61ccbb4 --- /dev/null +++ b/plugins/vibe/tools/python/test_vibe_1085_clerk_keys_hint_contract.py @@ -0,0 +1,21 @@ +"""Contracts for the vibe 1.0.85 release: the setup worker points a missing Clerk key at `just clerk-keys`.""" + +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[2] + + +def test_release_and_both_manifests_are_1085() -> None: + for manifest in (".claude-plugin/plugin.json", ".codex-plugin/plugin.json"): + assert json.loads((ROOT / manifest).read_text())["version"] == "1.0.85" + + +def test_setup_worker_sends_missing_clerk_keys_to_the_person() -> None: + text = " ".join((ROOT / "agents" / "vibe-setup-worker.md").read_text().split()) + assert "never fetch or type the secrets yourself" in text + assert "`! just clerk-keys`" in text + assert "`aws sso login --profile `" in text