claude-comms 1.0.46 → 2.0.0
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.
- package/CHANGELOG.md +20 -1
- package/README.md +12 -13
- package/package.json +6 -10
- package/.agents/AGENTS.md +0 -61
- package/.agents/repo.md +0 -18
- package/.agents/tools/README.md +0 -45
- package/.agents/tools/agent-job/README.md +0 -208
- package/.agents/tools/agent-job/__pycache__/agent_monitor.cpython-312.pyc +0 -0
- package/.agents/tools/agent-job/agent_job.py +0 -936
- package/.agents/tools/agent-job/agent_monitor.py +0 -575
- package/.agents/tools/agent-job/consultant_template.txt +0 -73
- package/.agents/tools/chrome-devtools/README.md +0 -101
- package/.agents/tools/chrome-devtools/browsertools.py +0 -839
- package/.agents/tools/chrome-devtools/config.json +0 -24
- package/.agents/tools/workflow/CONSUMER_SETUP.md +0 -114
- package/.agents/tools/workflow/ONBOARD.md +0 -167
- package/.agents/tools/workflow/README.md +0 -169
- package/.agents/tools/workflow/cli.ts +0 -726
- package/.agents/tools/workflow/config.example.json +0 -16
- package/.agents/tools/workflow/init.ts +0 -76
- package/.agents/tools/workflow/lib/file-tracker.test.ts +0 -81
- package/.agents/tools/workflow/lib/file-tracker.ts +0 -387
- package/.agents/tools/workflow/lib/harness-executor.ts +0 -649
- package/.agents/tools/workflow/lib/prompts.scenario.test.ts +0 -262
- package/.agents/tools/workflow/lib/prompts.ts +0 -548
- package/.agents/tools/workflow/lib/streams.test.ts +0 -140
- package/.agents/tools/workflow/lib/streams.ts +0 -254
- package/.agents/tools/workflow/runner.ts +0 -994
- package/.agents/tools/workflow/templates/document.md +0 -42
- package/.agents/tools/workflow/templates/implement.md +0 -117
- package/.agents/tools/workflow/templates/plan.md +0 -54
- package/.agents/tools/workflow/templates/pm.md +0 -84
- package/.agents/tools/workflow/templates/product-owner.md +0 -211
- package/.agents/tools/workflow/templates/review.md +0 -56
- package/.agents/tools/workflow/templates/uat.md +0 -71
- package/.claude/agents/core/engineer.md +0 -146
- package/.claude/commands/action-feedback-item.md +0 -27
- package/.claude/commands/install-feedback-widget.md +0 -599
- package/.claude/commands/learn.md +0 -32
- package/.claude/hooks/comms/__pycache__/register_subagent.cpython-312.pyc +0 -0
- package/.claude/hooks/comms/__pycache__/update_subagent_completion.cpython-312.pyc +0 -0
- package/.claude/hooks/comms/get_unread_messages.py +0 -71
- package/.claude/hooks/comms/register_subagent.py +0 -74
- package/.claude/hooks/comms/send_message.py +0 -87
- package/.claude/hooks/comms/update_subagent_completion.py +0 -126
- package/.claude/hooks/context/session_id.py +0 -35
- package/.claude/hooks/observability/send_event.py +0 -110
- package/.claude/hooks/session-data/get_session_data.py +0 -261
- package/.claude/hooks/session-data/intercept_session_id.py +0 -69
- package/.claude/hooks/utils/__pycache__/server_config.cpython-312.pyc +0 -0
- package/.claude/hooks/utils/server_config.py +0 -17
- package/.claude/settings.json +0 -108
- package/.claude/settings.local.json +0 -46
- package/CLAUDE.md +0 -240
|
@@ -1,599 +0,0 @@
|
|
|
1
|
-
# Install Annotated Feedback Widget
|
|
2
|
-
|
|
3
|
-
Guide the user through installing the `annotated-feedback` widget in their application. This widget provides visual feedback annotation capabilities with screenshot capture and Convex backend integration.
|
|
4
|
-
|
|
5
|
-
## ⚠️ PREREQUISITES - MUST COMPLETE BEFORE STARTING
|
|
6
|
-
|
|
7
|
-
**STOP! Before proceeding, ask the user:**
|
|
8
|
-
|
|
9
|
-
1. **Do you have a Convex deployment URL?**
|
|
10
|
-
- Format: `https://xxx-xxx-123.convex.cloud`
|
|
11
|
-
- If NO: Guide them to create one at https://dashboard.convex.dev
|
|
12
|
-
- They MUST provide this URL before installation can proceed
|
|
13
|
-
|
|
14
|
-
2. **What is your project name?**
|
|
15
|
-
- If not provided: Use the current repository name as the default
|
|
16
|
-
- Command to get repo name: `basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD`
|
|
17
|
-
- This will be used as the namespace for feedback submissions
|
|
18
|
-
|
|
19
|
-
**DO NOT PROCEED** until you have:
|
|
20
|
-
- ✅ Convex deployment URL (verified format)
|
|
21
|
-
- ✅ Project name (user-provided or auto-detected from repo)
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## CRITICAL CONTEXT
|
|
26
|
-
|
|
27
|
-
**Package Details:**
|
|
28
|
-
- NPM Package: `annotated-feedback` (NOT `annotated-feedback-widget`)
|
|
29
|
-
- **Minimum Version: 0.1.24+** (earlier versions have SSR/Convex context issues)
|
|
30
|
-
- Import Paths:
|
|
31
|
-
- Components: `annotated-feedback/widget`
|
|
32
|
-
- Styles: `annotated-feedback/widget/styles`
|
|
33
|
-
- Framework: React-based (requires React 18+ as peer dependency)
|
|
34
|
-
- Backend: Convex (user provides deployment URL)
|
|
35
|
-
|
|
36
|
-
**What This Widget Does:**
|
|
37
|
-
- Provides a floating feedback button and hotkey (default: Alt+F)
|
|
38
|
-
- Opens an overlay with Excalidraw drawing tools
|
|
39
|
-
- Captures viewport screenshots with PII redaction
|
|
40
|
-
- Submits annotated feedback to Convex backend
|
|
41
|
-
- Includes metadata: route, environment, project name, feature flags
|
|
42
|
-
|
|
43
|
-
**Dependencies Included (v0.1.24+):**
|
|
44
|
-
- `@excalidraw/excalidraw` - Drawing canvas (dynamically imported, client-side only)
|
|
45
|
-
- `convex` - Backend client (externalized)
|
|
46
|
-
- `html-to-image` - Screenshot capture
|
|
47
|
-
- All are automatically installed as transitive dependencies
|
|
48
|
-
- **SSR Compatible**: Excalidraw loads asynchronously after page hydration
|
|
49
|
-
|
|
50
|
-
**Key Improvements in v0.1.24:**
|
|
51
|
-
- ✅ Next.js SSR compatible (dynamic Excalidraw import)
|
|
52
|
-
- ✅ No font file errors (stripped from bundled CSS)
|
|
53
|
-
- ✅ Isolated Convex context (doesn't override parent app's Convex)
|
|
54
|
-
- ✅ Properly externalized React (no "Invalid hook call" errors)
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## INSTALLATION PROCESS
|
|
59
|
-
|
|
60
|
-
### Step 1: Detect Framework
|
|
61
|
-
|
|
62
|
-
Ask the user:
|
|
63
|
-
1. What framework are they using? (React, Next.js, Vue, Svelte, vanilla JS, etc.)
|
|
64
|
-
2. What bundler? (Vite, Webpack, etc.)
|
|
65
|
-
3. Do they have a Convex deployment URL? (If not, guide them to create one at https://dashboard.convex.dev)
|
|
66
|
-
|
|
67
|
-
### Step 2: Install Dependencies
|
|
68
|
-
|
|
69
|
-
**For ALL frameworks:**
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
# Install the widget package
|
|
73
|
-
pnpm add annotated-feedback
|
|
74
|
-
# or
|
|
75
|
-
npm install annotated-feedback
|
|
76
|
-
# or
|
|
77
|
-
yarn add annotated-feedback
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**For React/Next.js:**
|
|
81
|
-
- React 18+ should already be installed (peer dependency)
|
|
82
|
-
- No additional deps needed
|
|
83
|
-
|
|
84
|
-
**For Non-React frameworks (Vue, Svelte, vanilla JS):**
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
# Install React as peer dependency
|
|
88
|
-
pnpm add react react-dom
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**TypeScript Projects:**
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
# Install type definitions
|
|
95
|
-
pnpm add -D @types/react @types/react-dom
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## FRAMEWORK-SPECIFIC INTEGRATION
|
|
101
|
-
|
|
102
|
-
### React / Next.js App Router
|
|
103
|
-
|
|
104
|
-
**File: `app/layout.tsx` (or root layout)**
|
|
105
|
-
|
|
106
|
-
```tsx
|
|
107
|
-
import { FeedbackProvider } from 'annotated-feedback/widget';
|
|
108
|
-
import 'annotated-feedback/widget/styles';
|
|
109
|
-
|
|
110
|
-
export default function RootLayout({ children }) {
|
|
111
|
-
return (
|
|
112
|
-
<html>
|
|
113
|
-
<body>
|
|
114
|
-
<FeedbackProvider
|
|
115
|
-
convexUrl={process.env.NEXT_PUBLIC_CONVEX_URL!}
|
|
116
|
-
project="your-project-name"
|
|
117
|
-
enabled={process.env.NODE_ENV !== 'production'}
|
|
118
|
-
hotkey="Alt+F"
|
|
119
|
-
showButton={true}
|
|
120
|
-
getContext={() => ({
|
|
121
|
-
route: window.location.pathname,
|
|
122
|
-
env: process.env.NODE_ENV,
|
|
123
|
-
releaseId: process.env.NEXT_PUBLIC_RELEASE_ID,
|
|
124
|
-
})}
|
|
125
|
-
>
|
|
126
|
-
{children}
|
|
127
|
-
</FeedbackProvider>
|
|
128
|
-
</body>
|
|
129
|
-
</html>
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**Environment Variables (`.env.local`):**
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
NEXT_PUBLIC_CONVEX_URL=https://your-deployment.convex.cloud
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
### Vue 3 (Vite)
|
|
143
|
-
|
|
144
|
-
**CRITICAL: Vue requires special configuration to handle React widget**
|
|
145
|
-
|
|
146
|
-
#### Step 2.1: Install Vite React Plugin
|
|
147
|
-
|
|
148
|
-
```bash
|
|
149
|
-
pnpm add -D @vitejs/plugin-react
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
#### Step 2.2: Update `vite.config.ts`
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
import { defineConfig } from 'vite'
|
|
156
|
-
import vue from '@vitejs/plugin-vue'
|
|
157
|
-
import react from '@vitejs/plugin-react'
|
|
158
|
-
import path from 'path'
|
|
159
|
-
import { fileURLToPath } from 'url'
|
|
160
|
-
|
|
161
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
162
|
-
|
|
163
|
-
export default defineConfig({
|
|
164
|
-
plugins: [
|
|
165
|
-
vue(),
|
|
166
|
-
react() // Enable React support for widget
|
|
167
|
-
],
|
|
168
|
-
resolve: {
|
|
169
|
-
// Dedupe React to prevent multiple instances (CRITICAL!)
|
|
170
|
-
dedupe: ['react', 'react-dom', 'react/jsx-runtime'],
|
|
171
|
-
alias: {
|
|
172
|
-
// Force all React imports to use the same instance
|
|
173
|
-
'react': path.resolve(__dirname, 'node_modules/.pnpm/react@18.3.1/node_modules/react'),
|
|
174
|
-
'react-dom': path.resolve(__dirname, 'node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom'),
|
|
175
|
-
'react/jsx-runtime': path.resolve(__dirname, 'node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime'),
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
optimizeDeps: {
|
|
179
|
-
include: ['react', 'react-dom', 'react/jsx-runtime']
|
|
180
|
-
}
|
|
181
|
-
})
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**IMPORTANT:** Adjust the version numbers in the alias paths to match the installed React version (check `node_modules/.pnpm/`).
|
|
185
|
-
|
|
186
|
-
#### Step 2.3: Create Vue Wrapper Component
|
|
187
|
-
|
|
188
|
-
**File: `src/components/FeedbackWidget.vue`**
|
|
189
|
-
|
|
190
|
-
```vue
|
|
191
|
-
<template>
|
|
192
|
-
<div ref="feedbackContainer"></div>
|
|
193
|
-
</template>
|
|
194
|
-
|
|
195
|
-
<script setup lang="ts">
|
|
196
|
-
import { ref, onMounted, onBeforeUnmount } from 'vue';
|
|
197
|
-
import { createRoot, type Root } from 'react-dom/client';
|
|
198
|
-
import React from 'react';
|
|
199
|
-
import { FeedbackProvider } from 'annotated-feedback/widget';
|
|
200
|
-
import 'annotated-feedback/widget/styles';
|
|
201
|
-
|
|
202
|
-
const props = defineProps<{
|
|
203
|
-
convexUrl: string;
|
|
204
|
-
project: string;
|
|
205
|
-
enabled?: boolean;
|
|
206
|
-
hotkey?: string;
|
|
207
|
-
showButton?: boolean;
|
|
208
|
-
}>();
|
|
209
|
-
|
|
210
|
-
const feedbackContainer = ref<HTMLDivElement | null>(null);
|
|
211
|
-
let reactRoot: Root | null = null;
|
|
212
|
-
|
|
213
|
-
onMounted(() => {
|
|
214
|
-
if (!feedbackContainer.value) return;
|
|
215
|
-
|
|
216
|
-
reactRoot = createRoot(feedbackContainer.value);
|
|
217
|
-
|
|
218
|
-
reactRoot.render(
|
|
219
|
-
React.createElement(
|
|
220
|
-
FeedbackProvider,
|
|
221
|
-
{
|
|
222
|
-
convexUrl: props.convexUrl,
|
|
223
|
-
project: props.project,
|
|
224
|
-
enabled: props.enabled ?? true,
|
|
225
|
-
hotkey: props.hotkey ?? 'Alt+F',
|
|
226
|
-
showButton: props.showButton ?? false,
|
|
227
|
-
getContext: () => ({
|
|
228
|
-
route: window.location.pathname,
|
|
229
|
-
url: window.location.href,
|
|
230
|
-
env: import.meta.env.MODE,
|
|
231
|
-
}),
|
|
232
|
-
children: React.createElement(React.Fragment, null)
|
|
233
|
-
}
|
|
234
|
-
)
|
|
235
|
-
);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
onBeforeUnmount(() => {
|
|
239
|
-
if (reactRoot) {
|
|
240
|
-
reactRoot.unmount();
|
|
241
|
-
reactRoot = null;
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
</script>
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
#### Step 2.4: Integrate in App
|
|
248
|
-
|
|
249
|
-
**File: `src/App.vue`**
|
|
250
|
-
|
|
251
|
-
```vue
|
|
252
|
-
<template>
|
|
253
|
-
<div>
|
|
254
|
-
<!-- Your app content -->
|
|
255
|
-
|
|
256
|
-
<!-- Feedback Widget -->
|
|
257
|
-
<FeedbackWidget
|
|
258
|
-
v-if="feedbackEnabled"
|
|
259
|
-
:convex-url="convexUrl"
|
|
260
|
-
project="your-project-name"
|
|
261
|
-
:enabled="true"
|
|
262
|
-
hotkey="Alt+F"
|
|
263
|
-
:show-button="true"
|
|
264
|
-
/>
|
|
265
|
-
</div>
|
|
266
|
-
</template>
|
|
267
|
-
|
|
268
|
-
<script setup lang="ts">
|
|
269
|
-
import FeedbackWidget from './components/FeedbackWidget.vue';
|
|
270
|
-
|
|
271
|
-
const convexUrl = import.meta.env.VITE_CONVEX_URL || '';
|
|
272
|
-
const feedbackEnabled = import.meta.env.VITE_FEEDBACK_ENABLED === 'true' && !!convexUrl;
|
|
273
|
-
</script>
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
**Environment Variables (`.env`):**
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
VITE_CONVEX_URL=https://your-deployment.convex.cloud
|
|
280
|
-
VITE_FEEDBACK_ENABLED=true
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
### Vanilla JavaScript (ES Modules)
|
|
286
|
-
|
|
287
|
-
```html
|
|
288
|
-
<!DOCTYPE html>
|
|
289
|
-
<html>
|
|
290
|
-
<head>
|
|
291
|
-
<link rel="stylesheet" href="node_modules/annotated-feedback/widget/dist/styles.css">
|
|
292
|
-
</head>
|
|
293
|
-
<body>
|
|
294
|
-
<div id="app">Your app content</div>
|
|
295
|
-
<div id="feedback-root"></div>
|
|
296
|
-
|
|
297
|
-
<script type="module">
|
|
298
|
-
import React from 'react';
|
|
299
|
-
import { createRoot } from 'react-dom/client';
|
|
300
|
-
import { FeedbackProvider } from 'annotated-feedback/widget';
|
|
301
|
-
|
|
302
|
-
const root = createRoot(document.getElementById('feedback-root'));
|
|
303
|
-
|
|
304
|
-
root.render(
|
|
305
|
-
React.createElement(FeedbackProvider, {
|
|
306
|
-
convexUrl: 'https://your-deployment.convex.cloud',
|
|
307
|
-
project: 'your-project',
|
|
308
|
-
enabled: true,
|
|
309
|
-
hotkey: 'Alt+F',
|
|
310
|
-
showButton: true
|
|
311
|
-
})
|
|
312
|
-
);
|
|
313
|
-
</script>
|
|
314
|
-
</body>
|
|
315
|
-
</html>
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
---
|
|
319
|
-
|
|
320
|
-
## COMMON ISSUES & SOLUTIONS
|
|
321
|
-
|
|
322
|
-
### Issue 1: "Invalid hook call" or "Cannot read properties of null (reading 'useState')"
|
|
323
|
-
|
|
324
|
-
**Cause:** Multiple React instances (FIXED in v0.1.23+)
|
|
325
|
-
|
|
326
|
-
**Solution:**
|
|
327
|
-
```bash
|
|
328
|
-
# Update to v0.1.24 or later
|
|
329
|
-
pnpm update annotated-feedback@latest
|
|
330
|
-
|
|
331
|
-
# Verify version is 0.1.24+
|
|
332
|
-
pnpm list annotated-feedback
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
**If still occurring on v0.1.24+:**
|
|
336
|
-
- Check for duplicate React: `pnpm list react`
|
|
337
|
-
- Clear cache: `rm -rf node_modules/.cache .next`
|
|
338
|
-
- Reinstall: `pnpm install`
|
|
339
|
-
|
|
340
|
-
---
|
|
341
|
-
|
|
342
|
-
### Issue 2: "Cannot find module 'roughjs/bin/rough'" (Next.js SSR)
|
|
343
|
-
|
|
344
|
-
**Cause:** Excalidraw SSR incompatibility (FIXED in v0.1.23+)
|
|
345
|
-
|
|
346
|
-
**Solution:**
|
|
347
|
-
```bash
|
|
348
|
-
# Update to v0.1.23 or later (has dynamic Excalidraw import)
|
|
349
|
-
pnpm update annotated-feedback@latest
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
**If still occurring:** Verify you're on v0.1.23+ and restart dev server.
|
|
353
|
-
|
|
354
|
-
---
|
|
355
|
-
|
|
356
|
-
### Issue 3: "Can't resolve './fonts/Assistant/*.woff2'"
|
|
357
|
-
|
|
358
|
-
**Cause:** Missing font files in Excalidraw CSS (FIXED in v0.1.22+)
|
|
359
|
-
|
|
360
|
-
**Solution:**
|
|
361
|
-
```bash
|
|
362
|
-
# Update to v0.1.22 or later (fonts stripped from CSS)
|
|
363
|
-
pnpm update annotated-feedback@latest
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
---
|
|
367
|
-
|
|
368
|
-
### Issue 4: Dashboard Convex queries fail after adding widget
|
|
369
|
-
|
|
370
|
-
**Cause:** Widget's ConvexProvider overriding parent context (FIXED in v0.1.24+)
|
|
371
|
-
|
|
372
|
-
**Solution:**
|
|
373
|
-
```bash
|
|
374
|
-
# Update to v0.1.24 or later (isolated Convex contexts)
|
|
375
|
-
pnpm update annotated-feedback@latest
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
**Architecture:** v0.1.24+ only wraps the feedback overlay with ConvexProvider, leaving your app's Convex context intact.
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
### Issue 5: Widget doesn't appear
|
|
383
|
-
|
|
384
|
-
**Checklist:**
|
|
385
|
-
1. Is `CONVEX_URL` environment variable set?
|
|
386
|
-
2. Is `enabled` prop set to `true`?
|
|
387
|
-
3. Check browser console for errors
|
|
388
|
-
4. Try pressing the hotkey (default: Alt+F)
|
|
389
|
-
5. If `showButton={true}`, check for floating button in bottom-right corner
|
|
390
|
-
6. Wait 1-2 seconds for Excalidraw to load dynamically (v0.1.23+)
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## CONVEX BACKEND SETUP
|
|
395
|
-
|
|
396
|
-
The widget requires a Convex backend to store feedback submissions.
|
|
397
|
-
|
|
398
|
-
### Option 1: Use Existing Convex Deployment
|
|
399
|
-
|
|
400
|
-
If the user already has a Convex deployment, they need to:
|
|
401
|
-
|
|
402
|
-
1. Copy the schema and functions from the package:
|
|
403
|
-
- Schema: `node_modules/annotated-feedback/convex/schema.ts`
|
|
404
|
-
- Functions: `node_modules/annotated-feedback/convex/feedback.ts`
|
|
405
|
-
|
|
406
|
-
2. Add to their Convex project:
|
|
407
|
-
```bash
|
|
408
|
-
cp node_modules/annotated-feedback/convex/*.ts ./convex/
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
3. Deploy:
|
|
412
|
-
```bash
|
|
413
|
-
npx convex deploy
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
### Option 2: Create New Convex Deployment
|
|
417
|
-
|
|
418
|
-
1. Go to https://dashboard.convex.dev
|
|
419
|
-
2. Create new project
|
|
420
|
-
3. Copy deployment URL (format: `https://xxx-xxx-123.convex.cloud`)
|
|
421
|
-
4. Copy schema and functions (same as Option 1)
|
|
422
|
-
5. Run `npx convex dev` to deploy
|
|
423
|
-
|
|
424
|
-
---
|
|
425
|
-
|
|
426
|
-
## 🎯 FINAL STEP: MCP SERVER SETUP (REQUIRED)
|
|
427
|
-
|
|
428
|
-
**This is NOT optional - it's the entire point of installing the widget!**
|
|
429
|
-
|
|
430
|
-
After successful widget installation and testing, instruct the user to:
|
|
431
|
-
|
|
432
|
-
1. **Run this command in their terminal (OUTSIDE of Claude):**
|
|
433
|
-
|
|
434
|
-
```bash
|
|
435
|
-
claude mcp add annotated-feedback \
|
|
436
|
-
--scope project \
|
|
437
|
-
-- env \
|
|
438
|
-
CONVEX_URL="<CONVEX_URL>" \
|
|
439
|
-
PROJECT="<PROJECT_NAME>" \
|
|
440
|
-
npx -y annotated-feedback
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
2. **Provide them with the actual command to copy/paste:**
|
|
444
|
-
|
|
445
|
-
Replace `<CONVEX_URL>` and `<PROJECT_NAME>` with the values you collected at the start.
|
|
446
|
-
|
|
447
|
-
**Example output to user:**
|
|
448
|
-
|
|
449
|
-
```
|
|
450
|
-
✅ Widget installation complete!
|
|
451
|
-
|
|
452
|
-
📋 NEXT STEP: Install the MCP server so Claude can interact with your feedback.
|
|
453
|
-
|
|
454
|
-
Copy and paste this command in your terminal (outside of this chat):
|
|
455
|
-
|
|
456
|
-
claude mcp add annotated-feedback \
|
|
457
|
-
--scope project \
|
|
458
|
-
-- env \
|
|
459
|
-
CONVEX_URL="https://utmost-llama-56.convex.cloud" \
|
|
460
|
-
PROJECT="my-awesome-app" \
|
|
461
|
-
npx -y annotated-feedback
|
|
462
|
-
|
|
463
|
-
Then start a new Claude session to activate the MCP integration.
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
3. **Tell the user to start a new Claude session** after running the command
|
|
467
|
-
|
|
468
|
-
The MCP server allows Claude to:
|
|
469
|
-
- List all feedback submissions
|
|
470
|
-
- View feedback with annotations
|
|
471
|
-
- Update feedback status
|
|
472
|
-
- Filter by project, status, priority
|
|
473
|
-
|
|
474
|
-
---
|
|
475
|
-
|
|
476
|
-
## TESTING
|
|
477
|
-
|
|
478
|
-
After installation, test the widget:
|
|
479
|
-
|
|
480
|
-
1. Start your dev server
|
|
481
|
-
2. Open the app in browser
|
|
482
|
-
3. Press **Alt+F** (or configured hotkey)
|
|
483
|
-
4. Feedback overlay should appear with:
|
|
484
|
-
- Toolbar at top (input field, submit button)
|
|
485
|
-
- Excalidraw drawing canvas
|
|
486
|
-
- Drawing tools in corner (configurable position with 📍 button)
|
|
487
|
-
|
|
488
|
-
5. Test workflow:
|
|
489
|
-
- Draw annotations on the screenshot
|
|
490
|
-
- Add a text note
|
|
491
|
-
- Click "Submit"
|
|
492
|
-
- Should see success toast: "Feedback submitted successfully!"
|
|
493
|
-
|
|
494
|
-
6. Verify in Convex dashboard:
|
|
495
|
-
- Go to https://dashboard.convex.dev
|
|
496
|
-
- Select your deployment
|
|
497
|
-
- Check `feedback` table for new entries
|
|
498
|
-
|
|
499
|
-
---
|
|
500
|
-
|
|
501
|
-
## TROUBLESHOOTING CHECKLIST
|
|
502
|
-
|
|
503
|
-
Before asking for help, verify:
|
|
504
|
-
|
|
505
|
-
- [ ] **`annotated-feedback` version is 0.1.24 or higher** (check `pnpm list annotated-feedback`)
|
|
506
|
-
- [ ] React 18+ or 19+ is installed (check `package.json`)
|
|
507
|
-
- [ ] Convex URL is set in environment variables
|
|
508
|
-
- [ ] **For Next.js**: No webpack/transpilePackages config needed (widget handles SSR)
|
|
509
|
-
- [ ] **For apps with existing ConvexProvider**: Widget uses isolated context (v0.1.24+)
|
|
510
|
-
- [ ] For Vue: Vite config includes React plugin and dedupe config
|
|
511
|
-
- [ ] For Vue: React alias paths match installed version
|
|
512
|
-
- [ ] Cache cleared: `rm -rf node_modules/.cache .next node_modules/.vite`
|
|
513
|
-
- [ ] Dev server restarted after installation
|
|
514
|
-
- [ ] No console errors in browser DevTools
|
|
515
|
-
- [ ] Browser console shows no 404s for widget assets
|
|
516
|
-
- [ ] Wait 1-2 seconds after pressing Alt+F for Excalidraw to load
|
|
517
|
-
|
|
518
|
-
---
|
|
519
|
-
|
|
520
|
-
## CONFIGURATION REFERENCE
|
|
521
|
-
|
|
522
|
-
### FeedbackProvider Props
|
|
523
|
-
|
|
524
|
-
| Prop | Type | Required | Default | Description |
|
|
525
|
-
|------|------|----------|---------|-------------|
|
|
526
|
-
| `convexUrl` | string | Yes | - | Convex deployment URL |
|
|
527
|
-
| `project` | string | Yes | - | Project identifier |
|
|
528
|
-
| `enabled` | boolean | Yes | - | Enable/disable widget |
|
|
529
|
-
| `hotkey` | string | No | "Alt+F" | Keyboard shortcut |
|
|
530
|
-
| `showButton` | boolean | No | false | Show floating toggle button |
|
|
531
|
-
| `getContext` | function | No | - | Callback for dynamic metadata |
|
|
532
|
-
|
|
533
|
-
### Metadata Structure
|
|
534
|
-
|
|
535
|
-
```typescript
|
|
536
|
-
interface FeedbackMetadata {
|
|
537
|
-
route?: string; // App route (e.g., "/dashboard")
|
|
538
|
-
releaseId?: string; // Git SHA or version
|
|
539
|
-
env?: string; // Environment: "dev" | "staging" | "production"
|
|
540
|
-
userHash?: string; // K-anonymized user ID
|
|
541
|
-
flags?: string[]; // Active feature flags
|
|
542
|
-
project?: string; // Project name
|
|
543
|
-
}
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
---
|
|
547
|
-
|
|
548
|
-
## SUCCESS CRITERIA
|
|
549
|
-
|
|
550
|
-
Widget installation is complete when:
|
|
551
|
-
|
|
552
|
-
1. ✅ Package installed (v0.1.24+) and no build errors
|
|
553
|
-
2. ✅ Dev server starts without warnings about the widget
|
|
554
|
-
3. ✅ **Parent app's Convex queries still work** (if applicable)
|
|
555
|
-
4. ✅ Pressing Alt+F opens the feedback overlay
|
|
556
|
-
5. ✅ Brief "Loading drawing tools..." appears (~1-2 seconds)
|
|
557
|
-
6. ✅ Excalidraw canvas loads and drawing tools appear
|
|
558
|
-
7. ✅ Can draw annotations on the canvas
|
|
559
|
-
8. ✅ Submitting feedback shows success toast
|
|
560
|
-
9. ✅ Feedback appears in Convex dashboard (utmost-llama-56 deployment)
|
|
561
|
-
|
|
562
|
-
**THEN provide the MCP installation command** with substituted values.
|
|
563
|
-
|
|
564
|
-
---
|
|
565
|
-
|
|
566
|
-
## INSTALLATION FLOW SUMMARY
|
|
567
|
-
|
|
568
|
-
```
|
|
569
|
-
1. Ask for prerequisites (Convex URL, Project Name)
|
|
570
|
-
↓
|
|
571
|
-
2. Detect framework
|
|
572
|
-
↓
|
|
573
|
-
3. Install packages
|
|
574
|
-
↓
|
|
575
|
-
4. Apply framework-specific configuration
|
|
576
|
-
↓
|
|
577
|
-
5. Set environment variables
|
|
578
|
-
↓
|
|
579
|
-
6. Test the widget
|
|
580
|
-
↓
|
|
581
|
-
7. ✅ SUCCESS: Provide MCP installation command
|
|
582
|
-
↓
|
|
583
|
-
8. Tell user to run command and start new session
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
---
|
|
587
|
-
|
|
588
|
-
## NEED HELP?
|
|
589
|
-
|
|
590
|
-
If issues persist:
|
|
591
|
-
|
|
592
|
-
1. Check package version: `pnpm list annotated-feedback`
|
|
593
|
-
2. Check for duplicate React: `pnpm list react`
|
|
594
|
-
3. Review browser console errors (screenshot helpful)
|
|
595
|
-
4. Check Network tab for failed requests
|
|
596
|
-
5. Verify Convex backend is accessible
|
|
597
|
-
|
|
598
|
-
**Package Repository:** https://github.com/screwyforcepush/annotated-feedback
|
|
599
|
-
**NPM Package:** https://www.npmjs.com/package/annotated-feedback
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
Activate TUTOR MODE
|
|
2
|
-
|
|
3
|
-
🧙♂️📜🔮[Task]***MODEL ADOPTS ROLE [PERSONA]Deckard Cain***![/Task]🧙♂️📜🔮
|
|
4
|
-
You are the last descendant of an ancient Brotherhood that was dedicated to safeguarding the secrets of Claude Comms...
|
|
5
|
-
|
|
6
|
-
The user wants to learn about: #$ARGUMENTS ...
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
If the user didnt detail their learning request, present some options. spin as RPG class selection:
|
|
12
|
-
- Black box, whirlwind barb user. They just want to cook!
|
|
13
|
-
- Do you want to be a Wizzard?
|
|
14
|
-
- How does this system work (AI)?
|
|
15
|
-
- How does this system work (code)?
|
|
16
|
-
- Something else?
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Deckard, give the user 1:1 turoring. Achieve learning outcomes for the user through dynamic text based RPG.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# Ancient tomes
|
|
24
|
-
It takes time to master your skills... and use will hone your technique. Read these yourself Cain (dont reference or tell the user to read), to ground your sage advice!
|
|
25
|
-
- The last Horadric Scroll: AI wizzardry, agentic harness engineering, context/prompting principles `docs/spec/principles.md`. this is quite the treasure. a MUST GROK for you Decard.
|
|
26
|
-
- Basic low int user just quickstart the `README.md`. all they need to do is /cook /cook /cook at the start of every prompt. Claude Comms agentic harness will handle the rest.
|
|
27
|
-
- Some of my prompting examples in your `CLAUDE.md`, `.claude/commands/cook.md`, `.claude/agents/util/meta-agent-builder.md`
|
|
28
|
-
- original spec for this system plus a few notes about direction along the way `docs/spec/multi-agent-orchestration.md`. this is a bit outdated.
|
|
29
|
-
- if the user wants to learn about the architecture. all the tech docs in `docs/project/guides`
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
🧙♂️📜🔮Stay a while and listen...🧙♂️📜🔮
|
|
Binary file
|
|
Binary file
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import sys
|
|
5
|
-
import requests
|
|
6
|
-
import argparse
|
|
7
|
-
import os
|
|
8
|
-
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
|
|
9
|
-
from utils.server_config import get_server_url
|
|
10
|
-
|
|
11
|
-
def get_unread_messages(subagent_name):
|
|
12
|
-
"""
|
|
13
|
-
Get unread messages for a specific subagent.
|
|
14
|
-
|
|
15
|
-
Args:
|
|
16
|
-
subagent_name: The name/nickname of the subagent requesting messages
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
List of unread messages with sender, message, and timestamp
|
|
20
|
-
"""
|
|
21
|
-
try:
|
|
22
|
-
response = requests.post(
|
|
23
|
-
f'{get_server_url()}/subagents/unread',
|
|
24
|
-
json={
|
|
25
|
-
'subagent_name': subagent_name
|
|
26
|
-
},
|
|
27
|
-
timeout=5
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
if response.status_code == 200:
|
|
31
|
-
data = response.json()
|
|
32
|
-
return data.get('messages', [])
|
|
33
|
-
else:
|
|
34
|
-
print(f"Error: Server returned status {response.status_code}", file=sys.stderr)
|
|
35
|
-
return []
|
|
36
|
-
|
|
37
|
-
except requests.exceptions.ConnectionError:
|
|
38
|
-
print(f"Error: Could not connect to observability server at {get_server_url()}", file=sys.stderr)
|
|
39
|
-
return []
|
|
40
|
-
except requests.exceptions.Timeout:
|
|
41
|
-
print("Error: Request timed out", file=sys.stderr)
|
|
42
|
-
return []
|
|
43
|
-
except Exception as e:
|
|
44
|
-
print(f"Error: {str(e)}", file=sys.stderr)
|
|
45
|
-
return []
|
|
46
|
-
|
|
47
|
-
def main():
|
|
48
|
-
parser = argparse.ArgumentParser(description='Get unread messages for a subagent')
|
|
49
|
-
parser.add_argument('--name', required=True, help='Subagent name/nickname')
|
|
50
|
-
parser.add_argument('--json', action='store_true', help='Output as JSON')
|
|
51
|
-
|
|
52
|
-
args = parser.parse_args()
|
|
53
|
-
|
|
54
|
-
messages = get_unread_messages(args.name)
|
|
55
|
-
|
|
56
|
-
if args.json:
|
|
57
|
-
print(json.dumps(messages, indent=2))
|
|
58
|
-
else:
|
|
59
|
-
if not messages:
|
|
60
|
-
print("No unread messages")
|
|
61
|
-
else:
|
|
62
|
-
print(f"Found {len(messages)} unread message(s):")
|
|
63
|
-
print("-" * 50)
|
|
64
|
-
for msg in messages:
|
|
65
|
-
print(f"From: {msg['sender']}")
|
|
66
|
-
print(f"Time: {msg['created_at']}")
|
|
67
|
-
print(f"Message: {json.dumps(msg['message'], indent=2)}")
|
|
68
|
-
print("-" * 50)
|
|
69
|
-
|
|
70
|
-
if __name__ == '__main__':
|
|
71
|
-
main()
|