@cakemail-org/cakemail-cli 1.5.0 → 2.0.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 (234) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.env.example +40 -0
  3. package/.env.test.example +45 -0
  4. package/CHANGELOG.md +1031 -0
  5. package/README.md +319 -15
  6. package/audit-formats.js +128 -0
  7. package/cakemail.rb +20 -0
  8. package/dist/cli.js +27 -10
  9. package/dist/cli.js.map +1 -1
  10. package/dist/client.d.ts +2 -0
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +16 -6
  13. package/dist/client.js.map +1 -1
  14. package/dist/commands/account.js +1 -1
  15. package/dist/commands/account.js.map +1 -1
  16. package/dist/commands/attributes.js +1 -1
  17. package/dist/commands/attributes.js.map +1 -1
  18. package/dist/commands/campaigns.d.ts.map +1 -1
  19. package/dist/commands/campaigns.js +103 -8
  20. package/dist/commands/campaigns.js.map +1 -1
  21. package/dist/commands/config.d.ts.map +1 -1
  22. package/dist/commands/config.js +63 -4
  23. package/dist/commands/config.js.map +1 -1
  24. package/dist/commands/contacts.d.ts.map +1 -1
  25. package/dist/commands/contacts.js +91 -12
  26. package/dist/commands/contacts.js.map +1 -1
  27. package/dist/commands/emails.js +1 -1
  28. package/dist/commands/emails.js.map +1 -1
  29. package/dist/commands/interests.d.ts +5 -0
  30. package/dist/commands/interests.d.ts.map +1 -0
  31. package/dist/commands/interests.js +172 -0
  32. package/dist/commands/interests.js.map +1 -0
  33. package/dist/commands/lists.d.ts.map +1 -1
  34. package/dist/commands/lists.js +6 -8
  35. package/dist/commands/lists.js.map +1 -1
  36. package/dist/commands/logs.d.ts +5 -0
  37. package/dist/commands/logs.d.ts.map +1 -0
  38. package/dist/commands/logs.js +237 -0
  39. package/dist/commands/logs.js.map +1 -0
  40. package/dist/commands/reports.js +1 -1
  41. package/dist/commands/reports.js.map +1 -1
  42. package/dist/commands/segments.js +1 -1
  43. package/dist/commands/segments.js.map +1 -1
  44. package/dist/commands/senders.d.ts.map +1 -1
  45. package/dist/commands/senders.js +11 -8
  46. package/dist/commands/senders.js.map +1 -1
  47. package/dist/commands/suppressed.js +1 -1
  48. package/dist/commands/suppressed.js.map +1 -1
  49. package/dist/commands/tags.d.ts +5 -0
  50. package/dist/commands/tags.d.ts.map +1 -0
  51. package/dist/commands/tags.js +124 -0
  52. package/dist/commands/tags.js.map +1 -0
  53. package/dist/commands/templates.js +1 -1
  54. package/dist/commands/templates.js.map +1 -1
  55. package/dist/commands/transactional-templates.d.ts +5 -0
  56. package/dist/commands/transactional-templates.d.ts.map +1 -0
  57. package/dist/commands/transactional-templates.js +354 -0
  58. package/dist/commands/transactional-templates.js.map +1 -0
  59. package/dist/commands/webhooks.js +1 -1
  60. package/dist/commands/webhooks.js.map +1 -1
  61. package/dist/utils/auth.d.ts +8 -1
  62. package/dist/utils/auth.d.ts.map +1 -1
  63. package/dist/utils/auth.js +39 -11
  64. package/dist/utils/auth.js.map +1 -1
  65. package/dist/utils/config-file.d.ts +7 -0
  66. package/dist/utils/config-file.d.ts.map +1 -1
  67. package/dist/utils/config-file.js +15 -0
  68. package/dist/utils/config-file.js.map +1 -1
  69. package/dist/utils/config.d.ts +2 -0
  70. package/dist/utils/config.d.ts.map +1 -1
  71. package/dist/utils/config.js +12 -4
  72. package/dist/utils/config.js.map +1 -1
  73. package/dist/utils/errors.js +1 -1
  74. package/dist/utils/errors.js.map +1 -1
  75. package/dist/utils/list-defaults.d.ts +33 -0
  76. package/dist/utils/list-defaults.d.ts.map +1 -0
  77. package/dist/utils/list-defaults.js +52 -0
  78. package/dist/utils/list-defaults.js.map +1 -0
  79. package/dist/utils/output.d.ts.map +1 -1
  80. package/dist/utils/output.js +36 -13
  81. package/dist/utils/output.js.map +1 -1
  82. package/dist/utils/progress.d.ts.map +1 -1
  83. package/dist/utils/progress.js +32 -4
  84. package/dist/utils/progress.js.map +1 -1
  85. package/dist/utils/spinner.d.ts +17 -0
  86. package/dist/utils/spinner.d.ts.map +1 -0
  87. package/dist/utils/spinner.js +43 -0
  88. package/dist/utils/spinner.js.map +1 -0
  89. package/docs/DOCUMENTATION-STANDARD.md +1068 -0
  90. package/docs/README.md +161 -0
  91. package/docs/developer/ARCHITECTURE.md +516 -0
  92. package/docs/developer/AUTH.md +204 -0
  93. package/docs/developer/CONTRIBUTING.md +227 -0
  94. package/docs/developer/DOCUMENTATION_SUMMARY.md +346 -0
  95. package/docs/developer/PROJECT_INDEX.md +365 -0
  96. package/docs/planning/API_COVERAGE.md +1045 -0
  97. package/docs/planning/BACKLOG.md +1159 -0
  98. package/docs/planning/PROFILE_SYSTEM_TASKS.md +287 -0
  99. package/docs/planning/UX_IMPLEMENTATION_PLAN.md +691 -0
  100. package/docs/planning/archive/RELEASE_CHECKLIST_v1.3.0.md +332 -0
  101. package/docs/planning/archive/RELEASE_v1.3.0.md +428 -0
  102. package/docs/planning/archive/cakemail-cli-ux-improvements.md +438 -0
  103. package/docs/planning/cakemail-profile-system-plan.md +1121 -0
  104. package/docs/testing/AI_USER_SIMULATION_DESIGN.md +1342 -0
  105. package/docs/testing/KENOGAMI_BIDIRECTIONAL_FLOW.md +1517 -0
  106. package/docs/testing/KENOGAMI_TRUTH_RECONCILIATION_SYSTEM.md +1369 -0
  107. package/docs/user-manual/.obsidian/app.json +1 -0
  108. package/docs/user-manual/.obsidian/appearance.json +1 -0
  109. package/docs/user-manual/.obsidian/core-plugins.json +33 -0
  110. package/docs/user-manual/.obsidian/workspace.json +167 -0
  111. package/docs/user-manual/01-getting-started/01-installation.md +214 -0
  112. package/docs/user-manual/01-getting-started/02-quick-start.md +432 -0
  113. package/docs/user-manual/01-getting-started/03-authentication.md +448 -0
  114. package/docs/user-manual/01-getting-started/04-configuration.md +430 -0
  115. package/docs/user-manual/01-getting-started/05-output-formats.md +447 -0
  116. package/docs/user-manual/02-core-concepts/01-accounts.md +514 -0
  117. package/docs/user-manual/02-core-concepts/02-profile-system.md +771 -0
  118. package/docs/user-manual/02-core-concepts/03-smart-defaults.md +485 -0
  119. package/docs/user-manual/02-core-concepts/04-authentication-methods.md +435 -0
  120. package/docs/user-manual/02-core-concepts/05-pagination-filtering.md +600 -0
  121. package/docs/user-manual/02-core-concepts/06-error-handling.md +718 -0
  122. package/docs/user-manual/02-core-concepts/07-api-coverage.md +483 -0
  123. package/docs/user-manual/03-email-operations/01-senders.md +490 -0
  124. package/docs/user-manual/03-email-operations/02-templates.md +444 -0
  125. package/docs/user-manual/03-email-operations/03-transactional-emails.md +706 -0
  126. package/docs/user-manual/03-email-operations/04-email-tracking.md +407 -0
  127. package/docs/user-manual/04-campaign-management/01-campaigns-basics.md +394 -0
  128. package/docs/user-manual/04-campaign-management/02-campaign-scheduling.md +630 -0
  129. package/docs/user-manual/04-campaign-management/03-campaign-testing.md +997 -0
  130. package/docs/user-manual/04-campaign-management/04-campaign-lifecycle.md +709 -0
  131. package/docs/user-manual/04-campaign-management/05-campaign-links.md +934 -0
  132. package/docs/user-manual/05-contact-management/01-lists.md +836 -0
  133. package/docs/user-manual/05-contact-management/02-contacts.md +1035 -0
  134. package/docs/user-manual/05-contact-management/03-custom-attributes.md +788 -0
  135. package/docs/user-manual/05-contact-management/04-segments.md +1028 -0
  136. package/docs/user-manual/05-contact-management/05-contact-import-export.md +1031 -0
  137. package/docs/user-manual/06-analytics-reporting/01-campaign-analytics.md +867 -0
  138. package/docs/user-manual/06-analytics-reporting/02-account-reports.md +227 -0
  139. package/docs/user-manual/07-integrations/01-webhooks-integration.md +259 -0
  140. package/docs/user-manual/07-integrations/02-automation.md +326 -0
  141. package/docs/user-manual/08-advanced-usage/01-scripting-patterns.md +672 -0
  142. package/docs/user-manual/08-advanced-usage/02-bulk-operations.md +932 -0
  143. package/docs/user-manual/08-advanced-usage/03-ci-cd-integration.md +892 -0
  144. package/docs/user-manual/08-advanced-usage/04-performance-optimization.md +766 -0
  145. package/docs/user-manual/09-command-reference/01-config.md +776 -0
  146. package/docs/user-manual/09-command-reference/02-account.md +652 -0
  147. package/docs/user-manual/09-command-reference/03-lists.md +958 -0
  148. package/docs/user-manual/09-command-reference/04-contacts.md +1408 -0
  149. package/docs/user-manual/09-command-reference/05-attributes.md +617 -0
  150. package/docs/user-manual/09-command-reference/06-segments.md +894 -0
  151. package/docs/user-manual/09-command-reference/07-senders.md +803 -0
  152. package/docs/user-manual/09-command-reference/08-templates.md +818 -0
  153. package/docs/user-manual/09-command-reference/09-campaigns.md +1250 -0
  154. package/docs/user-manual/09-command-reference/10-emails.md +807 -0
  155. package/docs/user-manual/09-command-reference/11-reports.md +1135 -0
  156. package/docs/user-manual/09-command-reference/12-webhooks.md +773 -0
  157. package/docs/user-manual/09-command-reference/13-suppressed.md +797 -0
  158. package/docs/user-manual/09-command-reference/14-interests.md +630 -0
  159. package/docs/user-manual/09-command-reference/15-tags.md +584 -0
  160. package/docs/user-manual/09-command-reference/16-logs.md +656 -0
  161. package/docs/user-manual/09-command-reference/17-transactional-templates.md +850 -0
  162. package/docs/user-manual/10-troubleshooting/01-common-errors.md +457 -0
  163. package/docs/user-manual/10-troubleshooting/02-authentication-issues.md +558 -0
  164. package/docs/user-manual/10-troubleshooting/03-connection-problems.md +634 -0
  165. package/docs/user-manual/10-troubleshooting/04-debugging.md +725 -0
  166. package/docs/user-manual/11-appendix/04-faq.md +484 -0
  167. package/docs/user-manual/11-appendix/05-glossary.md +250 -0
  168. package/docs/user-manual/README.md +0 -0
  169. package/package.json +13 -47
  170. package/src/cli.ts +125 -0
  171. package/src/client.ts +16 -0
  172. package/src/commands/account.ts +267 -0
  173. package/src/commands/accounts.ts +78 -0
  174. package/src/commands/actions.ts +249 -0
  175. package/src/commands/attributes.ts +139 -0
  176. package/src/commands/campaign-blueprints.ts +106 -0
  177. package/src/commands/campaigns.ts +469 -0
  178. package/src/commands/config.ts +77 -0
  179. package/src/commands/contacts.ts +612 -0
  180. package/src/commands/custom-attributes.ts +127 -0
  181. package/src/commands/dkims.ts +117 -0
  182. package/src/commands/domains.ts +82 -0
  183. package/src/commands/email-apis.ts +569 -0
  184. package/src/commands/emails.ts +197 -0
  185. package/src/commands/forms.ts +283 -0
  186. package/src/commands/interests.ts +155 -0
  187. package/src/commands/links.ts +38 -0
  188. package/src/commands/lists.ts +406 -0
  189. package/src/commands/logos.ts +71 -0
  190. package/src/commands/logs.ts +386 -0
  191. package/src/commands/reports.ts +306 -0
  192. package/src/commands/segments.ts +158 -0
  193. package/src/commands/senders.ts +204 -0
  194. package/src/commands/sub-accounts.ts +271 -0
  195. package/src/commands/suppressed-emails.ts +234 -0
  196. package/src/commands/suppressed.ts +198 -0
  197. package/src/commands/system-emails.ts +85 -0
  198. package/src/commands/tags.ts +146 -0
  199. package/src/commands/tasks.ts +116 -0
  200. package/src/commands/templates.ts +189 -0
  201. package/src/commands/tokens.ts +83 -0
  202. package/src/commands/transactional-emails.ts +374 -0
  203. package/src/commands/transactional-templates.ts +385 -0
  204. package/src/commands/users.ts +506 -0
  205. package/src/commands/webhooks.ts +172 -0
  206. package/src/commands/workflow-blueprints.ts +123 -0
  207. package/src/commands/workflows.ts +265 -0
  208. package/src/types/profile.ts +93 -0
  209. package/src/utils/auth.ts +272 -0
  210. package/src/utils/config-file.ts +96 -0
  211. package/src/utils/config.ts +134 -0
  212. package/src/utils/confirm.ts +32 -0
  213. package/src/utils/defaults.ts +99 -0
  214. package/src/utils/errors.ts +116 -0
  215. package/src/utils/interactive.ts +91 -0
  216. package/src/utils/list-defaults.ts +74 -0
  217. package/src/utils/output.ts +190 -0
  218. package/src/utils/progress.ts +320 -0
  219. package/src/utils/spinner.ts +22 -0
  220. package/tests/IMPLEMENTATION_STATUS.md +258 -0
  221. package/tests/PTY_SETUP.md +118 -0
  222. package/tests/PTY_TESTING_GUIDE.md +507 -0
  223. package/tests/README.md +244 -0
  224. package/tests/fixtures/api-responses/campaigns.json +34 -0
  225. package/tests/fixtures/test-config.json +13 -0
  226. package/tests/helpers/cli-runner.ts +128 -0
  227. package/tests/helpers/mock-server.ts +301 -0
  228. package/tests/helpers/pty-runner.ts +181 -0
  229. package/tests/integration/campaigns-real-api.test.ts +196 -0
  230. package/tests/integration/setup-integration.ts +50 -0
  231. package/tests/pty/campaigns.test.ts +241 -0
  232. package/tests/setup.ts +34 -0
  233. package/tsconfig.json +15 -0
  234. package/vitest.config.ts +28 -0
@@ -0,0 +1,448 @@
1
+ # Authentication
2
+
3
+ Learn how to authenticate with the Cakemail API using the CLI.
4
+
5
+ ## Overview
6
+
7
+ The Cakemail CLI provides **seamless authentication** - just run any command, and if credentials are missing, you'll be prompted to provide them. No separate setup command required!
8
+
9
+ **Authentication Methods:**
10
+ 1. **Access Token** (recommended for automation)
11
+ 2. **Email & Password** (recommended for interactive use)
12
+
13
+ **Credential Sources:**
14
+ - Interactive prompts (easiest)
15
+ - Configuration file (`~/.cakemail/config.json`)
16
+ - Environment variables
17
+ - `.env` file
18
+ - Command-line options (for one-off overrides)
19
+
20
+ **First-Time Experience:**
21
+ ```bash
22
+ $ cakemail campaigns list
23
+ # If no credentials found, you'll be prompted interactively
24
+ # Credentials are validated and saved automatically
25
+ # No separate setup needed!
26
+ ```
27
+
28
+ ## Authentication Methods
29
+
30
+ ### Method 1: Email & Password (Recommended for Interactive Use)
31
+
32
+ Authenticate using your Cakemail account email and password. The CLI uses OAuth token-based authentication - when you provide your email and password, the CLI automatically obtains and stores OAuth tokens (access token and refresh token) for secure, long-lived sessions.
33
+
34
+ **Option A: Environment Variables**
35
+
36
+ ```bash
37
+ export CAKEMAIL_EMAIL=your@email.com
38
+ export CAKEMAIL_PASSWORD=your_password
39
+ ```
40
+
41
+ **Option B: .env File**
42
+
43
+ Create a `.env` file in your project directory:
44
+
45
+ ```bash
46
+ CAKEMAIL_EMAIL=your@email.com
47
+ CAKEMAIL_PASSWORD=your_password
48
+ ```
49
+
50
+ **Option C: Command-Line Flags**
51
+
52
+ ```bash
53
+ cakemail --email your@email.com --password your_password campaigns list
54
+ ```
55
+
56
+ **Option D: Interactive Prompts**
57
+
58
+ If no credentials are found, the CLI will prompt you interactively on first use:
59
+
60
+ ```bash
61
+ $ cakemail campaigns list
62
+
63
+ ⚠ Not authenticated
64
+ Please enter your Cakemail credentials:
65
+
66
+ Email: user@example.com
67
+ Password: ********
68
+
69
+ 🔐 Authenticating...
70
+ ✓ Authentication successful!
71
+
72
+ # If you have multiple accounts
73
+ ? Select an account:
74
+ › Cakemail (ID: 123456) ⭐
75
+ Sub-Account A (ID: 789012)
76
+ Sub-Account B (ID: 345678)
77
+
78
+ # Profile selection
79
+ ? Select your profile:
80
+ › 📊 Marketer - Interactive, user-friendly
81
+ 💻 Developer - Fast, scriptable
82
+ ⚖️ Balanced - Best of both
83
+
84
+ ✓ Profile set to: marketer
85
+ ✓ OAuth tokens saved to ~/.cakemail/config.json
86
+
87
+ [... proceeds with your command ...]
88
+ ```
89
+
90
+ **How OAuth Authentication Works:**
91
+ - You provide email and password once
92
+ - CLI obtains OAuth access token and refresh token
93
+ - Tokens are stored securely in `~/.cakemail/config.json`
94
+ - Your password is **never** stored - only tokens
95
+ - Tokens automatically refresh when needed
96
+ - You'll select a user profile (developer, marketer, or balanced)
97
+ - No separate setup command required
98
+
99
+ **What's Stored in config.json:**
100
+ - `access_token` - Used for API authentication
101
+ - `refresh_token` - Used to obtain new access tokens
102
+ - `expires_in` - Token expiration tracking
103
+ - `auth.method` - Authentication method used
104
+
105
+ **Subsequent Commands:**
106
+ - OAuth tokens loaded automatically from config
107
+ - Tokens refreshed automatically when expired
108
+ - No prompts needed
109
+ - Just run your commands
110
+
111
+ ---
112
+
113
+ ### Method 2: Access Token (Advanced - Manual Token Management)
114
+
115
+ For advanced users who want to manually manage API tokens, you can provide an access token directly. This skips the OAuth flow.
116
+
117
+ ---
118
+
119
+ ## Multi-Tenant Account Management
120
+
121
+ If you have access to multiple Cakemail accounts (parent account + sub-accounts), you can easily list and switch between them.
122
+
123
+ ### List All Accessible Accounts
124
+
125
+ ```bash
126
+ cakemail account list
127
+ ```
128
+
129
+ **Example Output:**
130
+ ```
131
+ ┌────────────┬─────────────────────────┬──────────┬────────────────────┐
132
+ │ Account ID │ Account Name │ Current │ Created │
133
+ ├────────────┼─────────────────────────┼──────────┼────────────────────┤
134
+ │ 12345 │ My Marketing Account │ ✓ │ 2024-01-15 │
135
+ │ 67890 │ Client Account │ │ 2024-03-20 │
136
+ │ 11111 │ Partner Sub-Account │ │ 2024-05-10 │
137
+ └────────────┴─────────────────────────┴──────────┴────────────────────┘
138
+
139
+ Showing 3 accessible accounts (parent + sub-accounts)
140
+ ```
141
+
142
+ ### View Current Account
143
+
144
+ ```bash
145
+ cakemail account show
146
+ ```
147
+
148
+ **Example Output:**
149
+ ```json
150
+ {
151
+ "id": 12345,
152
+ "name": "My Marketing Account",
153
+ "status": "active",
154
+ "created_on": "2024-01-15T10:00:00Z"
155
+ }
156
+ ```
157
+
158
+ ### Switch Between Accounts
159
+
160
+ ```bash
161
+ cakemail account use <account-id>
162
+ ```
163
+
164
+ **Example:**
165
+ ```bash
166
+ $ cakemail account use 67890
167
+ ✓ Switched to account: Client Account (67890)
168
+ ✓ Context saved to ~/.cakemail/config.json
169
+ ```
170
+
171
+ **Context Persistence:**
172
+ - Account context saved in `CAKEMAIL_CURRENT_ACCOUNT_ID`
173
+ - Persists between CLI sessions
174
+ - Applies to all subsequent commands
175
+
176
+ ### Use Specific Account for Single Command
177
+
178
+ Override the current account context for a single command:
179
+
180
+ ```bash
181
+ cakemail --account 67890 campaigns list
182
+ ```
183
+
184
+ This doesn't change your saved account context - just overrides it for this one command.
185
+
186
+ ### Test Current Credentials
187
+
188
+ Verify your authentication and account access:
189
+
190
+ ```bash
191
+ cakemail account test
192
+ ```
193
+
194
+ **Example Output:**
195
+ ```
196
+ ✓ Authentication successful
197
+ ✓ Connected as: user@example.com
198
+ ✓ Current account: My Marketing Account (12345)
199
+ ✓ API access: OK
200
+ ```
201
+
202
+ ### Logout
203
+
204
+ Remove stored credentials and authentication tokens:
205
+
206
+ ```bash
207
+ cakemail logout
208
+ ```
209
+
210
+ **Interactive Logout:**
211
+ ```bash
212
+ $ cakemail logout
213
+
214
+ 🚪 Logout
215
+
216
+ Currently logged in as: user@example.com
217
+
218
+ This will remove:
219
+ • Authentication tokens
220
+ • Profile settings
221
+ • All saved configuration
222
+
223
+ ? Are you sure you want to log out? (y/N) y
224
+
225
+ ✓ Logged out successfully
226
+
227
+ Run any command to log in again.
228
+ ```
229
+
230
+ **Force Logout (Skip Confirmation):**
231
+ ```bash
232
+ $ cakemail logout --force
233
+ ✓ Logged out successfully
234
+ ```
235
+
236
+ **What Gets Deleted:**
237
+ - OAuth access token and refresh token
238
+ - Profile settings
239
+ - Account context
240
+ - All saved configuration from `~/.cakemail/config.json`
241
+
242
+ **Note:** You'll need to authenticate again on next use.
243
+
244
+ ---
245
+
246
+ ## Security Best Practices
247
+
248
+ ### 1. OAuth Tokens vs Manual Access Tokens
249
+
250
+ **OAuth Tokens (Recommended for Most Users):**
251
+ - Obtained automatically from email/password
252
+ - Include refresh tokens for long-lived sessions
253
+ - Your password is never stored
254
+ - Tokens automatically refreshed
255
+ - Safer for interactive use
256
+
257
+ **Manual Access Tokens (For Automation):**
258
+ - Generated in Cakemail dashboard
259
+ - Good for CI/CD pipelines and scripts
260
+ - Can be revoked without changing password
261
+ - Limited scope (API access only)
262
+ - Easier to rotate regularly
263
+
264
+ ### 2. Store Credentials Securely
265
+
266
+ **Do:**
267
+ - Use `.env` files (and add them to `.gitignore`)
268
+ - Use environment variables
269
+ - Use a secrets manager for CI/CD (GitHub Secrets, AWS Secrets Manager, etc.)
270
+
271
+ **Don't:**
272
+ - Commit credentials to version control
273
+ - Share credentials in chat or email
274
+ - Use the same token across multiple projects
275
+
276
+ ### 3. Protect Configuration Files
277
+
278
+ Always exclude configuration files from version control:
279
+
280
+ ```bash
281
+ # Add to .gitignore
282
+ echo '.env' >> .gitignore
283
+ echo '.cakemail/' >> .gitignore
284
+ ```
285
+
286
+ **Important:** The `~/.cakemail/config.json` file contains:
287
+ - OAuth access tokens
288
+ - OAuth refresh tokens
289
+ - Profile settings
290
+ - Account context
291
+
292
+ **Never commit config.json to version control.**
293
+
294
+ ### 4. Use Logout When Switching Accounts
295
+
296
+ When switching between different Cakemail accounts or sharing a machine:
297
+
298
+ ```bash
299
+ # Log out completely
300
+ cakemail logout --force
301
+
302
+ # Log in with new account
303
+ cakemail campaigns list
304
+ # [Prompts for credentials]
305
+ ```
306
+
307
+ ### 5. Token Security
308
+
309
+ **OAuth tokens are automatically managed:**
310
+ - Access tokens expire and are refreshed automatically
311
+ - Refresh tokens are long-lived but can be invalidated
312
+ - Use `logout` command to remove all tokens when done
313
+
314
+ **For manual access tokens:**
315
+ - Rotate tokens periodically
316
+ - Generate new token in Cakemail dashboard
317
+ - Update environment variable or `.env` file
318
+ - Revoke old token
319
+
320
+ ---
321
+
322
+ ## Environment File (.env)
323
+
324
+ The CLI automatically loads environment variables from a `.env` file in:
325
+ 1. Current working directory
326
+ 2. Home directory (`~/.cakemail`)
327
+
328
+ ### Example .env File
329
+
330
+ ```bash
331
+ # Authentication (choose one method)
332
+ CAKEMAIL_ACCESS_TOKEN=your_access_token_here
333
+
334
+ # OR use email/password
335
+ # CAKEMAIL_EMAIL=your@email.com
336
+ # CAKEMAIL_PASSWORD=your_password
337
+
338
+ # Optional: Default output format
339
+ CAKEMAIL_OUTPUT_FORMAT=compact
340
+
341
+ # Optional: API base URL (defaults to https://api.cakemail.dev)
342
+ # CAKEMAIL_API_BASE=https://api.cakemail.dev
343
+
344
+ # Optional: Default account ID
345
+ # CAKEMAIL_ACCOUNT_ID=12345
346
+ ```
347
+
348
+ ### Global Configuration
349
+
350
+ Create a global `.env` file at `~/.cakemail/.env` to use across all projects:
351
+
352
+ ```bash
353
+ mkdir -p ~/.cakemail
354
+ cat > ~/.cakemail/.env <<EOF
355
+ CAKEMAIL_ACCESS_TOKEN=your_access_token_here
356
+ CAKEMAIL_OUTPUT_FORMAT=compact
357
+ EOF
358
+ ```
359
+
360
+ **Note**: Project-level `.env` files take precedence over global configuration.
361
+
362
+ ---
363
+
364
+ ## Credential Priority
365
+
366
+ When multiple credential sources are present, the CLI uses this priority order:
367
+
368
+ 1. **Command-line flags** (highest priority)
369
+ ```bash
370
+ cakemail --access-token abc123 campaigns list
371
+ ```
372
+
373
+ 2. **Environment variables**
374
+ ```bash
375
+ export CAKEMAIL_ACCESS_TOKEN=abc123
376
+ ```
377
+
378
+ 3. **Project .env file**
379
+ ```
380
+ # .env in current directory
381
+ CAKEMAIL_ACCESS_TOKEN=abc123
382
+ ```
383
+
384
+ 4. **Global .env file**
385
+ ```
386
+ # ~/.cakemail/.env
387
+ CAKEMAIL_ACCESS_TOKEN=abc123
388
+ ```
389
+
390
+ 5. **Interactive prompts** (lowest priority)
391
+
392
+ ---
393
+
394
+ ## Troubleshooting Authentication
395
+
396
+ ### "Missing credentials" Error
397
+
398
+ If you see this error:
399
+
400
+ ```
401
+ Error: Missing credentials. Please provide either an access token or email/password.
402
+ ```
403
+
404
+ **Solution:**
405
+ 1. Check that credentials are set in environment variables or `.env` file
406
+ 2. Verify there are no typos in variable names
407
+ 3. Try providing credentials via command-line flags
408
+
409
+ ### "Invalid credentials" Error
410
+
411
+ If authentication fails:
412
+
413
+ ```
414
+ Error: Authentication failed. Invalid credentials.
415
+ ```
416
+
417
+ **Solutions:**
418
+ 1. **Access Token**: Verify the token is correct and hasn't been revoked
419
+ 2. **Email/Password**: Check for typos and ensure the password is current
420
+ 3. **Account Access**: Ensure you have access to the account
421
+
422
+ ### "Account not found" Error
423
+
424
+ If switching to an account fails:
425
+
426
+ ```
427
+ Error: Account not found: 12345
428
+ ```
429
+
430
+ **Solutions:**
431
+ 1. List available accounts: `cakemail account list`
432
+ 2. Verify you have access to the account
433
+ 3. Check that you're authenticated with the correct credentials
434
+
435
+ ### Testing Authentication
436
+
437
+ Verify your credentials work:
438
+
439
+ ```bash
440
+ # Test with current account
441
+ cakemail account current
442
+
443
+ # Test with a simple list command
444
+ cakemail lists list --limit 1
445
+ ```
446
+
447
+ ---
448
+