@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,123 @@
1
+ // ABOUTME: CLI commands for Workflow Blueprint.
2
+ // ABOUTME: Generated by api-kit from the OpenAPI spec.
3
+
4
+ import { Command } from 'commander';
5
+ import { createSpinner } from '../utils/spinner.js';
6
+
7
+ export function createWorkflowBlueprintsCommand(
8
+ client: any,
9
+ formatter: any
10
+ ): Command {
11
+ const cmd = new Command('workflow-blueprints')
12
+ .description('Workflow Blueprint');
13
+
14
+
15
+ cmd
16
+ .command('list-workflow-blueprints')
17
+ .description('Show all workflow blueprints')
18
+ .option('--page <value>', 'page')
19
+ .option('--per-page <value>', 'per_page')
20
+ .option('--with-count <value>', 'Include count in the response')
21
+ .option('--sort <value>', 'Sort term and direction, using syntax `[-|+]term`.
22
+
23
+ Valid terms:
24
+ - `name`
25
+ - `description`
26
+ - `goal`
27
+ - `created_on`
28
+ - `updated_on`')
29
+ .action(async (options) => {
30
+ const spinner = createSpinner('Fetching workflow blueprint...').start();
31
+ try {
32
+ const data = await client.listWorkflowBlueprints({
33
+ page: options.page != null ? Number(options.page) : undefined,
34
+ perPage: options.perPage != null ? Number(options.perPage) : undefined,
35
+ withCount: options.withCount,
36
+ sort: options.sort,
37
+ });
38
+
39
+ spinner.stop();
40
+ formatter.output(data);
41
+ } catch (error: any) {
42
+ spinner.stop();
43
+ formatter.error(error.message);
44
+ process.exit(1);
45
+ }
46
+ });
47
+
48
+
49
+ cmd
50
+ .command('get-workflow-blueprint <blueprint-id>')
51
+ .description('Show a workflow blueprint')
52
+ .action(async (blueprint_id) => {
53
+ const spinner = createSpinner('Fetching workflow blueprint...').start();
54
+ try {
55
+ const data = await client.getWorkflowBlueprint({
56
+ blueprint_id,
57
+ });
58
+
59
+ spinner.stop();
60
+ formatter.output(data);
61
+ } catch (error: any) {
62
+ spinner.stop();
63
+ formatter.error(error.message);
64
+ process.exit(1);
65
+ }
66
+ });
67
+
68
+
69
+ cmd
70
+ .command('list-workflow-blueprint-actions <blueprint-id>')
71
+ .description('Show workflow blueprint actions')
72
+ .option('--page <value>', 'page')
73
+ .option('--per-page <value>', 'per_page')
74
+ .option('--with-count <value>', 'Include count in the response')
75
+ .option('--sort <value>', 'Sort term and direction, using syntax `[-|+]term`.
76
+
77
+ Valid terms:
78
+ - `name`
79
+ - `created_on`')
80
+ .action(async (blueprint_id, options) => {
81
+ const spinner = createSpinner('Fetching workflow blueprint...').start();
82
+ try {
83
+ const data = await client.listWorkflowBlueprintActions({
84
+ blueprint_id,
85
+ page: options.page != null ? Number(options.page) : undefined,
86
+ perPage: options.perPage != null ? Number(options.perPage) : undefined,
87
+ withCount: options.withCount,
88
+ sort: options.sort,
89
+ });
90
+
91
+ spinner.stop();
92
+ formatter.output(data);
93
+ } catch (error: any) {
94
+ spinner.stop();
95
+ formatter.error(error.message);
96
+ process.exit(1);
97
+ }
98
+ });
99
+
100
+
101
+ cmd
102
+ .command('get-workflow-blueprint-action <blueprint-id> <action-id>')
103
+ .description('Show a workflow blueprint action')
104
+ .action(async (blueprint_id, action_id) => {
105
+ const spinner = createSpinner('Fetching workflow blueprint...').start();
106
+ try {
107
+ const data = await client.getWorkflowBlueprintAction({
108
+ blueprint_id,
109
+ action_id,
110
+ });
111
+
112
+ spinner.stop();
113
+ formatter.output(data);
114
+ } catch (error: any) {
115
+ spinner.stop();
116
+ formatter.error(error.message);
117
+ process.exit(1);
118
+ }
119
+ });
120
+
121
+
122
+ return cmd;
123
+ }
@@ -0,0 +1,265 @@
1
+ // ABOUTME: CLI commands for Workflow.
2
+ // ABOUTME: Generated by api-kit from the OpenAPI spec.
3
+
4
+ import { Command } from 'commander';
5
+ import { createSpinner } from '../utils/spinner.js';
6
+ import { confirmDelete } from '../utils/confirm.js';
7
+
8
+ export function createWorkflowsCommand(
9
+ client: any,
10
+ formatter: any
11
+ ): Command {
12
+ const cmd = new Command('workflows')
13
+ .description('Workflow');
14
+
15
+
16
+ cmd
17
+ .command('list')
18
+ .description('Show all workflows')
19
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
20
+ .option('--page <value>', 'page')
21
+ .option('--per-page <value>', 'per_page')
22
+ .option('--with-count <value>', 'Include count in the response')
23
+ .option('--sort <value>', 'Sort term and direction, using syntax `[-|+]term`.
24
+
25
+ Valid terms:
26
+ - `name`
27
+ - `description`
28
+ - `goal`
29
+ - `status`
30
+ - `created_on`
31
+ - `updated_on`
32
+ - `activated_on`')
33
+ .action(async (options) => {
34
+ const spinner = createSpinner('Fetching workflow...').start();
35
+ try {
36
+ const data = await client.listWorkflows({
37
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
38
+ page: options.page != null ? Number(options.page) : undefined,
39
+ perPage: options.perPage != null ? Number(options.perPage) : undefined,
40
+ withCount: options.withCount,
41
+ sort: options.sort,
42
+ });
43
+
44
+ spinner.stop();
45
+ formatter.output(data);
46
+ } catch (error: any) {
47
+ spinner.stop();
48
+ formatter.error(error.message);
49
+ process.exit(1);
50
+ }
51
+ });
52
+
53
+
54
+ cmd
55
+ .command('create')
56
+ .description('Create a workflow')
57
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
58
+ .option('--lock-key <value>', 'Locking key, preventing other users from modifying this workflow for a short period.')
59
+ .requiredOption('--data <value>', 'Request body as JSON string')
60
+ .action(async (options) => {
61
+ const spinner = createSpinner('Creating workflow...').start();
62
+ try {
63
+ const body = JSON.parse(options.data);
64
+ const data = await client.createWorkflow({
65
+ ...body,
66
+ });
67
+
68
+ spinner.stop();
69
+ formatter.success('Workflow created successfully');
70
+ formatter.output(data);
71
+ } catch (error: any) {
72
+ spinner.stop();
73
+ formatter.error(error.message);
74
+ process.exit(1);
75
+ }
76
+ });
77
+
78
+
79
+ cmd
80
+ .command('get <workflow-id>')
81
+ .description('Show a workflow')
82
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
83
+ .option('--lock-key <value>', 'Locking key, preventing other users from modifying this workflow for a short period.')
84
+ .action(async (workflow_id, options) => {
85
+ const spinner = createSpinner('Fetching workflow...').start();
86
+ try {
87
+ const data = await client.getWorkflow({
88
+ workflow_id,
89
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
90
+ lockKey: options.lockKey,
91
+ });
92
+
93
+ spinner.stop();
94
+ formatter.output(data);
95
+ } catch (error: any) {
96
+ spinner.stop();
97
+ formatter.error(error.message);
98
+ process.exit(1);
99
+ }
100
+ });
101
+
102
+
103
+ cmd
104
+ .command('patch <workflow-id>')
105
+ .description('Update a workflow')
106
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
107
+ .option('--lock-key <value>', 'Locking key, preventing other users from modifying this workflow for a short period.')
108
+ .requiredOption('--data <value>', 'Request body as JSON string')
109
+ .action(async (workflow_id, options) => {
110
+ const spinner = createSpinner('Updating workflow...').start();
111
+ try {
112
+ const body = JSON.parse(options.data);
113
+ const data = await client.patchWorkflow({
114
+ workflow_id,
115
+ ...body,
116
+ });
117
+
118
+ spinner.stop();
119
+ formatter.success('Workflow updated successfully');
120
+ formatter.output(data);
121
+ } catch (error: any) {
122
+ spinner.stop();
123
+ formatter.error(error.message);
124
+ process.exit(1);
125
+ }
126
+ });
127
+
128
+
129
+ cmd
130
+ .command('delete <workflow-id>')
131
+ .description('Delete a workflow')
132
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
133
+ .option('--lock-key <value>', 'Locking key, preventing other users from modifying this workflow for a short period.')
134
+ .option('-f, --force', 'Skip confirmation prompt')
135
+ .action(async (workflow_id, options) => {
136
+ if (!options.force) {
137
+ const confirmed = await confirmDelete('workflow', workflow_id);
138
+ if (!confirmed) {
139
+ formatter.info('Deletion cancelled');
140
+ return;
141
+ }
142
+ }
143
+
144
+ const spinner = createSpinner('Deleting workflow...').start();
145
+ try {
146
+ const data = await client.deleteWorkflow({
147
+ workflow_id,
148
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
149
+ lockKey: options.lockKey,
150
+ });
151
+
152
+ spinner.stop();
153
+ formatter.success('Workflow deleted successfully');
154
+ } catch (error: any) {
155
+ spinner.stop();
156
+ formatter.error(error.message);
157
+ process.exit(1);
158
+ }
159
+ });
160
+
161
+
162
+ cmd
163
+ .command('activate <workflow-id>')
164
+ .description('Activate a workflow')
165
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
166
+ .option('--lock-key <value>', 'Locking key, preventing other users from modifying this workflow for a short period.')
167
+ .option('--sender-email <value>', 'sender_email')
168
+ .action(async (workflow_id, options) => {
169
+ const spinner = createSpinner('Creating workflow...').start();
170
+ try {
171
+ const data = await client.activateWorkflow({
172
+ workflow_id,
173
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
174
+ lockKey: options.lockKey,
175
+ senderEmail: options.senderEmail,
176
+ });
177
+
178
+ spinner.stop();
179
+ formatter.success('Workflow created successfully');
180
+ formatter.output(data);
181
+ } catch (error: any) {
182
+ spinner.stop();
183
+ formatter.error(error.message);
184
+ process.exit(1);
185
+ }
186
+ });
187
+
188
+
189
+ cmd
190
+ .command('deactivate <workflow-id>')
191
+ .description('Deactivate a workflow')
192
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
193
+ .option('--lock-key <value>', 'Locking key, preventing other users from modifying this workflow for a short period.')
194
+ .action(async (workflow_id, options) => {
195
+ const spinner = createSpinner('Creating workflow...').start();
196
+ try {
197
+ const data = await client.deactivateWorkflow({
198
+ workflow_id,
199
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
200
+ lockKey: options.lockKey,
201
+ });
202
+
203
+ spinner.stop();
204
+ formatter.success('Workflow created successfully');
205
+ formatter.output(data);
206
+ } catch (error: any) {
207
+ spinner.stop();
208
+ formatter.error(error.message);
209
+ process.exit(1);
210
+ }
211
+ });
212
+
213
+
214
+ cmd
215
+ .command('lock <workflow-id>')
216
+ .description('Lock a workflow')
217
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
218
+ .requiredOption('--key <value>', 'key')
219
+ .action(async (workflow_id, options) => {
220
+ const spinner = createSpinner('Creating workflow...').start();
221
+ try {
222
+ const data = await client.lockWorkflow({
223
+ workflow_id,
224
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
225
+ key: options.key,
226
+ });
227
+
228
+ spinner.stop();
229
+ formatter.success('Workflow created successfully');
230
+ formatter.output(data);
231
+ } catch (error: any) {
232
+ spinner.stop();
233
+ formatter.error(error.message);
234
+ process.exit(1);
235
+ }
236
+ });
237
+
238
+
239
+ cmd
240
+ .command('unlock <workflow-id>')
241
+ .description('Unlock a workflow')
242
+ .option('--account-id <value>', 'Optional Account ID to be used for the request')
243
+ .requiredOption('--key <value>', 'key')
244
+ .action(async (workflow_id, options) => {
245
+ const spinner = createSpinner('Creating workflow...').start();
246
+ try {
247
+ const data = await client.unlockWorkflow({
248
+ workflow_id,
249
+ accountId: options.accountId != null ? Number(options.accountId) : undefined,
250
+ key: options.key,
251
+ });
252
+
253
+ spinner.stop();
254
+ formatter.success('Workflow created successfully');
255
+ formatter.output(data);
256
+ } catch (error: any) {
257
+ spinner.stop();
258
+ formatter.error(error.message);
259
+ process.exit(1);
260
+ }
261
+ });
262
+
263
+
264
+ return cmd;
265
+ }
@@ -0,0 +1,93 @@
1
+ // ABOUTME: Profile system controlling CLI behavior per user persona.
2
+ // ABOUTME: Three profiles: developer (scripting), marketer (guided), balanced (default).
3
+
4
+ export type ProfileType = "developer" | "marketer" | "balanced";
5
+ export type OutputFormat = "json" | "table" | "compact";
6
+ export type ColorScheme = "none" | "minimal" | "moderate" | "rich";
7
+ export type DateFormat = "iso8601" | "friendly" | "relative";
8
+
9
+ export interface ProfileConfig {
10
+ output: {
11
+ format: OutputFormat;
12
+ colors: ColorScheme;
13
+ pretty_print: boolean;
14
+ show_tips: boolean;
15
+ };
16
+ behavior: {
17
+ interactive_prompts: boolean | "auto";
18
+ confirm_destructive: boolean;
19
+ show_progress: boolean;
20
+ };
21
+ display: {
22
+ date_format: DateFormat;
23
+ show_ids: boolean;
24
+ verbose_errors: boolean;
25
+ };
26
+ }
27
+
28
+ export const DEVELOPER_PROFILE: ProfileConfig = {
29
+ output: {
30
+ format: "json",
31
+ colors: "none",
32
+ pretty_print: false,
33
+ show_tips: false,
34
+ },
35
+ behavior: {
36
+ interactive_prompts: false,
37
+ confirm_destructive: false,
38
+ show_progress: false,
39
+ },
40
+ display: {
41
+ date_format: "iso8601",
42
+ show_ids: true,
43
+ verbose_errors: true,
44
+ },
45
+ };
46
+
47
+ export const MARKETER_PROFILE: ProfileConfig = {
48
+ output: {
49
+ format: "compact",
50
+ colors: "rich",
51
+ pretty_print: true,
52
+ show_tips: true,
53
+ },
54
+ behavior: {
55
+ interactive_prompts: true,
56
+ confirm_destructive: true,
57
+ show_progress: true,
58
+ },
59
+ display: {
60
+ date_format: "relative",
61
+ show_ids: false,
62
+ verbose_errors: false,
63
+ },
64
+ };
65
+
66
+ export const BALANCED_PROFILE: ProfileConfig = {
67
+ output: {
68
+ format: "table",
69
+ colors: "moderate",
70
+ pretty_print: true,
71
+ show_tips: false,
72
+ },
73
+ behavior: {
74
+ interactive_prompts: "auto",
75
+ confirm_destructive: true,
76
+ show_progress: true,
77
+ },
78
+ display: {
79
+ date_format: "friendly",
80
+ show_ids: true,
81
+ verbose_errors: false,
82
+ },
83
+ };
84
+
85
+ const PROFILES: Record<ProfileType, ProfileConfig> = {
86
+ developer: DEVELOPER_PROFILE,
87
+ marketer: MARKETER_PROFILE,
88
+ balanced: BALANCED_PROFILE,
89
+ };
90
+
91
+ export function getProfileConfig(type: ProfileType = "balanced"): ProfileConfig {
92
+ return PROFILES[type] ?? BALANCED_PROFILE;
93
+ }