@hivehub/rulebook 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +539 -0
- package/dist/agents/claude-code.d.ts +69 -0
- package/dist/agents/claude-code.d.ts.map +1 -0
- package/dist/agents/claude-code.js +180 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +184 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +299 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +69 -0
- package/dist/agents/gemini-cli.d.ts.map +1 -0
- package/dist/agents/gemini-cli.js +180 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/cli/commands.d.ts +57 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1370 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/docs-prompts.d.ts +3 -0
- package/dist/cli/docs-prompts.d.ts.map +1 -0
- package/dist/cli/docs-prompts.js +45 -0
- package/dist/cli/docs-prompts.js.map +1 -0
- package/dist/cli/prompts.d.ts +6 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +376 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/agent-manager.d.ts +89 -0
- package/dist/core/agent-manager.d.ts.map +1 -0
- package/dist/core/agent-manager.js +546 -0
- package/dist/core/agent-manager.js.map +1 -0
- package/dist/core/auto-fixer.d.ts +14 -0
- package/dist/core/auto-fixer.d.ts.map +1 -0
- package/dist/core/auto-fixer.js +207 -0
- package/dist/core/auto-fixer.js.map +1 -0
- package/dist/core/changelog-generator.d.ts +44 -0
- package/dist/core/changelog-generator.d.ts.map +1 -0
- package/dist/core/changelog-generator.js +222 -0
- package/dist/core/changelog-generator.js.map +1 -0
- package/dist/core/cli-bridge.d.ts +113 -0
- package/dist/core/cli-bridge.d.ts.map +1 -0
- package/dist/core/cli-bridge.js +1094 -0
- package/dist/core/cli-bridge.js.map +1 -0
- package/dist/core/config-manager.d.ts +65 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +266 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/coverage-checker.d.ts +14 -0
- package/dist/core/coverage-checker.d.ts.map +1 -0
- package/dist/core/coverage-checker.js +176 -0
- package/dist/core/coverage-checker.js.map +1 -0
- package/dist/core/custom-templates.d.ts +27 -0
- package/dist/core/custom-templates.d.ts.map +1 -0
- package/dist/core/custom-templates.js +122 -0
- package/dist/core/custom-templates.js.map +1 -0
- package/dist/core/dependency-checker.d.ts +21 -0
- package/dist/core/dependency-checker.d.ts.map +1 -0
- package/dist/core/dependency-checker.js +247 -0
- package/dist/core/dependency-checker.js.map +1 -0
- package/dist/core/detector.d.ts +3 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +1443 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/docs-generator.d.ts +9 -0
- package/dist/core/docs-generator.d.ts.map +1 -0
- package/dist/core/docs-generator.js +531 -0
- package/dist/core/docs-generator.js.map +1 -0
- package/dist/core/generator.d.ts +16 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +561 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/gitignore-generator.d.ts +13 -0
- package/dist/core/gitignore-generator.d.ts.map +1 -0
- package/dist/core/gitignore-generator.js +307 -0
- package/dist/core/gitignore-generator.js.map +1 -0
- package/dist/core/health-scorer.d.ts +22 -0
- package/dist/core/health-scorer.d.ts.map +1 -0
- package/dist/core/health-scorer.js +395 -0
- package/dist/core/health-scorer.js.map +1 -0
- package/dist/core/logger.d.ts +116 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +289 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/merger.d.ts +6 -0
- package/dist/core/merger.d.ts.map +1 -0
- package/dist/core/merger.js +131 -0
- package/dist/core/merger.js.map +1 -0
- package/dist/core/migrator.d.ts +19 -0
- package/dist/core/migrator.d.ts.map +1 -0
- package/dist/core/migrator.js +102 -0
- package/dist/core/migrator.js.map +1 -0
- package/dist/core/minimal-scaffolder.d.ts +8 -0
- package/dist/core/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/minimal-scaffolder.js +51 -0
- package/dist/core/minimal-scaffolder.js.map +1 -0
- package/dist/core/modern-console-new.d.ts +81 -0
- package/dist/core/modern-console-new.d.ts.map +1 -0
- package/dist/core/modern-console-new.js +340 -0
- package/dist/core/modern-console-new.js.map +1 -0
- package/dist/core/modern-console.d.ts +99 -0
- package/dist/core/modern-console.d.ts.map +1 -0
- package/dist/core/modern-console.js +568 -0
- package/dist/core/modern-console.js.map +1 -0
- package/dist/core/openspec-manager.d.ts +133 -0
- package/dist/core/openspec-manager.d.ts.map +1 -0
- package/dist/core/openspec-manager.js +605 -0
- package/dist/core/openspec-manager.js.map +1 -0
- package/dist/core/openspec-migrator.d.ts +27 -0
- package/dist/core/openspec-migrator.d.ts.map +1 -0
- package/dist/core/openspec-migrator.js +255 -0
- package/dist/core/openspec-migrator.js.map +1 -0
- package/dist/core/task-manager.d.ts +65 -0
- package/dist/core/task-manager.d.ts.map +1 -0
- package/dist/core/task-manager.js +318 -0
- package/dist/core/task-manager.js.map +1 -0
- package/dist/core/test-task-manager.d.ts +49 -0
- package/dist/core/test-task-manager.d.ts.map +1 -0
- package/dist/core/test-task-manager.js +121 -0
- package/dist/core/test-task-manager.js.map +1 -0
- package/dist/core/validator.d.ts +21 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +177 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/version-bumper.d.ts +19 -0
- package/dist/core/version-bumper.d.ts.map +1 -0
- package/dist/core/version-bumper.js +180 -0
- package/dist/core/version-bumper.js.map +1 -0
- package/dist/core/watcher.d.ts +9 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +22 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/core/workflow-generator.d.ts +10 -0
- package/dist/core/workflow-generator.d.ts.map +1 -0
- package/dist/core/workflow-generator.js +279 -0
- package/dist/core/workflow-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers/archive-task.d.ts +17 -0
- package/dist/mcp/handlers/archive-task.d.ts.map +1 -0
- package/dist/mcp/handlers/archive-task.js +36 -0
- package/dist/mcp/handlers/archive-task.js.map +1 -0
- package/dist/mcp/handlers/create-task.d.ts +17 -0
- package/dist/mcp/handlers/create-task.d.ts.map +1 -0
- package/dist/mcp/handlers/create-task.js +56 -0
- package/dist/mcp/handlers/create-task.js.map +1 -0
- package/dist/mcp/handlers/list-tasks.d.ts +22 -0
- package/dist/mcp/handlers/list-tasks.d.ts.map +1 -0
- package/dist/mcp/handlers/list-tasks.js +42 -0
- package/dist/mcp/handlers/list-tasks.js.map +1 -0
- package/dist/mcp/handlers/show-task.d.ts +25 -0
- package/dist/mcp/handlers/show-task.d.ts.map +1 -0
- package/dist/mcp/handlers/show-task.js +43 -0
- package/dist/mcp/handlers/show-task.js.map +1 -0
- package/dist/mcp/handlers/update-task.d.ts +17 -0
- package/dist/mcp/handlers/update-task.d.ts.map +1 -0
- package/dist/mcp/handlers/update-task.js +35 -0
- package/dist/mcp/handlers/update-task.js.map +1 -0
- package/dist/mcp/handlers/validate-task.d.ts +15 -0
- package/dist/mcp/handlers/validate-task.d.ts.map +1 -0
- package/dist/mcp/handlers/validate-task.js +27 -0
- package/dist/mcp/handlers/validate-task.js.map +1 -0
- package/dist/mcp/rulebook-config.d.ts +22 -0
- package/dist/mcp/rulebook-config.d.ts.map +1 -0
- package/dist/mcp/rulebook-config.js +65 -0
- package/dist/mcp/rulebook-config.js.map +1 -0
- package/dist/mcp/rulebook-server.d.ts +4 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -0
- package/dist/mcp/rulebook-server.js +246 -0
- package/dist/mcp/rulebook-server.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-system.d.ts +9 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +51 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +8 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +440 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/rulesignore.d.ts +9 -0
- package/dist/utils/rulesignore.d.ts.map +1 -0
- package/dist/utils/rulesignore.js +42 -0
- package/dist/utils/rulesignore.js.map +1 -0
- package/package.json +106 -0
- package/templates/cli/AIDER.md +49 -0
- package/templates/cli/AMAZON_Q.md +25 -0
- package/templates/cli/AUGGIE.md +32 -0
- package/templates/cli/CLAUDE.md +32 -0
- package/templates/cli/CLAUDE_CODE.md +35 -0
- package/templates/cli/CLINE.md +32 -0
- package/templates/cli/CODEBUDDY.md +20 -0
- package/templates/cli/CODEIUM.md +20 -0
- package/templates/cli/CODEX.md +21 -0
- package/templates/cli/CONTINUE.md +34 -0
- package/templates/cli/CURSOR_CLI.md +28 -0
- package/templates/cli/FACTORY.md +18 -0
- package/templates/cli/GEMINI.md +35 -0
- package/templates/cli/KILOCODE.md +18 -0
- package/templates/cli/OPENCODE.md +18 -0
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -0
- package/templates/commands/rulebook-task-apply.md +67 -0
- package/templates/commands/rulebook-task-archive.md +70 -0
- package/templates/commands/rulebook-task-create.md +93 -0
- package/templates/commands/rulebook-task-list.md +42 -0
- package/templates/commands/rulebook-task-show.md +52 -0
- package/templates/commands/rulebook-task-validate.md +53 -0
- package/templates/core/AGENT_AUTOMATION.md +184 -0
- package/templates/core/DAG.md +304 -0
- package/templates/core/DOCUMENTATION_RULES.md +37 -0
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -0
- package/templates/core/RULEBOOK.md +1874 -0
- package/templates/frameworks/ANGULAR.md +36 -0
- package/templates/frameworks/DJANGO.md +83 -0
- package/templates/frameworks/ELECTRON.md +147 -0
- package/templates/frameworks/FLASK.md +38 -0
- package/templates/frameworks/FLUTTER.md +55 -0
- package/templates/frameworks/JQUERY.md +32 -0
- package/templates/frameworks/LARAVEL.md +38 -0
- package/templates/frameworks/NESTJS.md +43 -0
- package/templates/frameworks/NEXTJS.md +127 -0
- package/templates/frameworks/NUXT.md +40 -0
- package/templates/frameworks/RAILS.md +66 -0
- package/templates/frameworks/REACT.md +38 -0
- package/templates/frameworks/REACT_NATIVE.md +47 -0
- package/templates/frameworks/SPRING.md +39 -0
- package/templates/frameworks/SYMFONY.md +36 -0
- package/templates/frameworks/VUE.md +36 -0
- package/templates/frameworks/ZEND.md +35 -0
- package/templates/git/CI_CD_PATTERNS.md +661 -0
- package/templates/git/GITHUB_ACTIONS.md +728 -0
- package/templates/git/GITLAB_CI.md +730 -0
- package/templates/git/GIT_WORKFLOW.md +1157 -0
- package/templates/git/SECRETS_MANAGEMENT.md +585 -0
- package/templates/hooks/COMMIT_MSG.md +530 -0
- package/templates/hooks/POST_CHECKOUT.md +546 -0
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -0
- package/templates/hooks/PRE_COMMIT.md +414 -0
- package/templates/hooks/PRE_PUSH.md +601 -0
- package/templates/hooks/csharp-pre-commit.sh +23 -0
- package/templates/hooks/csharp-pre-push.sh +23 -0
- package/templates/hooks/dart-pre-commit.sh +30 -0
- package/templates/hooks/dart-pre-push.sh +25 -0
- package/templates/hooks/elixir-pre-commit.sh +32 -0
- package/templates/hooks/elixir-pre-push.sh +31 -0
- package/templates/hooks/erlang-pre-commit.sh +30 -0
- package/templates/hooks/erlang-pre-push.sh +37 -0
- package/templates/hooks/go-pre-commit.sh +40 -0
- package/templates/hooks/go-pre-push.sh +31 -0
- package/templates/hooks/haskell-pre-commit.sh +41 -0
- package/templates/hooks/haskell-pre-push.sh +37 -0
- package/templates/hooks/java-pre-commit.sh +34 -0
- package/templates/hooks/java-pre-push.sh +24 -0
- package/templates/hooks/kotlin-pre-commit.sh +32 -0
- package/templates/hooks/kotlin-pre-push.sh +16 -0
- package/templates/hooks/php-pre-commit.sh +36 -0
- package/templates/hooks/php-pre-push.sh +26 -0
- package/templates/hooks/python-pre-commit.sh +51 -0
- package/templates/hooks/python-pre-push.sh +25 -0
- package/templates/hooks/ruby-pre-commit.sh +33 -0
- package/templates/hooks/ruby-pre-push.sh +32 -0
- package/templates/hooks/rust-pre-commit.sh +30 -0
- package/templates/hooks/rust-pre-push.sh +30 -0
- package/templates/hooks/scala-pre-commit.sh +32 -0
- package/templates/hooks/scala-pre-push.sh +24 -0
- package/templates/hooks/swift-pre-commit.sh +25 -0
- package/templates/hooks/swift-pre-push.sh +23 -0
- package/templates/hooks/typescript-pre-commit.sh +37 -0
- package/templates/hooks/typescript-pre-push.sh +36 -0
- package/templates/ides/COPILOT.md +37 -0
- package/templates/ides/CURSOR.md +43 -0
- package/templates/ides/JETBRAINS_AI.md +35 -0
- package/templates/ides/REPLIT.md +36 -0
- package/templates/ides/TABNINE.md +29 -0
- package/templates/ides/VSCODE.md +40 -0
- package/templates/ides/WINDSURF.md +36 -0
- package/templates/ides/ZED.md +32 -0
- package/templates/languages/ADA.md +58 -0
- package/templates/languages/C.md +333 -0
- package/templates/languages/CPP.md +743 -0
- package/templates/languages/CSHARP.md +417 -0
- package/templates/languages/DART.md +332 -0
- package/templates/languages/ELIXIR.md +454 -0
- package/templates/languages/ERLANG.md +361 -0
- package/templates/languages/GO.md +645 -0
- package/templates/languages/HASKELL.md +177 -0
- package/templates/languages/JAVA.md +607 -0
- package/templates/languages/JAVASCRIPT.md +631 -0
- package/templates/languages/JULIA.md +97 -0
- package/templates/languages/KOTLIN.md +511 -0
- package/templates/languages/LISP.md +100 -0
- package/templates/languages/LUA.md +74 -0
- package/templates/languages/OBJECTIVEC.md +90 -0
- package/templates/languages/PHP.md +416 -0
- package/templates/languages/PYTHON.md +682 -0
- package/templates/languages/R.md +350 -0
- package/templates/languages/RUBY.md +421 -0
- package/templates/languages/RUST.md +477 -0
- package/templates/languages/SAS.md +73 -0
- package/templates/languages/SCALA.md +348 -0
- package/templates/languages/SOLIDITY.md +580 -0
- package/templates/languages/SQL.md +137 -0
- package/templates/languages/SWIFT.md +466 -0
- package/templates/languages/TYPESCRIPT.md +591 -0
- package/templates/languages/ZIG.md +265 -0
- package/templates/modules/ATLASSIAN.md +255 -0
- package/templates/modules/CONTEXT7.md +54 -0
- package/templates/modules/FIGMA.md +267 -0
- package/templates/modules/GITHUB_MCP.md +64 -0
- package/templates/modules/GRAFANA.md +328 -0
- package/templates/modules/NOTION.md +247 -0
- package/templates/modules/PLAYWRIGHT.md +90 -0
- package/templates/modules/RULEBOOK_MCP.md +156 -0
- package/templates/modules/SERENA.md +337 -0
- package/templates/modules/SUPABASE.md +223 -0
- package/templates/modules/SYNAP.md +69 -0
- package/templates/modules/VECTORIZER.md +63 -0
- package/templates/services/AZURE_BLOB.md +184 -0
- package/templates/services/CASSANDRA.md +239 -0
- package/templates/services/DYNAMODB.md +308 -0
- package/templates/services/ELASTICSEARCH.md +347 -0
- package/templates/services/GCS.md +178 -0
- package/templates/services/INFLUXDB.md +265 -0
- package/templates/services/KAFKA.md +341 -0
- package/templates/services/MARIADB.md +183 -0
- package/templates/services/MEMCACHED.md +242 -0
- package/templates/services/MINIO.md +201 -0
- package/templates/services/MONGODB.md +268 -0
- package/templates/services/MYSQL.md +358 -0
- package/templates/services/NEO4J.md +247 -0
- package/templates/services/ORACLE.md +290 -0
- package/templates/services/POSTGRESQL.md +326 -0
- package/templates/services/RABBITMQ.md +286 -0
- package/templates/services/REDIS.md +292 -0
- package/templates/services/S3.md +298 -0
- package/templates/services/SQLITE.md +294 -0
- package/templates/services/SQLSERVER.md +294 -0
- package/templates/workflows/codespell.yml +31 -0
- package/templates/workflows/cpp-lint.yml +47 -0
- package/templates/workflows/cpp-publish.yml +119 -0
- package/templates/workflows/cpp-test.yml +77 -0
- package/templates/workflows/dotnet-lint.yml +29 -0
- package/templates/workflows/dotnet-publish.yml +40 -0
- package/templates/workflows/dotnet-test.yml +41 -0
- package/templates/workflows/elixir-lint.yml +45 -0
- package/templates/workflows/elixir-publish.yml +49 -0
- package/templates/workflows/elixir-test.yml +54 -0
- package/templates/workflows/erlang-lint.yml +47 -0
- package/templates/workflows/erlang-test.yml +62 -0
- package/templates/workflows/go-lint.yml +39 -0
- package/templates/workflows/go-publish.yml +95 -0
- package/templates/workflows/go-test.yml +59 -0
- package/templates/workflows/java-lint.yml +60 -0
- package/templates/workflows/java-publish.yml +120 -0
- package/templates/workflows/java-test.yml +85 -0
- package/templates/workflows/kotlin-lint.yml +34 -0
- package/templates/workflows/kotlin-publish.yml +56 -0
- package/templates/workflows/kotlin-test.yml +48 -0
- package/templates/workflows/php-lint.yml +39 -0
- package/templates/workflows/php-publish.yml +50 -0
- package/templates/workflows/php-test.yml +54 -0
- package/templates/workflows/python-lint.yml +47 -0
- package/templates/workflows/python-publish.yml +91 -0
- package/templates/workflows/python-test.yml +59 -0
- package/templates/workflows/rust-lint.yml +54 -0
- package/templates/workflows/rust-publish.yml +66 -0
- package/templates/workflows/rust-test.yml +75 -0
- package/templates/workflows/solidity-lint.yml +41 -0
- package/templates/workflows/solidity-test.yml +47 -0
- package/templates/workflows/swift-lint.yml +32 -0
- package/templates/workflows/swift-publish.yml +58 -0
- package/templates/workflows/swift-test.yml +44 -0
- package/templates/workflows/typescript-lint.yml +61 -0
- package/templates/workflows/typescript-publish.yml +60 -0
- package/templates/workflows/typescript-test.yml +73 -0
- package/templates/workflows/zig-lint.yml +27 -0
- package/templates/workflows/zig-test.yml +40 -0
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
# Secrets Management in CI/CD
|
|
2
|
+
|
|
3
|
+
This template provides best practices for securely managing secrets, API keys, tokens, and sensitive configuration in CI/CD pipelines.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Secure secrets management ensures:
|
|
8
|
+
- No hardcoded credentials in code
|
|
9
|
+
- Encrypted storage of sensitive data
|
|
10
|
+
- Least-privilege access control
|
|
11
|
+
- Audit trail of secret usage
|
|
12
|
+
- Easy secret rotation
|
|
13
|
+
|
|
14
|
+
## Core Principles
|
|
15
|
+
|
|
16
|
+
### 1. **Never Commit Secrets to Version Control**
|
|
17
|
+
|
|
18
|
+
**❌ Bad**:
|
|
19
|
+
```javascript
|
|
20
|
+
// NEVER do this
|
|
21
|
+
const API_KEY = 'sk_live_abc123xyz';
|
|
22
|
+
const DATABASE_URL = 'postgres://user:password@host/db';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**✅ Good**:
|
|
26
|
+
```javascript
|
|
27
|
+
// Use environment variables
|
|
28
|
+
const API_KEY = process.env.API_KEY;
|
|
29
|
+
const DATABASE_URL = process.env.DATABASE_URL;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2. **Use Platform Secret Stores**
|
|
33
|
+
|
|
34
|
+
**Platforms**:
|
|
35
|
+
- GitHub Actions: Repository/Organization secrets
|
|
36
|
+
- GitLab CI: CI/CD variables
|
|
37
|
+
- CircleCI: Environment variables (Project/Context)
|
|
38
|
+
- Azure DevOps: Variable groups
|
|
39
|
+
- AWS: Secrets Manager / Parameter Store
|
|
40
|
+
|
|
41
|
+
### 3. **Apply Least Privilege**
|
|
42
|
+
|
|
43
|
+
**Principle**: Grant minimum necessary access
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
# Good: Environment-specific secrets
|
|
47
|
+
production:
|
|
48
|
+
env:
|
|
49
|
+
API_KEY: ${{ secrets.PROD_API_KEY }}
|
|
50
|
+
|
|
51
|
+
development:
|
|
52
|
+
env:
|
|
53
|
+
API_KEY: ${{ secrets.DEV_API_KEY }}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 4. **Rotate Secrets Regularly**
|
|
57
|
+
|
|
58
|
+
**Schedule**:
|
|
59
|
+
- API keys: Every 90 days
|
|
60
|
+
- Access tokens: Every 90 days
|
|
61
|
+
- SSH keys: Every 180 days
|
|
62
|
+
- Database passwords: Every 90 days
|
|
63
|
+
|
|
64
|
+
## Platform-Specific Implementation
|
|
65
|
+
|
|
66
|
+
### GitHub Actions
|
|
67
|
+
|
|
68
|
+
#### Repository Secrets
|
|
69
|
+
|
|
70
|
+
**Add via UI**:
|
|
71
|
+
1. Repository → Settings → Secrets and variables → Actions
|
|
72
|
+
2. New repository secret
|
|
73
|
+
3. Name: `API_KEY`
|
|
74
|
+
4. Value: `sk_live_abc123xyz`
|
|
75
|
+
|
|
76
|
+
**Add via CLI**:
|
|
77
|
+
```bash
|
|
78
|
+
gh secret set API_KEY < api_key.txt
|
|
79
|
+
|
|
80
|
+
# Or inline
|
|
81
|
+
gh secret set API_KEY --body "sk_live_abc123xyz"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Usage in Workflow**:
|
|
85
|
+
```yaml
|
|
86
|
+
jobs:
|
|
87
|
+
deploy:
|
|
88
|
+
steps:
|
|
89
|
+
- name: Deploy
|
|
90
|
+
run: ./deploy.sh
|
|
91
|
+
env:
|
|
92
|
+
API_KEY: ${{ secrets.API_KEY }}
|
|
93
|
+
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
#### Organization Secrets
|
|
97
|
+
|
|
98
|
+
**When to use**: Shared across multiple repositories
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
# Available to all repos in org
|
|
102
|
+
- name: Use org secret
|
|
103
|
+
env:
|
|
104
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # Org-level secret
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Environment Secrets
|
|
108
|
+
|
|
109
|
+
**When to use**: Environment-specific secrets (production, staging)
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
jobs:
|
|
113
|
+
deploy:production:
|
|
114
|
+
environment: production # Uses production environment secrets
|
|
115
|
+
steps:
|
|
116
|
+
- run: deploy.sh
|
|
117
|
+
env:
|
|
118
|
+
API_KEY: ${{ secrets.API_KEY }} # production-specific value
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### GitLab CI
|
|
122
|
+
|
|
123
|
+
#### CI/CD Variables
|
|
124
|
+
|
|
125
|
+
**Add via UI**:
|
|
126
|
+
1. Project → Settings → CI/CD → Variables
|
|
127
|
+
2. Add variable
|
|
128
|
+
3. Key: `API_KEY`
|
|
129
|
+
4. Value: `sk_live_abc123xyz`
|
|
130
|
+
5. Flags: ✓ Protect variable (main branch only), ✓ Mask variable
|
|
131
|
+
|
|
132
|
+
**Usage in Pipeline**:
|
|
133
|
+
```yaml
|
|
134
|
+
deploy:
|
|
135
|
+
script:
|
|
136
|
+
- deploy.sh
|
|
137
|
+
variables:
|
|
138
|
+
API_KEY: ${{ secrets.API_KEY }}
|
|
139
|
+
only:
|
|
140
|
+
- main
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### File Variables
|
|
144
|
+
|
|
145
|
+
**For multi-line secrets** (certificates, keys):
|
|
146
|
+
```yaml
|
|
147
|
+
deploy:
|
|
148
|
+
before_script:
|
|
149
|
+
- echo "$SSL_CERTIFICATE" > cert.pem
|
|
150
|
+
- chmod 600 cert.pem
|
|
151
|
+
script:
|
|
152
|
+
- use-certificate cert.pem
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### CircleCI
|
|
156
|
+
|
|
157
|
+
#### Project Environment Variables
|
|
158
|
+
|
|
159
|
+
**Add via UI**:
|
|
160
|
+
1. Project Settings → Environment Variables
|
|
161
|
+
2. Add Variable
|
|
162
|
+
3. Name: `API_KEY`, Value: `sk_live_abc123xyz`
|
|
163
|
+
|
|
164
|
+
**Usage in Config**:
|
|
165
|
+
```yaml
|
|
166
|
+
jobs:
|
|
167
|
+
deploy:
|
|
168
|
+
steps:
|
|
169
|
+
- run:
|
|
170
|
+
command: deploy.sh
|
|
171
|
+
environment:
|
|
172
|
+
API_KEY: $API_KEY
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
#### Contexts (Organization Secrets)
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
workflows:
|
|
179
|
+
deploy:
|
|
180
|
+
jobs:
|
|
181
|
+
- deploy:
|
|
182
|
+
context: production-secrets # Shared secrets
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Secret Types and Patterns
|
|
186
|
+
|
|
187
|
+
### 1. API Keys
|
|
188
|
+
|
|
189
|
+
**Pattern**: Use environment-specific keys
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
# development
|
|
193
|
+
env:
|
|
194
|
+
STRIPE_KEY: ${{ secrets.STRIPE_TEST_KEY }}
|
|
195
|
+
|
|
196
|
+
# production
|
|
197
|
+
env:
|
|
198
|
+
STRIPE_KEY: ${{ secrets.STRIPE_LIVE_KEY }}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 2. Database Credentials
|
|
202
|
+
|
|
203
|
+
**Pattern**: Use connection strings with secrets
|
|
204
|
+
|
|
205
|
+
```yaml
|
|
206
|
+
env:
|
|
207
|
+
# Store entire connection string
|
|
208
|
+
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
|
209
|
+
|
|
210
|
+
# Or compose from parts
|
|
211
|
+
DB_HOST: ${{ secrets.DB_HOST }}
|
|
212
|
+
DB_USER: ${{ secrets.DB_USER }}
|
|
213
|
+
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
|
|
214
|
+
DB_NAME: ${{ secrets.DB_NAME }}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Script usage**:
|
|
218
|
+
```bash
|
|
219
|
+
# Use DATABASE_URL directly
|
|
220
|
+
psql "$DATABASE_URL" -c "SELECT 1"
|
|
221
|
+
|
|
222
|
+
# Or construct connection string
|
|
223
|
+
psql "postgres://$DB_USER:$DB_PASSWORD@$DB_HOST/$DB_NAME"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 3. SSH Keys
|
|
227
|
+
|
|
228
|
+
**Pattern**: Add SSH key for deployments
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
- name: Setup SSH key
|
|
232
|
+
run: |
|
|
233
|
+
mkdir -p ~/.ssh
|
|
234
|
+
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
|
|
235
|
+
chmod 600 ~/.ssh/id_rsa
|
|
236
|
+
ssh-keyscan ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 4. Service Account Keys (JSON)
|
|
240
|
+
|
|
241
|
+
**Pattern**: Store JSON credentials as secret
|
|
242
|
+
|
|
243
|
+
```yaml
|
|
244
|
+
- name: Authenticate with GCP
|
|
245
|
+
run: |
|
|
246
|
+
echo '${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}' > key.json
|
|
247
|
+
gcloud auth activate-service-account --key-file=key.json
|
|
248
|
+
rm key.json # Clean up
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 5. Certificates (PEM/CRT)
|
|
252
|
+
|
|
253
|
+
**Pattern**: Multi-line secret as file
|
|
254
|
+
|
|
255
|
+
```yaml
|
|
256
|
+
- name: Setup certificate
|
|
257
|
+
run: |
|
|
258
|
+
echo "${{ secrets.SSL_CERTIFICATE }}" > cert.pem
|
|
259
|
+
echo "${{ secrets.SSL_PRIVATE_KEY }}" > key.pem
|
|
260
|
+
chmod 600 *.pem
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 6. Signing Keys
|
|
264
|
+
|
|
265
|
+
**Pattern**: Sign artifacts with secret key
|
|
266
|
+
|
|
267
|
+
```yaml
|
|
268
|
+
- name: Sign package
|
|
269
|
+
run: |
|
|
270
|
+
echo "${{ secrets.GPG_PRIVATE_KEY }}" | gpg --import
|
|
271
|
+
gpg --sign package.tar.gz
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Advanced Patterns
|
|
275
|
+
|
|
276
|
+
### Pattern 1: Dynamic Secrets from Vault
|
|
277
|
+
|
|
278
|
+
**Use Vault for dynamic, short-lived secrets**:
|
|
279
|
+
|
|
280
|
+
```yaml
|
|
281
|
+
- name: Get secrets from Vault
|
|
282
|
+
run: |
|
|
283
|
+
# Login to Vault
|
|
284
|
+
vault login -method=github token=${{ secrets.VAULT_TOKEN }}
|
|
285
|
+
|
|
286
|
+
# Get dynamic database credentials (expires in 1 hour)
|
|
287
|
+
export DB_USER=$(vault read -field=username database/creds/app)
|
|
288
|
+
export DB_PASSWORD=$(vault read -field=password database/creds/app)
|
|
289
|
+
|
|
290
|
+
# Use credentials
|
|
291
|
+
psql "postgres://$DB_USER:$DB_PASSWORD@$DB_HOST/$DB_NAME"
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Pattern 2: AWS Secrets Manager
|
|
295
|
+
|
|
296
|
+
**Retrieve secrets at runtime**:
|
|
297
|
+
|
|
298
|
+
```yaml
|
|
299
|
+
- name: Configure AWS credentials
|
|
300
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
301
|
+
with:
|
|
302
|
+
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
|
|
303
|
+
|
|
304
|
+
- name: Get secrets from AWS Secrets Manager
|
|
305
|
+
run: |
|
|
306
|
+
export API_KEY=$(aws secretsmanager get-secret-value \
|
|
307
|
+
--secret-id production/api-key \
|
|
308
|
+
--query SecretString \
|
|
309
|
+
--output text)
|
|
310
|
+
|
|
311
|
+
# Use API_KEY
|
|
312
|
+
curl -H "Authorization: Bearer $API_KEY" https://api.example.com
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Pattern 3: Google Secret Manager
|
|
316
|
+
|
|
317
|
+
```yaml
|
|
318
|
+
- name: Authenticate with GCP
|
|
319
|
+
uses: google-github-actions/auth@v2
|
|
320
|
+
with:
|
|
321
|
+
credentials_json: ${{ secrets.GCP_CREDENTIALS }}
|
|
322
|
+
|
|
323
|
+
- name: Get secrets
|
|
324
|
+
run: |
|
|
325
|
+
export DATABASE_URL=$(gcloud secrets versions access latest \
|
|
326
|
+
--secret="database-url")
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Pattern 4: OIDC/Federated Authentication
|
|
330
|
+
|
|
331
|
+
**Passwordless authentication using OIDC** (GitHub Actions → AWS):
|
|
332
|
+
|
|
333
|
+
```yaml
|
|
334
|
+
- name: Configure AWS Credentials
|
|
335
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
336
|
+
with:
|
|
337
|
+
role-to-assume: arn:aws:iam::123456789:role/GitHubActionsRole
|
|
338
|
+
aws-region: us-east-1
|
|
339
|
+
# No secrets needed! Uses OIDC token
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**Benefits**:
|
|
343
|
+
- No long-lived credentials
|
|
344
|
+
- Automatic rotation
|
|
345
|
+
- Fine-grained permissions
|
|
346
|
+
|
|
347
|
+
## Security Best Practices
|
|
348
|
+
|
|
349
|
+
### ✅ DO
|
|
350
|
+
|
|
351
|
+
1. **Use Secret Scanning**
|
|
352
|
+
```yaml
|
|
353
|
+
# Enable in GitHub: Settings → Code security and analysis
|
|
354
|
+
# Automatically detects committed secrets
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
2. **Mask Secrets in Logs**
|
|
358
|
+
```yaml
|
|
359
|
+
# Secrets automatically masked in GitHub Actions logs
|
|
360
|
+
# Manually mask custom values:
|
|
361
|
+
- run: echo "::add-mask::$CUSTOM_VALUE"
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
3. **Use Separate Secrets Per Environment**
|
|
365
|
+
```yaml
|
|
366
|
+
production:
|
|
367
|
+
env:
|
|
368
|
+
API_KEY: ${{ secrets.PROD_API_KEY }}
|
|
369
|
+
|
|
370
|
+
staging:
|
|
371
|
+
env:
|
|
372
|
+
API_KEY: ${{ secrets.STAGING_API_KEY }}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
4. **Limit Secret Scope**
|
|
376
|
+
```yaml
|
|
377
|
+
# GitHub: Only available to protected branches
|
|
378
|
+
# Settings → Secrets → Environment secrets → production
|
|
379
|
+
# ✓ Required reviewers
|
|
380
|
+
# ✓ Wait timer
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
5. **Audit Secret Usage**
|
|
384
|
+
```yaml
|
|
385
|
+
# GitHub audit log shows:
|
|
386
|
+
# - Who accessed secrets
|
|
387
|
+
# - When secrets were used
|
|
388
|
+
# - Which workflows used secrets
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
6. **Rotate Secrets Regularly**
|
|
392
|
+
```bash
|
|
393
|
+
# Automate rotation with cron job
|
|
394
|
+
0 0 1 * * rotate-secrets.sh # Monthly
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### ❌ DON'T
|
|
398
|
+
|
|
399
|
+
1. **Don't Echo Secrets**
|
|
400
|
+
```yaml
|
|
401
|
+
# Bad
|
|
402
|
+
- run: echo "API key is ${{ secrets.API_KEY }}"
|
|
403
|
+
|
|
404
|
+
# Good
|
|
405
|
+
- run: echo "API key configured"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
2. **Don't Store Secrets in Code**
|
|
409
|
+
```javascript
|
|
410
|
+
// Bad
|
|
411
|
+
const key = 'sk_live_abc123';
|
|
412
|
+
|
|
413
|
+
// Good
|
|
414
|
+
const key = process.env.API_KEY;
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
3. **Don't Use Secrets in PR Builds**
|
|
418
|
+
```yaml
|
|
419
|
+
# Bad - secrets exposed to forks
|
|
420
|
+
on: pull_request
|
|
421
|
+
|
|
422
|
+
# Good - use pull_request_target with care
|
|
423
|
+
on:
|
|
424
|
+
pull_request_target:
|
|
425
|
+
types: [labeled]
|
|
426
|
+
|
|
427
|
+
jobs:
|
|
428
|
+
test:
|
|
429
|
+
if: github.event.label.name == 'safe-to-test'
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
4. **Don't Share Secrets Across Teams**
|
|
433
|
+
```yaml
|
|
434
|
+
# Bad - everyone has prod access
|
|
435
|
+
env:
|
|
436
|
+
PROD_KEY: ${{ secrets.PROD_KEY }}
|
|
437
|
+
|
|
438
|
+
# Good - separate secrets per team/environment
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
5. **Don't Commit `.env` Files**
|
|
442
|
+
```bash
|
|
443
|
+
# .gitignore
|
|
444
|
+
.env
|
|
445
|
+
.env.local
|
|
446
|
+
.env.*.local
|
|
447
|
+
**/.env
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
## Secret Rotation Strategy
|
|
451
|
+
|
|
452
|
+
### Automated Rotation Process
|
|
453
|
+
|
|
454
|
+
**1. Generate New Secret**:
|
|
455
|
+
```bash
|
|
456
|
+
# Script: rotate-api-key.sh
|
|
457
|
+
NEW_KEY=$(generate-api-key.sh)
|
|
458
|
+
|
|
459
|
+
# Update in secret store
|
|
460
|
+
gh secret set API_KEY --body "$NEW_KEY"
|
|
461
|
+
|
|
462
|
+
# Update in application
|
|
463
|
+
update-application-config.sh "$NEW_KEY"
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
**2. Test New Secret**:
|
|
467
|
+
```yaml
|
|
468
|
+
- name: Test new secret
|
|
469
|
+
run: |
|
|
470
|
+
curl -H "Authorization: Bearer ${{ secrets.API_KEY }}" \
|
|
471
|
+
https://api.example.com/health
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
**3. Deactivate Old Secret**:
|
|
475
|
+
```bash
|
|
476
|
+
# After confirming new secret works
|
|
477
|
+
deactivate-old-api-key.sh "$OLD_KEY"
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Rotation Checklist
|
|
481
|
+
|
|
482
|
+
- [ ] Generate new secret
|
|
483
|
+
- [ ] Update in CI/CD platform
|
|
484
|
+
- [ ] Deploy with new secret
|
|
485
|
+
- [ ] Verify functionality
|
|
486
|
+
- [ ] Revoke old secret
|
|
487
|
+
- [ ] Update documentation
|
|
488
|
+
|
|
489
|
+
## Troubleshooting
|
|
490
|
+
|
|
491
|
+
### Secret Not Available
|
|
492
|
+
|
|
493
|
+
**Issue**: Workflow can't access secret
|
|
494
|
+
|
|
495
|
+
**Solutions**:
|
|
496
|
+
1. Check secret name matches exactly (case-sensitive)
|
|
497
|
+
2. Verify workflow has permission to access secret
|
|
498
|
+
3. Check if secret is environment-specific
|
|
499
|
+
4. Ensure secret is not expired/deleted
|
|
500
|
+
|
|
501
|
+
### Secret Masked Incorrectly
|
|
502
|
+
|
|
503
|
+
**Issue**: Secret visible in logs
|
|
504
|
+
|
|
505
|
+
**Solutions**:
|
|
506
|
+
```yaml
|
|
507
|
+
# Explicitly mask value
|
|
508
|
+
- run: echo "::add-mask::$VALUE"
|
|
509
|
+
|
|
510
|
+
# Check if secret contains special characters
|
|
511
|
+
# - Secrets with spaces may not mask correctly
|
|
512
|
+
# - Use quotes: echo "::add-mask::$SECRET"
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### Secret Too Large
|
|
516
|
+
|
|
517
|
+
**Issue**: Secret exceeds size limit
|
|
518
|
+
|
|
519
|
+
**GitHub Limits**:
|
|
520
|
+
- Secret value: 64 KB
|
|
521
|
+
- Repository: 100 secrets
|
|
522
|
+
- Organization: 1000 secrets
|
|
523
|
+
|
|
524
|
+
**Solutions**:
|
|
525
|
+
1. Split large secrets into multiple parts
|
|
526
|
+
2. Store in external secret manager (Vault, AWS Secrets Manager)
|
|
527
|
+
3. Use base64 encoding for binary data
|
|
528
|
+
|
|
529
|
+
### Secret Rotation Breaks Deployment
|
|
530
|
+
|
|
531
|
+
**Issue**: Old secret revoked before new one deployed
|
|
532
|
+
|
|
533
|
+
**Solution**:
|
|
534
|
+
```bash
|
|
535
|
+
# Grace period approach
|
|
536
|
+
1. Deploy new secret to CI/CD
|
|
537
|
+
2. Deploy application with new secret
|
|
538
|
+
3. Wait 24 hours (grace period)
|
|
539
|
+
4. Revoke old secret
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
## Common Pitfalls
|
|
543
|
+
|
|
544
|
+
1. **❌ Hardcoding secrets**: Always use environment variables
|
|
545
|
+
2. **❌ Committing `.env`**: Add to `.gitignore`
|
|
546
|
+
3. **❌ Using same secret everywhere**: Separate dev/staging/prod
|
|
547
|
+
4. **❌ Never rotating secrets**: Set up automated rotation
|
|
548
|
+
5. **❌ Logging secrets**: Mask sensitive values
|
|
549
|
+
6. **❌ Sharing secrets insecurely**: Use secret management platform
|
|
550
|
+
7. **❌ No audit trail**: Enable secret access logging
|
|
551
|
+
|
|
552
|
+
## Integration with Rulebook
|
|
553
|
+
|
|
554
|
+
If using `@hivehub/rulebook`, secret management patterns are enforced:
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
# Initialize with secret management best practices
|
|
558
|
+
npx @hivehub/rulebook init
|
|
559
|
+
|
|
560
|
+
# Creates:
|
|
561
|
+
# - .env.example (template)
|
|
562
|
+
# - .gitignore (excludes .env)
|
|
563
|
+
# - Documentation on secret management
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
**`.env.example`**:
|
|
567
|
+
```bash
|
|
568
|
+
# API Keys
|
|
569
|
+
API_KEY=your-api-key-here
|
|
570
|
+
DATABASE_URL=postgres://user:password@localhost/db
|
|
571
|
+
|
|
572
|
+
# AWS Credentials
|
|
573
|
+
AWS_ACCESS_KEY_ID=your-access-key
|
|
574
|
+
AWS_SECRET_ACCESS_KEY=your-secret-key
|
|
575
|
+
|
|
576
|
+
# Note: Copy to .env and fill with actual values
|
|
577
|
+
# .env is gitignored and should NEVER be committed
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
## Related Templates
|
|
581
|
+
|
|
582
|
+
- See `/rulebook/GITHUB_ACTIONS.md` for GitHub Actions secrets
|
|
583
|
+
- See `/rulebook/GITLAB_CI.md` for GitLab CI secrets
|
|
584
|
+
- See `/rulebook/CI_CD_PATTERNS.md` for deployment patterns
|
|
585
|
+
- See `/rulebook/GIT.md` for .gitignore patterns
|