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