@rune-kit/rune 2.10.0 → 2.12.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/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
package/skills/db/SKILL.md
CHANGED
|
@@ -1,273 +1,273 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: db
|
|
3
|
-
description: Database workflow specialist. Generates migration files with rollback scripts, detects breaking schema changes, and validates query parameterization.
|
|
4
|
-
metadata:
|
|
5
|
-
author: runedev
|
|
6
|
-
version: "0.2.0"
|
|
7
|
-
layer: L2
|
|
8
|
-
model: sonnet
|
|
9
|
-
group: development
|
|
10
|
-
tools: "Read, Write, Edit, Bash, Glob, Grep"
|
|
11
|
-
emit: db.migrated
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# db
|
|
15
|
-
|
|
16
|
-
## Purpose
|
|
17
|
-
|
|
18
|
-
Database workflow specialist. Handles the parts of database work that cause production incidents — breaking schema changes, migrations without rollback, raw SQL injection vectors, and missing indexes on growing tables. Acts as a pre-deploy gate for any schema change, and generates correct migration files (up + down) for common ORMs.
|
|
19
|
-
|
|
20
|
-
## Triggers
|
|
21
|
-
|
|
22
|
-
- `/rune db` — manual invocation when schema changes are planned
|
|
23
|
-
- Called by `cook` (L1): schema change detected in diff
|
|
24
|
-
- Called by `deploy` (L2): pre-deploy migration safety check
|
|
25
|
-
- Called by `audit` (L2): database health dimension
|
|
26
|
-
|
|
27
|
-
## Calls (outbound)
|
|
28
|
-
|
|
29
|
-
- `scout` (L2): find schema files, migration files, ORM config
|
|
30
|
-
- `verification` (L3): run migration in test environment if configured
|
|
31
|
-
- `hallucination-guard` (L3): verify SQL syntax and ORM method names
|
|
32
|
-
|
|
33
|
-
## Called By (inbound)
|
|
34
|
-
|
|
35
|
-
- `cook` (L1): schema change detected in diff
|
|
36
|
-
- `deploy` (L2): pre-deploy migration safety check
|
|
37
|
-
- `audit` (L2): database health dimension
|
|
38
|
-
|
|
39
|
-
## References
|
|
40
|
-
|
|
41
|
-
- `references/scaling-reference.md` — Index strategies, query optimization, N+1 prevention, connection pooling, read replicas, partitioning, sharding, denormalization. Load when scaling, performance, or indexing context detected.
|
|
42
|
-
|
|
43
|
-
## Executable Steps
|
|
44
|
-
|
|
45
|
-
### Step 1 — Discovery
|
|
46
|
-
|
|
47
|
-
Invoke `scout` to locate:
|
|
48
|
-
- Schema definition files: `*.sql`, `schema.prisma`, `models.py`, `*.migration.ts`, `db/migrate/*.rb`
|
|
49
|
-
- Migration directory and existing migration files (to determine next migration number)
|
|
50
|
-
- ORM in use: **Prisma** | **TypeORM** | **SQLAlchemy/Alembic** | **Django ORM** | **ActiveRecord** | **raw SQL** | **unknown**
|
|
51
|
-
- Database type: **PostgreSQL** | **MySQL** | **SQLite** | **MongoDB** | **unknown**
|
|
52
|
-
|
|
53
|
-
If ORM cannot be determined with confidence, fall back to generic SQL migration format.
|
|
54
|
-
|
|
55
|
-
### Step 2 — Diff Analysis
|
|
56
|
-
|
|
57
|
-
Read current schema and compare against previous version (git diff if available):
|
|
58
|
-
- List all **added** columns, tables, indexes, constraints
|
|
59
|
-
- List all **removed** columns, tables, indexes
|
|
60
|
-
- List all **modified** columns (type changes, nullability changes, default changes)
|
|
61
|
-
- List all **renamed** columns or tables
|
|
62
|
-
|
|
63
|
-
### Step 3 — Breaking Change Detection
|
|
64
|
-
|
|
65
|
-
Classify each change by impact:
|
|
66
|
-
|
|
67
|
-
| Change | Classification | Why |
|
|
68
|
-
|--------|---------------|-----|
|
|
69
|
-
| ADD COLUMN NOT NULL without DEFAULT | **BREAKING** | Fails on existing rows |
|
|
70
|
-
| DROP COLUMN | **BREAKING** | Irreversible data loss |
|
|
71
|
-
| RENAME COLUMN or TABLE | **BREAKING** | Breaks all existing queries |
|
|
72
|
-
| CHANGE column type (e.g. VARCHAR→INT) | **BREAKING** | Data truncation risk |
|
|
73
|
-
| ADD COLUMN nullable | SAFE | Existing rows get NULL |
|
|
74
|
-
| ADD TABLE | SAFE | No impact on existing data |
|
|
75
|
-
| ADD INDEX | SAFE (but may lock table) | Lock risk on large tables |
|
|
76
|
-
| DROP INDEX | SAFE | Slight query slowdown |
|
|
77
|
-
| DROP TABLE | **BREAKING** | Irreversible data loss |
|
|
78
|
-
|
|
79
|
-
For any **BREAKING** change: output `BREAKING: [change description]` and require explicit user confirmation before generating migration.
|
|
80
|
-
|
|
81
|
-
<HARD-GATE>
|
|
82
|
-
Migration adding NOT NULL column to existing table without DEFAULT value = BLOCK.
|
|
83
|
-
Column rename or type change on data-bearing table = BREAKING — emit warning and require confirmation before proceeding.
|
|
84
|
-
Empty downgrade/rollback function = BLOCK — every migration MUST have a working down/rollback path.
|
|
85
|
-
</HARD-GATE>
|
|
86
|
-
|
|
87
|
-
### Step 4 — Migration Generation
|
|
88
|
-
|
|
89
|
-
For each schema change, generate a migration file with **up** (apply) and **down** (rollback) scripts.
|
|
90
|
-
|
|
91
|
-
**Prisma:**
|
|
92
|
-
```typescript
|
|
93
|
-
// migrations/[timestamp]_[description]/migration.sql
|
|
94
|
-
-- Up
|
|
95
|
-
ALTER TABLE "users" ADD COLUMN "avatar_url" TEXT;
|
|
96
|
-
|
|
97
|
-
-- Down (in separate migration file or comment)
|
|
98
|
-
ALTER TABLE "users" DROP COLUMN "avatar_url";
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
**Django / Alembic:**
|
|
102
|
-
```python
|
|
103
|
-
def upgrade():
|
|
104
|
-
op.add_column('users', sa.Column('avatar_url', sa.Text(), nullable=True))
|
|
105
|
-
|
|
106
|
-
def downgrade():
|
|
107
|
-
op.drop_column('users', 'avatar_url')
|
|
108
|
-
# NEVER leave downgrade() empty — HARD-GATE blocks this
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**TypeORM:**
|
|
112
|
-
```typescript
|
|
113
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
114
|
-
await queryRunner.addColumn('users', new TableColumn({
|
|
115
|
-
name: 'avatar_url', type: 'text', isNullable: true
|
|
116
|
-
}));
|
|
117
|
-
}
|
|
118
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
119
|
-
await queryRunner.dropColumn('users', 'avatar_url');
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
**Raw SQL:**
|
|
124
|
-
```sql
|
|
125
|
-
-- up.sql
|
|
126
|
-
ALTER TABLE users ADD COLUMN avatar_url TEXT;
|
|
127
|
-
-- down.sql
|
|
128
|
-
ALTER TABLE users DROP COLUMN avatar_url;
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
Use `hallucination-guard` to verify syntax of generated SQL and ORM method names before writing.
|
|
132
|
-
|
|
133
|
-
### Step 5 — Index Analysis
|
|
134
|
-
|
|
135
|
-
For every new table or column added, check:
|
|
136
|
-
- Foreign key columns without index → flag `MISSING_INDEX: [column] — add index for JOIN performance`
|
|
137
|
-
- High-cardinality columns used in WHERE clauses (email, user_id, status) without index → flag `CONSIDER_INDEX`
|
|
138
|
-
- Composite indexes: if queries filter on (A, B), index should be on (A, B) not just A
|
|
139
|
-
|
|
140
|
-
For existing tables with new query patterns:
|
|
141
|
-
- If query uses ORDER BY [column] on large table without index → flag `SORT_INDEX_MISSING`
|
|
142
|
-
|
|
143
|
-
### Step 6 — Query Parameterization Scan
|
|
144
|
-
|
|
145
|
-
Scan migration files and any raw SQL files for injection vectors:
|
|
146
|
-
|
|
147
|
-
```python
|
|
148
|
-
# BAD: string interpolation in SQL
|
|
149
|
-
query = f"SELECT * FROM users WHERE email = '{email}'"
|
|
150
|
-
|
|
151
|
-
# GOOD: parameterized
|
|
152
|
-
query = "SELECT * FROM users WHERE email = %s"
|
|
153
|
-
cursor.execute(query, (email,))
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
Finding: `SQL_INJECTION_RISK — [file:line] — string interpolation in query — use parameterized query`
|
|
157
|
-
|
|
158
|
-
### Step 7 — Schema Documentation
|
|
159
|
-
|
|
160
|
-
Update or create `.rune/schema-changelog.md` with a human-readable entry:
|
|
161
|
-
|
|
162
|
-
```markdown
|
|
163
|
-
## [date] — [migration name]
|
|
164
|
-
- Added: [column list]
|
|
165
|
-
- Removed: [column list — note if data was migrated]
|
|
166
|
-
- Breaking: [yes/no] — [details if yes]
|
|
167
|
-
- Rollback: [migration name or "manual"]
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### Step 8 — Report
|
|
171
|
-
|
|
172
|
-
Emit structured report:
|
|
173
|
-
|
|
174
|
-
```
|
|
175
|
-
## DB Report: [scope]
|
|
176
|
-
|
|
177
|
-
### Schema Changes
|
|
178
|
-
- [SAFE|BREAKING] [change description]
|
|
179
|
-
|
|
180
|
-
### Breaking Changes Requiring Confirmation
|
|
181
|
-
- BREAKING: [description] — requires explicit approval before migration runs
|
|
182
|
-
|
|
183
|
-
### Generated Files
|
|
184
|
-
- [migration file path] (up + down)
|
|
185
|
-
|
|
186
|
-
### Index Recommendations
|
|
187
|
-
- MISSING_INDEX: [table.column] — [reason]
|
|
188
|
-
|
|
189
|
-
### Query Safety
|
|
190
|
-
- SQL_INJECTION_RISK: [file:line] — [description]
|
|
191
|
-
- Clean: [list of checked files with no issues]
|
|
192
|
-
|
|
193
|
-
### Verdict: PASS | WARN | BLOCK
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## Output Format
|
|
197
|
-
|
|
198
|
-
```
|
|
199
|
-
## DB Report: schema.prisma diff
|
|
200
|
-
|
|
201
|
-
### Schema Changes
|
|
202
|
-
- SAFE: Added users.avatar_url (TEXT, nullable)
|
|
203
|
-
- BREAKING: Renamed users.created → users.created_at
|
|
204
|
-
|
|
205
|
-
### Breaking Changes Requiring Confirmation
|
|
206
|
-
- BREAKING: Column rename users.created → users.created_at
|
|
207
|
-
Impact: all queries referencing 'created' will break
|
|
208
|
-
Confirm before proceeding? [yes/no]
|
|
209
|
-
|
|
210
|
-
### Generated Files
|
|
211
|
-
- migrations/20260224_add_avatar_url/migration.sql (up + down)
|
|
212
|
-
|
|
213
|
-
### Index Recommendations
|
|
214
|
-
- MISSING_INDEX: users.email — high-cardinality FK, add for login query performance
|
|
215
|
-
|
|
216
|
-
### Verdict: BLOCK (breaking change unconfirmed)
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Constraints
|
|
220
|
-
|
|
221
|
-
1. MUST generate both up and down scripts for every migration — empty rollback = BLOCK
|
|
222
|
-
2. MUST flag NOT NULL without DEFAULT as BLOCK — never silently generate broken migration
|
|
223
|
-
3. MUST NOT run migration in production — only in test environment (via verification)
|
|
224
|
-
4. MUST use hallucination-guard to verify SQL syntax before writing migration files
|
|
225
|
-
5. MUST NOT rename columns silently — always present impact and require confirmation
|
|
226
|
-
|
|
227
|
-
## Mesh Gates (L1/L2 only)
|
|
228
|
-
|
|
229
|
-
| Gate | Requires | If Missing |
|
|
230
|
-
|------|----------|------------|
|
|
231
|
-
| ORM Gate | ORM identified before migration generation | Fall back to raw SQL format + note |
|
|
232
|
-
| Breaking Gate | User confirmation before proceeding on BREAKING changes | BLOCK and await response |
|
|
233
|
-
| Rollback Gate | Working down() / rollback script before writing migration | BLOCK — prompt for rollback logic |
|
|
234
|
-
| Safety Gate | hallucination-guard verified SQL before Write | Re-verify or flag as unverified |
|
|
235
|
-
|
|
236
|
-
## Sharp Edges
|
|
237
|
-
|
|
238
|
-
Known failure modes for this skill. Check these before declaring done.
|
|
239
|
-
|
|
240
|
-
| Failure Mode | Severity | Mitigation |
|
|
241
|
-
|---|---|---|
|
|
242
|
-
| Empty downgrade() written silently | CRITICAL | HARD-GATE: never write empty rollback — always prompt for rollback logic |
|
|
243
|
-
| NOT NULL column added without DEFAULT on existing table | CRITICAL | HARD-GATE: BLOCK and explain that this will fail on existing rows |
|
|
244
|
-
| Migration generated for wrong ORM (TypeORM syntax in Django project) | HIGH | hallucination-guard verifies method names match detected ORM |
|
|
245
|
-
| Index recommendations skipped on large tables | MEDIUM | Always run Step 5 — never skip index analysis |
|
|
246
|
-
| Schema changelog not updated after migration | LOW | Step 7 runs always — log INFO if skipped due to no .rune/ directory |
|
|
247
|
-
|
|
248
|
-
## Done When
|
|
249
|
-
|
|
250
|
-
- All schema changes classified (SAFE vs BREAKING)
|
|
251
|
-
- Breaking changes surfaced and confirmed (or BLOCK issued)
|
|
252
|
-
- Migration files generated with working up + down scripts
|
|
253
|
-
- hallucination-guard verified SQL syntax
|
|
254
|
-
- Index recommendations listed
|
|
255
|
-
- Query parameterization scan complete
|
|
256
|
-
- Schema changelog updated in .rune/schema-changelog.md
|
|
257
|
-
- Structured DB Report emitted with PASS/WARN/BLOCK verdict
|
|
258
|
-
|
|
259
|
-
## Returns
|
|
260
|
-
|
|
261
|
-
| Artifact | Format | Location |
|
|
262
|
-
|----------|--------|----------|
|
|
263
|
-
| Migration file (up) | SQL or ORM-specific | `migrations/<timestamp>_<name>/` |
|
|
264
|
-
| Rollback script (down) | SQL or ORM-specific | same migration directory |
|
|
265
|
-
| Schema changelog entry | Markdown | `.rune/schema-changelog.md` |
|
|
266
|
-
| Index recommendations | Structured list | inline (DB Report) |
|
|
267
|
-
| DB Report with verdict | Markdown (PASS/WARN/BLOCK) | inline |
|
|
268
|
-
|
|
269
|
-
## Cost Profile
|
|
270
|
-
|
|
271
|
-
~2000-6000 tokens input, ~800-2000 tokens output. Sonnet for migration generation quality.
|
|
272
|
-
|
|
273
|
-
**Scope guardrail:** db generates and validates migrations — it does not run them in production. Execution is delegated to `verification` in test environments only.
|
|
1
|
+
---
|
|
2
|
+
name: db
|
|
3
|
+
description: Database workflow specialist. Generates migration files with rollback scripts, detects breaking schema changes, and validates query parameterization.
|
|
4
|
+
metadata:
|
|
5
|
+
author: runedev
|
|
6
|
+
version: "0.2.0"
|
|
7
|
+
layer: L2
|
|
8
|
+
model: sonnet
|
|
9
|
+
group: development
|
|
10
|
+
tools: "Read, Write, Edit, Bash, Glob, Grep"
|
|
11
|
+
emit: db.migrated
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# db
|
|
15
|
+
|
|
16
|
+
## Purpose
|
|
17
|
+
|
|
18
|
+
Database workflow specialist. Handles the parts of database work that cause production incidents — breaking schema changes, migrations without rollback, raw SQL injection vectors, and missing indexes on growing tables. Acts as a pre-deploy gate for any schema change, and generates correct migration files (up + down) for common ORMs.
|
|
19
|
+
|
|
20
|
+
## Triggers
|
|
21
|
+
|
|
22
|
+
- `/rune db` — manual invocation when schema changes are planned
|
|
23
|
+
- Called by `cook` (L1): schema change detected in diff
|
|
24
|
+
- Called by `deploy` (L2): pre-deploy migration safety check
|
|
25
|
+
- Called by `audit` (L2): database health dimension
|
|
26
|
+
|
|
27
|
+
## Calls (outbound)
|
|
28
|
+
|
|
29
|
+
- `scout` (L2): find schema files, migration files, ORM config
|
|
30
|
+
- `verification` (L3): run migration in test environment if configured
|
|
31
|
+
- `hallucination-guard` (L3): verify SQL syntax and ORM method names
|
|
32
|
+
|
|
33
|
+
## Called By (inbound)
|
|
34
|
+
|
|
35
|
+
- `cook` (L1): schema change detected in diff
|
|
36
|
+
- `deploy` (L2): pre-deploy migration safety check
|
|
37
|
+
- `audit` (L2): database health dimension
|
|
38
|
+
|
|
39
|
+
## References
|
|
40
|
+
|
|
41
|
+
- `references/scaling-reference.md` — Index strategies, query optimization, N+1 prevention, connection pooling, read replicas, partitioning, sharding, denormalization. Load when scaling, performance, or indexing context detected.
|
|
42
|
+
|
|
43
|
+
## Executable Steps
|
|
44
|
+
|
|
45
|
+
### Step 1 — Discovery
|
|
46
|
+
|
|
47
|
+
Invoke `scout` to locate:
|
|
48
|
+
- Schema definition files: `*.sql`, `schema.prisma`, `models.py`, `*.migration.ts`, `db/migrate/*.rb`
|
|
49
|
+
- Migration directory and existing migration files (to determine next migration number)
|
|
50
|
+
- ORM in use: **Prisma** | **TypeORM** | **SQLAlchemy/Alembic** | **Django ORM** | **ActiveRecord** | **raw SQL** | **unknown**
|
|
51
|
+
- Database type: **PostgreSQL** | **MySQL** | **SQLite** | **MongoDB** | **unknown**
|
|
52
|
+
|
|
53
|
+
If ORM cannot be determined with confidence, fall back to generic SQL migration format.
|
|
54
|
+
|
|
55
|
+
### Step 2 — Diff Analysis
|
|
56
|
+
|
|
57
|
+
Read current schema and compare against previous version (git diff if available):
|
|
58
|
+
- List all **added** columns, tables, indexes, constraints
|
|
59
|
+
- List all **removed** columns, tables, indexes
|
|
60
|
+
- List all **modified** columns (type changes, nullability changes, default changes)
|
|
61
|
+
- List all **renamed** columns or tables
|
|
62
|
+
|
|
63
|
+
### Step 3 — Breaking Change Detection
|
|
64
|
+
|
|
65
|
+
Classify each change by impact:
|
|
66
|
+
|
|
67
|
+
| Change | Classification | Why |
|
|
68
|
+
|--------|---------------|-----|
|
|
69
|
+
| ADD COLUMN NOT NULL without DEFAULT | **BREAKING** | Fails on existing rows |
|
|
70
|
+
| DROP COLUMN | **BREAKING** | Irreversible data loss |
|
|
71
|
+
| RENAME COLUMN or TABLE | **BREAKING** | Breaks all existing queries |
|
|
72
|
+
| CHANGE column type (e.g. VARCHAR→INT) | **BREAKING** | Data truncation risk |
|
|
73
|
+
| ADD COLUMN nullable | SAFE | Existing rows get NULL |
|
|
74
|
+
| ADD TABLE | SAFE | No impact on existing data |
|
|
75
|
+
| ADD INDEX | SAFE (but may lock table) | Lock risk on large tables |
|
|
76
|
+
| DROP INDEX | SAFE | Slight query slowdown |
|
|
77
|
+
| DROP TABLE | **BREAKING** | Irreversible data loss |
|
|
78
|
+
|
|
79
|
+
For any **BREAKING** change: output `BREAKING: [change description]` and require explicit user confirmation before generating migration.
|
|
80
|
+
|
|
81
|
+
<HARD-GATE>
|
|
82
|
+
Migration adding NOT NULL column to existing table without DEFAULT value = BLOCK.
|
|
83
|
+
Column rename or type change on data-bearing table = BREAKING — emit warning and require confirmation before proceeding.
|
|
84
|
+
Empty downgrade/rollback function = BLOCK — every migration MUST have a working down/rollback path.
|
|
85
|
+
</HARD-GATE>
|
|
86
|
+
|
|
87
|
+
### Step 4 — Migration Generation
|
|
88
|
+
|
|
89
|
+
For each schema change, generate a migration file with **up** (apply) and **down** (rollback) scripts.
|
|
90
|
+
|
|
91
|
+
**Prisma:**
|
|
92
|
+
```typescript
|
|
93
|
+
// migrations/[timestamp]_[description]/migration.sql
|
|
94
|
+
-- Up
|
|
95
|
+
ALTER TABLE "users" ADD COLUMN "avatar_url" TEXT;
|
|
96
|
+
|
|
97
|
+
-- Down (in separate migration file or comment)
|
|
98
|
+
ALTER TABLE "users" DROP COLUMN "avatar_url";
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Django / Alembic:**
|
|
102
|
+
```python
|
|
103
|
+
def upgrade():
|
|
104
|
+
op.add_column('users', sa.Column('avatar_url', sa.Text(), nullable=True))
|
|
105
|
+
|
|
106
|
+
def downgrade():
|
|
107
|
+
op.drop_column('users', 'avatar_url')
|
|
108
|
+
# NEVER leave downgrade() empty — HARD-GATE blocks this
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**TypeORM:**
|
|
112
|
+
```typescript
|
|
113
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
114
|
+
await queryRunner.addColumn('users', new TableColumn({
|
|
115
|
+
name: 'avatar_url', type: 'text', isNullable: true
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
119
|
+
await queryRunner.dropColumn('users', 'avatar_url');
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Raw SQL:**
|
|
124
|
+
```sql
|
|
125
|
+
-- up.sql
|
|
126
|
+
ALTER TABLE users ADD COLUMN avatar_url TEXT;
|
|
127
|
+
-- down.sql
|
|
128
|
+
ALTER TABLE users DROP COLUMN avatar_url;
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Use `hallucination-guard` to verify syntax of generated SQL and ORM method names before writing.
|
|
132
|
+
|
|
133
|
+
### Step 5 — Index Analysis
|
|
134
|
+
|
|
135
|
+
For every new table or column added, check:
|
|
136
|
+
- Foreign key columns without index → flag `MISSING_INDEX: [column] — add index for JOIN performance`
|
|
137
|
+
- High-cardinality columns used in WHERE clauses (email, user_id, status) without index → flag `CONSIDER_INDEX`
|
|
138
|
+
- Composite indexes: if queries filter on (A, B), index should be on (A, B) not just A
|
|
139
|
+
|
|
140
|
+
For existing tables with new query patterns:
|
|
141
|
+
- If query uses ORDER BY [column] on large table without index → flag `SORT_INDEX_MISSING`
|
|
142
|
+
|
|
143
|
+
### Step 6 — Query Parameterization Scan
|
|
144
|
+
|
|
145
|
+
Scan migration files and any raw SQL files for injection vectors:
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
# BAD: string interpolation in SQL
|
|
149
|
+
query = f"SELECT * FROM users WHERE email = '{email}'"
|
|
150
|
+
|
|
151
|
+
# GOOD: parameterized
|
|
152
|
+
query = "SELECT * FROM users WHERE email = %s"
|
|
153
|
+
cursor.execute(query, (email,))
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Finding: `SQL_INJECTION_RISK — [file:line] — string interpolation in query — use parameterized query`
|
|
157
|
+
|
|
158
|
+
### Step 7 — Schema Documentation
|
|
159
|
+
|
|
160
|
+
Update or create `.rune/schema-changelog.md` with a human-readable entry:
|
|
161
|
+
|
|
162
|
+
```markdown
|
|
163
|
+
## [date] — [migration name]
|
|
164
|
+
- Added: [column list]
|
|
165
|
+
- Removed: [column list — note if data was migrated]
|
|
166
|
+
- Breaking: [yes/no] — [details if yes]
|
|
167
|
+
- Rollback: [migration name or "manual"]
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Step 8 — Report
|
|
171
|
+
|
|
172
|
+
Emit structured report:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
## DB Report: [scope]
|
|
176
|
+
|
|
177
|
+
### Schema Changes
|
|
178
|
+
- [SAFE|BREAKING] [change description]
|
|
179
|
+
|
|
180
|
+
### Breaking Changes Requiring Confirmation
|
|
181
|
+
- BREAKING: [description] — requires explicit approval before migration runs
|
|
182
|
+
|
|
183
|
+
### Generated Files
|
|
184
|
+
- [migration file path] (up + down)
|
|
185
|
+
|
|
186
|
+
### Index Recommendations
|
|
187
|
+
- MISSING_INDEX: [table.column] — [reason]
|
|
188
|
+
|
|
189
|
+
### Query Safety
|
|
190
|
+
- SQL_INJECTION_RISK: [file:line] — [description]
|
|
191
|
+
- Clean: [list of checked files with no issues]
|
|
192
|
+
|
|
193
|
+
### Verdict: PASS | WARN | BLOCK
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Output Format
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
## DB Report: schema.prisma diff
|
|
200
|
+
|
|
201
|
+
### Schema Changes
|
|
202
|
+
- SAFE: Added users.avatar_url (TEXT, nullable)
|
|
203
|
+
- BREAKING: Renamed users.created → users.created_at
|
|
204
|
+
|
|
205
|
+
### Breaking Changes Requiring Confirmation
|
|
206
|
+
- BREAKING: Column rename users.created → users.created_at
|
|
207
|
+
Impact: all queries referencing 'created' will break
|
|
208
|
+
Confirm before proceeding? [yes/no]
|
|
209
|
+
|
|
210
|
+
### Generated Files
|
|
211
|
+
- migrations/20260224_add_avatar_url/migration.sql (up + down)
|
|
212
|
+
|
|
213
|
+
### Index Recommendations
|
|
214
|
+
- MISSING_INDEX: users.email — high-cardinality FK, add for login query performance
|
|
215
|
+
|
|
216
|
+
### Verdict: BLOCK (breaking change unconfirmed)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Constraints
|
|
220
|
+
|
|
221
|
+
1. MUST generate both up and down scripts for every migration — empty rollback = BLOCK
|
|
222
|
+
2. MUST flag NOT NULL without DEFAULT as BLOCK — never silently generate broken migration
|
|
223
|
+
3. MUST NOT run migration in production — only in test environment (via verification)
|
|
224
|
+
4. MUST use hallucination-guard to verify SQL syntax before writing migration files
|
|
225
|
+
5. MUST NOT rename columns silently — always present impact and require confirmation
|
|
226
|
+
|
|
227
|
+
## Mesh Gates (L1/L2 only)
|
|
228
|
+
|
|
229
|
+
| Gate | Requires | If Missing |
|
|
230
|
+
|------|----------|------------|
|
|
231
|
+
| ORM Gate | ORM identified before migration generation | Fall back to raw SQL format + note |
|
|
232
|
+
| Breaking Gate | User confirmation before proceeding on BREAKING changes | BLOCK and await response |
|
|
233
|
+
| Rollback Gate | Working down() / rollback script before writing migration | BLOCK — prompt for rollback logic |
|
|
234
|
+
| Safety Gate | hallucination-guard verified SQL before Write | Re-verify or flag as unverified |
|
|
235
|
+
|
|
236
|
+
## Sharp Edges
|
|
237
|
+
|
|
238
|
+
Known failure modes for this skill. Check these before declaring done.
|
|
239
|
+
|
|
240
|
+
| Failure Mode | Severity | Mitigation |
|
|
241
|
+
|---|---|---|
|
|
242
|
+
| Empty downgrade() written silently | CRITICAL | HARD-GATE: never write empty rollback — always prompt for rollback logic |
|
|
243
|
+
| NOT NULL column added without DEFAULT on existing table | CRITICAL | HARD-GATE: BLOCK and explain that this will fail on existing rows |
|
|
244
|
+
| Migration generated for wrong ORM (TypeORM syntax in Django project) | HIGH | hallucination-guard verifies method names match detected ORM |
|
|
245
|
+
| Index recommendations skipped on large tables | MEDIUM | Always run Step 5 — never skip index analysis |
|
|
246
|
+
| Schema changelog not updated after migration | LOW | Step 7 runs always — log INFO if skipped due to no .rune/ directory |
|
|
247
|
+
|
|
248
|
+
## Done When
|
|
249
|
+
|
|
250
|
+
- All schema changes classified (SAFE vs BREAKING)
|
|
251
|
+
- Breaking changes surfaced and confirmed (or BLOCK issued)
|
|
252
|
+
- Migration files generated with working up + down scripts
|
|
253
|
+
- hallucination-guard verified SQL syntax
|
|
254
|
+
- Index recommendations listed
|
|
255
|
+
- Query parameterization scan complete
|
|
256
|
+
- Schema changelog updated in .rune/schema-changelog.md
|
|
257
|
+
- Structured DB Report emitted with PASS/WARN/BLOCK verdict
|
|
258
|
+
|
|
259
|
+
## Returns
|
|
260
|
+
|
|
261
|
+
| Artifact | Format | Location |
|
|
262
|
+
|----------|--------|----------|
|
|
263
|
+
| Migration file (up) | SQL or ORM-specific | `migrations/<timestamp>_<name>/` |
|
|
264
|
+
| Rollback script (down) | SQL or ORM-specific | same migration directory |
|
|
265
|
+
| Schema changelog entry | Markdown | `.rune/schema-changelog.md` |
|
|
266
|
+
| Index recommendations | Structured list | inline (DB Report) |
|
|
267
|
+
| DB Report with verdict | Markdown (PASS/WARN/BLOCK) | inline |
|
|
268
|
+
|
|
269
|
+
## Cost Profile
|
|
270
|
+
|
|
271
|
+
~2000-6000 tokens input, ~800-2000 tokens output. Sonnet for migration generation quality.
|
|
272
|
+
|
|
273
|
+
**Scope guardrail:** db generates and validates migrations — it does not run them in production. Execution is delegated to `verification` in test environments only.
|