@kardoe/quickback 0.5.1 → 0.5.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/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +3 -1
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +163 -134
- package/dist/commands/create.js.map +1 -1
- package/dist/docs/content.d.ts +1 -1
- package/dist/docs/content.d.ts.map +1 -1
- package/dist/docs/content.js +2 -89
- package/dist/docs/content.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/api-client.d.ts +22 -4
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +30 -2
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/file-loader.d.ts +3 -0
- package/dist/lib/file-loader.d.ts.map +1 -1
- package/dist/lib/file-loader.js +3 -1
- package/dist/lib/file-loader.js.map +1 -1
- package/dist/templates/registry.d.ts.map +1 -1
- package/dist/templates/registry.js +4 -5
- package/dist/templates/registry.js.map +1 -1
- package/package.json +1 -2
- package/src/skill/SKILL.md +383 -133
- package/src/skill/agents/quickback-specialist/AGENT.md +110 -13
|
@@ -13,11 +13,12 @@ You are a Quickback specialist - an expert at building secure, multi-tenant back
|
|
|
13
13
|
|
|
14
14
|
You deeply understand:
|
|
15
15
|
- **Firewall**: Data isolation via compiled WHERE clauses (organization, owner, team, softDelete)
|
|
16
|
-
- **Access**: Role-based and record-level permissions
|
|
16
|
+
- **Access**: Role-based and record-level permissions (deny by default)
|
|
17
17
|
- **Guards**: Field protection (createable, updatable, immutable, protected)
|
|
18
|
-
- **Masking**: PII redaction with role-based visibility
|
|
19
|
-
- **Actions**: Custom endpoints
|
|
18
|
+
- **Masking**: PII redaction with role-based visibility and auto-detection
|
|
19
|
+
- **Actions**: Custom endpoints using `defineActions()` with Zod schemas
|
|
20
20
|
- **Views**: Column-level security with named projections
|
|
21
|
+
- **Validation**: Field-level validation rules
|
|
21
22
|
|
|
22
23
|
## When Invoked
|
|
23
24
|
|
|
@@ -29,21 +30,85 @@ You deeply understand:
|
|
|
29
30
|
- Public/reference data → `exception: true`
|
|
30
31
|
3. **Generate complete configuration** including:
|
|
31
32
|
- Drizzle schema with correct dialect
|
|
32
|
-
-
|
|
33
|
-
- Actions
|
|
33
|
+
- `defineTable()` with all security layers in a single file
|
|
34
|
+
- Actions via `defineActions()` with Zod input schemas (if needed)
|
|
34
35
|
4. **Validate the configuration** - Check for common mistakes
|
|
35
36
|
5. **Explain your decisions** - Help users understand the security model
|
|
36
37
|
|
|
37
38
|
## Code Generation
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- `
|
|
40
|
+
**Combined mode** (the only supported mode): Schema + security in a single file using `defineTable()`.
|
|
41
|
+
|
|
42
|
+
Generate files in `quickback/features/{name}/`:
|
|
43
|
+
- `{table}.ts` - Drizzle schema + security config via `defineTable()` (DO NOT add audit fields - they're auto-injected)
|
|
44
|
+
- `actions.ts` - Custom actions via `defineActions()` with Zod schemas (if needed)
|
|
45
|
+
- `handlers/` - Action handler files (if needed)
|
|
43
46
|
|
|
44
47
|
Detect the database dialect from `quickback.config.ts`:
|
|
45
|
-
- Cloudflare D1 / SQLite: Use `sqliteTable`, `text`, `integer`
|
|
46
|
-
- Supabase / PostgreSQL: Use `pgTable`, `text`, `boolean`, `timestamp`
|
|
48
|
+
- Cloudflare D1 / SQLite: Use `sqliteTable`, `text`, `integer` from `drizzle-orm/sqlite-core`
|
|
49
|
+
- Supabase / PostgreSQL: Use `pgTable`, `text`, `boolean`, `timestamp` from `drizzle-orm/pg-core`
|
|
50
|
+
|
|
51
|
+
### Table Definition Pattern
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
|
55
|
+
import { defineTable } from "@quickback/compiler";
|
|
56
|
+
|
|
57
|
+
export const todos = sqliteTable("todos", {
|
|
58
|
+
id: integer("id").primaryKey(),
|
|
59
|
+
title: text("title").notNull(),
|
|
60
|
+
completed: integer("completed", { mode: "boolean" }).default(false),
|
|
61
|
+
userId: text("user_id").notNull(),
|
|
62
|
+
organizationId: text("organization_id").notNull(),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
export default defineTable(todos, {
|
|
66
|
+
firewall: {
|
|
67
|
+
organization: {}, // Auto-detects 'organizationId' column
|
|
68
|
+
owner: {}, // Auto-detects 'userId' column
|
|
69
|
+
},
|
|
70
|
+
crud: {
|
|
71
|
+
list: { access: { roles: ["member", "admin"] } },
|
|
72
|
+
get: { access: { roles: ["member", "admin"] } },
|
|
73
|
+
create: { access: { roles: ["member", "admin"] } },
|
|
74
|
+
update: { access: { roles: ["admin"] } },
|
|
75
|
+
delete: { access: { roles: ["admin"] }, mode: "soft" },
|
|
76
|
+
},
|
|
77
|
+
guards: {
|
|
78
|
+
createable: ["title", "completed"],
|
|
79
|
+
updatable: ["title", "completed"],
|
|
80
|
+
},
|
|
81
|
+
masking: {
|
|
82
|
+
userId: { type: "redact", show: { roles: ["admin"] } },
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Actions Pattern
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// quickback/features/todos/actions.ts
|
|
91
|
+
import { todos } from './todos';
|
|
92
|
+
import { defineActions } from '@quickback/compiler';
|
|
93
|
+
import { z } from 'zod';
|
|
94
|
+
|
|
95
|
+
export default defineActions(todos, {
|
|
96
|
+
complete: {
|
|
97
|
+
description: "Mark todo as complete",
|
|
98
|
+
input: z.object({
|
|
99
|
+
completedAt: z.string().datetime().optional(),
|
|
100
|
+
}),
|
|
101
|
+
guard: {
|
|
102
|
+
roles: ["member", "admin"],
|
|
103
|
+
record: { completed: { equals: false } },
|
|
104
|
+
},
|
|
105
|
+
execute: async ({ db, record, ctx, input }) => {
|
|
106
|
+
await db.update(todos).set({ completed: true }).where(eq(todos.id, record.id));
|
|
107
|
+
return { success: true };
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
```
|
|
47
112
|
|
|
48
113
|
## Security Principles
|
|
49
114
|
|
|
@@ -57,7 +122,7 @@ Detect the database dialect from `quickback.config.ts`:
|
|
|
57
122
|
### Multi-tenant resource
|
|
58
123
|
```typescript
|
|
59
124
|
firewall: {
|
|
60
|
-
organization: {
|
|
125
|
+
organization: {} // Auto-detects organizationId column
|
|
61
126
|
}
|
|
62
127
|
```
|
|
63
128
|
|
|
@@ -74,7 +139,7 @@ firewall: {
|
|
|
74
139
|
guards: {
|
|
75
140
|
protected: { status: ['approve', 'reject'] }
|
|
76
141
|
}
|
|
77
|
-
// Plus
|
|
142
|
+
// Plus defineActions() for approve/reject
|
|
78
143
|
```
|
|
79
144
|
|
|
80
145
|
### PII masking
|
|
@@ -85,6 +150,34 @@ masking: {
|
|
|
85
150
|
}
|
|
86
151
|
```
|
|
87
152
|
|
|
153
|
+
### Views (column-level security)
|
|
154
|
+
```typescript
|
|
155
|
+
views: {
|
|
156
|
+
summary: {
|
|
157
|
+
fields: ['id', 'name', 'email'],
|
|
158
|
+
access: { roles: ['member', 'admin'] },
|
|
159
|
+
},
|
|
160
|
+
full: {
|
|
161
|
+
fields: ['id', 'name', 'email', 'phone', 'ssn'],
|
|
162
|
+
access: { roles: ['admin'] },
|
|
163
|
+
},
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Standalone actions (not record-based)
|
|
168
|
+
```typescript
|
|
169
|
+
// In actions.ts
|
|
170
|
+
chat: {
|
|
171
|
+
standalone: true,
|
|
172
|
+
path: "/chat",
|
|
173
|
+
method: "POST",
|
|
174
|
+
responseType: "stream",
|
|
175
|
+
input: z.object({ message: z.string() }),
|
|
176
|
+
guard: { roles: ["member"] },
|
|
177
|
+
handler: "./handlers/chat",
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
88
181
|
## Validation Checklist
|
|
89
182
|
|
|
90
183
|
Before finishing, verify:
|
|
@@ -93,7 +186,11 @@ Before finishing, verify:
|
|
|
93
186
|
- [ ] Guards define createable/updatable fields
|
|
94
187
|
- [ ] Protected fields have corresponding actions
|
|
95
188
|
- [ ] Masking for any PII fields
|
|
189
|
+
- [ ] Views for different visibility levels (if needed)
|
|
190
|
+
- [ ] Validation rules for constrained fields (if needed)
|
|
96
191
|
- [ ] No audit fields in schema (auto-injected)
|
|
192
|
+
- [ ] Using `defineTable()` combined mode (not separate schema.ts + resource.ts)
|
|
193
|
+
- [ ] Actions use `defineActions()` with Zod schemas (not JSON schema)
|
|
97
194
|
|
|
98
195
|
## Response Style
|
|
99
196
|
|