vibesuite 1.3.3 → 2.0.2
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/README.md +75 -6
- package/assets/.agent/skills/avoid-feature-creep/SKILL.md +307 -0
- package/assets/.agent/skills/avoid-feature-creep/agents/openai.yaml +3 -0
- package/assets/.agent/skills/avoid-feature-creep/assets/large-logo.png +0 -0
- package/assets/.agent/skills/avoid-feature-creep/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex/SKILL.md +62 -0
- package/assets/.agent/skills/convex/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-agents/SKILL.md +516 -0
- package/assets/.agent/skills/convex-agents/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-agents/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-agents/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-best-practices/SKILL.md +369 -0
- package/assets/.agent/skills/convex-best-practices/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-best-practices/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-best-practices/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-component-authoring/SKILL.md +457 -0
- package/assets/.agent/skills/convex-component-authoring/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-component-authoring/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-component-authoring/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-cron-jobs/SKILL.md +604 -0
- package/assets/.agent/skills/convex-cron-jobs/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-cron-jobs/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-cron-jobs/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-file-storage/SKILL.md +467 -0
- package/assets/.agent/skills/convex-file-storage/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-file-storage/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-file-storage/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-functions/SKILL.md +458 -0
- package/assets/.agent/skills/convex-functions/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-functions/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-functions/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-http-actions/SKILL.md +733 -0
- package/assets/.agent/skills/convex-http-actions/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-http-actions/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-http-actions/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-migrations/SKILL.md +712 -0
- package/assets/.agent/skills/convex-migrations/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-migrations/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-migrations/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-realtime/SKILL.md +443 -0
- package/assets/.agent/skills/convex-realtime/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-realtime/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-realtime/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-schema-validator/SKILL.md +400 -0
- package/assets/.agent/skills/convex-schema-validator/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-schema-validator/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-schema-validator/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-security-audit/SKILL.md +539 -0
- package/assets/.agent/skills/convex-security-audit/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-security-audit/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-security-audit/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/convex-security-check/SKILL.md +378 -0
- package/assets/.agent/skills/convex-security-check/agents/openai.yaml +3 -0
- package/assets/.agent/skills/convex-security-check/assets/large-logo.png +0 -0
- package/assets/.agent/skills/convex-security-check/assets/small-logo.svg +17 -0
- package/assets/.agent/skills/github-ops/SKILL.md +4 -4
- package/assets/.agent/skills/google-trends/SKILL.md +7 -7
- package/assets/.agent/skills/optimize-agent-context/SKILL.md +97 -0
- package/assets/.agent/skills/youtube-pipeline/SKILL.md +10 -10
- package/assets/.agent/workflows/LEGACY/init_smart_ops.md +2 -2
- package/assets/.agent/workflows/agent_reset.md +4 -6
- package/assets/.agent/workflows/mode-orchestrator.md +17 -22
- package/assets/.agent/workflows/mode-visionary.md +3 -10
- package/assets/.agent/workflows/optimize-agent-context.md +54 -0
- package/assets/.agent/workflows/remotion-build.md +17 -17
- package/assets/.agent/workflows/stitch.md +4 -4
- package/assets/VibeCode-Agents/vibe-orchestrator.yaml +14 -33
- package/assets/VibeCode-Agents/vibe-visionary.yaml +3 -13
- package/package.json +1 -1
- package/src/cli.js +416 -20
- package/src/harness.js +281 -0
- package/src/store.js +239 -0
- package/assets/VibeCode-Agents/custom_modes.yaml +0 -979
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: convex-security-check
|
|
3
|
+
displayName: Convex Security Check
|
|
4
|
+
description: Quick security audit checklist covering authentication, function exposure, argument validation, row-level access control, and environment variable handling
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
author: Convex
|
|
7
|
+
tags: [convex, security, authentication, authorization, checklist]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Convex Security Check
|
|
11
|
+
|
|
12
|
+
A quick security audit checklist for Convex applications covering authentication, function exposure, argument validation, row-level access control, and environment variable handling.
|
|
13
|
+
|
|
14
|
+
## Documentation Sources
|
|
15
|
+
|
|
16
|
+
Before implementing, do not assume; fetch the latest documentation:
|
|
17
|
+
|
|
18
|
+
- Primary: https://docs.convex.dev/auth
|
|
19
|
+
- Production Security: https://docs.convex.dev/production
|
|
20
|
+
- Functions Auth: https://docs.convex.dev/auth/functions-auth
|
|
21
|
+
- For broader context: https://docs.convex.dev/llms.txt
|
|
22
|
+
|
|
23
|
+
## Instructions
|
|
24
|
+
|
|
25
|
+
### Security Checklist
|
|
26
|
+
|
|
27
|
+
Use this checklist to quickly audit your Convex application's security:
|
|
28
|
+
|
|
29
|
+
#### 1. Authentication
|
|
30
|
+
|
|
31
|
+
- [ ] Authentication provider configured (Clerk, Auth0, etc.)
|
|
32
|
+
- [ ] All sensitive queries check `ctx.auth.getUserIdentity()`
|
|
33
|
+
- [ ] Unauthenticated access explicitly allowed where intended
|
|
34
|
+
- [ ] Session tokens properly validated
|
|
35
|
+
|
|
36
|
+
#### 2. Function Exposure
|
|
37
|
+
|
|
38
|
+
- [ ] Public functions (`query`, `mutation`, `action`) reviewed
|
|
39
|
+
- [ ] Internal functions use `internalQuery`, `internalMutation`, `internalAction`
|
|
40
|
+
- [ ] No sensitive operations exposed as public functions
|
|
41
|
+
- [ ] HTTP actions validate origin/authentication
|
|
42
|
+
|
|
43
|
+
#### 3. Argument Validation
|
|
44
|
+
|
|
45
|
+
- [ ] All functions have explicit `args` validators
|
|
46
|
+
- [ ] All functions have explicit `returns` validators
|
|
47
|
+
- [ ] No `v.any()` used for sensitive data
|
|
48
|
+
- [ ] ID validators use correct table names
|
|
49
|
+
|
|
50
|
+
#### 4. Row-Level Access Control
|
|
51
|
+
|
|
52
|
+
- [ ] Users can only access their own data
|
|
53
|
+
- [ ] Admin functions check user roles
|
|
54
|
+
- [ ] Shared resources have proper access checks
|
|
55
|
+
- [ ] Deletion functions verify ownership
|
|
56
|
+
|
|
57
|
+
#### 5. Environment Variables
|
|
58
|
+
|
|
59
|
+
- [ ] API keys stored in environment variables
|
|
60
|
+
- [ ] No secrets in code or schema
|
|
61
|
+
- [ ] Different keys for dev/prod environments
|
|
62
|
+
- [ ] Environment variables accessed only in actions
|
|
63
|
+
|
|
64
|
+
### Authentication Check
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// convex/auth.ts
|
|
68
|
+
import { query, mutation } from "./_generated/server";
|
|
69
|
+
import { v } from "convex/values";
|
|
70
|
+
import { ConvexError } from "convex/values";
|
|
71
|
+
|
|
72
|
+
// Helper to require authentication
|
|
73
|
+
async function requireAuth(ctx: QueryCtx | MutationCtx) {
|
|
74
|
+
const identity = await ctx.auth.getUserIdentity();
|
|
75
|
+
if (!identity) {
|
|
76
|
+
throw new ConvexError("Authentication required");
|
|
77
|
+
}
|
|
78
|
+
return identity;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Secure query pattern
|
|
82
|
+
export const getMyProfile = query({
|
|
83
|
+
args: {},
|
|
84
|
+
returns: v.union(v.object({
|
|
85
|
+
_id: v.id("users"),
|
|
86
|
+
name: v.string(),
|
|
87
|
+
email: v.string(),
|
|
88
|
+
}), v.null()),
|
|
89
|
+
handler: async (ctx) => {
|
|
90
|
+
const identity = await requireAuth(ctx);
|
|
91
|
+
|
|
92
|
+
return await ctx.db
|
|
93
|
+
.query("users")
|
|
94
|
+
.withIndex("by_tokenIdentifier", (q) =>
|
|
95
|
+
q.eq("tokenIdentifier", identity.tokenIdentifier)
|
|
96
|
+
)
|
|
97
|
+
.unique();
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Function Exposure Check
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// PUBLIC - Exposed to clients (review carefully!)
|
|
106
|
+
export const listPublicPosts = query({
|
|
107
|
+
args: {},
|
|
108
|
+
returns: v.array(v.object({ /* ... */ })),
|
|
109
|
+
handler: async (ctx) => {
|
|
110
|
+
// Anyone can call this - intentionally public
|
|
111
|
+
return await ctx.db
|
|
112
|
+
.query("posts")
|
|
113
|
+
.withIndex("by_public", (q) => q.eq("isPublic", true))
|
|
114
|
+
.collect();
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// INTERNAL - Only callable from other Convex functions
|
|
119
|
+
export const _updateUserCredits = internalMutation({
|
|
120
|
+
args: { userId: v.id("users"), amount: v.number() },
|
|
121
|
+
returns: v.null(),
|
|
122
|
+
handler: async (ctx, args) => {
|
|
123
|
+
// This cannot be called directly from clients
|
|
124
|
+
await ctx.db.patch(args.userId, {
|
|
125
|
+
credits: args.amount,
|
|
126
|
+
});
|
|
127
|
+
return null;
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Argument Validation Check
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// GOOD: Strict validation
|
|
136
|
+
export const createPost = mutation({
|
|
137
|
+
args: {
|
|
138
|
+
title: v.string(),
|
|
139
|
+
content: v.string(),
|
|
140
|
+
category: v.union(
|
|
141
|
+
v.literal("tech"),
|
|
142
|
+
v.literal("news"),
|
|
143
|
+
v.literal("other")
|
|
144
|
+
),
|
|
145
|
+
},
|
|
146
|
+
returns: v.id("posts"),
|
|
147
|
+
handler: async (ctx, args) => {
|
|
148
|
+
const identity = await requireAuth(ctx);
|
|
149
|
+
return await ctx.db.insert("posts", {
|
|
150
|
+
...args,
|
|
151
|
+
authorId: identity.tokenIdentifier,
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// BAD: Weak validation
|
|
157
|
+
export const createPostUnsafe = mutation({
|
|
158
|
+
args: {
|
|
159
|
+
data: v.any(), // DANGEROUS: Allows any data
|
|
160
|
+
},
|
|
161
|
+
returns: v.id("posts"),
|
|
162
|
+
handler: async (ctx, args) => {
|
|
163
|
+
return await ctx.db.insert("posts", args.data);
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Row-Level Access Control Check
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
// Verify ownership before update
|
|
172
|
+
export const updateTask = mutation({
|
|
173
|
+
args: {
|
|
174
|
+
taskId: v.id("tasks"),
|
|
175
|
+
title: v.string(),
|
|
176
|
+
},
|
|
177
|
+
returns: v.null(),
|
|
178
|
+
handler: async (ctx, args) => {
|
|
179
|
+
const identity = await requireAuth(ctx);
|
|
180
|
+
|
|
181
|
+
const task = await ctx.db.get(args.taskId);
|
|
182
|
+
|
|
183
|
+
// Check ownership
|
|
184
|
+
if (!task || task.userId !== identity.tokenIdentifier) {
|
|
185
|
+
throw new ConvexError("Not authorized to update this task");
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
await ctx.db.patch(args.taskId, { title: args.title });
|
|
189
|
+
return null;
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Verify ownership before delete
|
|
194
|
+
export const deleteTask = mutation({
|
|
195
|
+
args: { taskId: v.id("tasks") },
|
|
196
|
+
returns: v.null(),
|
|
197
|
+
handler: async (ctx, args) => {
|
|
198
|
+
const identity = await requireAuth(ctx);
|
|
199
|
+
|
|
200
|
+
const task = await ctx.db.get(args.taskId);
|
|
201
|
+
|
|
202
|
+
if (!task || task.userId !== identity.tokenIdentifier) {
|
|
203
|
+
throw new ConvexError("Not authorized to delete this task");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
await ctx.db.delete(args.taskId);
|
|
207
|
+
return null;
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Environment Variables Check
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// convex/actions.ts
|
|
216
|
+
"use node";
|
|
217
|
+
|
|
218
|
+
import { action } from "./_generated/server";
|
|
219
|
+
import { v } from "convex/values";
|
|
220
|
+
|
|
221
|
+
export const sendEmail = action({
|
|
222
|
+
args: {
|
|
223
|
+
to: v.string(),
|
|
224
|
+
subject: v.string(),
|
|
225
|
+
body: v.string(),
|
|
226
|
+
},
|
|
227
|
+
returns: v.object({ success: v.boolean() }),
|
|
228
|
+
handler: async (ctx, args) => {
|
|
229
|
+
// Access API key from environment
|
|
230
|
+
const apiKey = process.env.RESEND_API_KEY;
|
|
231
|
+
|
|
232
|
+
if (!apiKey) {
|
|
233
|
+
throw new Error("RESEND_API_KEY not configured");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const response = await fetch("https://api.resend.com/emails", {
|
|
237
|
+
method: "POST",
|
|
238
|
+
headers: {
|
|
239
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
240
|
+
"Content-Type": "application/json",
|
|
241
|
+
},
|
|
242
|
+
body: JSON.stringify({
|
|
243
|
+
from: "noreply@example.com",
|
|
244
|
+
to: args.to,
|
|
245
|
+
subject: args.subject,
|
|
246
|
+
html: args.body,
|
|
247
|
+
}),
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
return { success: response.ok };
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Examples
|
|
256
|
+
|
|
257
|
+
### Complete Security Pattern
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
// convex/secure.ts
|
|
261
|
+
import { query, mutation, internalMutation } from "./_generated/server";
|
|
262
|
+
import { v } from "convex/values";
|
|
263
|
+
import { ConvexError } from "convex/values";
|
|
264
|
+
|
|
265
|
+
// Authentication helper
|
|
266
|
+
async function getAuthenticatedUser(ctx: QueryCtx | MutationCtx) {
|
|
267
|
+
const identity = await ctx.auth.getUserIdentity();
|
|
268
|
+
if (!identity) {
|
|
269
|
+
throw new ConvexError({
|
|
270
|
+
code: "UNAUTHENTICATED",
|
|
271
|
+
message: "You must be logged in",
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const user = await ctx.db
|
|
276
|
+
.query("users")
|
|
277
|
+
.withIndex("by_tokenIdentifier", (q) =>
|
|
278
|
+
q.eq("tokenIdentifier", identity.tokenIdentifier)
|
|
279
|
+
)
|
|
280
|
+
.unique();
|
|
281
|
+
|
|
282
|
+
if (!user) {
|
|
283
|
+
throw new ConvexError({
|
|
284
|
+
code: "USER_NOT_FOUND",
|
|
285
|
+
message: "User profile not found",
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return user;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Check admin role
|
|
293
|
+
async function requireAdmin(ctx: QueryCtx | MutationCtx) {
|
|
294
|
+
const user = await getAuthenticatedUser(ctx);
|
|
295
|
+
|
|
296
|
+
if (user.role !== "admin") {
|
|
297
|
+
throw new ConvexError({
|
|
298
|
+
code: "FORBIDDEN",
|
|
299
|
+
message: "Admin access required",
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return user;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Public: List own tasks
|
|
307
|
+
export const listMyTasks = query({
|
|
308
|
+
args: {},
|
|
309
|
+
returns: v.array(v.object({
|
|
310
|
+
_id: v.id("tasks"),
|
|
311
|
+
title: v.string(),
|
|
312
|
+
completed: v.boolean(),
|
|
313
|
+
})),
|
|
314
|
+
handler: async (ctx) => {
|
|
315
|
+
const user = await getAuthenticatedUser(ctx);
|
|
316
|
+
|
|
317
|
+
return await ctx.db
|
|
318
|
+
.query("tasks")
|
|
319
|
+
.withIndex("by_user", (q) => q.eq("userId", user._id))
|
|
320
|
+
.collect();
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
// Admin only: List all users
|
|
325
|
+
export const listAllUsers = query({
|
|
326
|
+
args: {},
|
|
327
|
+
returns: v.array(v.object({
|
|
328
|
+
_id: v.id("users"),
|
|
329
|
+
name: v.string(),
|
|
330
|
+
role: v.string(),
|
|
331
|
+
})),
|
|
332
|
+
handler: async (ctx) => {
|
|
333
|
+
await requireAdmin(ctx);
|
|
334
|
+
|
|
335
|
+
return await ctx.db.query("users").collect();
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// Internal: Update user role (never exposed)
|
|
340
|
+
export const _setUserRole = internalMutation({
|
|
341
|
+
args: {
|
|
342
|
+
userId: v.id("users"),
|
|
343
|
+
role: v.union(v.literal("user"), v.literal("admin")),
|
|
344
|
+
},
|
|
345
|
+
returns: v.null(),
|
|
346
|
+
handler: async (ctx, args) => {
|
|
347
|
+
await ctx.db.patch(args.userId, { role: args.role });
|
|
348
|
+
return null;
|
|
349
|
+
},
|
|
350
|
+
});
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Best Practices
|
|
354
|
+
|
|
355
|
+
- Never run `npx convex deploy` unless explicitly instructed
|
|
356
|
+
- Never run any git commands unless explicitly instructed
|
|
357
|
+
- Always verify user identity before returning sensitive data
|
|
358
|
+
- Use internal functions for sensitive operations
|
|
359
|
+
- Validate all arguments with strict validators
|
|
360
|
+
- Check ownership before update/delete operations
|
|
361
|
+
- Store API keys in environment variables
|
|
362
|
+
- Review all public functions for security implications
|
|
363
|
+
|
|
364
|
+
## Common Pitfalls
|
|
365
|
+
|
|
366
|
+
1. **Missing authentication checks** - Always verify identity
|
|
367
|
+
2. **Exposing internal operations** - Use internalMutation/Query
|
|
368
|
+
3. **Trusting client-provided IDs** - Verify ownership
|
|
369
|
+
4. **Using v.any() for arguments** - Use specific validators
|
|
370
|
+
5. **Hardcoding secrets** - Use environment variables
|
|
371
|
+
|
|
372
|
+
## References
|
|
373
|
+
|
|
374
|
+
- Convex Documentation: https://docs.convex.dev/
|
|
375
|
+
- Convex LLMs.txt: https://docs.convex.dev/llms.txt
|
|
376
|
+
- Authentication: https://docs.convex.dev/auth
|
|
377
|
+
- Production Security: https://docs.convex.dev/production
|
|
378
|
+
- Functions Auth: https://docs.convex.dev/auth/functions-auth
|
|
Binary file
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g clip-path="url(#clip0_3_23)">
|
|
3
|
+
<g clip-path="url(#clip1_3_23)">
|
|
4
|
+
<path d="M10.0643 12.5735C12.3769 12.3166 14.5572 11.0843 15.7577 9.02756C15.1892 14.1148 9.62646 17.3302 5.08583 15.356C4.66743 15.1746 4.30728 14.8728 4.06013 14.4848C3.03973 12.8825 2.7043 10.8437 3.18626 8.99344C4.56327 11.37 7.3632 12.8267 10.0643 12.5735Z" fill="#F3B01C"/>
|
|
5
|
+
<path d="M3.1018 7.50072C2.16436 9.66714 2.12376 12.2034 3.27303 14.2907C-0.771507 11.2479 -0.72737 4.7362 3.2236 1.72378C3.58904 1.44535 4.02333 1.2801 4.47881 1.25494C6.3519 1.15614 8.25501 1.88006 9.58963 3.22909C6.87799 3.25604 4.23695 4.99308 3.1018 7.50072Z" fill="#8D2676"/>
|
|
6
|
+
<path d="M10.8974 3.89562C9.52924 1.98794 7.38779 0.68921 5.04156 0.649695C9.57686 -1.40888 15.1555 1.92867 15.7629 6.86314C15.8194 7.32119 15.7452 7.78824 15.5421 8.20138C14.6948 9.92223 13.1236 11.2569 11.2876 11.7508C12.6328 9.25579 12.4668 6.20748 10.8974 3.89562Z" fill="#EE342F"/>
|
|
7
|
+
</g>
|
|
8
|
+
</g>
|
|
9
|
+
<defs>
|
|
10
|
+
<clipPath id="clip0_3_23">
|
|
11
|
+
<rect width="16" height="16" fill="white"/>
|
|
12
|
+
</clipPath>
|
|
13
|
+
<clipPath id="clip1_3_23">
|
|
14
|
+
<rect width="16" height="16" fill="white"/>
|
|
15
|
+
</clipPath>
|
|
16
|
+
</defs>
|
|
17
|
+
</svg>
|
|
@@ -102,16 +102,16 @@ gh project field-create NUMBER --owner USERNAME --name "Target Date" --data-type
|
|
|
102
102
|
|
|
103
103
|
```powershell
|
|
104
104
|
# Basic: Create new issues only
|
|
105
|
-
powershell -ExecutionPolicy Bypass -File
|
|
105
|
+
powershell -ExecutionPolicy Bypass -File .agent/skills/github-ops/scripts/publish_issues.ps1
|
|
106
106
|
|
|
107
107
|
# Dry run preview
|
|
108
|
-
powershell -ExecutionPolicy Bypass -File
|
|
108
|
+
powershell -ExecutionPolicy Bypass -File .agent/skills/github-ops/scripts/publish_issues.ps1 -Update -DryRun
|
|
109
109
|
|
|
110
110
|
# Update + archive completed
|
|
111
|
-
powershell -ExecutionPolicy Bypass -File
|
|
111
|
+
powershell -ExecutionPolicy Bypass -File .agent/skills/github-ops/scripts/publish_issues.ps1 -Update -AutoArchive
|
|
112
112
|
|
|
113
113
|
# Full sync with project dates
|
|
114
|
-
powershell -ExecutionPolicy Bypass -File
|
|
114
|
+
powershell -ExecutionPolicy Bypass -File .agent/skills/github-ops/scripts/publish_issues.ps1 `
|
|
115
115
|
-Update -AutoArchive -SyncDates `
|
|
116
116
|
-ProjectNumber 7 `
|
|
117
117
|
-ProjectId "PVT_xxx" `
|
|
@@ -16,7 +16,7 @@ Node.js 18+ and PNPM required.
|
|
|
16
16
|
node --version
|
|
17
17
|
|
|
18
18
|
# Install dependencies (first-time only)
|
|
19
|
-
cd
|
|
19
|
+
cd .agent/skills/google-trends/scripts
|
|
20
20
|
pnpm install
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -26,16 +26,16 @@ pnpm install
|
|
|
26
26
|
|
|
27
27
|
```powershell
|
|
28
28
|
# Basic search (YouTube, Last 7 Days, Tech category)
|
|
29
|
-
node
|
|
29
|
+
node .agent/skills/google-trends/scripts/search.js -k "Claude AI"
|
|
30
30
|
|
|
31
31
|
# Search Web instead of YouTube
|
|
32
|
-
node
|
|
32
|
+
node .agent/skills/google-trends/scripts/search.js -k "AI agents" -p web
|
|
33
33
|
|
|
34
34
|
# Extended time range (1 month)
|
|
35
|
-
node
|
|
35
|
+
node .agent/skills/google-trends/scripts/search.js -k "VibeCoding" -t "now 1-m"
|
|
36
36
|
|
|
37
37
|
# Output as JSON for piping
|
|
38
|
-
node
|
|
38
|
+
node .agent/skills/google-trends/scripts/search.js -k "Cursor IDE" -o json
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
---
|
|
@@ -96,7 +96,7 @@ Use this skill during `/youtube-phase1-strategy` to validate topics:
|
|
|
96
96
|
|
|
97
97
|
```powershell
|
|
98
98
|
# Check if "Claude Cowork" is rising on YouTube
|
|
99
|
-
node
|
|
99
|
+
node .agent/skills/google-trends/scripts/search.js -k "Claude Cowork" -p youtube -t "now 7-d"
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
**Signal:** Look for `BREAKOUT` or values > 100 in related queries.
|
|
@@ -105,7 +105,7 @@ node ~/.gemini/antigravity/skills/google-trends/scripts/search.js -k "Claude Cow
|
|
|
105
105
|
|
|
106
106
|
```powershell
|
|
107
107
|
# Is "RAG" still trending in AI?
|
|
108
|
-
node
|
|
108
|
+
node .agent/skills/google-trends/scripts/search.js -k "RAG AI" -p web -t "today 3-m" --interest
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
**Signal:** Check if interest-over-time is increasing or peaked.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: optimize-agent-context
|
|
3
|
+
description: >
|
|
4
|
+
Create, audit, or optimize agent.md, claude.md, cursorrules, or any AI coding agent context file
|
|
5
|
+
using the "Band-Aid Philosophy." Strips bloat, enforces minimalism, and ensures only failure-correcting
|
|
6
|
+
rules remain. Use when the user mentions: "agent.md", "claude.md", "cursorrules", ".clinerules",
|
|
7
|
+
"AGENTS.md", "context file", "optimize context", "agent instructions", "reduce agent bloat",
|
|
8
|
+
"agent keeps making mistakes", "fix my agent file", "create agent file", "audit agent context",
|
|
9
|
+
or any variant of writing/improving AI coding agent instruction files.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Optimize Agent Context
|
|
13
|
+
|
|
14
|
+
Enforce the **Band-Aid Philosophy**: an agent context file should only contain rules that fix mistakes the agent is actively making. Everything else is bloat that degrades performance and increases cost.
|
|
15
|
+
|
|
16
|
+
## Core Rules (Non-Negotiable)
|
|
17
|
+
|
|
18
|
+
1. **NO BLOAT** — Never include directory structures, file trees, dependency lists, or package inventories. The agent has tools to discover these.
|
|
19
|
+
2. **NO SUMMARIES** — Never include vague app descriptions ("This is a video sharing app"). This distracts the model and triggers hallucinations.
|
|
20
|
+
3. **ONLY FIX KNOWN FAILURES** — Every line must correct a specific, observed agent mistake or enforce an architectural constraint the agent cannot guess.
|
|
21
|
+
4. **USE NEGATIVE CONSTRAINTS** — When the agent uses the wrong tool/library, explicitly state what NOT to use, then what TO use.
|
|
22
|
+
5. **BE MINIMAL** — Target under 20 lines. Bullet points preferred. If a rule can be removed without the agent breaking, remove it.
|
|
23
|
+
|
|
24
|
+
## Why This Matters
|
|
25
|
+
|
|
26
|
+
Studies show bloated, AI-generated context files:
|
|
27
|
+
- **Degrade agent performance by ~3%**
|
|
28
|
+
- **Increase token costs by 20%+**
|
|
29
|
+
- Trigger hallucinations by surfacing legacy code the agent then tries to use ("pink elephants" effect)
|
|
30
|
+
|
|
31
|
+
## Workflow
|
|
32
|
+
|
|
33
|
+
### Mode A: Create New Agent File (Interview)
|
|
34
|
+
|
|
35
|
+
When the user wants to create a new context file from scratch:
|
|
36
|
+
|
|
37
|
+
1. **Ask these questions one at a time** (do not dump all at once):
|
|
38
|
+
- "What specific mistakes has the AI agent been making repeatedly?" (e.g., wrong imports, forgetting to format, modifying wrong files)
|
|
39
|
+
- "Are there legacy tools/libraries the agent keeps using but shouldn't?" (e.g., "We have Redux but use Zustand for new features")
|
|
40
|
+
- "Any build/test/env quirks the agent can't figure out on its own?" (e.g., special env vars, non-standard test commands)
|
|
41
|
+
|
|
42
|
+
2. **Synthesize** answers into a ruthlessly minimal bulleted markdown file.
|
|
43
|
+
|
|
44
|
+
3. **Validate** the output against the Core Rules above. Strip anything that violates them.
|
|
45
|
+
|
|
46
|
+
4. **Present** the file and ask: "Does this capture the mistakes? Anything to add or remove?"
|
|
47
|
+
|
|
48
|
+
### Mode B: Audit Existing Agent File
|
|
49
|
+
|
|
50
|
+
When the user has an existing `agent.md` / `claude.md` / `cursorrules` and wants it optimized:
|
|
51
|
+
|
|
52
|
+
1. **Read the file** using `view_file`.
|
|
53
|
+
2. **Classify every line** into one of:
|
|
54
|
+
- ✅ **KEEP** — Fixes a known failure or states an ungessable constraint
|
|
55
|
+
- ❌ **BLOAT** — Directory trees, dependency lists, file structures
|
|
56
|
+
- ❌ **SUMMARY** — Vague app descriptions, project overviews
|
|
57
|
+
- ❌ **OBVIOUS** — Things the agent can discover via tools (package.json, tsconfig, etc.)
|
|
58
|
+
- ⚠️ **MAYBE** — Potentially useful but needs user confirmation
|
|
59
|
+
3. **Present the audit** as a table showing each section and its classification.
|
|
60
|
+
4. **Generate the optimized version** with only ✅ KEEP and confirmed ⚠️ MAYBE lines.
|
|
61
|
+
5. **Show before/after line count** to demonstrate the reduction.
|
|
62
|
+
|
|
63
|
+
### Mode C: Add a Band-Aid
|
|
64
|
+
|
|
65
|
+
When the user reports a specific agent mistake mid-session:
|
|
66
|
+
|
|
67
|
+
1. Ask: "What did the agent do wrong?"
|
|
68
|
+
2. Write a single, precise negative constraint: `Do NOT [wrong thing]. Instead, [correct thing].`
|
|
69
|
+
3. Suggest appending it to the existing context file.
|
|
70
|
+
|
|
71
|
+
## Output Format
|
|
72
|
+
|
|
73
|
+
The generated file should follow this structure:
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
# Agent Rules
|
|
77
|
+
|
|
78
|
+
- [Negative constraint or correction]
|
|
79
|
+
- [Negative constraint or correction]
|
|
80
|
+
- [Build/test quirk]
|
|
81
|
+
- [Architectural constraint]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**No headers beyond the title. No explanations. No examples. Just rules.**
|
|
85
|
+
|
|
86
|
+
## Anti-Patterns to Reject
|
|
87
|
+
|
|
88
|
+
If the user or another agent tries to include any of these, push back:
|
|
89
|
+
|
|
90
|
+
| Anti-Pattern | Why It's Bad |
|
|
91
|
+
|---|---|
|
|
92
|
+
| Folder tree / file structure | Agent has `list_dir` and `find_by_name` |
|
|
93
|
+
| Dependency list | Agent reads `package.json` / `requirements.txt` |
|
|
94
|
+
| "This app is a..." summary | Distracts model, triggers hallucination |
|
|
95
|
+
| Tech stack overview | Agent reads config files |
|
|
96
|
+
| Code style rules already in linter config | Redundant — linter enforces these |
|
|
97
|
+
| Long code examples | Bloats context, agent writes its own code |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
2
|
name: youtube-pipeline
|
|
3
3
|
description: Complete YouTube video production pipeline from ideation to distribution. Covers Strategy (Phase 1), Packaging (Phase 2), Scripting (Phase 3), Shorts (Phase 3.5), Production (Phase 4), and Repurposing (Phase 5).
|
|
4
4
|
---
|
|
@@ -27,13 +27,13 @@ The workflow docs are bundled in this skill's `resources/` folder for quick acce
|
|
|
27
27
|
|
|
28
28
|
**Workflow Files (Local):**
|
|
29
29
|
```
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
.agent/skills/youtube-pipeline/resources/youtube-pipeline.md
|
|
31
|
+
.agent/skills/youtube-pipeline/resources/youtube-phase1-strategy.md
|
|
32
|
+
.agent/skills/youtube-pipeline/resources/youtube-phase2-packaging.md
|
|
33
|
+
.agent/skills/youtube-pipeline/resources/youtube-phase3-scripting.md
|
|
34
|
+
.agent/skills/youtube-pipeline/resources/youtube-phase3.5-shorts.md
|
|
35
|
+
.agent/skills/youtube-pipeline/resources/youtube-phase4-production.md
|
|
36
|
+
.agent/skills/youtube-pipeline/resources/youtube-phase5-repurposing.md
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
**Source of Truth (User's Vault):**
|
|
@@ -53,8 +53,8 @@ c:\CreativeOS\Creator_Command_Hub_Obsidian\📁 YouTube Brain\📝 01-Prompt\Sho
|
|
|
53
53
|
|
|
54
54
|
**Automation Scripts (Phase 1):**
|
|
55
55
|
```
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
.agent/skills/youtube-pipeline/scripts/parse_yt_studio.ps1 # Parse YT Studio Inspiration HTML
|
|
57
|
+
.agent/skills/google-trends/scripts/search.js # Google Trends CLI (separate skill)
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
---
|
|
@@ -6,7 +6,7 @@ description: Initialize Smart Ops for this repository with automatic OS detectio
|
|
|
6
6
|
|
|
7
7
|
One-time setup to generate GitHub automation scripts for your repository.
|
|
8
8
|
|
|
9
|
-
> **Skill Reference:** Read
|
|
9
|
+
> **Skill Reference:** Read `.agent/skills/github-ops/SKILL.md` for templates and patterns.
|
|
10
10
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
@@ -20,7 +20,7 @@ User: "/init_smart_ops"
|
|
|
20
20
|
|
|
21
21
|
### 1. Read the Skill First
|
|
22
22
|
```
|
|
23
|
-
view_file
|
|
23
|
+
view_file .agent/skills/github-ops/SKILL.md
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
### 2. Detect OS
|
|
@@ -21,14 +21,12 @@ You are exhibiting context degradation. Before doing ANYTHING:
|
|
|
21
21
|
|
|
22
22
|
### 0. Re-Discover Available Skills & Workflows
|
|
23
23
|
|
|
24
|
-
You may have forgotten what tools are available.
|
|
24
|
+
You may have forgotten what tools are available.
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
# Global (always available)
|
|
28
|
-
ls ~/.gemini/antigravity/skills/
|
|
29
|
-
ls ~/.gemini/antigravity/global_workflows/
|
|
26
|
+
**Your system prompt lists all available skills and workflows with their full absolute paths.** Check there FIRST.
|
|
30
27
|
|
|
31
|
-
|
|
28
|
+
Fallback (if not in system prompt):
|
|
29
|
+
```bash
|
|
32
30
|
ls .agent/skills/ 2>/dev/null
|
|
33
31
|
ls .agent/workflows/ 2>/dev/null
|
|
34
32
|
```
|