@hivehub/rulebook 4.1.0 → 4.2.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.
Files changed (335) hide show
  1. package/.claude/commands/continue.md +33 -33
  2. package/.claude/commands/ralph-config.md +112 -112
  3. package/.claude/commands/ralph-history.md +110 -110
  4. package/.claude/commands/ralph-init.md +72 -72
  5. package/.claude/commands/ralph-pause-resume.md +105 -105
  6. package/.claude/commands/ralph-run.md +101 -101
  7. package/.claude/commands/ralph-status.md +76 -76
  8. package/.claude/commands/rulebook-memory-save.md +48 -48
  9. package/.claude/commands/rulebook-memory-search.md +47 -47
  10. package/.claude/commands/rulebook-task-apply.md +67 -67
  11. package/.claude/commands/rulebook-task-archive.md +70 -70
  12. package/.claude/commands/rulebook-task-create.md +93 -93
  13. package/.claude/commands/rulebook-task-list.md +42 -42
  14. package/.claude/commands/rulebook-task-show.md +52 -52
  15. package/.claude/commands/rulebook-task-validate.md +53 -53
  16. package/.claude-plugin/marketplace.json +28 -28
  17. package/.claude-plugin/plugin.json +8 -8
  18. package/README.md +137 -1
  19. package/dist/cli/commands.d.ts +18 -6
  20. package/dist/cli/commands.d.ts.map +1 -1
  21. package/dist/cli/commands.js +727 -406
  22. package/dist/cli/commands.js.map +1 -1
  23. package/dist/core/claude-mcp.d.ts +4 -2
  24. package/dist/core/claude-mcp.d.ts.map +1 -1
  25. package/dist/core/claude-mcp.js +14 -9
  26. package/dist/core/claude-mcp.js.map +1 -1
  27. package/dist/core/generator.d.ts.map +1 -1
  28. package/dist/core/generator.js +13 -0
  29. package/dist/core/generator.js.map +1 -1
  30. package/dist/core/indexer/background-indexer.d.ts.map +1 -1
  31. package/dist/core/indexer/background-indexer.js +26 -5
  32. package/dist/core/indexer/background-indexer.js.map +1 -1
  33. package/dist/core/indexer/file-parser.d.ts.map +1 -1
  34. package/dist/core/indexer/file-parser.js +1 -1
  35. package/dist/core/indexer/file-parser.js.map +1 -1
  36. package/dist/core/indexer/indexer-types.d.ts.map +1 -1
  37. package/dist/core/workspace/legacy-migrator.d.ts +29 -0
  38. package/dist/core/workspace/legacy-migrator.d.ts.map +1 -0
  39. package/dist/core/workspace/legacy-migrator.js +142 -0
  40. package/dist/core/workspace/legacy-migrator.js.map +1 -0
  41. package/dist/core/workspace/project-worker.d.ts +49 -0
  42. package/dist/core/workspace/project-worker.d.ts.map +1 -0
  43. package/dist/core/workspace/project-worker.js +108 -0
  44. package/dist/core/workspace/project-worker.js.map +1 -0
  45. package/dist/core/workspace/workspace-manager.d.ts +90 -0
  46. package/dist/core/workspace/workspace-manager.d.ts.map +1 -0
  47. package/dist/core/workspace/workspace-manager.js +347 -0
  48. package/dist/core/workspace/workspace-manager.js.map +1 -0
  49. package/dist/core/workspace/workspace-types.d.ts +37 -0
  50. package/dist/core/workspace/workspace-types.d.ts.map +1 -0
  51. package/dist/core/workspace/workspace-types.js +8 -0
  52. package/dist/core/workspace/workspace-types.js.map +1 -0
  53. package/dist/index.js +43 -7
  54. package/dist/index.js.map +1 -1
  55. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  56. package/dist/mcp/rulebook-server.js +367 -100
  57. package/dist/mcp/rulebook-server.js.map +1 -1
  58. package/dist/memory/memory-manager.js +2 -2
  59. package/dist/memory/memory-manager.js.map +1 -1
  60. package/dist/memory/memory-search.js.map +1 -1
  61. package/dist/memory/memory-store.d.ts.map +1 -1
  62. package/dist/memory/memory-store.js +1 -1
  63. package/dist/memory/memory-store.js.map +1 -1
  64. package/dist/types.d.ts +1 -0
  65. package/dist/types.d.ts.map +1 -1
  66. package/package.json +22 -21
  67. package/templates/agents/implementer.md +35 -35
  68. package/templates/agents/researcher.md +34 -34
  69. package/templates/agents/team-lead.md +34 -34
  70. package/templates/agents/tester.md +42 -42
  71. package/templates/ci/rulebook-review.yml +26 -26
  72. package/templates/cli/AIDER.md +49 -49
  73. package/templates/cli/AMAZON_Q.md +25 -25
  74. package/templates/cli/AUGGIE.md +32 -32
  75. package/templates/cli/CLAUDE.md +117 -117
  76. package/templates/cli/CLINE.md +99 -99
  77. package/templates/cli/CODEBUDDY.md +20 -20
  78. package/templates/cli/CODEIUM.md +20 -20
  79. package/templates/cli/CODEX.md +21 -21
  80. package/templates/cli/CONTINUE.md +34 -34
  81. package/templates/cli/CURSOR_CLI.md +62 -62
  82. package/templates/cli/FACTORY.md +18 -18
  83. package/templates/cli/GEMINI.md +35 -35
  84. package/templates/cli/KILOCODE.md +18 -18
  85. package/templates/cli/OPENCODE.md +18 -18
  86. package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
  87. package/templates/commands/rulebook-memory-save.md +48 -48
  88. package/templates/commands/rulebook-memory-search.md +47 -47
  89. package/templates/commands/rulebook-task-apply.md +67 -67
  90. package/templates/commands/rulebook-task-archive.md +94 -94
  91. package/templates/commands/rulebook-task-create.md +93 -93
  92. package/templates/commands/rulebook-task-list.md +42 -42
  93. package/templates/commands/rulebook-task-show.md +52 -52
  94. package/templates/commands/rulebook-task-validate.md +53 -53
  95. package/templates/core/AGENTS_LEAN.md +25 -25
  96. package/templates/core/AGENTS_OVERRIDE.md +16 -16
  97. package/templates/core/AGENT_AUTOMATION.md +288 -288
  98. package/templates/core/DAG.md +304 -304
  99. package/templates/core/DOCUMENTATION_RULES.md +36 -36
  100. package/templates/core/MULTI_AGENT.md +74 -74
  101. package/templates/core/PLANS.md +28 -28
  102. package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
  103. package/templates/core/RALPH.md +471 -471
  104. package/templates/core/RULEBOOK.md +1935 -1935
  105. package/templates/core/WORKSPACE.md +69 -0
  106. package/templates/frameworks/ANGULAR.md +36 -36
  107. package/templates/frameworks/DJANGO.md +83 -83
  108. package/templates/frameworks/ELECTRON.md +147 -147
  109. package/templates/frameworks/FLASK.md +38 -38
  110. package/templates/frameworks/FLUTTER.md +55 -55
  111. package/templates/frameworks/JQUERY.md +32 -32
  112. package/templates/frameworks/LARAVEL.md +38 -38
  113. package/templates/frameworks/NESTJS.md +43 -43
  114. package/templates/frameworks/NEXTJS.md +127 -127
  115. package/templates/frameworks/NUXT.md +40 -40
  116. package/templates/frameworks/RAILS.md +66 -66
  117. package/templates/frameworks/REACT.md +38 -38
  118. package/templates/frameworks/REACT_NATIVE.md +47 -47
  119. package/templates/frameworks/SPRING.md +39 -39
  120. package/templates/frameworks/SYMFONY.md +36 -36
  121. package/templates/frameworks/VUE.md +36 -36
  122. package/templates/frameworks/ZEND.md +35 -35
  123. package/templates/git/CI_CD_PATTERNS.md +661 -661
  124. package/templates/git/GITHUB_ACTIONS.md +728 -728
  125. package/templates/git/GITLAB_CI.md +730 -730
  126. package/templates/git/GIT_WORKFLOW.md +1157 -1157
  127. package/templates/git/SECRETS_MANAGEMENT.md +585 -585
  128. package/templates/hooks/COMMIT_MSG.md +530 -530
  129. package/templates/hooks/POST_CHECKOUT.md +546 -546
  130. package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
  131. package/templates/hooks/PRE_COMMIT.md +414 -414
  132. package/templates/hooks/PRE_PUSH.md +601 -601
  133. package/templates/ides/CONTINUE_RULES.md +16 -16
  134. package/templates/ides/COPILOT.md +37 -37
  135. package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
  136. package/templates/ides/CURSOR.md +43 -43
  137. package/templates/ides/GEMINI_RULES.md +17 -17
  138. package/templates/ides/JETBRAINS_AI.md +35 -35
  139. package/templates/ides/REPLIT.md +36 -36
  140. package/templates/ides/TABNINE.md +29 -29
  141. package/templates/ides/VSCODE.md +40 -40
  142. package/templates/ides/WINDSURF.md +36 -36
  143. package/templates/ides/WINDSURF_RULES.md +14 -14
  144. package/templates/ides/ZED.md +32 -32
  145. package/templates/ides/cursor-mdc/go.mdc +24 -24
  146. package/templates/ides/cursor-mdc/python.mdc +24 -24
  147. package/templates/ides/cursor-mdc/quality.mdc +25 -25
  148. package/templates/ides/cursor-mdc/ralph.mdc +39 -39
  149. package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
  150. package/templates/ides/cursor-mdc/rust.mdc +24 -24
  151. package/templates/ides/cursor-mdc/typescript.mdc +25 -25
  152. package/templates/languages/C.md +333 -333
  153. package/templates/languages/CPP.md +743 -743
  154. package/templates/languages/CSHARP.md +417 -417
  155. package/templates/languages/ELIXIR.md +454 -454
  156. package/templates/languages/ERLANG.md +361 -361
  157. package/templates/languages/GO.md +645 -645
  158. package/templates/languages/HASKELL.md +177 -177
  159. package/templates/languages/JAVA.md +607 -607
  160. package/templates/languages/JAVASCRIPT.md +631 -631
  161. package/templates/languages/JULIA.md +97 -97
  162. package/templates/languages/KOTLIN.md +511 -511
  163. package/templates/languages/LISP.md +100 -100
  164. package/templates/languages/LUA.md +74 -74
  165. package/templates/languages/OBJECTIVEC.md +90 -90
  166. package/templates/languages/PHP.md +416 -416
  167. package/templates/languages/PYTHON.md +682 -682
  168. package/templates/languages/RUBY.md +421 -421
  169. package/templates/languages/RUST.md +477 -477
  170. package/templates/languages/SAS.md +73 -73
  171. package/templates/languages/SCALA.md +348 -348
  172. package/templates/languages/SOLIDITY.md +580 -580
  173. package/templates/languages/SQL.md +137 -137
  174. package/templates/languages/SWIFT.md +466 -466
  175. package/templates/languages/TYPESCRIPT.md +591 -591
  176. package/templates/languages/ZIG.md +265 -265
  177. package/templates/modules/ATLASSIAN.md +255 -255
  178. package/templates/modules/CONTEXT7.md +54 -54
  179. package/templates/modules/FIGMA.md +267 -267
  180. package/templates/modules/GITHUB_MCP.md +64 -64
  181. package/templates/modules/GRAFANA.md +328 -328
  182. package/templates/modules/MEMORY.md +126 -126
  183. package/templates/modules/NOTION.md +247 -247
  184. package/templates/modules/PLAYWRIGHT.md +90 -90
  185. package/templates/modules/RULEBOOK_MCP.md +156 -156
  186. package/templates/modules/SERENA.md +337 -337
  187. package/templates/modules/SUPABASE.md +223 -223
  188. package/templates/modules/SYNAP.md +69 -69
  189. package/templates/modules/VECTORIZER.md +63 -63
  190. package/templates/modules/sequential-thinking.md +42 -42
  191. package/templates/ralph/ralph-history.bat +4 -4
  192. package/templates/ralph/ralph-history.sh +5 -5
  193. package/templates/ralph/ralph-init.bat +5 -5
  194. package/templates/ralph/ralph-init.sh +5 -5
  195. package/templates/ralph/ralph-pause.bat +5 -5
  196. package/templates/ralph/ralph-pause.sh +5 -5
  197. package/templates/ralph/ralph-run.bat +5 -5
  198. package/templates/ralph/ralph-run.sh +5 -5
  199. package/templates/ralph/ralph-status.bat +4 -4
  200. package/templates/ralph/ralph-status.sh +5 -5
  201. package/templates/services/AZURE_BLOB.md +184 -184
  202. package/templates/services/CASSANDRA.md +239 -239
  203. package/templates/services/DATADOG.md +26 -26
  204. package/templates/services/DOCKER.md +124 -124
  205. package/templates/services/DOCKER_COMPOSE.md +168 -168
  206. package/templates/services/DYNAMODB.md +308 -308
  207. package/templates/services/ELASTICSEARCH.md +347 -347
  208. package/templates/services/GCS.md +178 -178
  209. package/templates/services/HELM.md +194 -194
  210. package/templates/services/INFLUXDB.md +265 -265
  211. package/templates/services/KAFKA.md +341 -341
  212. package/templates/services/KUBERNETES.md +208 -208
  213. package/templates/services/MARIADB.md +183 -183
  214. package/templates/services/MEMCACHED.md +242 -242
  215. package/templates/services/MINIO.md +201 -201
  216. package/templates/services/MONGODB.md +268 -268
  217. package/templates/services/MYSQL.md +358 -358
  218. package/templates/services/NEO4J.md +247 -247
  219. package/templates/services/OPENTELEMETRY.md +25 -25
  220. package/templates/services/ORACLE.md +290 -290
  221. package/templates/services/PINO.md +24 -24
  222. package/templates/services/POSTGRESQL.md +326 -326
  223. package/templates/services/PROMETHEUS.md +33 -33
  224. package/templates/services/RABBITMQ.md +286 -286
  225. package/templates/services/REDIS.md +292 -292
  226. package/templates/services/S3.md +298 -298
  227. package/templates/services/SENTRY.md +23 -23
  228. package/templates/services/SQLITE.md +294 -294
  229. package/templates/services/SQLSERVER.md +294 -294
  230. package/templates/services/WINSTON.md +30 -30
  231. package/templates/skills/cli/aider/SKILL.md +59 -59
  232. package/templates/skills/cli/amazon-q/SKILL.md +35 -35
  233. package/templates/skills/cli/auggie/SKILL.md +42 -42
  234. package/templates/skills/cli/claude/SKILL.md +42 -42
  235. package/templates/skills/cli/cline/SKILL.md +42 -42
  236. package/templates/skills/cli/codebuddy/SKILL.md +30 -30
  237. package/templates/skills/cli/codeium/SKILL.md +30 -30
  238. package/templates/skills/cli/codex/SKILL.md +31 -31
  239. package/templates/skills/cli/continue/SKILL.md +44 -44
  240. package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
  241. package/templates/skills/cli/factory/SKILL.md +28 -28
  242. package/templates/skills/cli/gemini/SKILL.md +45 -45
  243. package/templates/skills/cli/kilocode/SKILL.md +28 -28
  244. package/templates/skills/cli/opencode/SKILL.md +28 -28
  245. package/templates/skills/core/agent-automation/SKILL.md +194 -194
  246. package/templates/skills/core/dag/SKILL.md +314 -314
  247. package/templates/skills/core/documentation-rules/SKILL.md +46 -46
  248. package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
  249. package/templates/skills/core/rulebook/SKILL.md +176 -176
  250. package/templates/skills/frameworks/angular/SKILL.md +46 -46
  251. package/templates/skills/frameworks/django/SKILL.md +93 -93
  252. package/templates/skills/frameworks/electron/SKILL.md +157 -157
  253. package/templates/skills/frameworks/flask/SKILL.md +48 -48
  254. package/templates/skills/frameworks/flutter/SKILL.md +65 -65
  255. package/templates/skills/frameworks/jquery/SKILL.md +42 -42
  256. package/templates/skills/frameworks/laravel/SKILL.md +48 -48
  257. package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
  258. package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
  259. package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
  260. package/templates/skills/frameworks/rails/SKILL.md +76 -76
  261. package/templates/skills/frameworks/react/SKILL.md +48 -48
  262. package/templates/skills/frameworks/react-native/SKILL.md +57 -57
  263. package/templates/skills/frameworks/spring/SKILL.md +49 -49
  264. package/templates/skills/frameworks/symfony/SKILL.md +46 -46
  265. package/templates/skills/frameworks/vue/SKILL.md +46 -46
  266. package/templates/skills/frameworks/zend/SKILL.md +45 -45
  267. package/templates/skills/ides/copilot/SKILL.md +47 -47
  268. package/templates/skills/ides/cursor/SKILL.md +53 -53
  269. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
  270. package/templates/skills/ides/replit/SKILL.md +46 -46
  271. package/templates/skills/ides/tabnine/SKILL.md +39 -39
  272. package/templates/skills/ides/vscode/SKILL.md +50 -50
  273. package/templates/skills/ides/windsurf/SKILL.md +46 -46
  274. package/templates/skills/ides/zed/SKILL.md +42 -42
  275. package/templates/skills/languages/c/SKILL.md +343 -343
  276. package/templates/skills/languages/cpp/SKILL.md +753 -753
  277. package/templates/skills/languages/csharp/SKILL.md +427 -427
  278. package/templates/skills/languages/elixir/SKILL.md +464 -464
  279. package/templates/skills/languages/erlang/SKILL.md +371 -371
  280. package/templates/skills/languages/go/SKILL.md +655 -655
  281. package/templates/skills/languages/haskell/SKILL.md +187 -187
  282. package/templates/skills/languages/java/SKILL.md +617 -617
  283. package/templates/skills/languages/javascript/SKILL.md +641 -641
  284. package/templates/skills/languages/julia/SKILL.md +107 -107
  285. package/templates/skills/languages/kotlin/SKILL.md +521 -521
  286. package/templates/skills/languages/lisp/SKILL.md +110 -110
  287. package/templates/skills/languages/lua/SKILL.md +84 -84
  288. package/templates/skills/languages/objectivec/SKILL.md +100 -100
  289. package/templates/skills/languages/php/SKILL.md +426 -426
  290. package/templates/skills/languages/python/SKILL.md +692 -692
  291. package/templates/skills/languages/ruby/SKILL.md +431 -431
  292. package/templates/skills/languages/rust/SKILL.md +487 -487
  293. package/templates/skills/languages/sas/SKILL.md +83 -83
  294. package/templates/skills/languages/scala/SKILL.md +358 -358
  295. package/templates/skills/languages/solidity/SKILL.md +590 -590
  296. package/templates/skills/languages/sql/SKILL.md +147 -147
  297. package/templates/skills/languages/swift/SKILL.md +476 -476
  298. package/templates/skills/languages/typescript/SKILL.md +302 -302
  299. package/templates/skills/languages/zig/SKILL.md +275 -275
  300. package/templates/skills/modules/atlassian/SKILL.md +265 -265
  301. package/templates/skills/modules/context7/SKILL.md +64 -64
  302. package/templates/skills/modules/figma/SKILL.md +277 -277
  303. package/templates/skills/modules/github-mcp/SKILL.md +74 -74
  304. package/templates/skills/modules/grafana/SKILL.md +338 -338
  305. package/templates/skills/modules/memory/SKILL.md +73 -73
  306. package/templates/skills/modules/notion/SKILL.md +257 -257
  307. package/templates/skills/modules/playwright/SKILL.md +100 -100
  308. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
  309. package/templates/skills/modules/serena/SKILL.md +347 -347
  310. package/templates/skills/modules/supabase/SKILL.md +233 -233
  311. package/templates/skills/modules/synap/SKILL.md +79 -79
  312. package/templates/skills/modules/vectorizer/SKILL.md +73 -73
  313. package/templates/skills/services/azure-blob/SKILL.md +194 -194
  314. package/templates/skills/services/cassandra/SKILL.md +249 -249
  315. package/templates/skills/services/dynamodb/SKILL.md +318 -318
  316. package/templates/skills/services/elasticsearch/SKILL.md +357 -357
  317. package/templates/skills/services/gcs/SKILL.md +188 -188
  318. package/templates/skills/services/influxdb/SKILL.md +275 -275
  319. package/templates/skills/services/kafka/SKILL.md +351 -351
  320. package/templates/skills/services/mariadb/SKILL.md +193 -193
  321. package/templates/skills/services/memcached/SKILL.md +252 -252
  322. package/templates/skills/services/minio/SKILL.md +211 -211
  323. package/templates/skills/services/mongodb/SKILL.md +278 -278
  324. package/templates/skills/services/mysql/SKILL.md +368 -368
  325. package/templates/skills/services/neo4j/SKILL.md +257 -257
  326. package/templates/skills/services/oracle/SKILL.md +300 -300
  327. package/templates/skills/services/postgresql/SKILL.md +336 -336
  328. package/templates/skills/services/rabbitmq/SKILL.md +296 -296
  329. package/templates/skills/services/redis/SKILL.md +302 -302
  330. package/templates/skills/services/s3/SKILL.md +308 -308
  331. package/templates/skills/services/sqlite/SKILL.md +304 -304
  332. package/templates/skills/services/sqlserver/SKILL.md +304 -304
  333. package/templates/skills/workflows/ralph/SKILL.md +309 -309
  334. package/templates/skills/workflows/ralph/install.sh +87 -87
  335. package/templates/skills/workflows/ralph/manifest.json +158 -158
@@ -1,585 +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/specs/GITHUB_ACTIONS.md` for GitHub Actions secrets
583
- - See `/.rulebook/specs/GITLAB_CI.md` for GitLab CI secrets
584
- - See `/.rulebook/specs/CI_CD_PATTERNS.md` for deployment patterns
585
- - See `/.rulebook/specs/GIT.md` for .gitignore patterns
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/specs/GITHUB_ACTIONS.md` for GitHub Actions secrets
583
+ - See `/.rulebook/specs/GITLAB_CI.md` for GitLab CI secrets
584
+ - See `/.rulebook/specs/CI_CD_PATTERNS.md` for deployment patterns
585
+ - See `/.rulebook/specs/GIT.md` for .gitignore patterns