@hivehub/rulebook 5.5.2 → 5.7.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/.claude/commands/rulebook-learn-capture.md +41 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- package/README.md +332 -394
- package/dist/cli/commands/context-intelligence.d.ts +0 -1
- package/dist/cli/commands/context-intelligence.d.ts.map +1 -1
- package/dist/cli/commands/context-intelligence.js +12 -33
- package/dist/cli/commands/context-intelligence.js.map +1 -1
- package/dist/cli/commands/index.d.ts +4 -7
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +4 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +40 -81
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +0 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +1 -7
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +7 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +51 -57
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/misc.d.ts +1 -15
- package/dist/cli/commands/misc.d.ts.map +1 -1
- package/dist/cli/commands/misc.js +36 -215
- package/dist/cli/commands/misc.js.map +1 -1
- package/dist/cli/commands/plans.d.ts +0 -6
- package/dist/cli/commands/plans.d.ts.map +1 -1
- package/dist/cli/commands/plans.js +9 -77
- package/dist/cli/commands/plans.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/task.js +4 -4
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +122 -52
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +1 -78
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +59 -0
- package/dist/core/claude/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude/claude-mcp.js +220 -0
- package/dist/core/claude/claude-mcp.js.map +1 -0
- package/dist/core/claude/claude-md-generator.d.ts +52 -0
- package/dist/core/claude/claude-md-generator.d.ts.map +1 -0
- package/dist/core/claude/claude-md-generator.js +104 -0
- package/dist/core/claude/claude-md-generator.js.map +1 -0
- package/dist/core/claude/claude-settings-manager.d.ts +44 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -0
- package/dist/core/claude/claude-settings-manager.js +194 -0
- package/dist/core/claude/claude-settings-manager.js.map +1 -0
- package/dist/core/console/cli-bridge.d.ts +113 -0
- package/dist/core/console/cli-bridge.d.ts.map +1 -0
- package/dist/core/console/cli-bridge.js +1094 -0
- package/dist/core/console/cli-bridge.js.map +1 -0
- package/dist/core/detect/detector.d.ts +35 -0
- package/dist/core/detect/detector.d.ts.map +1 -0
- package/dist/core/detect/detector.js +541 -0
- package/dist/core/detect/detector.js.map +1 -0
- package/dist/core/docs/docs-generator.d.ts +9 -0
- package/dist/core/docs/docs-generator.d.ts.map +1 -0
- package/dist/core/docs/docs-generator.js +531 -0
- package/dist/core/docs/docs-generator.js.map +1 -0
- package/dist/core/docs/mcp-reference-generator.d.ts +13 -0
- package/dist/core/docs/mcp-reference-generator.d.ts.map +1 -0
- package/dist/core/docs/mcp-reference-generator.js +66 -0
- package/dist/core/docs/mcp-reference-generator.js.map +1 -0
- package/dist/core/generators/generator.d.ts +54 -0
- package/dist/core/generators/generator.d.ts.map +1 -0
- package/dist/core/generators/generator.js +1041 -0
- package/dist/core/generators/generator.js.map +1 -0
- package/dist/core/generators/gitignore-generator.d.ts +13 -0
- package/dist/core/generators/gitignore-generator.d.ts.map +1 -0
- package/dist/core/generators/gitignore-generator.js +307 -0
- package/dist/core/generators/gitignore-generator.js.map +1 -0
- package/dist/core/generators/minimal-scaffolder.d.ts +8 -0
- package/dist/core/generators/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/generators/minimal-scaffolder.js +51 -0
- package/dist/core/generators/minimal-scaffolder.js.map +1 -0
- package/dist/core/generators/rules-generator.d.ts +73 -0
- package/dist/core/generators/rules-generator.d.ts.map +1 -0
- package/dist/core/generators/rules-generator.js +202 -0
- package/dist/core/generators/rules-generator.js.map +1 -0
- package/dist/core/generators/workflow-generator.d.ts +15 -0
- package/dist/core/generators/workflow-generator.d.ts.map +1 -0
- package/dist/core/generators/workflow-generator.js +390 -0
- package/dist/core/generators/workflow-generator.js.map +1 -0
- package/dist/core/ide/multi-tool-generator.d.ts +59 -0
- package/dist/core/ide/multi-tool-generator.d.ts.map +1 -0
- package/dist/core/ide/multi-tool-generator.js +157 -0
- package/dist/core/ide/multi-tool-generator.js.map +1 -0
- package/dist/core/ide/opencode-generator.d.ts +72 -0
- package/dist/core/ide/opencode-generator.d.ts.map +1 -0
- package/dist/core/ide/opencode-generator.js +450 -0
- package/dist/core/ide/opencode-generator.js.map +1 -0
- package/dist/core/merger.d.ts +1 -1
- package/dist/core/merger.d.ts.map +1 -1
- package/dist/core/merger.js +5 -5
- package/dist/core/merger.js.map +1 -1
- package/dist/core/migrator.d.ts +0 -1
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +4 -29
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/quality/coverage-checker.d.ts +14 -0
- package/dist/core/quality/coverage-checker.d.ts.map +1 -0
- package/dist/core/quality/coverage-checker.js +176 -0
- package/dist/core/quality/coverage-checker.js.map +1 -0
- package/dist/core/quality/dependency-checker.d.ts +21 -0
- package/dist/core/quality/dependency-checker.d.ts.map +1 -0
- package/dist/core/quality/dependency-checker.js +247 -0
- package/dist/core/quality/dependency-checker.js.map +1 -0
- package/dist/core/quality/doctor.d.ts +19 -0
- package/dist/core/quality/doctor.d.ts.map +1 -0
- package/dist/core/quality/doctor.js +163 -0
- package/dist/core/quality/doctor.js.map +1 -0
- package/dist/core/quality/validator.d.ts +21 -0
- package/dist/core/quality/validator.d.ts.map +1 -0
- package/dist/core/quality/validator.js +177 -0
- package/dist/core/quality/validator.js.map +1 -0
- package/dist/core/skills/skills-manager.d.ts +126 -0
- package/dist/core/skills/skills-manager.d.ts.map +1 -0
- package/dist/core/skills/skills-manager.js +630 -0
- package/dist/core/skills/skills-manager.js.map +1 -0
- package/dist/core/state/config-manager.d.ts +86 -0
- package/dist/core/state/config-manager.d.ts.map +1 -0
- package/dist/core/state/config-manager.js +562 -0
- package/dist/core/state/config-manager.js.map +1 -0
- package/dist/core/state/override-manager.d.ts +23 -0
- package/dist/core/state/override-manager.d.ts.map +1 -0
- package/dist/core/state/override-manager.js +82 -0
- package/dist/core/state/override-manager.js.map +1 -0
- package/dist/core/state/state-writer.d.ts +34 -0
- package/dist/core/state/state-writer.d.ts.map +1 -0
- package/dist/core/state/state-writer.js +78 -0
- package/dist/core/state/state-writer.js.map +1 -0
- package/dist/core/state/version-bumper.d.ts +19 -0
- package/dist/core/state/version-bumper.d.ts.map +1 -0
- package/dist/core/state/version-bumper.js +180 -0
- package/dist/core/state/version-bumper.js.map +1 -0
- package/dist/core/tasks/decision-manager.d.ts +25 -0
- package/dist/core/tasks/decision-manager.d.ts.map +1 -0
- package/dist/core/tasks/decision-manager.js +183 -0
- package/dist/core/tasks/decision-manager.js.map +1 -0
- package/dist/core/tasks/knowledge-manager.d.ts +24 -0
- package/dist/core/tasks/knowledge-manager.d.ts.map +1 -0
- package/dist/core/tasks/knowledge-manager.js +173 -0
- package/dist/core/tasks/knowledge-manager.js.map +1 -0
- package/dist/core/tasks/learn-manager.d.ts +27 -0
- package/dist/core/tasks/learn-manager.d.ts.map +1 -0
- package/dist/core/tasks/learn-manager.js +121 -0
- package/dist/core/tasks/learn-manager.js.map +1 -0
- package/dist/core/tasks/plans-manager.d.ts +46 -0
- package/dist/core/tasks/plans-manager.d.ts.map +1 -0
- package/dist/core/tasks/plans-manager.js +158 -0
- package/dist/core/tasks/plans-manager.js.map +1 -0
- package/dist/core/tasks/task-manager.d.ts +127 -0
- package/dist/core/tasks/task-manager.d.ts.map +1 -0
- package/dist/core/tasks/task-manager.js +607 -0
- package/dist/core/tasks/task-manager.js.map +1 -0
- package/dist/core/workspace/project-worker.d.ts +6 -6
- package/dist/core/workspace/project-worker.d.ts.map +1 -1
- package/dist/core/workspace/project-worker.js +6 -6
- package/dist/core/workspace/project-worker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -176
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +16 -960
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/file-search.d.ts +43 -0
- package/dist/memory/file-search.d.ts.map +1 -0
- package/dist/memory/file-search.js +228 -0
- package/dist/memory/file-search.js.map +1 -0
- package/dist/memory/file-store.d.ts +99 -0
- package/dist/memory/file-store.d.ts.map +1 -0
- package/dist/memory/file-store.js +615 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/legacy-migrator.d.ts +27 -0
- package/dist/memory/legacy-migrator.d.ts.map +1 -0
- package/dist/memory/legacy-migrator.js +185 -0
- package/dist/memory/legacy-migrator.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +25 -24
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +97 -140
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-types.d.ts +1 -1
- package/dist/memory/memory-types.d.ts.map +1 -1
- package/dist/types.d.ts +8 -119
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -6
- package/templates/agents/context-intelligence.md +50 -52
- package/templates/cli/OPENCODE.md +85 -18
- package/templates/commands/rulebook-learn-capture.md +41 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- package/templates/core/AGENTS_LEAN.md +0 -14
- package/templates/hooks/check-context-and-handoff.sh +8 -10
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- package/templates/hooks/terse-mode-tracker.sh +146 -143
- package/templates/ides/OPENCODE.md +63 -0
- package/templates/skills/cli/opencode/SKILL.md +82 -28
- package/.claude/commands/ralph-config.md +0 -112
- package/.claude/commands/ralph-history.md +0 -110
- package/.claude/commands/ralph-init.md +0 -72
- package/.claude/commands/ralph-pause-resume.md +0 -105
- package/.claude/commands/ralph-run.md +0 -101
- package/.claude/commands/ralph-status.md +0 -76
- package/templates/core/RALPH.md +0 -471
- package/templates/frameworks/ANGULAR.md +0 -36
- package/templates/frameworks/DJANGO.md +0 -83
- package/templates/frameworks/ELECTRON.md +0 -147
- package/templates/frameworks/FLASK.md +0 -38
- package/templates/frameworks/FLUTTER.md +0 -55
- package/templates/frameworks/JQUERY.md +0 -32
- package/templates/frameworks/LARAVEL.md +0 -38
- package/templates/frameworks/NESTJS.md +0 -43
- package/templates/frameworks/NEXTJS.md +0 -127
- package/templates/frameworks/NUXT.md +0 -40
- package/templates/frameworks/RAILS.md +0 -66
- package/templates/frameworks/REACT.md +0 -38
- package/templates/frameworks/REACT_NATIVE.md +0 -47
- package/templates/frameworks/SPRING.md +0 -39
- package/templates/frameworks/SYMFONY.md +0 -36
- package/templates/frameworks/VUE.md +0 -36
- package/templates/frameworks/ZEND.md +0 -35
- package/templates/hooks/enforce-mcp-for-tasks.sh +0 -31
- package/templates/hooks/enforce-no-deferred.sh +0 -21
- package/templates/hooks/enforce-no-shortcuts.sh +0 -31
- package/templates/ides/COPILOT.md +0 -37
- package/templates/ides/CURSOR.md +0 -43
- package/templates/ides/JETBRAINS_AI.md +0 -35
- package/templates/ides/REPLIT.md +0 -36
- package/templates/ides/TABNINE.md +0 -29
- package/templates/ides/VSCODE.md +0 -40
- package/templates/ides/WINDSURF.md +0 -36
- package/templates/ides/ZED.md +0 -32
- package/templates/ides/cursor-mdc/go.mdc +0 -24
- package/templates/ides/cursor-mdc/python.mdc +0 -24
- package/templates/ides/cursor-mdc/quality.mdc +0 -25
- package/templates/ides/cursor-mdc/ralph.mdc +0 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +0 -38
- package/templates/ides/cursor-mdc/rust.mdc +0 -24
- package/templates/ides/cursor-mdc/typescript.mdc +0 -25
- package/templates/ralph/ralph-history.bat +0 -4
- package/templates/ralph/ralph-history.sh +0 -5
- package/templates/ralph/ralph-init.bat +0 -5
- package/templates/ralph/ralph-init.sh +0 -5
- package/templates/ralph/ralph-pause.bat +0 -5
- package/templates/ralph/ralph-pause.sh +0 -5
- package/templates/ralph/ralph-run.bat +0 -5
- package/templates/ralph/ralph-run.sh +0 -5
- package/templates/ralph/ralph-status.bat +0 -4
- package/templates/ralph/ralph-status.sh +0 -5
- package/templates/services/AZURE_BLOB.md +0 -184
- package/templates/services/CASSANDRA.md +0 -239
- package/templates/services/DATADOG.md +0 -26
- package/templates/services/DOCKER.md +0 -124
- package/templates/services/DOCKER_COMPOSE.md +0 -168
- package/templates/services/DYNAMODB.md +0 -308
- package/templates/services/ELASTICSEARCH.md +0 -347
- package/templates/services/GCS.md +0 -178
- package/templates/services/HELM.md +0 -194
- package/templates/services/INFLUXDB.md +0 -265
- package/templates/services/KAFKA.md +0 -341
- package/templates/services/KUBERNETES.md +0 -208
- package/templates/services/MARIADB.md +0 -183
- package/templates/services/MEMCACHED.md +0 -242
- package/templates/services/MINIO.md +0 -201
- package/templates/services/MONGODB.md +0 -268
- package/templates/services/MYSQL.md +0 -358
- package/templates/services/NEO4J.md +0 -247
- package/templates/services/OPENTELEMETRY.md +0 -25
- package/templates/services/ORACLE.md +0 -290
- package/templates/services/PINO.md +0 -24
- package/templates/services/POSTGRESQL.md +0 -326
- package/templates/services/PROMETHEUS.md +0 -33
- package/templates/services/RABBITMQ.md +0 -286
- package/templates/services/REDIS.md +0 -292
- package/templates/services/S3.md +0 -298
- package/templates/services/SENTRY.md +0 -23
- package/templates/services/SQLITE.md +0 -294
- package/templates/services/SQLSERVER.md +0 -294
- package/templates/services/WINSTON.md +0 -30
- package/templates/skills/frameworks/angular/SKILL.md +0 -46
- package/templates/skills/frameworks/django/SKILL.md +0 -93
- package/templates/skills/frameworks/electron/SKILL.md +0 -157
- package/templates/skills/frameworks/flask/SKILL.md +0 -48
- package/templates/skills/frameworks/flutter/SKILL.md +0 -65
- package/templates/skills/frameworks/jquery/SKILL.md +0 -42
- package/templates/skills/frameworks/laravel/SKILL.md +0 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +0 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +0 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +0 -50
- package/templates/skills/frameworks/rails/SKILL.md +0 -76
- package/templates/skills/frameworks/react/SKILL.md +0 -48
- package/templates/skills/frameworks/react-native/SKILL.md +0 -57
- package/templates/skills/frameworks/spring/SKILL.md +0 -49
- package/templates/skills/frameworks/symfony/SKILL.md +0 -46
- package/templates/skills/frameworks/vue/SKILL.md +0 -46
- package/templates/skills/frameworks/zend/SKILL.md +0 -45
- package/templates/skills/services/azure-blob/SKILL.md +0 -194
- package/templates/skills/services/cassandra/SKILL.md +0 -249
- package/templates/skills/services/dynamodb/SKILL.md +0 -318
- package/templates/skills/services/elasticsearch/SKILL.md +0 -357
- package/templates/skills/services/gcs/SKILL.md +0 -188
- package/templates/skills/services/influxdb/SKILL.md +0 -275
- package/templates/skills/services/kafka/SKILL.md +0 -351
- package/templates/skills/services/mariadb/SKILL.md +0 -193
- package/templates/skills/services/memcached/SKILL.md +0 -252
- package/templates/skills/services/minio/SKILL.md +0 -211
- package/templates/skills/services/mongodb/SKILL.md +0 -278
- package/templates/skills/services/mysql/SKILL.md +0 -368
- package/templates/skills/services/neo4j/SKILL.md +0 -257
- package/templates/skills/services/oracle/SKILL.md +0 -300
- package/templates/skills/services/postgresql/SKILL.md +0 -336
- package/templates/skills/services/rabbitmq/SKILL.md +0 -296
- package/templates/skills/services/redis/SKILL.md +0 -302
- package/templates/skills/services/s3/SKILL.md +0 -308
- package/templates/skills/services/sqlite/SKILL.md +0 -304
- package/templates/skills/services/sqlserver/SKILL.md +0 -304
- package/templates/skills/workflows/ralph/SETUP.md +0 -228
- package/templates/skills/workflows/ralph/SKILL.md +0 -309
- package/templates/skills/workflows/ralph/install.sh +0 -87
- package/templates/skills/workflows/ralph/manifest.json +0 -158
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
<!-- SQLSERVER:START -->
|
|
2
|
-
# SQL Server Database Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use SQL Server for enterprise relational data storage with advanced features, high availability, and Windows integration.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using mssql (Node.js)
|
|
11
|
-
import sql from 'mssql'
|
|
12
|
-
|
|
13
|
-
const pool = await sql.connect({
|
|
14
|
-
server: process.env.DB_HOST || 'localhost',
|
|
15
|
-
port: parseInt(process.env.DB_PORT || '1433'),
|
|
16
|
-
database: process.env.DB_NAME || 'myapp',
|
|
17
|
-
user: process.env.DB_USER,
|
|
18
|
-
password: process.env.DB_PASSWORD,
|
|
19
|
-
options: {
|
|
20
|
-
encrypt: process.env.NODE_ENV === 'production',
|
|
21
|
-
trustServerCertificate: process.env.NODE_ENV !== 'production',
|
|
22
|
-
enableArithAbort: true,
|
|
23
|
-
connectionTimeout: 30000,
|
|
24
|
-
requestTimeout: 30000,
|
|
25
|
-
},
|
|
26
|
-
pool: {
|
|
27
|
-
max: 10,
|
|
28
|
-
min: 0,
|
|
29
|
-
idleTimeoutMillis: 30000,
|
|
30
|
-
},
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
// Using tedious (lower level)
|
|
34
|
-
import { Connection } from 'tedious'
|
|
35
|
-
|
|
36
|
-
const connection = new Connection({
|
|
37
|
-
server: process.env.DB_HOST || 'localhost',
|
|
38
|
-
authentication: {
|
|
39
|
-
type: 'default',
|
|
40
|
-
options: {
|
|
41
|
-
userName: process.env.DB_USER,
|
|
42
|
-
password: process.env.DB_PASSWORD,
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
options: {
|
|
46
|
-
encrypt: true,
|
|
47
|
-
database: process.env.DB_NAME,
|
|
48
|
-
trustServerCertificate: true,
|
|
49
|
-
},
|
|
50
|
-
})
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Basic Queries
|
|
54
|
-
```typescript
|
|
55
|
-
// SELECT
|
|
56
|
-
const result = await pool.request()
|
|
57
|
-
.input('userId', sql.Int, userId)
|
|
58
|
-
.query('SELECT * FROM Users WHERE Id = @userId')
|
|
59
|
-
const users = result.recordset
|
|
60
|
-
|
|
61
|
-
// INSERT
|
|
62
|
-
const result = await pool.request()
|
|
63
|
-
.input('name', sql.NVarChar, 'John Doe')
|
|
64
|
-
.input('email', sql.NVarChar, 'john@example.com')
|
|
65
|
-
.query('INSERT INTO Users (Name, Email) OUTPUT INSERTED.* VALUES (@name, @email)')
|
|
66
|
-
const newUser = result.recordset[0]
|
|
67
|
-
|
|
68
|
-
// UPDATE
|
|
69
|
-
const result = await pool.request()
|
|
70
|
-
.input('id', sql.Int, userId)
|
|
71
|
-
.input('name', sql.NVarChar, 'Jane Doe')
|
|
72
|
-
.query('UPDATE Users SET Name = @name WHERE Id = @id')
|
|
73
|
-
|
|
74
|
-
// DELETE
|
|
75
|
-
await pool.request()
|
|
76
|
-
.input('id', sql.Int, userId)
|
|
77
|
-
.query('DELETE FROM Users WHERE Id = @id')
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### Transactions
|
|
81
|
-
```typescript
|
|
82
|
-
const transaction = new sql.Transaction(pool)
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
await transaction.begin()
|
|
86
|
-
|
|
87
|
-
const request = new sql.Request(transaction)
|
|
88
|
-
await request
|
|
89
|
-
.input('userId', sql.Int, userId)
|
|
90
|
-
.input('amount', sql.Decimal(18, 2), 1000)
|
|
91
|
-
.query('INSERT INTO Accounts (UserId, Balance) VALUES (@userId, @amount)')
|
|
92
|
-
|
|
93
|
-
await request
|
|
94
|
-
.input('accountId', sql.Int, accountId)
|
|
95
|
-
.input('amount', sql.Decimal(18, 2), 1000)
|
|
96
|
-
.query('INSERT INTO Transactions (AccountId, Amount) VALUES (@accountId, @amount)')
|
|
97
|
-
|
|
98
|
-
await transaction.commit()
|
|
99
|
-
} catch (error) {
|
|
100
|
-
await transaction.rollback()
|
|
101
|
-
throw error
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Advanced Features
|
|
106
|
-
```typescript
|
|
107
|
-
// Stored procedures
|
|
108
|
-
const result = await pool.request()
|
|
109
|
-
.input('userId', sql.Int, userId)
|
|
110
|
-
.execute('sp_GetUserDetails')
|
|
111
|
-
|
|
112
|
-
// JSON operations (SQL Server 2016+)
|
|
113
|
-
const result = await pool.request()
|
|
114
|
-
.query(`
|
|
115
|
-
SELECT
|
|
116
|
-
Id,
|
|
117
|
-
Name,
|
|
118
|
-
JSON_VALUE(Metadata, '$.category') AS Category
|
|
119
|
-
FROM Products
|
|
120
|
-
WHERE JSON_VALUE(Metadata, '$.category') = 'electronics'
|
|
121
|
-
`)
|
|
122
|
-
|
|
123
|
-
// Full-text search
|
|
124
|
-
const result = await pool.request()
|
|
125
|
-
.input('searchTerm', sql.NVarChar, 'search term')
|
|
126
|
-
.query(`
|
|
127
|
-
SELECT * FROM Articles
|
|
128
|
-
WHERE CONTAINS(Content, @searchTerm)
|
|
129
|
-
`)
|
|
130
|
-
|
|
131
|
-
// Window functions
|
|
132
|
-
const result = await pool.request()
|
|
133
|
-
.query(`
|
|
134
|
-
SELECT
|
|
135
|
-
Name,
|
|
136
|
-
Salary,
|
|
137
|
-
ROW_NUMBER() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS Rank
|
|
138
|
-
FROM Employees
|
|
139
|
-
`)
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## Common Patterns
|
|
143
|
-
|
|
144
|
-
### Connection Pooling
|
|
145
|
-
```typescript
|
|
146
|
-
let pool: sql.ConnectionPool | null = null
|
|
147
|
-
|
|
148
|
-
export async function getPool(): Promise<sql.ConnectionPool> {
|
|
149
|
-
if (!pool) {
|
|
150
|
-
pool = await sql.connect({
|
|
151
|
-
// ... config
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
pool.on('error', (err) => {
|
|
155
|
-
console.error('SQL Server pool error', err)
|
|
156
|
-
})
|
|
157
|
-
}
|
|
158
|
-
return pool
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Graceful shutdown
|
|
162
|
-
process.on('SIGINT', async () => {
|
|
163
|
-
if (pool) {
|
|
164
|
-
await pool.close()
|
|
165
|
-
}
|
|
166
|
-
process.exit(0)
|
|
167
|
-
})
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### Parameterized Queries
|
|
171
|
-
```typescript
|
|
172
|
-
// Always use parameters to prevent SQL injection
|
|
173
|
-
// ❌ WRONG
|
|
174
|
-
await pool.request().query(`SELECT * FROM Users WHERE Email = '${email}'`)
|
|
175
|
-
|
|
176
|
-
// ✅ CORRECT
|
|
177
|
-
await pool.request()
|
|
178
|
-
.input('email', sql.NVarChar, email)
|
|
179
|
-
.query('SELECT * FROM Users WHERE Email = @email')
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### Error Handling
|
|
183
|
-
```typescript
|
|
184
|
-
try {
|
|
185
|
-
const result = await pool.request()
|
|
186
|
-
.input('id', sql.Int, userId)
|
|
187
|
-
.query('SELECT * FROM Users WHERE Id = @id')
|
|
188
|
-
|
|
189
|
-
if (result.recordset.length === 0) {
|
|
190
|
-
throw new Error('User not found')
|
|
191
|
-
}
|
|
192
|
-
return result.recordset[0]
|
|
193
|
-
} catch (error: any) {
|
|
194
|
-
if (error.number === 2627) { // Unique constraint violation
|
|
195
|
-
throw new Error('Duplicate entry')
|
|
196
|
-
}
|
|
197
|
-
if (error.number === 547) { // Foreign key constraint violation
|
|
198
|
-
throw new Error('Referenced record does not exist')
|
|
199
|
-
}
|
|
200
|
-
throw error
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
## Best Practices
|
|
205
|
-
|
|
206
|
-
✅ **DO:**
|
|
207
|
-
- Use connection pooling (10-20 connections)
|
|
208
|
-
- Always use parameterized queries (@param)
|
|
209
|
-
- Use transactions for multi-step operations
|
|
210
|
-
- Create indexes on frequently queried columns
|
|
211
|
-
- Use appropriate data types (NVarChar for Unicode)
|
|
212
|
-
- Enable encryption in production
|
|
213
|
-
- Use stored procedures for complex logic
|
|
214
|
-
- Monitor connection pool usage
|
|
215
|
-
- Use appropriate timeout values
|
|
216
|
-
- Implement retry logic for transient errors
|
|
217
|
-
|
|
218
|
-
❌ **DON'T:**
|
|
219
|
-
- Use string concatenation for queries (SQL injection risk)
|
|
220
|
-
- Create too many connections
|
|
221
|
-
- Skip error handling
|
|
222
|
-
- Ignore connection pool limits
|
|
223
|
-
- Use SELECT * in production
|
|
224
|
-
- Skip indexes on foreign keys
|
|
225
|
-
- Hardcode connection strings
|
|
226
|
-
- Skip encryption in production
|
|
227
|
-
- Ignore query performance
|
|
228
|
-
- Use synchronous operations
|
|
229
|
-
|
|
230
|
-
## Configuration
|
|
231
|
-
|
|
232
|
-
### Environment Variables
|
|
233
|
-
```bash
|
|
234
|
-
DB_HOST=localhost
|
|
235
|
-
DB_PORT=1433
|
|
236
|
-
DB_NAME=myapp
|
|
237
|
-
DB_USER=sa
|
|
238
|
-
DB_PASSWORD=securepassword
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### Docker Compose
|
|
242
|
-
```yaml
|
|
243
|
-
services:
|
|
244
|
-
sqlserver:
|
|
245
|
-
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
246
|
-
ports:
|
|
247
|
-
- "1433:1433"
|
|
248
|
-
environment:
|
|
249
|
-
ACCEPT_EULA: Y
|
|
250
|
-
SA_PASSWORD: securepassword
|
|
251
|
-
MSSQL_PID: Developer
|
|
252
|
-
volumes:
|
|
253
|
-
- sqlserver_data:/var/opt/mssql
|
|
254
|
-
healthcheck:
|
|
255
|
-
test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P securepassword -Q 'SELECT 1' || exit 1"]
|
|
256
|
-
interval: 10s
|
|
257
|
-
timeout: 5s
|
|
258
|
-
retries: 5
|
|
259
|
-
|
|
260
|
-
volumes:
|
|
261
|
-
sqlserver_data:
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
## Integration with Development
|
|
265
|
-
|
|
266
|
-
### Testing
|
|
267
|
-
```typescript
|
|
268
|
-
// Use test database
|
|
269
|
-
const testPool = await sql.connect({
|
|
270
|
-
database: 'myapp_test',
|
|
271
|
-
// ... config
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
// Clean up after tests
|
|
275
|
-
afterEach(async () => {
|
|
276
|
-
await testPool.request().query('DELETE FROM Users')
|
|
277
|
-
await testPool.request().query('DELETE FROM Posts')
|
|
278
|
-
})
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
### Health Checks
|
|
282
|
-
```typescript
|
|
283
|
-
async function checkDatabaseHealth(): Promise<boolean> {
|
|
284
|
-
try {
|
|
285
|
-
const result = await pool.request().query('SELECT 1 AS Health')
|
|
286
|
-
return result.recordset.length > 0
|
|
287
|
-
} catch {
|
|
288
|
-
return false
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
<!-- SQLSERVER:END -->
|
|
294
|
-
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<!-- WINSTON:START -->
|
|
2
|
-
# Winston — Logging
|
|
3
|
-
|
|
4
|
-
## Configuration
|
|
5
|
-
```typescript
|
|
6
|
-
const logger = winston.createLogger({
|
|
7
|
-
level: process.env.LOG_LEVEL || 'info',
|
|
8
|
-
format: winston.format.combine(
|
|
9
|
-
winston.format.timestamp(),
|
|
10
|
-
winston.format.json() // Always JSON in production
|
|
11
|
-
),
|
|
12
|
-
transports: [
|
|
13
|
-
new winston.transports.Console(),
|
|
14
|
-
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
|
|
15
|
-
],
|
|
16
|
-
});
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Log Levels
|
|
20
|
-
- Use semantic levels: `error`, `warn`, `info`, `http`, `debug`
|
|
21
|
-
- Set `level: 'info'` in production; `level: 'debug'` in development
|
|
22
|
-
|
|
23
|
-
## Metadata
|
|
24
|
-
- Include structured metadata: `logger.info('message', { userId, requestId, duration })`
|
|
25
|
-
- Never log sensitive data (tokens, passwords, credit card numbers)
|
|
26
|
-
|
|
27
|
-
## Custom Transports
|
|
28
|
-
- Add external service transports (Datadog, Loggly) as additional transports
|
|
29
|
-
- Always keep console transport as fallback
|
|
30
|
-
<!-- WINSTON:END -->
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "Angular"
|
|
3
|
-
description: "Angular projects must meet these standards before delivery."
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "frameworks"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["frameworks", "framework"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- ANGULAR:START -->
|
|
12
|
-
# Angular Framework Rules
|
|
13
|
-
|
|
14
|
-
**CRITICAL**: Angular projects must meet these standards before delivery.
|
|
15
|
-
|
|
16
|
-
## Quality Commands
|
|
17
|
-
- Lint: `npm run lint`
|
|
18
|
-
- Unit tests: `npm run test -- --watch=false --code-coverage`
|
|
19
|
-
- e2e tests: `npm run e2e`
|
|
20
|
-
- Build: `npm run build -- --configuration production`
|
|
21
|
-
|
|
22
|
-
## Project Structure
|
|
23
|
-
- Colocate features inside `src/app/<feature>/`
|
|
24
|
-
- Keep shared modules in `src/app/shared`
|
|
25
|
-
- Avoid `providedIn: 'root'` unless service truly global
|
|
26
|
-
- Leverage `OnPush` change detection for performance-critical components
|
|
27
|
-
|
|
28
|
-
## Implementation Guidelines
|
|
29
|
-
- Define interfaces for component inputs/outputs
|
|
30
|
-
- Use `HttpClient` interceptors for auth/logging
|
|
31
|
-
- Isolate environment variables in `src/environments/`
|
|
32
|
-
- Prefer Reactive Forms and RxJS operators over manual subscriptions
|
|
33
|
-
|
|
34
|
-
## Pre-Commit Sequence
|
|
35
|
-
```bash
|
|
36
|
-
npm run lint
|
|
37
|
-
npm run test -- --watch=false
|
|
38
|
-
npm run build -- --configuration production
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Documentation
|
|
42
|
-
- Update `/docs/angular-architecture.md` with new modules and routes
|
|
43
|
-
- Record shared component APIs in Storybook or `/docs/ui-components.md`
|
|
44
|
-
- Version major route changes in `/docs/roadmap.md`
|
|
45
|
-
|
|
46
|
-
<!-- ANGULAR:END -->
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "Django"
|
|
3
|
-
description: "Language: Python"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "frameworks"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["frameworks", "framework"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- DJANGO:START -->
|
|
12
|
-
# Django Framework Rules
|
|
13
|
-
|
|
14
|
-
**Language**: Python
|
|
15
|
-
**Version**: Django 4.2+ (LTS) or 5.0+
|
|
16
|
-
|
|
17
|
-
## Setup & Configuration
|
|
18
|
-
|
|
19
|
-
```python
|
|
20
|
-
# settings.py
|
|
21
|
-
SECRET_KEY = env('SECRET_KEY') # Never hardcode
|
|
22
|
-
DEBUG = env.bool('DEBUG', default=False)
|
|
23
|
-
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
|
|
24
|
-
|
|
25
|
-
INSTALLED_APPS = [
|
|
26
|
-
# Django apps
|
|
27
|
-
'django.contrib.admin',
|
|
28
|
-
'django.contrib.auth',
|
|
29
|
-
# Third-party
|
|
30
|
-
'rest_framework',
|
|
31
|
-
'corsheaders',
|
|
32
|
-
# Local apps
|
|
33
|
-
'apps.users',
|
|
34
|
-
]
|
|
35
|
-
|
|
36
|
-
DATABASES = {
|
|
37
|
-
'default': env.db('DATABASE_URL') # Use django-environ
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Quality Gates
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# Code quality
|
|
45
|
-
black . # Format
|
|
46
|
-
ruff check . # Lint
|
|
47
|
-
mypy . # Type check
|
|
48
|
-
|
|
49
|
-
# Tests
|
|
50
|
-
python manage.py test # Run tests
|
|
51
|
-
pytest --cov=apps --cov-report=html # With coverage
|
|
52
|
-
|
|
53
|
-
# Security
|
|
54
|
-
python manage.py check --deploy # Production checks
|
|
55
|
-
bandit -r apps/ # Security scan
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Best Practices
|
|
59
|
-
|
|
60
|
-
✅ **DO:**
|
|
61
|
-
- Use Class-Based Views (CBVs) or Django REST Framework ViewSets
|
|
62
|
-
- Implement custom User model from start
|
|
63
|
-
- Use Django ORM properly (select_related, prefetch_related)
|
|
64
|
-
- Enable CSRF protection
|
|
65
|
-
- Use environment variables for secrets
|
|
66
|
-
- Write tests for views, models, and forms
|
|
67
|
-
|
|
68
|
-
❌ **DON'T:**
|
|
69
|
-
- Use `DEBUG=True` in production
|
|
70
|
-
- Store secrets in settings.py
|
|
71
|
-
- Use raw SQL without parameterization
|
|
72
|
-
- Skip migrations
|
|
73
|
-
- Ignore security middleware
|
|
74
|
-
|
|
75
|
-
## Project Structure
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
project/
|
|
79
|
-
├── manage.py
|
|
80
|
-
├── requirements.txt
|
|
81
|
-
├── apps/
|
|
82
|
-
│ ├── users/
|
|
83
|
-
│ ├── api/
|
|
84
|
-
│ └── core/
|
|
85
|
-
├── config/
|
|
86
|
-
│ ├── settings.py
|
|
87
|
-
│ ├── urls.py
|
|
88
|
-
│ └── wsgi.py
|
|
89
|
-
└── tests/
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
<!-- DJANGO:END -->
|
|
93
|
-
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "Electron"
|
|
3
|
-
description: "Language: TypeScript, JavaScript"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "frameworks"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["frameworks", "framework"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- ELECTRON:START -->
|
|
12
|
-
# Electron Framework Rules
|
|
13
|
-
|
|
14
|
-
**Language**: TypeScript, JavaScript
|
|
15
|
-
**Version**: Electron 28+
|
|
16
|
-
|
|
17
|
-
## Setup & Configuration
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
20
|
-
// main.ts (Main Process)
|
|
21
|
-
import { app, BrowserWindow } from 'electron'
|
|
22
|
-
import path from 'path'
|
|
23
|
-
|
|
24
|
-
function createWindow() {
|
|
25
|
-
const win = new BrowserWindow({
|
|
26
|
-
width: 1200,
|
|
27
|
-
height: 800,
|
|
28
|
-
webPreferences: {
|
|
29
|
-
preload: path.join(__dirname, 'preload.js'),
|
|
30
|
-
contextIsolation: true,
|
|
31
|
-
nodeIntegration: false,
|
|
32
|
-
},
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
win.loadFile('index.html')
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
app.whenReady().then(createWindow)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Quality Gates
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# Type check
|
|
45
|
-
npm run type-check
|
|
46
|
-
|
|
47
|
-
# Lint
|
|
48
|
-
npm run lint
|
|
49
|
-
|
|
50
|
-
# Tests
|
|
51
|
-
npm test
|
|
52
|
-
|
|
53
|
-
# Build
|
|
54
|
-
npm run build # Compile TypeScript
|
|
55
|
-
npm run package # Package app
|
|
56
|
-
npm run make # Create distributables
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Best Practices
|
|
60
|
-
|
|
61
|
-
✅ **DO:**
|
|
62
|
-
- Use contextIsolation: true
|
|
63
|
-
- Disable nodeIntegration
|
|
64
|
-
- Use preload scripts for IPC
|
|
65
|
-
- Implement auto-updates (electron-updater)
|
|
66
|
-
- Sign and notarize apps (production)
|
|
67
|
-
- Use Content Security Policy
|
|
68
|
-
- Implement proper error handling
|
|
69
|
-
- Separate main and renderer processes
|
|
70
|
-
|
|
71
|
-
❌ **DON'T:**
|
|
72
|
-
- Enable nodeIntegration in renderer
|
|
73
|
-
- Skip contextIsolation
|
|
74
|
-
- Use remote module (deprecated)
|
|
75
|
-
- Ignore security warnings
|
|
76
|
-
- Skip code signing
|
|
77
|
-
- Load remote content without CSP
|
|
78
|
-
- Use synchronous IPC
|
|
79
|
-
- Hardcode credentials
|
|
80
|
-
|
|
81
|
-
## Project Structure
|
|
82
|
-
|
|
83
|
-
```
|
|
84
|
-
src/
|
|
85
|
-
├── main/
|
|
86
|
-
│ ├── main.ts # Main process
|
|
87
|
-
│ ├── preload.ts # Preload script
|
|
88
|
-
│ └── ipc/ # IPC handlers
|
|
89
|
-
├── renderer/
|
|
90
|
-
│ ├── index.html
|
|
91
|
-
│ ├── renderer.ts
|
|
92
|
-
│ └── components/
|
|
93
|
-
└── shared/
|
|
94
|
-
└── types.ts
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## IPC Communication
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
// preload.ts
|
|
101
|
-
import { contextBridge, ipcRenderer } from 'electron'
|
|
102
|
-
|
|
103
|
-
contextBridge.exposeInMainWorld('electronAPI', {
|
|
104
|
-
sendMessage: (message: string) => ipcRenderer.send('message', message),
|
|
105
|
-
onReply: (callback: (reply: string) => void) =>
|
|
106
|
-
ipcRenderer.on('reply', (_event, reply) => callback(reply)),
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
// main.ts
|
|
110
|
-
import { ipcMain } from 'electron'
|
|
111
|
-
|
|
112
|
-
ipcMain.on('message', (event, message) => {
|
|
113
|
-
console.log(message)
|
|
114
|
-
event.reply('reply', 'Message received')
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
// renderer.ts
|
|
118
|
-
declare global {
|
|
119
|
-
interface Window {
|
|
120
|
-
electronAPI: {
|
|
121
|
-
sendMessage: (message: string) => void
|
|
122
|
-
onReply: (callback: (reply: string) => void) => void
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
window.electronAPI.sendMessage('Hello from renderer')
|
|
128
|
-
window.electronAPI.onReply((reply) => console.log(reply))
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Security Checklist
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
// ✅ Good security configuration
|
|
135
|
-
const win = new BrowserWindow({
|
|
136
|
-
webPreferences: {
|
|
137
|
-
contextIsolation: true, // ✅ MUST enable
|
|
138
|
-
nodeIntegration: false, // ✅ MUST disable
|
|
139
|
-
sandbox: true, // ✅ Enable sandbox
|
|
140
|
-
webSecurity: true, // ✅ Enable web security
|
|
141
|
-
allowRunningInsecureContent: false, // ✅ Block insecure content
|
|
142
|
-
},
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
// Content Security Policy
|
|
146
|
-
session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
|
|
147
|
-
callback({
|
|
148
|
-
responseHeaders: {
|
|
149
|
-
...details.responseHeaders,
|
|
150
|
-
'Content-Security-Policy': ["default-src 'self'"]
|
|
151
|
-
}
|
|
152
|
-
})
|
|
153
|
-
})
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
<!-- ELECTRON:END -->
|
|
157
|
-
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "Flask"
|
|
3
|
-
description: "Language: Python"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "frameworks"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["frameworks", "framework"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- FLASK:START -->
|
|
12
|
-
# Flask Framework Rules
|
|
13
|
-
|
|
14
|
-
**Language**: Python
|
|
15
|
-
**Version**: Flask 3.0+
|
|
16
|
-
|
|
17
|
-
## Setup
|
|
18
|
-
|
|
19
|
-
```python
|
|
20
|
-
from flask import Flask
|
|
21
|
-
app = Flask(__name__)
|
|
22
|
-
app.config.from_object('config.ProductionConfig')
|
|
23
|
-
|
|
24
|
-
# Use Flask-SQLAlchemy for ORM
|
|
25
|
-
# Use Flask-Migrate for migrations
|
|
26
|
-
# Use Flask-Login for auth
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Quality Gates
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
black .
|
|
33
|
-
ruff check .
|
|
34
|
-
pytest --cov=app
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Best Practices
|
|
38
|
-
|
|
39
|
-
✅ Use application factory pattern
|
|
40
|
-
✅ Enable CORS properly
|
|
41
|
-
✅ Use blueprints for organization
|
|
42
|
-
✅ Implement error handlers
|
|
43
|
-
|
|
44
|
-
❌ Don't use `debug=True` in production
|
|
45
|
-
❌ Don't store secrets in code
|
|
46
|
-
|
|
47
|
-
<!-- FLASK:END -->
|
|
48
|
-
|