@hivehub/rulebook 5.1.2 → 5.1.3
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-decision-create.md +55 -55
- package/.claude/commands/rulebook-decision-list.md +15 -15
- package/.claude/commands/rulebook-knowledge-add.md +41 -41
- package/.claude/commands/rulebook-knowledge-list.md +15 -15
- package/.claude/commands/rulebook-learn-capture.md +48 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- 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 +94 -94
- 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 +4 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +39 -8
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/agent-template-engine.d.ts.map +1 -1
- package/dist/core/agent-template-engine.js +36 -30
- package/dist/core/agent-template-engine.js.map +1 -1
- package/dist/core/complexity-detector.d.ts.map +1 -1
- package/dist/core/complexity-detector.js +109 -29
- package/dist/core/complexity-detector.js.map +1 -1
- package/dist/core/decision-manager.d.ts.map +1 -1
- package/dist/core/decision-manager.js +2 -7
- package/dist/core/decision-manager.js.map +1 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +28 -28
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts +1 -0
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +107 -19
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/indexer/indexer-types.d.ts +2 -0
- package/dist/core/indexer/indexer-types.d.ts.map +1 -1
- package/dist/core/knowledge-manager.d.ts.map +1 -1
- package/dist/core/knowledge-manager.js +1 -1
- package/dist/core/knowledge-manager.js.map +1 -1
- package/dist/core/learn-manager.d.ts.map +1 -1
- package/dist/core/learn-manager.js +1 -1
- package/dist/core/learn-manager.js.map +1 -1
- package/dist/core/rule-engine.d.ts.map +1 -1
- package/dist/core/rule-engine.js +1 -3
- package/dist/core/rule-engine.js.map +1 -1
- package/dist/core/task-manager.d.ts.map +1 -1
- package/dist/core/task-manager.js +24 -24
- package/dist/core/task-manager.js.map +1 -1
- package/dist/index.js +23 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +18 -6
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/hnsw-index.d.ts.map +1 -1
- package/dist/memory/hnsw-index.js +12 -4
- package/dist/memory/hnsw-index.js.map +1 -1
- package/dist/memory/memory-store.d.ts.map +1 -1
- package/dist/memory/memory-store.js +136 -107
- package/dist/memory/memory-store.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +22 -21
- package/templates/agents/accessibility-reviewer.md +43 -43
- package/templates/agents/api-designer.md +42 -42
- package/templates/agents/architect.md +51 -51
- package/templates/agents/build-engineer.md +36 -36
- package/templates/agents/code-reviewer.md +47 -47
- package/templates/agents/compiler/codegen-debugger.md +34 -34
- package/templates/agents/compiler/stdlib-engineer.md +28 -28
- package/templates/agents/compiler/test-coverage-guardian.md +31 -31
- package/templates/agents/context-intelligence.md +52 -52
- package/templates/agents/database-architect.md +41 -41
- package/templates/agents/devops-engineer.md +42 -42
- package/templates/agents/docs-writer.md +38 -38
- package/templates/agents/game-engine/cpp-core-expert.md +35 -35
- package/templates/agents/game-engine/render-engineer.md +22 -22
- package/templates/agents/game-engine/shader-engineer.md +38 -38
- package/templates/agents/game-engine/systems-integration.md +43 -43
- package/templates/agents/generic/code-reviewer.md +41 -41
- package/templates/agents/generic/docs-writer.md +25 -25
- package/templates/agents/generic/project-manager.md +36 -36
- package/templates/agents/generic/researcher.md +34 -34
- package/templates/agents/generic/test-engineer.md +41 -41
- package/templates/agents/i18n-engineer.md +42 -42
- package/templates/agents/implementer.md +42 -42
- package/templates/agents/migration-engineer.md +42 -42
- package/templates/agents/mobile/platform-specialist.md +22 -22
- package/templates/agents/mobile/ui-engineer.md +22 -22
- package/templates/agents/performance-engineer.md +49 -49
- package/templates/agents/refactoring-agent.md +41 -41
- package/templates/agents/researcher.md +38 -38
- package/templates/agents/security-reviewer.md +40 -40
- package/templates/agents/team-lead.md +37 -37
- package/templates/agents/tester.md +48 -48
- package/templates/agents/ux-reviewer.md +43 -43
- package/templates/agents/web-app/api-designer.md +22 -22
- package/templates/agents/web-app/backend-engineer.md +30 -30
- package/templates/agents/web-app/database-engineer.md +22 -22
- package/templates/agents/web-app/frontend-engineer.md +29 -29
- package/templates/agents/web-app/security-reviewer.md +32 -32
- 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-decision-create.md +55 -55
- package/templates/commands/rulebook-decision-list.md +15 -15
- package/templates/commands/rulebook-knowledge-add.md +41 -41
- package/templates/commands/rulebook-knowledge-list.md +15 -15
- package/templates/commands/rulebook-learn-capture.md +48 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- 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 +296 -296
- package/templates/core/DAG.md +304 -304
- package/templates/core/DECISIONS.md +38 -38
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/KNOWLEDGE.md +49 -49
- 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 +1947 -1947
- package/templates/core/TIER1_PROHIBITIONS.md +154 -154
- package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
- 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 +1192 -1192
- 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/rules/follow-task-sequence.md +36 -36
- package/templates/rules/git-safety.md +29 -29
- package/templates/rules/incremental-tests.md +29 -29
- package/templates/rules/no-deferred.md +31 -31
- package/templates/rules/no-shortcuts.md +30 -30
- package/templates/rules/research-first.md +30 -30
- package/templates/rules/sequential-editing.md +21 -21
- package/templates/rules/session-workflow.md +24 -24
- package/templates/rules/task-decomposition.md +32 -32
- 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 -17
- package/templates/skills/dev/api-design/SKILL.md +15 -15
- package/templates/skills/dev/architect/SKILL.md +17 -17
- package/templates/skills/dev/build-fix/SKILL.md +17 -17
- package/templates/skills/dev/db-design/SKILL.md +15 -15
- package/templates/skills/dev/debug/SKILL.md +16 -16
- package/templates/skills/dev/deploy/SKILL.md +17 -17
- package/templates/skills/dev/docs/SKILL.md +17 -17
- package/templates/skills/dev/migrate/SKILL.md +15 -15
- package/templates/skills/dev/perf/SKILL.md +17 -17
- package/templates/skills/dev/refactor/SKILL.md +17 -17
- package/templates/skills/dev/research/SKILL.md +14 -14
- package/templates/skills/dev/review/SKILL.md +18 -18
- package/templates/skills/dev/security-audit/SKILL.md +17 -17
- 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,30 +1,30 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: research-first
|
|
3
|
-
tier: 1
|
|
4
|
-
description: "Always research before implementing — never guess"
|
|
5
|
-
alwaysApply: true
|
|
6
|
-
filePatterns: ["*"]
|
|
7
|
-
tools: ["all"]
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Research Before Implementing
|
|
11
|
-
|
|
12
|
-
NEVER guess at bug causes, API behavior, or algorithm correctness.
|
|
13
|
-
|
|
14
|
-
## Required Process
|
|
15
|
-
|
|
16
|
-
1. **State what you KNOW** (from logs, debug output, code reading)
|
|
17
|
-
2. **State what you DON'T KNOW**
|
|
18
|
-
3. **Research** the unknown (read source, check docs, use diagnostic tools)
|
|
19
|
-
4. **Only then** implement the fix
|
|
20
|
-
|
|
21
|
-
## Forbidden
|
|
22
|
-
|
|
23
|
-
- Guessing at the cause of a bug
|
|
24
|
-
- "Trying things" to see if they work
|
|
25
|
-
- Hypothesizing without reading code
|
|
26
|
-
- Assuming how an API works without checking docs
|
|
27
|
-
- Iterating blindly — each attempt must be informed by new data
|
|
28
|
-
|
|
29
|
-
**"I think this might be the problem" is NOT acceptable.**
|
|
30
|
-
**"Source X does Y at file:line, we do Z, the difference causes W" IS acceptable.**
|
|
1
|
+
---
|
|
2
|
+
name: research-first
|
|
3
|
+
tier: 1
|
|
4
|
+
description: "Always research before implementing — never guess"
|
|
5
|
+
alwaysApply: true
|
|
6
|
+
filePatterns: ["*"]
|
|
7
|
+
tools: ["all"]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Research Before Implementing
|
|
11
|
+
|
|
12
|
+
NEVER guess at bug causes, API behavior, or algorithm correctness.
|
|
13
|
+
|
|
14
|
+
## Required Process
|
|
15
|
+
|
|
16
|
+
1. **State what you KNOW** (from logs, debug output, code reading)
|
|
17
|
+
2. **State what you DON'T KNOW**
|
|
18
|
+
3. **Research** the unknown (read source, check docs, use diagnostic tools)
|
|
19
|
+
4. **Only then** implement the fix
|
|
20
|
+
|
|
21
|
+
## Forbidden
|
|
22
|
+
|
|
23
|
+
- Guessing at the cause of a bug
|
|
24
|
+
- "Trying things" to see if they work
|
|
25
|
+
- Hypothesizing without reading code
|
|
26
|
+
- Assuming how an API works without checking docs
|
|
27
|
+
- Iterating blindly — each attempt must be informed by new data
|
|
28
|
+
|
|
29
|
+
**"I think this might be the problem" is NOT acceptable.**
|
|
30
|
+
**"Source X does Y at file:line, we do Z, the difference causes W" IS acceptable.**
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sequential-editing
|
|
3
|
-
tier: 1
|
|
4
|
-
description: "Edit files one at a time, never batch-edit"
|
|
5
|
-
alwaysApply: true
|
|
6
|
-
filePatterns: ["*"]
|
|
7
|
-
tools: ["all"]
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Sequential File Editing
|
|
11
|
-
|
|
12
|
-
ALWAYS edit files one at a time: Read file1 → Edit file1 → Read file2 → Edit file2.
|
|
13
|
-
|
|
14
|
-
NEVER batch-read multiple files then batch-edit them. By the time you edit file 3, context from file 1 may be stale.
|
|
15
|
-
|
|
16
|
-
When a task touches 3+ files across subsystems:
|
|
17
|
-
1. **STOP** — do not start implementing
|
|
18
|
-
2. **Plan** the changes (list files, dependency order)
|
|
19
|
-
3. **Decompose** into sub-tasks of 1-2 files each
|
|
20
|
-
4. **Execute** sub-tasks in dependency order (upstream first)
|
|
21
|
-
5. **Build/test** after each sub-task
|
|
1
|
+
---
|
|
2
|
+
name: sequential-editing
|
|
3
|
+
tier: 1
|
|
4
|
+
description: "Edit files one at a time, never batch-edit"
|
|
5
|
+
alwaysApply: true
|
|
6
|
+
filePatterns: ["*"]
|
|
7
|
+
tools: ["all"]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Sequential File Editing
|
|
11
|
+
|
|
12
|
+
ALWAYS edit files one at a time: Read file1 → Edit file1 → Read file2 → Edit file2.
|
|
13
|
+
|
|
14
|
+
NEVER batch-read multiple files then batch-edit them. By the time you edit file 3, context from file 1 may be stale.
|
|
15
|
+
|
|
16
|
+
When a task touches 3+ files across subsystems:
|
|
17
|
+
1. **STOP** — do not start implementing
|
|
18
|
+
2. **Plan** the changes (list files, dependency order)
|
|
19
|
+
3. **Decompose** into sub-tasks of 1-2 files each
|
|
20
|
+
4. **Execute** sub-tasks in dependency order (upstream first)
|
|
21
|
+
5. **Build/test** after each sub-task
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: session-workflow
|
|
3
|
-
tier: 2
|
|
4
|
-
description: "Read PLANS.md at session start, save summary at session end"
|
|
5
|
-
alwaysApply: true
|
|
6
|
-
filePatterns: ["*"]
|
|
7
|
-
tools: ["all"]
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Session Workflow — Preserve Context Across Sessions
|
|
11
|
-
|
|
12
|
-
## At Session Start
|
|
13
|
-
1. Read `.rulebook/PLANS.md` for current context and active task
|
|
14
|
-
2. Search memory for relevant past work: `rulebook_memory_search` or `rulebook_session_start`
|
|
15
|
-
3. Check `.rulebook/tasks/` for pending work
|
|
16
|
-
|
|
17
|
-
## During Session
|
|
18
|
-
- Update PLANS.md when making key decisions or discoveries
|
|
19
|
-
- Save important context to memory as you go
|
|
20
|
-
|
|
21
|
-
## At Session End
|
|
22
|
-
1. Save session summary to PLANS.md: `rulebook_session_end`
|
|
23
|
-
2. Summary should include: what was accomplished, key decisions, next steps
|
|
24
|
-
3. Update tasks.md with completed items
|
|
1
|
+
---
|
|
2
|
+
name: session-workflow
|
|
3
|
+
tier: 2
|
|
4
|
+
description: "Read PLANS.md at session start, save summary at session end"
|
|
5
|
+
alwaysApply: true
|
|
6
|
+
filePatterns: ["*"]
|
|
7
|
+
tools: ["all"]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Session Workflow — Preserve Context Across Sessions
|
|
11
|
+
|
|
12
|
+
## At Session Start
|
|
13
|
+
1. Read `.rulebook/PLANS.md` for current context and active task
|
|
14
|
+
2. Search memory for relevant past work: `rulebook_memory_search` or `rulebook_session_start`
|
|
15
|
+
3. Check `.rulebook/tasks/` for pending work
|
|
16
|
+
|
|
17
|
+
## During Session
|
|
18
|
+
- Update PLANS.md when making key decisions or discoveries
|
|
19
|
+
- Save important context to memory as you go
|
|
20
|
+
|
|
21
|
+
## At Session End
|
|
22
|
+
1. Save session summary to PLANS.md: `rulebook_session_end`
|
|
23
|
+
2. Summary should include: what was accomplished, key decisions, next steps
|
|
24
|
+
3. Update tasks.md with completed items
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: task-decomposition
|
|
3
|
-
tier: 2
|
|
4
|
-
description: "Decompose multi-file tasks into 1-2 file sub-tasks"
|
|
5
|
-
alwaysApply: true
|
|
6
|
-
filePatterns: ["*"]
|
|
7
|
-
tools: ["all"]
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Task Decomposition
|
|
11
|
-
|
|
12
|
-
When a task touches multiple subsystems, decompose into sub-tasks where each modifies **at most 1-2 files**.
|
|
13
|
-
|
|
14
|
-
## Why
|
|
15
|
-
|
|
16
|
-
AI agents lose accuracy when editing 3+ files in one pass. Context from earlier files gets compressed away.
|
|
17
|
-
|
|
18
|
-
## Rules
|
|
19
|
-
|
|
20
|
-
1. **Each sub-task modifies 1-2 files** — never more
|
|
21
|
-
2. **Each sub-task is independently verifiable** — it compiles, it doesn't break existing behavior
|
|
22
|
-
3. **Sub-tasks follow data flow order** — upstream first (component → buffer → renderer → shader)
|
|
23
|
-
4. **Each sub-task has a clear "done when"** — not "implement X", but "field Y exists with default Z"
|
|
24
|
-
5. **Build after each sub-task** — verify compilation before proceeding
|
|
25
|
-
|
|
26
|
-
## When an Agent Receives a Multi-File Task
|
|
27
|
-
|
|
28
|
-
1. **STOP** — do not start implementing
|
|
29
|
-
2. **Create a change plan** listing all files and dependency order
|
|
30
|
-
3. **Decompose** into sub-tasks following this rule
|
|
31
|
-
4. **Report back** with the decomposition
|
|
32
|
-
5. **Implement** one sub-task at a time
|
|
1
|
+
---
|
|
2
|
+
name: task-decomposition
|
|
3
|
+
tier: 2
|
|
4
|
+
description: "Decompose multi-file tasks into 1-2 file sub-tasks"
|
|
5
|
+
alwaysApply: true
|
|
6
|
+
filePatterns: ["*"]
|
|
7
|
+
tools: ["all"]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Task Decomposition
|
|
11
|
+
|
|
12
|
+
When a task touches multiple subsystems, decompose into sub-tasks where each modifies **at most 1-2 files**.
|
|
13
|
+
|
|
14
|
+
## Why
|
|
15
|
+
|
|
16
|
+
AI agents lose accuracy when editing 3+ files in one pass. Context from earlier files gets compressed away.
|
|
17
|
+
|
|
18
|
+
## Rules
|
|
19
|
+
|
|
20
|
+
1. **Each sub-task modifies 1-2 files** — never more
|
|
21
|
+
2. **Each sub-task is independently verifiable** — it compiles, it doesn't break existing behavior
|
|
22
|
+
3. **Sub-tasks follow data flow order** — upstream first (component → buffer → renderer → shader)
|
|
23
|
+
4. **Each sub-task has a clear "done when"** — not "implement X", but "field Y exists with default Z"
|
|
24
|
+
5. **Build after each sub-task** — verify compilation before proceeding
|
|
25
|
+
|
|
26
|
+
## When an Agent Receives a Multi-File Task
|
|
27
|
+
|
|
28
|
+
1. **STOP** — do not start implementing
|
|
29
|
+
2. **Create a change plan** listing all files and dependency order
|
|
30
|
+
3. **Decompose** into sub-tasks following this rule
|
|
31
|
+
4. **Report back** with the decomposition
|
|
32
|
+
5. **Implement** one sub-task at a time
|
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
<!-- AZURE_BLOB:START -->
|
|
2
|
-
# Azure Blob Storage Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use Azure Blob Storage for object storage, file uploads, static assets, and backup storage in Azure cloud.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using @azure/storage-blob
|
|
11
|
-
import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob'
|
|
12
|
-
|
|
13
|
-
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME || ''
|
|
14
|
-
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY || ''
|
|
15
|
-
|
|
16
|
-
const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey)
|
|
17
|
-
const blobServiceClient = new BlobServiceClient(
|
|
18
|
-
`https://${accountName}.blob.core.windows.net`,
|
|
19
|
-
sharedKeyCredential
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
const containerClient = blobServiceClient.getContainerClient(
|
|
23
|
-
process.env.AZURE_CONTAINER_NAME || 'mycontainer'
|
|
24
|
-
)
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Basic Operations
|
|
28
|
-
```typescript
|
|
29
|
-
// Create container
|
|
30
|
-
await containerClient.createIfNotExists({
|
|
31
|
-
access: 'blob', // 'blob', 'container', or 'private'
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
// Upload blob
|
|
35
|
-
const blockBlobClient = containerClient.getBlockBlobClient('path/to/file.jpg')
|
|
36
|
-
await blockBlobClient.upload(fileBuffer, fileBuffer.length, {
|
|
37
|
-
blobHTTPHeaders: {
|
|
38
|
-
blobContentType: 'image/jpeg',
|
|
39
|
-
},
|
|
40
|
-
metadata: {
|
|
41
|
-
userId: '123',
|
|
42
|
-
originalName: 'photo.jpg',
|
|
43
|
-
},
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
// Download blob
|
|
47
|
-
const downloadResponse = await blockBlobClient.download()
|
|
48
|
-
const fileContent = await streamToBuffer(downloadResponse.readableStreamBody)
|
|
49
|
-
|
|
50
|
-
// Delete blob
|
|
51
|
-
await blockBlobClient.delete()
|
|
52
|
-
|
|
53
|
-
// List blobs
|
|
54
|
-
for await (const blob of containerClient.listBlobsFlat()) {
|
|
55
|
-
console.log(blob.name, blob.properties.contentLength)
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Advanced Features
|
|
60
|
-
```typescript
|
|
61
|
-
// Generate SAS URL
|
|
62
|
-
import { generateBlobSASQueryParameters, BlobSASPermissions, StorageSharedKeyCredential } from '@azure/storage-blob'
|
|
63
|
-
|
|
64
|
-
const sasToken = generateBlobSASQueryParameters(
|
|
65
|
-
{
|
|
66
|
-
containerName: 'mycontainer',
|
|
67
|
-
blobName: 'path/to/file.jpg',
|
|
68
|
-
permissions: BlobSASPermissions.parse('r'), // read
|
|
69
|
-
startsOn: new Date(),
|
|
70
|
-
expiresOn: new Date(new Date().valueOf() + 3600 * 1000), // 1 hour
|
|
71
|
-
},
|
|
72
|
-
sharedKeyCredential
|
|
73
|
-
).toString()
|
|
74
|
-
|
|
75
|
-
const sasUrl = `https://${accountName}.blob.core.windows.net/mycontainer/path/to/file.jpg?${sasToken}`
|
|
76
|
-
|
|
77
|
-
// Copy blob
|
|
78
|
-
const sourceBlobClient = containerClient.getBlockBlobClient('source/file.jpg')
|
|
79
|
-
const destBlobClient = containerClient.getBlockBlobClient('dest/file.jpg')
|
|
80
|
-
await destBlobClient.beginCopyFromURL(sourceBlobClient.url)
|
|
81
|
-
|
|
82
|
-
// Set blob metadata
|
|
83
|
-
await blockBlobClient.setMetadata({
|
|
84
|
-
category: 'profile',
|
|
85
|
-
uploadedBy: 'user-123',
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
// Get blob properties
|
|
89
|
-
const properties = await blockBlobClient.getProperties()
|
|
90
|
-
console.log(properties.contentType, properties.contentLength, properties.metadata)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## Common Patterns
|
|
94
|
-
|
|
95
|
-
### File Upload Handler
|
|
96
|
-
```typescript
|
|
97
|
-
async function uploadFile(file: Buffer, filename: string, userId: string) {
|
|
98
|
-
const blobName = `users/${userId}/${Date.now()}-${filename}`
|
|
99
|
-
const blobClient = containerClient.getBlockBlobClient(blobName)
|
|
100
|
-
|
|
101
|
-
await blobClient.upload(file, file.length, {
|
|
102
|
-
blobHTTPHeaders: {
|
|
103
|
-
blobContentType: getContentType(filename),
|
|
104
|
-
},
|
|
105
|
-
metadata: {
|
|
106
|
-
userId,
|
|
107
|
-
originalName: filename,
|
|
108
|
-
uploadedAt: new Date().toISOString(),
|
|
109
|
-
},
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
blobName,
|
|
114
|
-
url: blobClient.url,
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Temporary Access URL
|
|
120
|
-
```typescript
|
|
121
|
-
async function generateTemporaryUrl(blobName: string, expiresInMinutes: number = 60) {
|
|
122
|
-
const blobClient = containerClient.getBlockBlobClient(blobName)
|
|
123
|
-
const sasToken = generateBlobSASQueryParameters(
|
|
124
|
-
{
|
|
125
|
-
containerName: containerClient.containerName,
|
|
126
|
-
blobName,
|
|
127
|
-
permissions: BlobSASPermissions.parse('r'),
|
|
128
|
-
expiresOn: new Date(Date.now() + expiresInMinutes * 60 * 1000),
|
|
129
|
-
},
|
|
130
|
-
sharedKeyCredential
|
|
131
|
-
).toString()
|
|
132
|
-
|
|
133
|
-
return `${blobClient.url}?${sasToken}`
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## Best Practices
|
|
138
|
-
|
|
139
|
-
✅ **DO:**
|
|
140
|
-
- Use appropriate access tiers (Hot, Cool, Archive)
|
|
141
|
-
- Set blob metadata for organization
|
|
142
|
-
- Use SAS tokens for temporary access
|
|
143
|
-
- Implement proper error handling
|
|
144
|
-
- Use appropriate content types
|
|
145
|
-
- Enable soft delete for important data
|
|
146
|
-
- Monitor storage usage and costs
|
|
147
|
-
- Use lifecycle management policies
|
|
148
|
-
- Implement retry logic
|
|
149
|
-
- Use connection strings or managed identity
|
|
150
|
-
|
|
151
|
-
❌ **DON'T:**
|
|
152
|
-
- Store sensitive data without encryption
|
|
153
|
-
- Use public access unnecessarily
|
|
154
|
-
- Hardcode credentials
|
|
155
|
-
- Ignore error handling
|
|
156
|
-
- Skip content-type validation
|
|
157
|
-
- Ignore lifecycle policies
|
|
158
|
-
- Skip access logging
|
|
159
|
-
- Use default access levels
|
|
160
|
-
- Ignore cost optimization
|
|
161
|
-
- Store large files without chunking
|
|
162
|
-
|
|
163
|
-
## Configuration
|
|
164
|
-
|
|
165
|
-
### Environment Variables
|
|
166
|
-
```bash
|
|
167
|
-
AZURE_STORAGE_ACCOUNT_NAME=myaccount
|
|
168
|
-
AZURE_STORAGE_ACCOUNT_KEY=your-account-key
|
|
169
|
-
AZURE_CONTAINER_NAME=mycontainer
|
|
170
|
-
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Managed Identity (Recommended)
|
|
174
|
-
```typescript
|
|
175
|
-
import { DefaultAzureCredential } from '@azure/identity'
|
|
176
|
-
|
|
177
|
-
const blobServiceClient = new BlobServiceClient(
|
|
178
|
-
`https://${accountName}.blob.core.windows.net`,
|
|
179
|
-
new DefaultAzureCredential()
|
|
180
|
-
)
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
<!-- AZURE_BLOB:END -->
|
|
184
|
-
|
|
1
|
+
<!-- AZURE_BLOB:START -->
|
|
2
|
+
# Azure Blob Storage Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use Azure Blob Storage for object storage, file uploads, static assets, and backup storage in Azure cloud.
|
|
5
|
+
|
|
6
|
+
## Core Features
|
|
7
|
+
|
|
8
|
+
### Connection
|
|
9
|
+
```typescript
|
|
10
|
+
// Using @azure/storage-blob
|
|
11
|
+
import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob'
|
|
12
|
+
|
|
13
|
+
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME || ''
|
|
14
|
+
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY || ''
|
|
15
|
+
|
|
16
|
+
const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey)
|
|
17
|
+
const blobServiceClient = new BlobServiceClient(
|
|
18
|
+
`https://${accountName}.blob.core.windows.net`,
|
|
19
|
+
sharedKeyCredential
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
const containerClient = blobServiceClient.getContainerClient(
|
|
23
|
+
process.env.AZURE_CONTAINER_NAME || 'mycontainer'
|
|
24
|
+
)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Basic Operations
|
|
28
|
+
```typescript
|
|
29
|
+
// Create container
|
|
30
|
+
await containerClient.createIfNotExists({
|
|
31
|
+
access: 'blob', // 'blob', 'container', or 'private'
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// Upload blob
|
|
35
|
+
const blockBlobClient = containerClient.getBlockBlobClient('path/to/file.jpg')
|
|
36
|
+
await blockBlobClient.upload(fileBuffer, fileBuffer.length, {
|
|
37
|
+
blobHTTPHeaders: {
|
|
38
|
+
blobContentType: 'image/jpeg',
|
|
39
|
+
},
|
|
40
|
+
metadata: {
|
|
41
|
+
userId: '123',
|
|
42
|
+
originalName: 'photo.jpg',
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Download blob
|
|
47
|
+
const downloadResponse = await blockBlobClient.download()
|
|
48
|
+
const fileContent = await streamToBuffer(downloadResponse.readableStreamBody)
|
|
49
|
+
|
|
50
|
+
// Delete blob
|
|
51
|
+
await blockBlobClient.delete()
|
|
52
|
+
|
|
53
|
+
// List blobs
|
|
54
|
+
for await (const blob of containerClient.listBlobsFlat()) {
|
|
55
|
+
console.log(blob.name, blob.properties.contentLength)
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Advanced Features
|
|
60
|
+
```typescript
|
|
61
|
+
// Generate SAS URL
|
|
62
|
+
import { generateBlobSASQueryParameters, BlobSASPermissions, StorageSharedKeyCredential } from '@azure/storage-blob'
|
|
63
|
+
|
|
64
|
+
const sasToken = generateBlobSASQueryParameters(
|
|
65
|
+
{
|
|
66
|
+
containerName: 'mycontainer',
|
|
67
|
+
blobName: 'path/to/file.jpg',
|
|
68
|
+
permissions: BlobSASPermissions.parse('r'), // read
|
|
69
|
+
startsOn: new Date(),
|
|
70
|
+
expiresOn: new Date(new Date().valueOf() + 3600 * 1000), // 1 hour
|
|
71
|
+
},
|
|
72
|
+
sharedKeyCredential
|
|
73
|
+
).toString()
|
|
74
|
+
|
|
75
|
+
const sasUrl = `https://${accountName}.blob.core.windows.net/mycontainer/path/to/file.jpg?${sasToken}`
|
|
76
|
+
|
|
77
|
+
// Copy blob
|
|
78
|
+
const sourceBlobClient = containerClient.getBlockBlobClient('source/file.jpg')
|
|
79
|
+
const destBlobClient = containerClient.getBlockBlobClient('dest/file.jpg')
|
|
80
|
+
await destBlobClient.beginCopyFromURL(sourceBlobClient.url)
|
|
81
|
+
|
|
82
|
+
// Set blob metadata
|
|
83
|
+
await blockBlobClient.setMetadata({
|
|
84
|
+
category: 'profile',
|
|
85
|
+
uploadedBy: 'user-123',
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
// Get blob properties
|
|
89
|
+
const properties = await blockBlobClient.getProperties()
|
|
90
|
+
console.log(properties.contentType, properties.contentLength, properties.metadata)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Common Patterns
|
|
94
|
+
|
|
95
|
+
### File Upload Handler
|
|
96
|
+
```typescript
|
|
97
|
+
async function uploadFile(file: Buffer, filename: string, userId: string) {
|
|
98
|
+
const blobName = `users/${userId}/${Date.now()}-${filename}`
|
|
99
|
+
const blobClient = containerClient.getBlockBlobClient(blobName)
|
|
100
|
+
|
|
101
|
+
await blobClient.upload(file, file.length, {
|
|
102
|
+
blobHTTPHeaders: {
|
|
103
|
+
blobContentType: getContentType(filename),
|
|
104
|
+
},
|
|
105
|
+
metadata: {
|
|
106
|
+
userId,
|
|
107
|
+
originalName: filename,
|
|
108
|
+
uploadedAt: new Date().toISOString(),
|
|
109
|
+
},
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
blobName,
|
|
114
|
+
url: blobClient.url,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Temporary Access URL
|
|
120
|
+
```typescript
|
|
121
|
+
async function generateTemporaryUrl(blobName: string, expiresInMinutes: number = 60) {
|
|
122
|
+
const blobClient = containerClient.getBlockBlobClient(blobName)
|
|
123
|
+
const sasToken = generateBlobSASQueryParameters(
|
|
124
|
+
{
|
|
125
|
+
containerName: containerClient.containerName,
|
|
126
|
+
blobName,
|
|
127
|
+
permissions: BlobSASPermissions.parse('r'),
|
|
128
|
+
expiresOn: new Date(Date.now() + expiresInMinutes * 60 * 1000),
|
|
129
|
+
},
|
|
130
|
+
sharedKeyCredential
|
|
131
|
+
).toString()
|
|
132
|
+
|
|
133
|
+
return `${blobClient.url}?${sasToken}`
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Best Practices
|
|
138
|
+
|
|
139
|
+
✅ **DO:**
|
|
140
|
+
- Use appropriate access tiers (Hot, Cool, Archive)
|
|
141
|
+
- Set blob metadata for organization
|
|
142
|
+
- Use SAS tokens for temporary access
|
|
143
|
+
- Implement proper error handling
|
|
144
|
+
- Use appropriate content types
|
|
145
|
+
- Enable soft delete for important data
|
|
146
|
+
- Monitor storage usage and costs
|
|
147
|
+
- Use lifecycle management policies
|
|
148
|
+
- Implement retry logic
|
|
149
|
+
- Use connection strings or managed identity
|
|
150
|
+
|
|
151
|
+
❌ **DON'T:**
|
|
152
|
+
- Store sensitive data without encryption
|
|
153
|
+
- Use public access unnecessarily
|
|
154
|
+
- Hardcode credentials
|
|
155
|
+
- Ignore error handling
|
|
156
|
+
- Skip content-type validation
|
|
157
|
+
- Ignore lifecycle policies
|
|
158
|
+
- Skip access logging
|
|
159
|
+
- Use default access levels
|
|
160
|
+
- Ignore cost optimization
|
|
161
|
+
- Store large files without chunking
|
|
162
|
+
|
|
163
|
+
## Configuration
|
|
164
|
+
|
|
165
|
+
### Environment Variables
|
|
166
|
+
```bash
|
|
167
|
+
AZURE_STORAGE_ACCOUNT_NAME=myaccount
|
|
168
|
+
AZURE_STORAGE_ACCOUNT_KEY=your-account-key
|
|
169
|
+
AZURE_CONTAINER_NAME=mycontainer
|
|
170
|
+
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Managed Identity (Recommended)
|
|
174
|
+
```typescript
|
|
175
|
+
import { DefaultAzureCredential } from '@azure/identity'
|
|
176
|
+
|
|
177
|
+
const blobServiceClient = new BlobServiceClient(
|
|
178
|
+
`https://${accountName}.blob.core.windows.net`,
|
|
179
|
+
new DefaultAzureCredential()
|
|
180
|
+
)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
<!-- AZURE_BLOB:END -->
|
|
184
|
+
|