@hivehub/rulebook 4.2.2 → 4.3.1
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/continue.md +33 -33
- package/.claude/commands/ralph-config.md +112 -112
- package/.claude/commands/ralph-history.md +110 -110
- package/.claude/commands/ralph-init.md +72 -72
- package/.claude/commands/ralph-pause-resume.md +105 -105
- package/.claude/commands/ralph-run.md +101 -101
- package/.claude/commands/ralph-status.md +76 -76
- package/.claude/commands/rulebook-memory-save.md +48 -48
- package/.claude/commands/rulebook-memory-search.md +47 -47
- package/.claude/commands/rulebook-task-apply.md +67 -67
- package/.claude/commands/rulebook-task-archive.md +70 -70
- package/.claude/commands/rulebook-task-create.md +93 -93
- package/.claude/commands/rulebook-task-list.md +42 -42
- package/.claude/commands/rulebook-task-show.md +52 -52
- package/.claude/commands/rulebook-task-validate.md +53 -53
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +8 -8
- package/README.md +15 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +43 -18
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/claude-mcp.d.ts +10 -2
- package/dist/core/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude-mcp.js +48 -9
- package/dist/core/claude-mcp.js.map +1 -1
- package/dist/core/config-manager.d.ts.map +1 -1
- package/dist/core/config-manager.js +1 -2
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/generator.d.ts +13 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +283 -28
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +10 -3
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/core/workspace/workspace-manager.js +2 -6
- package/dist/core/workspace/workspace-manager.js.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +23 -10
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/package.json +21 -22
- package/templates/agents/accessibility-reviewer.md +43 -0
- package/templates/agents/api-designer.md +42 -0
- package/templates/agents/architect.md +51 -0
- package/templates/agents/build-engineer.md +36 -0
- package/templates/agents/code-reviewer.md +47 -0
- package/templates/agents/database-architect.md +41 -0
- package/templates/agents/devops-engineer.md +42 -0
- package/templates/agents/docs-writer.md +38 -0
- package/templates/agents/i18n-engineer.md +42 -0
- package/templates/agents/implementer.md +38 -35
- package/templates/agents/migration-engineer.md +42 -0
- package/templates/agents/performance-engineer.md +49 -0
- package/templates/agents/refactoring-agent.md +41 -0
- package/templates/agents/researcher.md +38 -34
- package/templates/agents/security-reviewer.md +40 -0
- package/templates/agents/team-lead.md +37 -34
- package/templates/agents/tester.md +45 -42
- package/templates/agents/ux-reviewer.md +43 -0
- package/templates/ci/rulebook-review.yml +26 -26
- package/templates/cli/AIDER.md +49 -49
- package/templates/cli/AMAZON_Q.md +25 -25
- package/templates/cli/AUGGIE.md +32 -32
- package/templates/cli/CLAUDE.md +117 -117
- package/templates/cli/CLINE.md +99 -99
- package/templates/cli/CODEBUDDY.md +20 -20
- package/templates/cli/CODEIUM.md +20 -20
- package/templates/cli/CODEX.md +21 -21
- package/templates/cli/CONTINUE.md +34 -34
- package/templates/cli/CURSOR_CLI.md +62 -62
- package/templates/cli/FACTORY.md +18 -18
- package/templates/cli/GEMINI.md +35 -35
- package/templates/cli/KILOCODE.md +18 -18
- package/templates/cli/OPENCODE.md +18 -18
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
- package/templates/commands/rulebook-memory-save.md +48 -48
- package/templates/commands/rulebook-memory-search.md +47 -47
- package/templates/commands/rulebook-task-apply.md +67 -67
- package/templates/commands/rulebook-task-archive.md +94 -94
- package/templates/commands/rulebook-task-create.md +93 -93
- package/templates/commands/rulebook-task-list.md +42 -42
- package/templates/commands/rulebook-task-show.md +52 -52
- package/templates/commands/rulebook-task-validate.md +53 -53
- package/templates/core/AGENTS_LEAN.md +25 -25
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +288 -288
- package/templates/core/DAG.md +304 -304
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/MULTI_AGENT.md +74 -74
- package/templates/core/PLANS.md +28 -28
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
- package/templates/core/RALPH.md +471 -471
- package/templates/core/RULEBOOK.md +1935 -1935
- package/templates/frameworks/ANGULAR.md +36 -36
- package/templates/frameworks/DJANGO.md +83 -83
- package/templates/frameworks/ELECTRON.md +147 -147
- package/templates/frameworks/FLASK.md +38 -38
- package/templates/frameworks/FLUTTER.md +55 -55
- package/templates/frameworks/JQUERY.md +32 -32
- package/templates/frameworks/LARAVEL.md +38 -38
- package/templates/frameworks/NESTJS.md +43 -43
- package/templates/frameworks/NEXTJS.md +127 -127
- package/templates/frameworks/NUXT.md +40 -40
- package/templates/frameworks/RAILS.md +66 -66
- package/templates/frameworks/REACT.md +38 -38
- package/templates/frameworks/REACT_NATIVE.md +47 -47
- package/templates/frameworks/SPRING.md +39 -39
- package/templates/frameworks/SYMFONY.md +36 -36
- package/templates/frameworks/VUE.md +36 -36
- package/templates/frameworks/ZEND.md +35 -35
- package/templates/git/CI_CD_PATTERNS.md +661 -661
- package/templates/git/GITHUB_ACTIONS.md +728 -728
- package/templates/git/GITLAB_CI.md +730 -730
- package/templates/git/GIT_WORKFLOW.md +1157 -1157
- package/templates/git/SECRETS_MANAGEMENT.md +585 -585
- package/templates/hooks/COMMIT_MSG.md +530 -530
- package/templates/hooks/POST_CHECKOUT.md +546 -546
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
- package/templates/hooks/PRE_COMMIT.md +414 -414
- package/templates/hooks/PRE_PUSH.md +601 -601
- package/templates/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT.md +37 -37
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/CURSOR.md +43 -43
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/JETBRAINS_AI.md +35 -35
- package/templates/ides/REPLIT.md +36 -36
- package/templates/ides/TABNINE.md +29 -29
- package/templates/ides/VSCODE.md +40 -40
- package/templates/ides/WINDSURF.md +36 -36
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/ides/ZED.md +32 -32
- package/templates/ides/cursor-mdc/go.mdc +24 -24
- package/templates/ides/cursor-mdc/python.mdc +24 -24
- package/templates/ides/cursor-mdc/quality.mdc +25 -25
- package/templates/ides/cursor-mdc/ralph.mdc +39 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
- package/templates/ides/cursor-mdc/rust.mdc +24 -24
- package/templates/ides/cursor-mdc/typescript.mdc +25 -25
- package/templates/languages/C.md +333 -333
- package/templates/languages/CPP.md +743 -743
- package/templates/languages/CSHARP.md +417 -417
- package/templates/languages/ELIXIR.md +454 -454
- package/templates/languages/ERLANG.md +361 -361
- package/templates/languages/GO.md +645 -645
- package/templates/languages/HASKELL.md +177 -177
- package/templates/languages/JAVA.md +607 -607
- package/templates/languages/JAVASCRIPT.md +631 -631
- package/templates/languages/JULIA.md +97 -97
- package/templates/languages/KOTLIN.md +511 -511
- package/templates/languages/LISP.md +100 -100
- package/templates/languages/LUA.md +74 -74
- package/templates/languages/OBJECTIVEC.md +90 -90
- package/templates/languages/PHP.md +416 -416
- package/templates/languages/PYTHON.md +682 -682
- package/templates/languages/RUBY.md +421 -421
- package/templates/languages/RUST.md +477 -477
- package/templates/languages/SAS.md +73 -73
- package/templates/languages/SCALA.md +348 -348
- package/templates/languages/SOLIDITY.md +580 -580
- package/templates/languages/SQL.md +137 -137
- package/templates/languages/SWIFT.md +466 -466
- package/templates/languages/TYPESCRIPT.md +591 -591
- package/templates/languages/ZIG.md +265 -265
- package/templates/modules/ATLASSIAN.md +255 -255
- package/templates/modules/CONTEXT7.md +54 -54
- package/templates/modules/FIGMA.md +267 -267
- package/templates/modules/GITHUB_MCP.md +64 -64
- package/templates/modules/GRAFANA.md +328 -328
- package/templates/modules/MEMORY.md +126 -126
- package/templates/modules/NOTION.md +247 -247
- package/templates/modules/PLAYWRIGHT.md +90 -90
- package/templates/modules/RULEBOOK_MCP.md +156 -156
- package/templates/modules/SERENA.md +337 -337
- package/templates/modules/SUPABASE.md +223 -223
- package/templates/modules/SYNAP.md +69 -69
- package/templates/modules/VECTORIZER.md +63 -63
- package/templates/modules/sequential-thinking.md +42 -42
- package/templates/ralph/ralph-history.bat +4 -4
- package/templates/ralph/ralph-history.sh +5 -5
- package/templates/ralph/ralph-init.bat +5 -5
- package/templates/ralph/ralph-init.sh +5 -5
- package/templates/ralph/ralph-pause.bat +5 -5
- package/templates/ralph/ralph-pause.sh +5 -5
- package/templates/ralph/ralph-run.bat +5 -5
- package/templates/ralph/ralph-run.sh +5 -5
- package/templates/ralph/ralph-status.bat +4 -4
- package/templates/ralph/ralph-status.sh +5 -5
- package/templates/services/AZURE_BLOB.md +184 -184
- package/templates/services/CASSANDRA.md +239 -239
- package/templates/services/DATADOG.md +26 -26
- package/templates/services/DOCKER.md +124 -124
- package/templates/services/DOCKER_COMPOSE.md +168 -168
- package/templates/services/DYNAMODB.md +308 -308
- package/templates/services/ELASTICSEARCH.md +347 -347
- package/templates/services/GCS.md +178 -178
- package/templates/services/HELM.md +194 -194
- package/templates/services/INFLUXDB.md +265 -265
- package/templates/services/KAFKA.md +341 -341
- package/templates/services/KUBERNETES.md +208 -208
- package/templates/services/MARIADB.md +183 -183
- package/templates/services/MEMCACHED.md +242 -242
- package/templates/services/MINIO.md +201 -201
- package/templates/services/MONGODB.md +268 -268
- package/templates/services/MYSQL.md +358 -358
- package/templates/services/NEO4J.md +247 -247
- package/templates/services/OPENTELEMETRY.md +25 -25
- package/templates/services/ORACLE.md +290 -290
- package/templates/services/PINO.md +24 -24
- package/templates/services/POSTGRESQL.md +326 -326
- package/templates/services/PROMETHEUS.md +33 -33
- package/templates/services/RABBITMQ.md +286 -286
- package/templates/services/REDIS.md +292 -292
- package/templates/services/S3.md +298 -298
- package/templates/services/SENTRY.md +23 -23
- package/templates/services/SQLITE.md +294 -294
- package/templates/services/SQLSERVER.md +294 -294
- package/templates/services/WINSTON.md +30 -30
- package/templates/skills/cli/aider/SKILL.md +59 -59
- package/templates/skills/cli/amazon-q/SKILL.md +35 -35
- package/templates/skills/cli/auggie/SKILL.md +42 -42
- package/templates/skills/cli/claude/SKILL.md +42 -42
- package/templates/skills/cli/cline/SKILL.md +42 -42
- package/templates/skills/cli/codebuddy/SKILL.md +30 -30
- package/templates/skills/cli/codeium/SKILL.md +30 -30
- package/templates/skills/cli/codex/SKILL.md +31 -31
- package/templates/skills/cli/continue/SKILL.md +44 -44
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
- package/templates/skills/cli/factory/SKILL.md +28 -28
- package/templates/skills/cli/gemini/SKILL.md +45 -45
- package/templates/skills/cli/kilocode/SKILL.md +28 -28
- package/templates/skills/cli/opencode/SKILL.md +28 -28
- package/templates/skills/core/agent-automation/SKILL.md +194 -194
- package/templates/skills/core/dag/SKILL.md +314 -314
- package/templates/skills/core/documentation-rules/SKILL.md +46 -46
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
- package/templates/skills/core/rulebook/SKILL.md +176 -176
- package/templates/skills/dev/accessibility/SKILL.md +17 -0
- package/templates/skills/dev/api-design/SKILL.md +15 -0
- package/templates/skills/dev/architect/SKILL.md +17 -0
- package/templates/skills/dev/build-fix/SKILL.md +17 -0
- package/templates/skills/dev/db-design/SKILL.md +15 -0
- package/templates/skills/dev/debug/SKILL.md +16 -0
- package/templates/skills/dev/deploy/SKILL.md +17 -0
- package/templates/skills/dev/docs/SKILL.md +17 -0
- package/templates/skills/dev/migrate/SKILL.md +15 -0
- package/templates/skills/dev/perf/SKILL.md +17 -0
- package/templates/skills/dev/refactor/SKILL.md +17 -0
- package/templates/skills/dev/research/SKILL.md +14 -0
- package/templates/skills/dev/review/SKILL.md +18 -0
- package/templates/skills/dev/security-audit/SKILL.md +17 -0
- package/templates/skills/frameworks/angular/SKILL.md +46 -46
- package/templates/skills/frameworks/django/SKILL.md +93 -93
- package/templates/skills/frameworks/electron/SKILL.md +157 -157
- package/templates/skills/frameworks/flask/SKILL.md +48 -48
- package/templates/skills/frameworks/flutter/SKILL.md +65 -65
- package/templates/skills/frameworks/jquery/SKILL.md +42 -42
- package/templates/skills/frameworks/laravel/SKILL.md +48 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
- package/templates/skills/frameworks/rails/SKILL.md +76 -76
- package/templates/skills/frameworks/react/SKILL.md +48 -48
- package/templates/skills/frameworks/react-native/SKILL.md +57 -57
- package/templates/skills/frameworks/spring/SKILL.md +49 -49
- package/templates/skills/frameworks/symfony/SKILL.md +46 -46
- package/templates/skills/frameworks/vue/SKILL.md +46 -46
- package/templates/skills/frameworks/zend/SKILL.md +45 -45
- package/templates/skills/ides/copilot/SKILL.md +47 -47
- package/templates/skills/ides/cursor/SKILL.md +53 -53
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
- package/templates/skills/ides/replit/SKILL.md +46 -46
- package/templates/skills/ides/tabnine/SKILL.md +39 -39
- package/templates/skills/ides/vscode/SKILL.md +50 -50
- package/templates/skills/ides/windsurf/SKILL.md +46 -46
- package/templates/skills/ides/zed/SKILL.md +42 -42
- package/templates/skills/languages/c/SKILL.md +343 -343
- package/templates/skills/languages/cpp/SKILL.md +753 -753
- package/templates/skills/languages/csharp/SKILL.md +427 -427
- package/templates/skills/languages/elixir/SKILL.md +464 -464
- package/templates/skills/languages/erlang/SKILL.md +371 -371
- package/templates/skills/languages/go/SKILL.md +655 -655
- package/templates/skills/languages/haskell/SKILL.md +187 -187
- package/templates/skills/languages/java/SKILL.md +617 -617
- package/templates/skills/languages/javascript/SKILL.md +641 -641
- package/templates/skills/languages/julia/SKILL.md +107 -107
- package/templates/skills/languages/kotlin/SKILL.md +521 -521
- package/templates/skills/languages/lisp/SKILL.md +110 -110
- package/templates/skills/languages/lua/SKILL.md +84 -84
- package/templates/skills/languages/objectivec/SKILL.md +100 -100
- package/templates/skills/languages/php/SKILL.md +426 -426
- package/templates/skills/languages/python/SKILL.md +692 -692
- package/templates/skills/languages/ruby/SKILL.md +431 -431
- package/templates/skills/languages/rust/SKILL.md +487 -487
- package/templates/skills/languages/sas/SKILL.md +83 -83
- package/templates/skills/languages/scala/SKILL.md +358 -358
- package/templates/skills/languages/solidity/SKILL.md +590 -590
- package/templates/skills/languages/sql/SKILL.md +147 -147
- package/templates/skills/languages/swift/SKILL.md +476 -476
- package/templates/skills/languages/typescript/SKILL.md +302 -302
- package/templates/skills/languages/zig/SKILL.md +275 -275
- package/templates/skills/modules/atlassian/SKILL.md +265 -265
- package/templates/skills/modules/context7/SKILL.md +64 -64
- package/templates/skills/modules/figma/SKILL.md +277 -277
- package/templates/skills/modules/github-mcp/SKILL.md +74 -74
- package/templates/skills/modules/grafana/SKILL.md +338 -338
- package/templates/skills/modules/memory/SKILL.md +73 -73
- package/templates/skills/modules/notion/SKILL.md +257 -257
- package/templates/skills/modules/playwright/SKILL.md +100 -100
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
- package/templates/skills/modules/serena/SKILL.md +347 -347
- package/templates/skills/modules/supabase/SKILL.md +233 -233
- package/templates/skills/modules/synap/SKILL.md +79 -79
- package/templates/skills/modules/vectorizer/SKILL.md +73 -73
- package/templates/skills/services/azure-blob/SKILL.md +194 -194
- package/templates/skills/services/cassandra/SKILL.md +249 -249
- package/templates/skills/services/dynamodb/SKILL.md +318 -318
- package/templates/skills/services/elasticsearch/SKILL.md +357 -357
- package/templates/skills/services/gcs/SKILL.md +188 -188
- package/templates/skills/services/influxdb/SKILL.md +275 -275
- package/templates/skills/services/kafka/SKILL.md +351 -351
- package/templates/skills/services/mariadb/SKILL.md +193 -193
- package/templates/skills/services/memcached/SKILL.md +252 -252
- package/templates/skills/services/minio/SKILL.md +211 -211
- package/templates/skills/services/mongodb/SKILL.md +278 -278
- package/templates/skills/services/mysql/SKILL.md +368 -368
- package/templates/skills/services/neo4j/SKILL.md +257 -257
- package/templates/skills/services/oracle/SKILL.md +300 -300
- package/templates/skills/services/postgresql/SKILL.md +336 -336
- package/templates/skills/services/rabbitmq/SKILL.md +296 -296
- package/templates/skills/services/redis/SKILL.md +302 -302
- package/templates/skills/services/s3/SKILL.md +308 -308
- package/templates/skills/services/sqlite/SKILL.md +304 -304
- package/templates/skills/services/sqlserver/SKILL.md +304 -304
- package/templates/skills/workflows/ralph/SKILL.md +309 -309
- package/templates/skills/workflows/ralph/install.sh +87 -87
- package/templates/skills/workflows/ralph/manifest.json +158 -158
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
<!-- GCS:START -->
|
|
2
|
-
# Google Cloud Storage Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use Google Cloud Storage for object storage, file uploads, static assets, and backup storage in GCP.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using @google-cloud/storage
|
|
11
|
-
import { Storage } from '@google-cloud/storage'
|
|
12
|
-
|
|
13
|
-
const storage = new Storage({
|
|
14
|
-
projectId: process.env.GCP_PROJECT_ID,
|
|
15
|
-
keyFilename: process.env.GCP_KEY_FILE, // Path to service account key
|
|
16
|
-
// Or use credentials object
|
|
17
|
-
credentials: {
|
|
18
|
-
client_email: process.env.GCP_CLIENT_EMAIL,
|
|
19
|
-
private_key: process.env.GCP_PRIVATE_KEY?.replace(/\\n/g, '\n'),
|
|
20
|
-
},
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
const bucket = storage.bucket(process.env.GCS_BUCKET_NAME || 'my-bucket')
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Basic Operations
|
|
27
|
-
```typescript
|
|
28
|
-
// Upload file
|
|
29
|
-
const file = bucket.file('path/to/file.jpg')
|
|
30
|
-
await file.save(fileBuffer, {
|
|
31
|
-
metadata: {
|
|
32
|
-
contentType: 'image/jpeg',
|
|
33
|
-
metadata: {
|
|
34
|
-
userId: '123',
|
|
35
|
-
originalName: 'photo.jpg',
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
// Download file
|
|
41
|
-
const [fileContent] = await file.download()
|
|
42
|
-
|
|
43
|
-
// Delete file
|
|
44
|
-
await file.delete()
|
|
45
|
-
|
|
46
|
-
// List files
|
|
47
|
-
const [files] = await bucket.getFiles({
|
|
48
|
-
prefix: 'uploads/',
|
|
49
|
-
maxResults: 100,
|
|
50
|
-
})
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Advanced Features
|
|
54
|
-
```typescript
|
|
55
|
-
// Generate signed URL
|
|
56
|
-
const [url] = await file.getSignedUrl({
|
|
57
|
-
action: 'read',
|
|
58
|
-
expires: Date.now() + 3600 * 1000, // 1 hour
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
// Generate signed URL for upload
|
|
62
|
-
const [uploadUrl] = await file.getSignedUrl({
|
|
63
|
-
action: 'write',
|
|
64
|
-
expires: Date.now() + 3600 * 1000,
|
|
65
|
-
contentType: 'image/jpeg',
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
// Copy file
|
|
69
|
-
const sourceFile = bucket.file('source/file.jpg')
|
|
70
|
-
const destFile = bucket.file('dest/file.jpg')
|
|
71
|
-
await sourceFile.copy(destFile)
|
|
72
|
-
|
|
73
|
-
// Set metadata
|
|
74
|
-
await file.setMetadata({
|
|
75
|
-
metadata: {
|
|
76
|
-
category: 'profile',
|
|
77
|
-
uploadedBy: 'user-123',
|
|
78
|
-
},
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
// Get metadata
|
|
82
|
-
const [metadata] = await file.getMetadata()
|
|
83
|
-
console.log(metadata.contentType, metadata.size, metadata.metadata)
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Common Patterns
|
|
87
|
-
|
|
88
|
-
### File Upload Handler
|
|
89
|
-
```typescript
|
|
90
|
-
async function uploadFile(file: Buffer, filename: string, userId: string) {
|
|
91
|
-
const filePath = `users/${userId}/${Date.now()}-${filename}`
|
|
92
|
-
const file = bucket.file(filePath)
|
|
93
|
-
|
|
94
|
-
await file.save(file, {
|
|
95
|
-
metadata: {
|
|
96
|
-
contentType: getContentType(filename),
|
|
97
|
-
metadata: {
|
|
98
|
-
userId,
|
|
99
|
-
originalName: filename,
|
|
100
|
-
uploadedAt: new Date().toISOString(),
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
await file.makePublic() // Or use signed URLs
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
filePath,
|
|
109
|
-
publicUrl: file.publicUrl(),
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Temporary Access URL
|
|
115
|
-
```typescript
|
|
116
|
-
async function generateTemporaryUrl(filePath: string, expiresInMinutes: number = 60) {
|
|
117
|
-
const file = bucket.file(filePath)
|
|
118
|
-
const [url] = await file.getSignedUrl({
|
|
119
|
-
action: 'read',
|
|
120
|
-
expires: Date.now() + expiresInMinutes * 60 * 1000,
|
|
121
|
-
})
|
|
122
|
-
return url
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## Best Practices
|
|
127
|
-
|
|
128
|
-
✅ **DO:**
|
|
129
|
-
- Use appropriate storage classes (Standard, Nearline, Coldline, Archive)
|
|
130
|
-
- Set blob metadata for organization
|
|
131
|
-
- Use signed URLs for temporary access
|
|
132
|
-
- Implement proper error handling
|
|
133
|
-
- Use appropriate content types
|
|
134
|
-
- Enable versioning for important data
|
|
135
|
-
- Monitor storage usage and costs
|
|
136
|
-
- Use lifecycle management policies
|
|
137
|
-
- Implement retry logic
|
|
138
|
-
- Use service account credentials
|
|
139
|
-
|
|
140
|
-
❌ **DON'T:**
|
|
141
|
-
- Store sensitive data without encryption
|
|
142
|
-
- Make files public unnecessarily
|
|
143
|
-
- Hardcode credentials
|
|
144
|
-
- Ignore error handling
|
|
145
|
-
- Skip content-type validation
|
|
146
|
-
- Ignore lifecycle policies
|
|
147
|
-
- Skip access logging
|
|
148
|
-
- Use default permissions
|
|
149
|
-
- Ignore cost optimization
|
|
150
|
-
- Store large files without chunking
|
|
151
|
-
|
|
152
|
-
## Configuration
|
|
153
|
-
|
|
154
|
-
### Environment Variables
|
|
155
|
-
```bash
|
|
156
|
-
GCP_PROJECT_ID=my-project
|
|
157
|
-
GCP_KEY_FILE=/path/to/service-account-key.json
|
|
158
|
-
GCP_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com
|
|
159
|
-
GCP_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n..."
|
|
160
|
-
GCS_BUCKET_NAME=my-bucket
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Service Account Key
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"type": "service_account",
|
|
167
|
-
"project_id": "my-project",
|
|
168
|
-
"private_key_id": "...",
|
|
169
|
-
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
|
|
170
|
-
"client_email": "service-account@project.iam.gserviceaccount.com",
|
|
171
|
-
"client_id": "...",
|
|
172
|
-
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
|
173
|
-
"token_uri": "https://oauth2.googleapis.com/token"
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
<!-- GCS:END -->
|
|
178
|
-
|
|
1
|
+
<!-- GCS:START -->
|
|
2
|
+
# Google Cloud Storage Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use Google Cloud Storage for object storage, file uploads, static assets, and backup storage in GCP.
|
|
5
|
+
|
|
6
|
+
## Core Features
|
|
7
|
+
|
|
8
|
+
### Connection
|
|
9
|
+
```typescript
|
|
10
|
+
// Using @google-cloud/storage
|
|
11
|
+
import { Storage } from '@google-cloud/storage'
|
|
12
|
+
|
|
13
|
+
const storage = new Storage({
|
|
14
|
+
projectId: process.env.GCP_PROJECT_ID,
|
|
15
|
+
keyFilename: process.env.GCP_KEY_FILE, // Path to service account key
|
|
16
|
+
// Or use credentials object
|
|
17
|
+
credentials: {
|
|
18
|
+
client_email: process.env.GCP_CLIENT_EMAIL,
|
|
19
|
+
private_key: process.env.GCP_PRIVATE_KEY?.replace(/\\n/g, '\n'),
|
|
20
|
+
},
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const bucket = storage.bucket(process.env.GCS_BUCKET_NAME || 'my-bucket')
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Basic Operations
|
|
27
|
+
```typescript
|
|
28
|
+
// Upload file
|
|
29
|
+
const file = bucket.file('path/to/file.jpg')
|
|
30
|
+
await file.save(fileBuffer, {
|
|
31
|
+
metadata: {
|
|
32
|
+
contentType: 'image/jpeg',
|
|
33
|
+
metadata: {
|
|
34
|
+
userId: '123',
|
|
35
|
+
originalName: 'photo.jpg',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
// Download file
|
|
41
|
+
const [fileContent] = await file.download()
|
|
42
|
+
|
|
43
|
+
// Delete file
|
|
44
|
+
await file.delete()
|
|
45
|
+
|
|
46
|
+
// List files
|
|
47
|
+
const [files] = await bucket.getFiles({
|
|
48
|
+
prefix: 'uploads/',
|
|
49
|
+
maxResults: 100,
|
|
50
|
+
})
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Advanced Features
|
|
54
|
+
```typescript
|
|
55
|
+
// Generate signed URL
|
|
56
|
+
const [url] = await file.getSignedUrl({
|
|
57
|
+
action: 'read',
|
|
58
|
+
expires: Date.now() + 3600 * 1000, // 1 hour
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
// Generate signed URL for upload
|
|
62
|
+
const [uploadUrl] = await file.getSignedUrl({
|
|
63
|
+
action: 'write',
|
|
64
|
+
expires: Date.now() + 3600 * 1000,
|
|
65
|
+
contentType: 'image/jpeg',
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// Copy file
|
|
69
|
+
const sourceFile = bucket.file('source/file.jpg')
|
|
70
|
+
const destFile = bucket.file('dest/file.jpg')
|
|
71
|
+
await sourceFile.copy(destFile)
|
|
72
|
+
|
|
73
|
+
// Set metadata
|
|
74
|
+
await file.setMetadata({
|
|
75
|
+
metadata: {
|
|
76
|
+
category: 'profile',
|
|
77
|
+
uploadedBy: 'user-123',
|
|
78
|
+
},
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// Get metadata
|
|
82
|
+
const [metadata] = await file.getMetadata()
|
|
83
|
+
console.log(metadata.contentType, metadata.size, metadata.metadata)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Common Patterns
|
|
87
|
+
|
|
88
|
+
### File Upload Handler
|
|
89
|
+
```typescript
|
|
90
|
+
async function uploadFile(file: Buffer, filename: string, userId: string) {
|
|
91
|
+
const filePath = `users/${userId}/${Date.now()}-${filename}`
|
|
92
|
+
const file = bucket.file(filePath)
|
|
93
|
+
|
|
94
|
+
await file.save(file, {
|
|
95
|
+
metadata: {
|
|
96
|
+
contentType: getContentType(filename),
|
|
97
|
+
metadata: {
|
|
98
|
+
userId,
|
|
99
|
+
originalName: filename,
|
|
100
|
+
uploadedAt: new Date().toISOString(),
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
await file.makePublic() // Or use signed URLs
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
filePath,
|
|
109
|
+
publicUrl: file.publicUrl(),
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Temporary Access URL
|
|
115
|
+
```typescript
|
|
116
|
+
async function generateTemporaryUrl(filePath: string, expiresInMinutes: number = 60) {
|
|
117
|
+
const file = bucket.file(filePath)
|
|
118
|
+
const [url] = await file.getSignedUrl({
|
|
119
|
+
action: 'read',
|
|
120
|
+
expires: Date.now() + expiresInMinutes * 60 * 1000,
|
|
121
|
+
})
|
|
122
|
+
return url
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Best Practices
|
|
127
|
+
|
|
128
|
+
✅ **DO:**
|
|
129
|
+
- Use appropriate storage classes (Standard, Nearline, Coldline, Archive)
|
|
130
|
+
- Set blob metadata for organization
|
|
131
|
+
- Use signed URLs for temporary access
|
|
132
|
+
- Implement proper error handling
|
|
133
|
+
- Use appropriate content types
|
|
134
|
+
- Enable versioning for important data
|
|
135
|
+
- Monitor storage usage and costs
|
|
136
|
+
- Use lifecycle management policies
|
|
137
|
+
- Implement retry logic
|
|
138
|
+
- Use service account credentials
|
|
139
|
+
|
|
140
|
+
❌ **DON'T:**
|
|
141
|
+
- Store sensitive data without encryption
|
|
142
|
+
- Make files public unnecessarily
|
|
143
|
+
- Hardcode credentials
|
|
144
|
+
- Ignore error handling
|
|
145
|
+
- Skip content-type validation
|
|
146
|
+
- Ignore lifecycle policies
|
|
147
|
+
- Skip access logging
|
|
148
|
+
- Use default permissions
|
|
149
|
+
- Ignore cost optimization
|
|
150
|
+
- Store large files without chunking
|
|
151
|
+
|
|
152
|
+
## Configuration
|
|
153
|
+
|
|
154
|
+
### Environment Variables
|
|
155
|
+
```bash
|
|
156
|
+
GCP_PROJECT_ID=my-project
|
|
157
|
+
GCP_KEY_FILE=/path/to/service-account-key.json
|
|
158
|
+
GCP_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com
|
|
159
|
+
GCP_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n..."
|
|
160
|
+
GCS_BUCKET_NAME=my-bucket
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Service Account Key
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"type": "service_account",
|
|
167
|
+
"project_id": "my-project",
|
|
168
|
+
"private_key_id": "...",
|
|
169
|
+
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
|
|
170
|
+
"client_email": "service-account@project.iam.gserviceaccount.com",
|
|
171
|
+
"client_id": "...",
|
|
172
|
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
|
173
|
+
"token_uri": "https://oauth2.googleapis.com/token"
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
<!-- GCS:END -->
|
|
178
|
+
|