@cakemail-org/cakemail-cli 1.7.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.
- package/.claude/settings.local.json +12 -0
- package/.env.example +40 -0
- package/.env.test.example +45 -0
- package/CHANGELOG.md +1031 -0
- package/README.md +41 -37
- package/audit-formats.js +128 -0
- package/cakemail.rb +20 -0
- package/dist/client.js +1 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/account.js +1 -1
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/attributes.js +1 -1
- package/dist/commands/attributes.js.map +1 -1
- package/dist/commands/campaigns.js +1 -1
- package/dist/commands/campaigns.js.map +1 -1
- package/dist/commands/contacts.js +1 -1
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/emails.js +1 -1
- package/dist/commands/emails.js.map +1 -1
- package/dist/commands/interests.js +1 -1
- package/dist/commands/interests.js.map +1 -1
- package/dist/commands/lists.js +1 -1
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/reports.js +1 -1
- package/dist/commands/reports.js.map +1 -1
- package/dist/commands/segments.js +1 -1
- package/dist/commands/segments.js.map +1 -1
- package/dist/commands/senders.js +1 -1
- package/dist/commands/senders.js.map +1 -1
- package/dist/commands/suppressed.js +1 -1
- package/dist/commands/suppressed.js.map +1 -1
- package/dist/commands/tags.js +1 -1
- package/dist/commands/tags.js.map +1 -1
- package/dist/commands/templates.js +1 -1
- package/dist/commands/templates.js.map +1 -1
- package/dist/commands/transactional-templates.js +1 -1
- package/dist/commands/transactional-templates.js.map +1 -1
- package/dist/commands/webhooks.js +1 -1
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/utils/config.js +2 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.js +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/progress.d.ts.map +1 -1
- package/dist/utils/progress.js +32 -4
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/spinner.d.ts +17 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +43 -0
- package/dist/utils/spinner.js.map +1 -0
- package/docs/DOCUMENTATION-STANDARD.md +1068 -0
- package/docs/README.md +161 -0
- package/docs/developer/ARCHITECTURE.md +516 -0
- package/docs/developer/AUTH.md +204 -0
- package/docs/developer/CONTRIBUTING.md +227 -0
- package/docs/developer/DOCUMENTATION_SUMMARY.md +346 -0
- package/docs/developer/PROJECT_INDEX.md +365 -0
- package/docs/planning/API_COVERAGE.md +1045 -0
- package/docs/planning/BACKLOG.md +1159 -0
- package/docs/planning/PROFILE_SYSTEM_TASKS.md +287 -0
- package/docs/planning/UX_IMPLEMENTATION_PLAN.md +691 -0
- package/docs/planning/archive/RELEASE_CHECKLIST_v1.3.0.md +332 -0
- package/docs/planning/archive/RELEASE_v1.3.0.md +428 -0
- package/docs/planning/archive/cakemail-cli-ux-improvements.md +438 -0
- package/docs/planning/cakemail-profile-system-plan.md +1121 -0
- package/docs/testing/AI_USER_SIMULATION_DESIGN.md +1342 -0
- package/docs/testing/KENOGAMI_BIDIRECTIONAL_FLOW.md +1517 -0
- package/docs/testing/KENOGAMI_TRUTH_RECONCILIATION_SYSTEM.md +1369 -0
- package/docs/user-manual/.obsidian/app.json +1 -0
- package/docs/user-manual/.obsidian/appearance.json +1 -0
- package/docs/user-manual/.obsidian/core-plugins.json +33 -0
- package/docs/user-manual/.obsidian/workspace.json +167 -0
- package/docs/user-manual/01-getting-started/01-installation.md +214 -0
- package/docs/user-manual/01-getting-started/02-quick-start.md +432 -0
- package/docs/user-manual/01-getting-started/03-authentication.md +448 -0
- package/docs/user-manual/01-getting-started/04-configuration.md +430 -0
- package/docs/user-manual/01-getting-started/05-output-formats.md +447 -0
- package/docs/user-manual/02-core-concepts/01-accounts.md +514 -0
- package/docs/user-manual/02-core-concepts/02-profile-system.md +771 -0
- package/docs/user-manual/02-core-concepts/03-smart-defaults.md +485 -0
- package/docs/user-manual/02-core-concepts/04-authentication-methods.md +435 -0
- package/docs/user-manual/02-core-concepts/05-pagination-filtering.md +600 -0
- package/docs/user-manual/02-core-concepts/06-error-handling.md +718 -0
- package/docs/user-manual/02-core-concepts/07-api-coverage.md +483 -0
- package/docs/user-manual/03-email-operations/01-senders.md +490 -0
- package/docs/user-manual/03-email-operations/02-templates.md +444 -0
- package/docs/user-manual/03-email-operations/03-transactional-emails.md +706 -0
- package/docs/user-manual/03-email-operations/04-email-tracking.md +407 -0
- package/docs/user-manual/04-campaign-management/01-campaigns-basics.md +394 -0
- package/docs/user-manual/04-campaign-management/02-campaign-scheduling.md +630 -0
- package/docs/user-manual/04-campaign-management/03-campaign-testing.md +997 -0
- package/docs/user-manual/04-campaign-management/04-campaign-lifecycle.md +709 -0
- package/docs/user-manual/04-campaign-management/05-campaign-links.md +934 -0
- package/docs/user-manual/05-contact-management/01-lists.md +836 -0
- package/docs/user-manual/05-contact-management/02-contacts.md +1035 -0
- package/docs/user-manual/05-contact-management/03-custom-attributes.md +788 -0
- package/docs/user-manual/05-contact-management/04-segments.md +1028 -0
- package/docs/user-manual/05-contact-management/05-contact-import-export.md +1031 -0
- package/docs/user-manual/06-analytics-reporting/01-campaign-analytics.md +867 -0
- package/docs/user-manual/06-analytics-reporting/02-account-reports.md +227 -0
- package/docs/user-manual/07-integrations/01-webhooks-integration.md +259 -0
- package/docs/user-manual/07-integrations/02-automation.md +326 -0
- package/docs/user-manual/08-advanced-usage/01-scripting-patterns.md +672 -0
- package/docs/user-manual/08-advanced-usage/02-bulk-operations.md +932 -0
- package/docs/user-manual/08-advanced-usage/03-ci-cd-integration.md +892 -0
- package/docs/user-manual/08-advanced-usage/04-performance-optimization.md +766 -0
- package/docs/user-manual/09-command-reference/01-config.md +776 -0
- package/docs/user-manual/09-command-reference/02-account.md +652 -0
- package/docs/user-manual/09-command-reference/03-lists.md +958 -0
- package/docs/user-manual/09-command-reference/04-contacts.md +1408 -0
- package/docs/user-manual/09-command-reference/05-attributes.md +617 -0
- package/docs/user-manual/09-command-reference/06-segments.md +894 -0
- package/docs/user-manual/09-command-reference/07-senders.md +803 -0
- package/docs/user-manual/09-command-reference/08-templates.md +818 -0
- package/docs/user-manual/09-command-reference/09-campaigns.md +1250 -0
- package/docs/user-manual/09-command-reference/10-emails.md +807 -0
- package/docs/user-manual/09-command-reference/11-reports.md +1135 -0
- package/docs/user-manual/09-command-reference/12-webhooks.md +773 -0
- package/docs/user-manual/09-command-reference/13-suppressed.md +797 -0
- package/docs/user-manual/09-command-reference/14-interests.md +630 -0
- package/docs/user-manual/09-command-reference/15-tags.md +584 -0
- package/docs/user-manual/09-command-reference/16-logs.md +656 -0
- package/docs/user-manual/09-command-reference/17-transactional-templates.md +850 -0
- package/docs/user-manual/10-troubleshooting/01-common-errors.md +457 -0
- package/docs/user-manual/10-troubleshooting/02-authentication-issues.md +558 -0
- package/docs/user-manual/10-troubleshooting/03-connection-problems.md +634 -0
- package/docs/user-manual/10-troubleshooting/04-debugging.md +725 -0
- package/docs/user-manual/11-appendix/04-faq.md +484 -0
- package/docs/user-manual/11-appendix/05-glossary.md +250 -0
- package/docs/user-manual/README.md +0 -0
- package/package.json +13 -61
- package/src/cli.ts +125 -0
- package/src/client.ts +16 -0
- package/src/commands/account.ts +267 -0
- package/src/commands/accounts.ts +78 -0
- package/src/commands/actions.ts +249 -0
- package/src/commands/attributes.ts +139 -0
- package/src/commands/campaign-blueprints.ts +106 -0
- package/src/commands/campaigns.ts +469 -0
- package/src/commands/config.ts +77 -0
- package/src/commands/contacts.ts +612 -0
- package/src/commands/custom-attributes.ts +127 -0
- package/src/commands/dkims.ts +117 -0
- package/src/commands/domains.ts +82 -0
- package/src/commands/email-apis.ts +569 -0
- package/src/commands/emails.ts +197 -0
- package/src/commands/forms.ts +283 -0
- package/src/commands/interests.ts +155 -0
- package/src/commands/links.ts +38 -0
- package/src/commands/lists.ts +406 -0
- package/src/commands/logos.ts +71 -0
- package/src/commands/logs.ts +386 -0
- package/src/commands/reports.ts +306 -0
- package/src/commands/segments.ts +158 -0
- package/src/commands/senders.ts +204 -0
- package/src/commands/sub-accounts.ts +271 -0
- package/src/commands/suppressed-emails.ts +234 -0
- package/src/commands/suppressed.ts +198 -0
- package/src/commands/system-emails.ts +85 -0
- package/src/commands/tags.ts +146 -0
- package/src/commands/tasks.ts +116 -0
- package/src/commands/templates.ts +189 -0
- package/src/commands/tokens.ts +83 -0
- package/src/commands/transactional-emails.ts +374 -0
- package/src/commands/transactional-templates.ts +385 -0
- package/src/commands/users.ts +506 -0
- package/src/commands/webhooks.ts +172 -0
- package/src/commands/workflow-blueprints.ts +123 -0
- package/src/commands/workflows.ts +265 -0
- package/src/types/profile.ts +93 -0
- package/src/utils/auth.ts +272 -0
- package/src/utils/config-file.ts +96 -0
- package/src/utils/config.ts +134 -0
- package/src/utils/confirm.ts +32 -0
- package/src/utils/defaults.ts +99 -0
- package/src/utils/errors.ts +116 -0
- package/src/utils/interactive.ts +91 -0
- package/src/utils/list-defaults.ts +74 -0
- package/src/utils/output.ts +190 -0
- package/src/utils/progress.ts +320 -0
- package/src/utils/spinner.ts +22 -0
- package/tests/IMPLEMENTATION_STATUS.md +258 -0
- package/tests/PTY_SETUP.md +118 -0
- package/tests/PTY_TESTING_GUIDE.md +507 -0
- package/tests/README.md +244 -0
- package/tests/fixtures/api-responses/campaigns.json +34 -0
- package/tests/fixtures/test-config.json +13 -0
- package/tests/helpers/cli-runner.ts +128 -0
- package/tests/helpers/mock-server.ts +301 -0
- package/tests/helpers/pty-runner.ts +181 -0
- package/tests/integration/campaigns-real-api.test.ts +196 -0
- package/tests/integration/setup-integration.ts +50 -0
- package/tests/pty/campaigns.test.ts +241 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +15 -0
- 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
|
+
|