claude-comms 1.0.31 → 1.0.33
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/.agents/AGENTS.md +7 -4
- package/.agents/tools/README.md +45 -0
- package/.agents/tools/chrome-devtools/README.md +101 -0
- package/.agents/tools/chrome-devtools/browsertools.py +736 -0
- package/.agents/tools/chrome-devtools/config.json +24 -0
- package/.claude/agents/core/consultant.md +1 -1
- package/.claude/agents/core/uat.md +146 -0
- package/.claude/commands/{build.md → cook.md} +3 -3
- package/.claude/commands/feedback.md +140 -0
- package/.claude/commands/install-feedback-widget.md +567 -0
- package/.claude/commands/learn.md +6 -4
- package/.claude/settings.json +7 -7
- package/CLAUDE.md +8 -7
- package/package.json +1 -1
- package/.claude/commands/old-cook.md +0 -192
- package/.claude/commands/scope-plan.md +0 -0
|
@@ -0,0 +1,567 @@
|
|
|
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
|
+
- Current Version: 0.1.18+
|
|
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 (as of v0.1.18):**
|
|
44
|
+
- `@excalidraw/excalidraw` - Drawing canvas
|
|
45
|
+
- `convex` - Backend client
|
|
46
|
+
- `html-to-image` - Screenshot capture
|
|
47
|
+
- All are automatically installed as transitive dependencies
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## INSTALLATION PROCESS
|
|
52
|
+
|
|
53
|
+
### Step 1: Detect Framework
|
|
54
|
+
|
|
55
|
+
Ask the user:
|
|
56
|
+
1. What framework are they using? (React, Next.js, Vue, Svelte, vanilla JS, etc.)
|
|
57
|
+
2. What bundler? (Vite, Webpack, etc.)
|
|
58
|
+
3. Do they have a Convex deployment URL? (If not, guide them to create one at https://dashboard.convex.dev)
|
|
59
|
+
|
|
60
|
+
### Step 2: Install Dependencies
|
|
61
|
+
|
|
62
|
+
**For ALL frameworks:**
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Install the widget package
|
|
66
|
+
pnpm add annotated-feedback
|
|
67
|
+
# or
|
|
68
|
+
npm install annotated-feedback
|
|
69
|
+
# or
|
|
70
|
+
yarn add annotated-feedback
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**For React/Next.js:**
|
|
74
|
+
- React 18+ should already be installed (peer dependency)
|
|
75
|
+
- No additional deps needed
|
|
76
|
+
|
|
77
|
+
**For Non-React frameworks (Vue, Svelte, vanilla JS):**
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Install React as peer dependency
|
|
81
|
+
pnpm add react react-dom
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**TypeScript Projects:**
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Install type definitions
|
|
88
|
+
pnpm add -D @types/react @types/react-dom
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## FRAMEWORK-SPECIFIC INTEGRATION
|
|
94
|
+
|
|
95
|
+
### React / Next.js App Router
|
|
96
|
+
|
|
97
|
+
**File: `app/layout.tsx` (or root layout)**
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
import { FeedbackProvider } from 'annotated-feedback/widget';
|
|
101
|
+
import 'annotated-feedback/widget/styles';
|
|
102
|
+
|
|
103
|
+
export default function RootLayout({ children }) {
|
|
104
|
+
return (
|
|
105
|
+
<html>
|
|
106
|
+
<body>
|
|
107
|
+
<FeedbackProvider
|
|
108
|
+
convexUrl={process.env.NEXT_PUBLIC_CONVEX_URL!}
|
|
109
|
+
project="your-project-name"
|
|
110
|
+
enabled={process.env.NODE_ENV !== 'production'}
|
|
111
|
+
hotkey="Alt+F"
|
|
112
|
+
showButton={true}
|
|
113
|
+
getContext={() => ({
|
|
114
|
+
route: window.location.pathname,
|
|
115
|
+
env: process.env.NODE_ENV,
|
|
116
|
+
releaseId: process.env.NEXT_PUBLIC_RELEASE_ID,
|
|
117
|
+
})}
|
|
118
|
+
>
|
|
119
|
+
{children}
|
|
120
|
+
</FeedbackProvider>
|
|
121
|
+
</body>
|
|
122
|
+
</html>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Environment Variables (`.env.local`):**
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
NEXT_PUBLIC_CONVEX_URL=https://your-deployment.convex.cloud
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### Vue 3 (Vite)
|
|
136
|
+
|
|
137
|
+
**CRITICAL: Vue requires special configuration to handle React widget**
|
|
138
|
+
|
|
139
|
+
#### Step 2.1: Install Vite React Plugin
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
pnpm add -D @vitejs/plugin-react
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### Step 2.2: Update `vite.config.ts`
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
import { defineConfig } from 'vite'
|
|
149
|
+
import vue from '@vitejs/plugin-vue'
|
|
150
|
+
import react from '@vitejs/plugin-react'
|
|
151
|
+
import path from 'path'
|
|
152
|
+
import { fileURLToPath } from 'url'
|
|
153
|
+
|
|
154
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
155
|
+
|
|
156
|
+
export default defineConfig({
|
|
157
|
+
plugins: [
|
|
158
|
+
vue(),
|
|
159
|
+
react() // Enable React support for widget
|
|
160
|
+
],
|
|
161
|
+
resolve: {
|
|
162
|
+
// Dedupe React to prevent multiple instances (CRITICAL!)
|
|
163
|
+
dedupe: ['react', 'react-dom', 'react/jsx-runtime'],
|
|
164
|
+
alias: {
|
|
165
|
+
// Force all React imports to use the same instance
|
|
166
|
+
'react': path.resolve(__dirname, 'node_modules/.pnpm/react@18.3.1/node_modules/react'),
|
|
167
|
+
'react-dom': path.resolve(__dirname, 'node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom'),
|
|
168
|
+
'react/jsx-runtime': path.resolve(__dirname, 'node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime'),
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
optimizeDeps: {
|
|
172
|
+
include: ['react', 'react-dom', 'react/jsx-runtime']
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**IMPORTANT:** Adjust the version numbers in the alias paths to match the installed React version (check `node_modules/.pnpm/`).
|
|
178
|
+
|
|
179
|
+
#### Step 2.3: Create Vue Wrapper Component
|
|
180
|
+
|
|
181
|
+
**File: `src/components/FeedbackWidget.vue`**
|
|
182
|
+
|
|
183
|
+
```vue
|
|
184
|
+
<template>
|
|
185
|
+
<div ref="feedbackContainer"></div>
|
|
186
|
+
</template>
|
|
187
|
+
|
|
188
|
+
<script setup lang="ts">
|
|
189
|
+
import { ref, onMounted, onBeforeUnmount } from 'vue';
|
|
190
|
+
import { createRoot, type Root } from 'react-dom/client';
|
|
191
|
+
import React from 'react';
|
|
192
|
+
import { FeedbackProvider } from 'annotated-feedback/widget';
|
|
193
|
+
import 'annotated-feedback/widget/styles';
|
|
194
|
+
|
|
195
|
+
const props = defineProps<{
|
|
196
|
+
convexUrl: string;
|
|
197
|
+
project: string;
|
|
198
|
+
enabled?: boolean;
|
|
199
|
+
hotkey?: string;
|
|
200
|
+
showButton?: boolean;
|
|
201
|
+
}>();
|
|
202
|
+
|
|
203
|
+
const feedbackContainer = ref<HTMLDivElement | null>(null);
|
|
204
|
+
let reactRoot: Root | null = null;
|
|
205
|
+
|
|
206
|
+
onMounted(() => {
|
|
207
|
+
if (!feedbackContainer.value) return;
|
|
208
|
+
|
|
209
|
+
reactRoot = createRoot(feedbackContainer.value);
|
|
210
|
+
|
|
211
|
+
reactRoot.render(
|
|
212
|
+
React.createElement(
|
|
213
|
+
FeedbackProvider,
|
|
214
|
+
{
|
|
215
|
+
convexUrl: props.convexUrl,
|
|
216
|
+
project: props.project,
|
|
217
|
+
enabled: props.enabled ?? true,
|
|
218
|
+
hotkey: props.hotkey ?? 'Alt+F',
|
|
219
|
+
showButton: props.showButton ?? false,
|
|
220
|
+
getContext: () => ({
|
|
221
|
+
route: window.location.pathname,
|
|
222
|
+
url: window.location.href,
|
|
223
|
+
env: import.meta.env.MODE,
|
|
224
|
+
}),
|
|
225
|
+
children: React.createElement(React.Fragment, null)
|
|
226
|
+
}
|
|
227
|
+
)
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
onBeforeUnmount(() => {
|
|
232
|
+
if (reactRoot) {
|
|
233
|
+
reactRoot.unmount();
|
|
234
|
+
reactRoot = null;
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
</script>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
#### Step 2.4: Integrate in App
|
|
241
|
+
|
|
242
|
+
**File: `src/App.vue`**
|
|
243
|
+
|
|
244
|
+
```vue
|
|
245
|
+
<template>
|
|
246
|
+
<div>
|
|
247
|
+
<!-- Your app content -->
|
|
248
|
+
|
|
249
|
+
<!-- Feedback Widget -->
|
|
250
|
+
<FeedbackWidget
|
|
251
|
+
v-if="feedbackEnabled"
|
|
252
|
+
:convex-url="convexUrl"
|
|
253
|
+
project="your-project-name"
|
|
254
|
+
:enabled="true"
|
|
255
|
+
hotkey="Alt+F"
|
|
256
|
+
:show-button="true"
|
|
257
|
+
/>
|
|
258
|
+
</div>
|
|
259
|
+
</template>
|
|
260
|
+
|
|
261
|
+
<script setup lang="ts">
|
|
262
|
+
import FeedbackWidget from './components/FeedbackWidget.vue';
|
|
263
|
+
|
|
264
|
+
const convexUrl = import.meta.env.VITE_CONVEX_URL || '';
|
|
265
|
+
const feedbackEnabled = import.meta.env.VITE_FEEDBACK_ENABLED === 'true' && !!convexUrl;
|
|
266
|
+
</script>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Environment Variables (`.env`):**
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
VITE_CONVEX_URL=https://your-deployment.convex.cloud
|
|
273
|
+
VITE_FEEDBACK_ENABLED=true
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
### Vanilla JavaScript (ES Modules)
|
|
279
|
+
|
|
280
|
+
```html
|
|
281
|
+
<!DOCTYPE html>
|
|
282
|
+
<html>
|
|
283
|
+
<head>
|
|
284
|
+
<link rel="stylesheet" href="node_modules/annotated-feedback/widget/dist/styles.css">
|
|
285
|
+
</head>
|
|
286
|
+
<body>
|
|
287
|
+
<div id="app">Your app content</div>
|
|
288
|
+
<div id="feedback-root"></div>
|
|
289
|
+
|
|
290
|
+
<script type="module">
|
|
291
|
+
import React from 'react';
|
|
292
|
+
import { createRoot } from 'react-dom/client';
|
|
293
|
+
import { FeedbackProvider } from 'annotated-feedback/widget';
|
|
294
|
+
|
|
295
|
+
const root = createRoot(document.getElementById('feedback-root'));
|
|
296
|
+
|
|
297
|
+
root.render(
|
|
298
|
+
React.createElement(FeedbackProvider, {
|
|
299
|
+
convexUrl: 'https://your-deployment.convex.cloud',
|
|
300
|
+
project: 'your-project',
|
|
301
|
+
enabled: true,
|
|
302
|
+
hotkey: 'Alt+F',
|
|
303
|
+
showButton: true
|
|
304
|
+
})
|
|
305
|
+
);
|
|
306
|
+
</script>
|
|
307
|
+
</body>
|
|
308
|
+
</html>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## COMMON ISSUES & SOLUTIONS
|
|
314
|
+
|
|
315
|
+
### Issue 1: "Invalid hook call" or "Cannot read properties of null (reading 'useContext')"
|
|
316
|
+
|
|
317
|
+
**Cause:** Multiple React instances in the bundle.
|
|
318
|
+
|
|
319
|
+
**Solution for Vue/non-React frameworks:**
|
|
320
|
+
- Ensure Vite config has `resolve.dedupe` and `resolve.alias` set correctly
|
|
321
|
+
- Clear Vite cache: `rm -rf node_modules/.vite`
|
|
322
|
+
- Restart dev server
|
|
323
|
+
|
|
324
|
+
**Solution for React/Next.js:**
|
|
325
|
+
- Check for duplicate React installations: `npm ls react`
|
|
326
|
+
- Remove any local React copies and reinstall
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
### Issue 2: "Failed to resolve import '@excalidraw/excalidraw'"
|
|
331
|
+
|
|
332
|
+
**Cause:** Using old version of `annotated-feedback` (< 0.1.18) that's missing dependencies.
|
|
333
|
+
|
|
334
|
+
**Solution:**
|
|
335
|
+
```bash
|
|
336
|
+
# Update to latest version
|
|
337
|
+
pnpm update annotated-feedback@latest
|
|
338
|
+
|
|
339
|
+
# Verify version is 0.1.18 or higher
|
|
340
|
+
pnpm list annotated-feedback
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
If still failing on older versions, manually install:
|
|
344
|
+
```bash
|
|
345
|
+
pnpm add @excalidraw/excalidraw convex html-to-image
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
### Issue 3: "The requested module does not provide an export named 'default'"
|
|
351
|
+
|
|
352
|
+
**Cause:** Vite ESM compatibility issue with nested dependencies.
|
|
353
|
+
|
|
354
|
+
**Solution:**
|
|
355
|
+
- Clear Vite cache: `rm -rf node_modules/.vite`
|
|
356
|
+
- Ensure `optimizeDeps.include` in Vite config includes React
|
|
357
|
+
- Restart dev server
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
### Issue 4: Widget doesn't appear
|
|
362
|
+
|
|
363
|
+
**Checklist:**
|
|
364
|
+
1. Is `CONVEX_URL` environment variable set?
|
|
365
|
+
2. Is `enabled` prop set to `true`?
|
|
366
|
+
3. Check browser console for errors
|
|
367
|
+
4. Try pressing the hotkey (default: Alt+F)
|
|
368
|
+
5. If `showButton={true}`, check for floating button in bottom-right corner
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## CONVEX BACKEND SETUP
|
|
373
|
+
|
|
374
|
+
The widget requires a Convex backend to store feedback submissions.
|
|
375
|
+
|
|
376
|
+
### Option 1: Use Existing Convex Deployment
|
|
377
|
+
|
|
378
|
+
If the user already has a Convex deployment, they need to:
|
|
379
|
+
|
|
380
|
+
1. Copy the schema and functions from the package:
|
|
381
|
+
- Schema: `node_modules/annotated-feedback/convex/schema.ts`
|
|
382
|
+
- Functions: `node_modules/annotated-feedback/convex/feedback.ts`
|
|
383
|
+
|
|
384
|
+
2. Add to their Convex project:
|
|
385
|
+
```bash
|
|
386
|
+
cp node_modules/annotated-feedback/convex/*.ts ./convex/
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
3. Deploy:
|
|
390
|
+
```bash
|
|
391
|
+
npx convex deploy
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Option 2: Create New Convex Deployment
|
|
395
|
+
|
|
396
|
+
1. Go to https://dashboard.convex.dev
|
|
397
|
+
2. Create new project
|
|
398
|
+
3. Copy deployment URL (format: `https://xxx-xxx-123.convex.cloud`)
|
|
399
|
+
4. Copy schema and functions (same as Option 1)
|
|
400
|
+
5. Run `npx convex dev` to deploy
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 🎯 FINAL STEP: MCP SERVER SETUP (REQUIRED)
|
|
405
|
+
|
|
406
|
+
**This is NOT optional - it's the entire point of installing the widget!**
|
|
407
|
+
|
|
408
|
+
After successful widget installation and testing, instruct the user to:
|
|
409
|
+
|
|
410
|
+
1. **Run this command in their terminal (OUTSIDE of Claude):**
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
claude mcp add annotated-feedback \
|
|
414
|
+
-- env CONVEX_URL="<CONVEX_URL>" \
|
|
415
|
+
npx -y annotated-feedback \
|
|
416
|
+
-- --PROJECT="<PROJECT_NAME>"
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
2. **Provide them with the actual command to copy/paste:**
|
|
420
|
+
|
|
421
|
+
Replace `<CONVEX_URL>` and `<PROJECT_NAME>` with the values you collected at the start.
|
|
422
|
+
|
|
423
|
+
**Example output to user:**
|
|
424
|
+
|
|
425
|
+
```
|
|
426
|
+
✅ Widget installation complete!
|
|
427
|
+
|
|
428
|
+
📋 NEXT STEP: Install the MCP server so Claude can interact with your feedback.
|
|
429
|
+
|
|
430
|
+
Copy and paste this command in your terminal (outside of this chat):
|
|
431
|
+
|
|
432
|
+
claude mcp add annotated-feedback \
|
|
433
|
+
-- env CONVEX_URL="https://utmost-llama-56.convex.cloud" \
|
|
434
|
+
npx -y annotated-feedback \
|
|
435
|
+
-- --PROJECT="my-awesome-app"
|
|
436
|
+
|
|
437
|
+
Then start a new Claude session to activate the MCP integration.
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
3. **Tell the user to start a new Claude session** after running the command
|
|
441
|
+
|
|
442
|
+
The MCP server allows Claude to:
|
|
443
|
+
- List all feedback submissions
|
|
444
|
+
- View feedback with annotations
|
|
445
|
+
- Update feedback status
|
|
446
|
+
- Filter by project, status, priority
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## TESTING
|
|
451
|
+
|
|
452
|
+
After installation, test the widget:
|
|
453
|
+
|
|
454
|
+
1. Start your dev server
|
|
455
|
+
2. Open the app in browser
|
|
456
|
+
3. Press **Alt+F** (or configured hotkey)
|
|
457
|
+
4. Feedback overlay should appear with:
|
|
458
|
+
- Toolbar at top (input field, submit button)
|
|
459
|
+
- Excalidraw drawing canvas
|
|
460
|
+
- Drawing tools in corner (configurable position with 📍 button)
|
|
461
|
+
|
|
462
|
+
5. Test workflow:
|
|
463
|
+
- Draw annotations on the screenshot
|
|
464
|
+
- Add a text note
|
|
465
|
+
- Click "Submit"
|
|
466
|
+
- Should see success toast: "Feedback submitted successfully!"
|
|
467
|
+
|
|
468
|
+
6. Verify in Convex dashboard:
|
|
469
|
+
- Go to https://dashboard.convex.dev
|
|
470
|
+
- Select your deployment
|
|
471
|
+
- Check `feedback` table for new entries
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## TROUBLESHOOTING CHECKLIST
|
|
476
|
+
|
|
477
|
+
Before asking for help, verify:
|
|
478
|
+
|
|
479
|
+
- [ ] `annotated-feedback` version is 0.1.18 or higher
|
|
480
|
+
- [ ] React 18+ is installed (check `package.json`)
|
|
481
|
+
- [ ] Convex URL is set in environment variables
|
|
482
|
+
- [ ] For Vue: Vite config includes React plugin and dedupe config
|
|
483
|
+
- [ ] For Vue: React alias paths match installed version
|
|
484
|
+
- [ ] Vite cache cleared: `rm -rf node_modules/.vite`
|
|
485
|
+
- [ ] Dev server restarted after config changes
|
|
486
|
+
- [ ] No console errors in browser DevTools
|
|
487
|
+
- [ ] Browser console shows no 404s for widget assets
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## CONFIGURATION REFERENCE
|
|
492
|
+
|
|
493
|
+
### FeedbackProvider Props
|
|
494
|
+
|
|
495
|
+
| Prop | Type | Required | Default | Description |
|
|
496
|
+
|------|------|----------|---------|-------------|
|
|
497
|
+
| `convexUrl` | string | Yes | - | Convex deployment URL |
|
|
498
|
+
| `project` | string | Yes | - | Project identifier |
|
|
499
|
+
| `enabled` | boolean | Yes | - | Enable/disable widget |
|
|
500
|
+
| `hotkey` | string | No | "Alt+F" | Keyboard shortcut |
|
|
501
|
+
| `showButton` | boolean | No | false | Show floating toggle button |
|
|
502
|
+
| `getContext` | function | No | - | Callback for dynamic metadata |
|
|
503
|
+
|
|
504
|
+
### Metadata Structure
|
|
505
|
+
|
|
506
|
+
```typescript
|
|
507
|
+
interface FeedbackMetadata {
|
|
508
|
+
route?: string; // App route (e.g., "/dashboard")
|
|
509
|
+
releaseId?: string; // Git SHA or version
|
|
510
|
+
env?: string; // Environment: "dev" | "staging" | "production"
|
|
511
|
+
userHash?: string; // K-anonymized user ID
|
|
512
|
+
flags?: string[]; // Active feature flags
|
|
513
|
+
project?: string; // Project name
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## SUCCESS CRITERIA
|
|
520
|
+
|
|
521
|
+
Widget installation is complete when:
|
|
522
|
+
|
|
523
|
+
1. ✅ Package installed and no build errors
|
|
524
|
+
2. ✅ Dev server starts without warnings about the widget
|
|
525
|
+
3. ✅ Pressing Alt+F opens the feedback overlay
|
|
526
|
+
4. ✅ Can draw annotations on the canvas
|
|
527
|
+
5. ✅ Submitting feedback shows success toast
|
|
528
|
+
6. ✅ Feedback appears in Convex dashboard
|
|
529
|
+
|
|
530
|
+
**THEN provide the MCP installation command** with substituted values.
|
|
531
|
+
|
|
532
|
+
---
|
|
533
|
+
|
|
534
|
+
## INSTALLATION FLOW SUMMARY
|
|
535
|
+
|
|
536
|
+
```
|
|
537
|
+
1. Ask for prerequisites (Convex URL, Project Name)
|
|
538
|
+
↓
|
|
539
|
+
2. Detect framework
|
|
540
|
+
↓
|
|
541
|
+
3. Install packages
|
|
542
|
+
↓
|
|
543
|
+
4. Apply framework-specific configuration
|
|
544
|
+
↓
|
|
545
|
+
5. Set environment variables
|
|
546
|
+
↓
|
|
547
|
+
6. Test the widget
|
|
548
|
+
↓
|
|
549
|
+
7. ✅ SUCCESS: Provide MCP installation command
|
|
550
|
+
↓
|
|
551
|
+
8. Tell user to run command and start new session
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
556
|
+
## NEED HELP?
|
|
557
|
+
|
|
558
|
+
If issues persist:
|
|
559
|
+
|
|
560
|
+
1. Check package version: `pnpm list annotated-feedback`
|
|
561
|
+
2. Check for duplicate React: `pnpm list react`
|
|
562
|
+
3. Review browser console errors (screenshot helpful)
|
|
563
|
+
4. Check Network tab for failed requests
|
|
564
|
+
5. Verify Convex backend is accessible
|
|
565
|
+
|
|
566
|
+
**Package Repository:** https://github.com/screwyforcepush/annotated-feedback
|
|
567
|
+
**NPM Package:** https://www.npmjs.com/package/annotated-feedback
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
Activate TUTOR MODE
|
|
2
2
|
|
|
3
3
|
🧙♂️📜🔮[Task]***MODEL ADOPTS ROLE [PERSONA]Deckard Cain***![/Task]🧙♂️📜🔮
|
|
4
|
+
[Initial Invocation]: first you must study the Ancient Tombs to refresh your wizdom. This knowledge is your best-in-slot
|
|
5
|
+
|
|
4
6
|
|
|
5
7
|
The user wants to learn about: #$ARGUMENTS ...
|
|
6
8
|
|
|
@@ -19,11 +21,11 @@ If the user didnt detail their learning request, present some options. spin as R
|
|
|
19
21
|
Deckard, give the user 1:1 turoring. Achieve learning outcomes for the user through dynamic text based RPG.
|
|
20
22
|
|
|
21
23
|
|
|
22
|
-
# Ancient
|
|
24
|
+
# Ancient Tomes. (dont tell the user to read these. Consume them yourself!)
|
|
23
25
|
- Basic bitch user just quickstart the `README.md`. all they need to do is /cook /cook /cook at the start of every prompt to you. Your system will handle the rest.
|
|
24
|
-
- My context wizzardry (agentic engineering
|
|
25
|
-
- Some of my prompting examples in your `CLAUDE.md`, `.claude/commands/cook.md`, `.claude/agents/meta-agent-builder.md`,
|
|
26
|
-
- original spec for this system plus a few notes about direction along the way `docs/spec/multi-agent-orchestration.md`
|
|
26
|
+
- My personal journal of context wizzardry (prompting, agentic harness engineering, etc) principles `docs/spec/principles.md`. This is foundation of this entire realm!
|
|
27
|
+
- Some of my prompting examples in your `CLAUDE.md`, `.agents/AGENTS.md`, `.claude/commands/cook.md`, `.claude/agents/meta-agent-builder.md`, `.claude/agents/core/consultant.md`
|
|
28
|
+
- original spec for this system plus a few notes about direction along the way `docs/spec/multi-agent-orchestration.md` (bit outdated but directionally accurate)
|
|
27
29
|
- if the user wants to learn about the architecture. all the tech docs in `docs/project/guides`
|
|
28
30
|
|
|
29
31
|
|
package/.claude/settings.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"hooks": [
|
|
26
26
|
{
|
|
27
27
|
"type": "command",
|
|
28
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
28
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type PreToolUse --summarize"
|
|
29
29
|
}
|
|
30
30
|
]
|
|
31
31
|
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"hooks": [
|
|
46
46
|
{
|
|
47
47
|
"type": "command",
|
|
48
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
48
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type PostToolUse --summarize"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
}
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"hooks": [
|
|
57
57
|
{
|
|
58
58
|
"type": "command",
|
|
59
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
59
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type Notification --summarize"
|
|
60
60
|
}
|
|
61
61
|
]
|
|
62
62
|
}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"hooks": [
|
|
68
68
|
{
|
|
69
69
|
"type": "command",
|
|
70
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
70
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type Stop --add-chat"
|
|
71
71
|
}
|
|
72
72
|
]
|
|
73
73
|
}
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"hooks": [
|
|
79
79
|
{
|
|
80
80
|
"type": "command",
|
|
81
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
81
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type SubagentStop"
|
|
82
82
|
}
|
|
83
83
|
]
|
|
84
84
|
}
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"hooks": [
|
|
90
90
|
{
|
|
91
91
|
"type": "command",
|
|
92
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
92
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type PreCompact"
|
|
93
93
|
}
|
|
94
94
|
]
|
|
95
95
|
}
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"hooks": [
|
|
100
100
|
{
|
|
101
101
|
"type": "command",
|
|
102
|
-
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app
|
|
102
|
+
"command": "uv run $CLAUDE_PROJECT_DIR/.claude/hooks/observability/send_event.py --source-app claude-comms --event-type UserPromptSubmit --summarize"
|
|
103
103
|
}
|
|
104
104
|
]
|
|
105
105
|
}
|