@quantiya/codevibe 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +33 -55
  2. package/bin/codevibe +149 -17
  3. package/package.json +5 -5
package/README.md CHANGED
@@ -1,84 +1,62 @@
1
1
  # CodeVibe
2
2
 
3
- Monitor and control AI coding agents from your mobile device.
3
+ Monitor and control AI coding agents from your phone.
4
4
 
5
- CodeVibe syncs your terminal sessions (Claude Code, Gemini CLI, Codex CLI) to the [CodeVibe iOS app](https://apps.apple.com/app/id6740641420), letting you review code changes, approve actions, and send prompts — all from your phone.
5
+ CodeVibe syncs your terminal sessions (Claude Code, Gemini CLI, Codex CLI) to the CodeVibe mobile app, letting you review code changes, approve actions, and send prompts — all from your phone.
6
6
 
7
- ## Install
7
+ ## Quick Install
8
8
 
9
9
  ```bash
10
- npm install -g @quantiya/codevibe
11
- ```
12
-
13
- This installs wrapper commands for all three agents:
14
- - `codevibe-claude` — Claude Code integration
15
- - `codevibe-gemini` — Gemini CLI integration
16
- - `codevibe-codex` — Codex CLI integration
17
-
18
- ### Claude Code: Additional Step
19
-
20
- Claude Code also requires its MCP plugin to be registered. Inside a Claude Code session, run:
21
-
22
- ```
23
- /plugin marketplace add https://github.com/hendryyeh/quantiya-codevibe-marketplace
24
- /plugin install codevibe-claude
10
+ curl -fsSL https://quantiya.ai/codevibe/install.sh | bash
25
11
  ```
26
12
 
27
- This registers the CodeVibe MCP server with Claude Code. You only need to do this once.
28
-
29
- ### Install individual plugins
13
+ This installs everything automatically: Node.js, tmux, Claude Code, CodeVibe, and the Claude plugin.
30
14
 
31
- If you only use specific agents:
15
+ ### Manual Install
32
16
 
33
17
  ```bash
34
- npm install -g @quantiya/codevibe-claude-plugin # Also needs marketplace install above
35
- npm install -g @quantiya/codevibe-gemini-plugin
36
- npm install -g @quantiya/codevibe-codex-plugin
18
+ npm install -g @quantiya/codevibe
19
+ claude plugin marketplace add https://github.com/hendryyeh/quantiya-codevibe-marketplace
20
+ claude plugin install codevibe-claude@codevibe-marketplace
21
+ codevibe login
37
22
  ```
38
23
 
39
- ## Quick Start
24
+ ## Commands
40
25
 
41
26
  ```bash
42
- # 1. Sign in (opens browser — Apple or Google)
43
- codevibe-claude login
44
-
45
- # 2. Start coding — session syncs to your phone
46
- codevibe-claude
27
+ codevibe login # Sign in with Apple or Google
28
+ codevibe status # Show auth status
29
+ codevibe update # Update all packages + Claude plugin
30
+ codevibe version # Show installed versions
31
+ codevibe --help # Show all commands
47
32
  ```
48
33
 
49
- Same pattern for Gemini and Codex:
34
+ ### Agent Wrappers
50
35
 
51
36
  ```bash
52
- codevibe-gemini login && codevibe-gemini
53
- codevibe-codex login && codevibe-codex
37
+ codevibe-claude # Start Claude Code with mobile sync
38
+ codevibe-gemini # Start Gemini CLI with mobile sync
39
+ codevibe-codex # Start Codex CLI with mobile sync
54
40
  ```
55
41
 
56
42
  ## Features
57
43
 
58
- **Real-time sync** — See assistant responses, tool usage, and file changes on your phone as they happen (~100-500ms latency)
59
-
60
- **Mobile approval** — Approve or reject tool permissions remotely. View full file diffs with syntax highlighting before approving changes
61
-
62
- **Send prompts** — Type or dictate prompts from your phone that execute immediately on desktop
63
-
64
- **Voice messages** — Tap the microphone to dictate prompts with real-time speech-to-text transcription
65
-
66
- **Image attachments** — Send screenshots or photos from your camera or photo library alongside your messages
67
-
68
- **Push notifications** — Get notified when your agent needs attention, with deep linking to the relevant session
69
-
70
- **Delivery status** — WhatsApp-style checkmarks: sent, delivered, and executed confirmations
71
-
72
- **Multi-agent** — Run Claude Code, Gemini CLI, and Codex CLI sessions simultaneously, each clearly labeled in the app
73
-
74
- **End-to-end encryption** — All messages encrypted with AES-256-GCM. Your code stays private
75
-
76
- **Offline queue** — Messages queue automatically when offline and send when connection restores
44
+ - **Real-time sync** — See responses, tool usage, and file changes on your phone (~100-500ms latency)
45
+ - **Mobile approval** — Approve or reject tool permissions remotely with full file diff preview
46
+ - **Send prompts** — Type or dictate prompts from your phone
47
+ - **Voice input** — Speech-to-text with live transcription
48
+ - **Image attachments** — Send screenshots or photos alongside messages
49
+ - **Push notifications** — Get notified when your agent needs attention
50
+ - **Delivery status** — Checkmarks: sent, delivered, and executed confirmations
51
+ - **Multi-agent** — Claude Code, Gemini CLI, and Codex CLI from one app
52
+ - **E2E encrypted** — AES-256-GCM encryption for all content
53
+ - **Offline queue** — Messages queue when offline, send on reconnect
77
54
 
78
55
  ## Links
79
56
 
80
- - [iOS App](https://apps.apple.com/app/id6740641420)
81
- - [Website](https://quantiya.ai/codevibe)
57
+ - [Landing Page](https://quantiya.ai/codevibe)
58
+ - [Android — Google Play](https://play.google.com/store/apps/details?id=ai.quantiya.app.codevibe)
59
+ - [iOS — App Store](https://apps.apple.com/app/id6756500217)
82
60
 
83
61
  ## License
84
62
 
package/bin/codevibe CHANGED
@@ -103,42 +103,174 @@ show_version() {
103
103
  }
104
104
 
105
105
  # ─── Update ──────────────────────────────────────────────────────────
106
+ #
107
+ # NOTE: Claude Code's plugin lifecycle has known bugs as of Claude Code 2.1.x:
108
+ # 1. `claude plugin update` lies — reports "already at latest version" based on
109
+ # the installed plugin's own package.json, never consults the marketplace
110
+ # manifest for the authoritative latest version.
111
+ # 2. `claude plugin install` doesn't refetch — if a cache directory for the
112
+ # plugin exists, it reuses it silently instead of downloading the version
113
+ # pinned in the marketplace manifest.
114
+ # 3. `claude plugin uninstall` doesn't delete the cached plugin directory —
115
+ # only removes the installed_plugins.json entry, leaving stale code on disk
116
+ # for the next install to silently reuse.
117
+ #
118
+ # This function works around all three by detecting when the installed version
119
+ # on disk doesn't match the version the marketplace says it should be, then
120
+ # manually clearing all stale cache paths before reinstalling and verifying.
121
+ #
122
+ # If Anthropic fixes these bugs, the cache-nuking path is a no-op (the version
123
+ # comparison will always match) and the code stays correct.
124
+
125
+ _read_marketplace_version() {
126
+ # Read the pinned source.version for codevibe-claude from the marketplace manifest.
127
+ # Echoes the version string, or empty on failure.
128
+ local manifest="$HOME/.claude/plugins/marketplaces/codevibe-marketplace/.claude-plugin/marketplace.json"
129
+ [ -f "$manifest" ] || return 0
130
+ node -p "
131
+ try {
132
+ const m = require('$manifest');
133
+ const p = (m.plugins || []).find(x => x.name === 'codevibe-claude');
134
+ (p && p.source && p.source.version) || '';
135
+ } catch (e) { '' }
136
+ " 2>/dev/null
137
+ }
138
+
139
+ _read_installed_version() {
140
+ # Read the installed version of codevibe-claude from installed_plugins.json.
141
+ # Echoes the version string, or empty if not installed.
142
+ local db="$HOME/.claude/plugins/installed_plugins.json"
143
+ [ -f "$db" ] || return 0
144
+ node -p "
145
+ try {
146
+ const ip = require('$db');
147
+ const e = (ip.plugins || {})['codevibe-claude@codevibe-marketplace'];
148
+ (e && e[0] && e[0].version) || '';
149
+ } catch (e) { '' }
150
+ " 2>/dev/null
151
+ }
152
+
153
+ _nuke_claude_plugin_cache() {
154
+ # Remove every path Claude Code's plugin loader might read stale code from.
155
+ rm -rf "$HOME/.claude/plugins/cache/codevibe-marketplace/codevibe-claude"
156
+ rm -rf "$HOME/.claude/plugins/npm-cache/node_modules/@quantiya/codevibe-claude-plugin"
157
+ rm -rf "$HOME/.claude/plugins/npm-cache/node_modules/codevibe-claude-plugin"
158
+ rm -f "$HOME/.claude/plugins/npm-cache/package-lock.json"
159
+ }
106
160
 
107
161
  do_update() {
108
162
  echo ""
109
163
  echo -e "${BOLD}${PURPLE}CodeVibe Update${NC}"
110
164
  echo ""
111
165
 
112
- # Show current versions
166
+ # Show current meta-package version
113
167
  if [ -f "$PACKAGE_DIR/package.json" ]; then
114
168
  CUR_VER=$(node -p "require('$PACKAGE_DIR/package.json').version" 2>/dev/null || echo "?")
115
- echo -e " ${DIM}Current version: $CUR_VER${NC}"
169
+ echo -e " ${DIM}Current meta-package: $CUR_VER${NC}"
116
170
  fi
117
171
  echo ""
118
172
 
119
- # Update meta-package (pulls latest core + all plugins)
173
+ # ─── Step 1: Update the global meta-package (pulls latest core + plugins) ──
120
174
  echo -e "${PURPLE}▸${NC} Updating @quantiya/codevibe..."
121
- npm install -g --force @quantiya/codevibe@latest 2>&1 | tail -1
122
- echo -e "${GREEN}✓${NC} CodeVibe updated"
175
+ # Capture output so we can check npm's exit status directly instead of the
176
+ # pipe's (tail's exit status would mask npm failures without `set -o pipefail`).
177
+ local npm_output
178
+ if ! npm_output=$(npm install -g --force @quantiya/codevibe@latest 2>&1); then
179
+ echo "$npm_output" | tail -10
180
+ echo ""
181
+ echo -e "${YELLOW}!${NC} Meta-package update failed. Check the output above, fix the issue, and retry 'codevibe update'."
182
+ return 1
183
+ fi
184
+ echo "$npm_output" | tail -3
185
+ echo -e "${GREEN}✓${NC} Meta-package updated"
123
186
 
124
- # Update Claude plugin in Claude Code
125
- if command -v claude >/dev/null 2>&1; then
187
+ # ─── Step 2: Update the Claude Code plugin ─────────────────────────────────
188
+ if ! command -v claude >/dev/null 2>&1; then
189
+ echo ""
190
+ echo -e "${YELLOW}!${NC} claude CLI not found — skipping Claude Code plugin update"
126
191
  echo ""
127
- echo -e "${PURPLE}▸${NC} Updating Claude Code plugin..."
192
+ echo -e "${BOLD}Updated versions:${NC}"
193
+ show_version
194
+ return 0
195
+ fi
128
196
 
129
- # Refresh marketplace
130
- if claude plugin marketplace update codevibe-marketplace 2>/dev/null; then
131
- echo -e "${GREEN}✓${NC} Marketplace refreshed"
132
- else
133
- echo -e "${YELLOW}!${NC} Marketplace refresh skipped"
197
+ echo ""
198
+ echo -e "${PURPLE}▸${NC} Updating Claude Code plugin..."
199
+
200
+ # Refresh the marketplace manifest so we see the latest pinned version.
201
+ # Errors here are non-fatal at this step — the previously-cached manifest may
202
+ # still be usable — but the EXPECTED_VERSION read below is the real gate.
203
+ if claude plugin marketplace update codevibe-marketplace; then
204
+ echo -e "${GREEN}✓${NC} Marketplace refreshed"
205
+ else
206
+ echo -e "${YELLOW}!${NC} Marketplace refresh failed (falling back to cached manifest)"
207
+ fi
208
+
209
+ local EXPECTED_VERSION
210
+ local INSTALLED_VERSION
211
+ EXPECTED_VERSION=$(_read_marketplace_version)
212
+ INSTALLED_VERSION=$(_read_installed_version)
213
+
214
+ # EXPECTED_VERSION is required — without it we have no ground truth to verify
215
+ # against, so the whole cache-bug workaround is blind. Fail loudly rather than
216
+ # claim success we can't prove.
217
+ if [ -z "$EXPECTED_VERSION" ]; then
218
+ echo ""
219
+ echo -e "${YELLOW}!${NC} Could not read expected version from marketplace manifest."
220
+ echo -e " ${DIM}Expected at: \$HOME/.claude/plugins/marketplaces/codevibe-marketplace/.claude-plugin/marketplace.json${NC}"
221
+ echo -e " ${DIM}This usually means the marketplace refresh failed or the manifest schema has drifted.${NC}"
222
+ echo -e " ${DIM}Try: claude plugin marketplace update codevibe-marketplace${NC}"
223
+ return 1
224
+ fi
225
+
226
+ echo -e " ${DIM}installed: ${INSTALLED_VERSION:-<none>} marketplace: ${EXPECTED_VERSION}${NC}"
227
+
228
+ # ─── Step 3: Decide if we need to force a cache-clearing reinstall ─────────
229
+ local NEEDS_REINSTALL=false
230
+ if [ -z "$INSTALLED_VERSION" ] || [ "$INSTALLED_VERSION" != "$EXPECTED_VERSION" ]; then
231
+ NEEDS_REINSTALL=true
232
+ if [ -n "$INSTALLED_VERSION" ]; then
233
+ echo -e "${YELLOW}!${NC} Cache is stale (${INSTALLED_VERSION} on disk, ${EXPECTED_VERSION} in marketplace)."
234
+ echo -e " ${DIM}Working around Claude Code plugin update bug...${NC}"
134
235
  fi
236
+ fi
237
+
238
+ if [ "$NEEDS_REINSTALL" = "true" ]; then
239
+ # Must uninstall + nuke cache BEFORE install. `claude plugin install` will
240
+ # silently reuse an existing cache dir even if the marketplace version changed.
241
+ claude plugin uninstall codevibe-claude@codevibe-marketplace >/dev/null 2>&1 || true
242
+ _nuke_claude_plugin_cache
135
243
 
136
- # Reinstall plugin (gets latest version from marketplace)
137
- if claude plugin install codevibe-claude@codevibe-marketplace 2>/dev/null; then
138
- echo -e "${GREEN}✓${NC} Claude plugin updated"
244
+ if claude plugin install codevibe-claude@codevibe-marketplace; then
245
+ echo -e "${GREEN}✓${NC} Claude plugin reinstalled"
139
246
  else
140
- echo -e "${YELLOW}!${NC} Claude plugin update skipped"
247
+ echo ""
248
+ echo -e "${YELLOW}!${NC} Claude plugin install failed — try running 'codevibe update' again"
249
+ return 1
141
250
  fi
251
+ else
252
+ # Version already matches. Still call install to make sure installed_plugins.json
253
+ # is in sync, but treat any error as non-fatal since we're not actually changing state.
254
+ claude plugin install codevibe-claude@codevibe-marketplace >/dev/null 2>&1 || true
255
+ echo -e "${GREEN}✓${NC} Claude plugin already at ${INSTALLED_VERSION}"
256
+ fi
257
+
258
+ # ─── Step 4: Verify the installed version is now what we expected ──────────
259
+ # EXPECTED_VERSION is guaranteed non-empty here (we bailed earlier otherwise),
260
+ # so the verification is unconditional.
261
+ INSTALLED_VERSION=$(_read_installed_version)
262
+ if [ "$INSTALLED_VERSION" != "$EXPECTED_VERSION" ]; then
263
+ echo ""
264
+ echo -e "${YELLOW}!${NC} WARNING: Installed version (${INSTALLED_VERSION:-<none>}) still doesn't match expected (${EXPECTED_VERSION})."
265
+ echo -e " ${DIM}Try: rm -rf ~/.claude/plugins/cache/codevibe-marketplace/codevibe-claude && codevibe update${NC}"
266
+ return 1
267
+ fi
268
+
269
+ # ─── Step 5: Tell the user about running sessions ──────────────────────────
270
+ if [ "$NEEDS_REINSTALL" = "true" ]; then
271
+ echo ""
272
+ echo -e "${YELLOW}!${NC} Running Claude Code sessions still have the OLD plugin server in memory."
273
+ echo -e " ${DIM}Exit and restart any active session to pick up the new plugin.${NC}"
142
274
  fi
143
275
 
144
276
  echo ""
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quantiya/codevibe",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "CodeVibe - Monitor and control AI coding agents (Claude Code, Gemini CLI, Codex CLI) from your mobile device",
5
5
  "bin": {
6
6
  "codevibe": "./bin/codevibe",
@@ -14,10 +14,10 @@
14
14
  "LICENSE"
15
15
  ],
16
16
  "dependencies": {
17
- "@quantiya/codevibe-core": "^1.0.0",
18
- "@quantiya/codevibe-claude-plugin": "^1.0.0",
19
- "@quantiya/codevibe-gemini-plugin": "^1.0.0",
20
- "@quantiya/codevibe-codex-plugin": "^1.0.0"
17
+ "@quantiya/codevibe-core": "^1.0.3",
18
+ "@quantiya/codevibe-claude-plugin": "^1.0.9",
19
+ "@quantiya/codevibe-gemini-plugin": "^1.0.5",
20
+ "@quantiya/codevibe-codex-plugin": "^1.0.6"
21
21
  },
22
22
  "keywords": [
23
23
  "codevibe",