@getbrevo/cli 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +24 -49
  3. package/agent-context/AGENTS.md +61 -9
  4. package/agent-context/SKILL.md +40 -2
  5. package/dist/api/client.d.ts +1 -1
  6. package/dist/api/client.d.ts.map +1 -1
  7. package/dist/api/client.js +4 -2
  8. package/dist/api/client.js.map +1 -1
  9. package/dist/bin/index.js +26 -16
  10. package/dist/bin/index.js.map +1 -1
  11. package/dist/commands/app/create.js +8 -8
  12. package/dist/commands/app/create.js.map +1 -1
  13. package/dist/commands/app/credentials.d.ts.map +1 -1
  14. package/dist/commands/app/credentials.js +73 -71
  15. package/dist/commands/app/credentials.js.map +1 -1
  16. package/dist/commands/app/delete.d.ts.map +1 -1
  17. package/dist/commands/app/delete.js +9 -8
  18. package/dist/commands/app/delete.js.map +1 -1
  19. package/dist/commands/app/scaffold.d.ts.map +1 -1
  20. package/dist/commands/app/scaffold.js +69 -70
  21. package/dist/commands/app/scaffold.js.map +1 -1
  22. package/dist/commands/app/start.d.ts.map +1 -1
  23. package/dist/commands/app/start.js +38 -48
  24. package/dist/commands/app/start.js.map +1 -1
  25. package/dist/commands/definitions.d.ts +1 -0
  26. package/dist/commands/definitions.d.ts.map +1 -1
  27. package/dist/commands/definitions.js +23 -1
  28. package/dist/commands/definitions.js.map +1 -1
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +59 -56
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/login.d.ts.map +1 -1
  33. package/dist/commands/login.js +50 -38
  34. package/dist/commands/login.js.map +1 -1
  35. package/dist/commands/skill/install.d.ts +4 -0
  36. package/dist/commands/skill/install.d.ts.map +1 -0
  37. package/dist/commands/skill/install.js +29 -0
  38. package/dist/commands/skill/install.js.map +1 -0
  39. package/dist/commands/skill/uninstall.d.ts +4 -0
  40. package/dist/commands/skill/uninstall.d.ts.map +1 -0
  41. package/dist/commands/skill/uninstall.js +23 -0
  42. package/dist/commands/skill/uninstall.js.map +1 -0
  43. package/dist/commands/whoami.d.ts.map +1 -1
  44. package/dist/commands/whoami.js +5 -1
  45. package/dist/commands/whoami.js.map +1 -1
  46. package/dist/lang/en.d.ts +7 -0
  47. package/dist/lang/en.d.ts.map +1 -1
  48. package/dist/lang/en.js +8 -0
  49. package/dist/lang/en.js.map +1 -1
  50. package/dist/lib/auth-guard.d.ts.map +1 -1
  51. package/dist/lib/auth-guard.js +8 -2
  52. package/dist/lib/auth-guard.js.map +1 -1
  53. package/dist/lib/browser.js +4 -4
  54. package/dist/lib/browser.js.map +1 -1
  55. package/dist/lib/command-registry.js +1 -1
  56. package/dist/lib/command-registry.js.map +1 -1
  57. package/dist/lib/config.d.ts +2 -0
  58. package/dist/lib/config.d.ts.map +1 -1
  59. package/dist/lib/config.js +26 -6
  60. package/dist/lib/config.js.map +1 -1
  61. package/dist/lib/constants.d.ts +2 -0
  62. package/dist/lib/constants.d.ts.map +1 -1
  63. package/dist/lib/constants.js +6 -6
  64. package/dist/lib/constants.js.map +1 -1
  65. package/dist/lib/hidden-input.js +1 -1
  66. package/dist/lib/hidden-input.js.map +1 -1
  67. package/dist/lib/logger.d.ts.map +1 -1
  68. package/dist/lib/logger.js +14 -4
  69. package/dist/lib/logger.js.map +1 -1
  70. package/dist/lib/update-notifier.d.ts.map +1 -1
  71. package/dist/lib/update-notifier.js +11 -11
  72. package/dist/lib/update-notifier.js.map +1 -1
  73. package/dist/services/browser-auth.js +9 -8
  74. package/dist/services/browser-auth.js.map +1 -1
  75. package/dist/services/skill.d.ts +48 -0
  76. package/dist/services/skill.d.ts.map +1 -0
  77. package/dist/services/skill.js +223 -0
  78. package/dist/services/skill.js.map +1 -0
  79. package/dist/skills/index.d.ts +46 -0
  80. package/dist/skills/index.d.ts.map +1 -0
  81. package/dist/skills/index.js +80 -0
  82. package/dist/skills/index.js.map +1 -0
  83. package/dist/templates/files/AGENTS.md.tmpl +5 -0
  84. package/dist/templates/files/CLAUDE.md.tmpl +1 -1
  85. package/dist/templates/files/README.md.tmpl +1 -0
  86. package/dist/templates/index.js +2 -2
  87. package/dist/templates/index.js.map +1 -1
  88. package/package.json +4 -3
@@ -13,11 +13,77 @@ const json_output_1 = require("../../lib/json-output");
13
13
  const container_1 = require("../../container");
14
14
  const ui_1 = require("../../lib/ui");
15
15
  const config_1 = require("../../lib/config");
16
- exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
17
- let appId = options.appId;
18
- if (!appId) {
19
- appId = await container_1.appService.pickApp(en_1.messages.APP_CREDENTIALS_SELECT);
16
+ async function resolveSecretReveal(revealRequested, app) {
17
+ if (!revealRequested) {
18
+ return { display: en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN, revealed: false };
19
+ }
20
+ if (!process.stdin.isTTY) {
21
+ (0, logger_1.logInfo)(' Secret not revealed in non-interactive mode. Use --reveal-secret in a terminal.');
22
+ return { display: en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN, revealed: false };
23
+ }
24
+ const { confirmed } = await inquirer_1.default.prompt([
25
+ {
26
+ type: 'confirm',
27
+ name: 'confirmed',
28
+ message: en_1.messages.APP_CREDENTIALS_REVEAL_CONFIRM,
29
+ default: false,
30
+ },
31
+ ]);
32
+ if (confirmed) {
33
+ return {
34
+ display: app.client_secret || en_1.messages.CLIENT_SECRET_NOT_AVAILABLE,
35
+ revealed: true,
36
+ };
37
+ }
38
+ return { display: en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN, revealed: false };
39
+ }
40
+ function printCredentialsHuman(app, appId, secretDisplay) {
41
+ (0, logger_1.logInfo)(`\n App name: ${app.name || '—'}`);
42
+ (0, logger_1.logInfo)(` App ID: ${appId}`);
43
+ (0, logger_1.logInfo)(` Client ID: ${app.client_id}`);
44
+ (0, logger_1.logInfo)(` Client secret: ${secretDisplay}`);
45
+ if (app.scopes && app.scopes.length > 0) {
46
+ (0, logger_1.logInfo)(` Scopes: ${app.scopes.join(', ')}`);
47
+ }
48
+ else {
49
+ (0, logger_1.logInfo)(` Scopes: (none)`);
50
+ }
51
+ if (app.redirect_uris.length > 0) {
52
+ app.redirect_uris.forEach((uri, i) => {
53
+ (0, logger_1.logInfo)(` Redirect URL ${i + 1}: ${uri}`);
54
+ });
55
+ }
56
+ else {
57
+ (0, logger_1.logInfo)(` Redirect URLs: (none)`);
58
+ }
59
+ process.stdout.write('\n');
60
+ }
61
+ async function reconcileLocalCache(appId, app, diffs, jsonMode) {
62
+ if (diffs.length === 0) {
63
+ // First-time save (no local cache yet) is silent
64
+ container_1.appService.syncAppCredentials(appId, app);
65
+ return;
66
+ }
67
+ (0, logger_1.logWarn)(`Local credentials for app ${appId} differ from server (${diffs.join(', ')}).`);
68
+ if (!process.stdin.isTTY || jsonMode) {
69
+ container_1.appService.syncAppCredentials(appId, app);
70
+ return;
20
71
  }
72
+ const { shouldUpdate } = await inquirer_1.default.prompt([
73
+ {
74
+ type: 'confirm',
75
+ name: 'shouldUpdate',
76
+ message: 'Update local credentials to match the server?',
77
+ default: true,
78
+ },
79
+ ]);
80
+ if (shouldUpdate) {
81
+ container_1.appService.syncAppCredentials(appId, app);
82
+ (0, logger_1.logInfo)(' Local credentials updated.\n');
83
+ }
84
+ }
85
+ exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
86
+ const appId = options.appId ?? (await container_1.appService.pickApp(en_1.messages.APP_CREDENTIALS_SELECT));
21
87
  const spinner = (0, ui_1.createSpinner)('Fetching credentials...', { silent: options.json });
22
88
  const result = await container_1.appService.resolveAppCredentials(appId);
23
89
  spinner.stop();
@@ -27,28 +93,7 @@ exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (op
27
93
  const { app, diffs } = result;
28
94
  if (app.name)
29
95
  (0, config_1.saveAppName)(appId, app.name);
30
- let secretDisplay = en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN;
31
- let revealConfirmed = false;
32
- if (options.revealSecret) {
33
- if (!process.stdin.isTTY) {
34
- // Non-interactive: auto-deny reveal to prevent secrets leaking into CI logs
35
- (0, logger_1.logInfo)(' Secret not revealed in non-interactive mode. Use --reveal-secret in a terminal.');
36
- }
37
- else {
38
- const { confirmed } = await inquirer_1.default.prompt([
39
- {
40
- type: 'confirm',
41
- name: 'confirmed',
42
- message: en_1.messages.APP_CREDENTIALS_REVEAL_CONFIRM,
43
- default: false,
44
- },
45
- ]);
46
- if (confirmed) {
47
- revealConfirmed = true;
48
- secretDisplay = app.client_secret || en_1.messages.CLIENT_SECRET_NOT_AVAILABLE;
49
- }
50
- }
51
- }
96
+ const { display: secretDisplay, revealed: revealConfirmed } = await resolveSecretReveal(options.revealSecret, app);
52
97
  if (options.json) {
53
98
  (0, json_output_1.jsonOutput)({
54
99
  appName: app.name || null,
@@ -62,51 +107,8 @@ exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (op
62
107
  });
63
108
  }
64
109
  else {
65
- (0, logger_1.logInfo)(`\n App name: ${app.name || '—'}`);
66
- (0, logger_1.logInfo)(` App ID: ${appId}`);
67
- (0, logger_1.logInfo)(` Client ID: ${app.client_id}`);
68
- (0, logger_1.logInfo)(` Client secret: ${secretDisplay}`);
69
- if (app.scopes && app.scopes.length > 0) {
70
- (0, logger_1.logInfo)(` Scopes: ${app.scopes.join(', ')}`);
71
- }
72
- else {
73
- (0, logger_1.logInfo)(` Scopes: (none)`);
74
- }
75
- if (app.redirect_uris.length > 0) {
76
- app.redirect_uris.forEach((uri, i) => {
77
- (0, logger_1.logInfo)(` Redirect URL ${i + 1}: ${uri}`);
78
- });
79
- }
80
- else {
81
- (0, logger_1.logInfo)(` Redirect URLs: (none)`);
82
- }
83
- process.stdout.write('\n');
84
- }
85
- // After displaying credentials, warn if local cache differs and prompt to update
86
- if (diffs.length > 0) {
87
- (0, logger_1.logWarn)(`Local credentials for app ${appId} differ from server (${diffs.join(', ')}).`);
88
- if (process.stdin.isTTY && !options.json) {
89
- const { shouldUpdate } = await inquirer_1.default.prompt([
90
- {
91
- type: 'confirm',
92
- name: 'shouldUpdate',
93
- message: 'Update local credentials to match the server?',
94
- default: true,
95
- },
96
- ]);
97
- if (shouldUpdate) {
98
- container_1.appService.syncAppCredentials(appId, app);
99
- (0, logger_1.logInfo)(' Local credentials updated.\n');
100
- }
101
- }
102
- else {
103
- // Non-interactive or JSON mode: auto-update silently
104
- container_1.appService.syncAppCredentials(appId, app);
105
- }
106
- }
107
- else {
108
- // No diffs — still save if this is the first time (no local cache yet)
109
- container_1.appService.syncAppCredentials(appId, app);
110
+ printCredentialsHuman(app, appId, secretDisplay);
110
111
  }
112
+ await reconcileLocalCache(appId, app, diffs, options.json);
111
113
  });
112
114
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/commands/app/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/commands/app/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,6CAAoD;AACpD,sCAAyC;AACzC,6CAA4C;AAC5C,+DAA+D;AAC/D,uDAAmD;AACnD,+CAA6C;AAC7C,qCAA6C;AAC7C,6CAA+C;AAI/C,KAAK,UAAU,mBAAmB,CAChC,eAAoC,EACpC,GAAmC;IAEnC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,aAAQ,CAAC,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,IAAA,gBAAO,EAAC,mFAAmF,CAAC,CAAC;QAC7F,OAAO,EAAE,OAAO,EAAE,aAAQ,CAAC,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3E,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC1C;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,aAAQ,CAAC,8BAA8B;YAChD,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IACH,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,aAAa,IAAI,aAAQ,CAAC,2BAA2B;YAClE,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,aAAQ,CAAC,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAC5B,GAAmC,EACnC,KAAa,EACb,aAAqB;IAErB,IAAA,gBAAO,EAAC,sBAAsB,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IACjD,IAAA,gBAAO,EAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;IACrC,IAAA,gBAAO,EAAC,oBAAoB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7C,IAAA,gBAAO,EAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;IAC7C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,IAAA,gBAAO,EAAC,oBAAoB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,IAAA,gBAAO,EAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACnC,IAAA,gBAAO,EAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAA,gBAAO,EAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAa,EACb,GAAmC,EACnC,KAAe,EACf,QAA6B;IAE7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,iDAAiD;QACjD,sBAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAA,gBAAO,EAAC,6BAA6B,KAAK,wBAAwB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;QACrC,sBAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC7C;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,+CAA+C;YACxD,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IACH,IAAI,YAAY,EAAE,CAAC;QACjB,sBAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAA,gBAAO,EAAC,gCAAgC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAEY,QAAA,kBAAkB,GAAG,IAAA,oCAAkB,EAClD,KAAK,EAAE,OAAmE,EAAiB,EAAE;IAC3F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,sBAAU,CAAC,OAAO,CAAC,aAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAE3F,MAAM,OAAO,GAAG,IAAA,kBAAa,EAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,sBAAU,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAQ,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAE9B,IAAI,GAAG,CAAC,IAAI;QAAE,IAAA,oBAAW,EAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAE3C,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,mBAAmB,CACrF,OAAO,CAAC,YAAY,EACpB,GAAG,CACJ,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAA,wBAAU,EAAC;YACT,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;YACzB,KAAK;YACL,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,YAAY,EAAE,eAAe;gBAC3B,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,aAAQ,CAAC,2BAA2B,CAAC;gBAC7D,CAAC,CAAC,aAAQ,CAAC,yBAAyB;YACtC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;YACxB,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;SACtC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC,CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,aAAa;YACE,MAAM;YAAU,OAAO;WAAS,OAAO;mBAwFlE,CAAC"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,aAAa;YACE,MAAM;YAAU,OAAO;WAAS,OAAO;mBAyFlE,CAAC"}
@@ -37,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.deleteCommand = void 0;
40
- const fs = __importStar(require("fs"));
41
- const path = __importStar(require("path"));
42
- const os = __importStar(require("os"));
40
+ const fs = __importStar(require("node:fs"));
41
+ const path = __importStar(require("node:path"));
42
+ const os = __importStar(require("node:os"));
43
43
  const inquirer_1 = __importDefault(require("inquirer"));
44
44
  const logger_1 = require("../../lib/logger");
45
45
  const en_1 = require("../../lang/en");
@@ -109,6 +109,7 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
109
109
  await container_1.appService.deleteApp(appId);
110
110
  deleteSpinner.stop();
111
111
  (0, config_1.deleteAppName)(appId);
112
+ (0, config_1.deleteAppCredentials)(appId);
112
113
  if (options.json) {
113
114
  (0, json_output_1.jsonOutput)({ deleted: true, appId });
114
115
  return;
@@ -117,7 +118,7 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
117
118
  // Offer to delete the local scaffolded project folder if it matches the deleted app
118
119
  if (!options.force) {
119
120
  const projectConfig = (0, config_1.readProjectConfig)();
120
- if (projectConfig && projectConfig.appId === appId) {
121
+ if (projectConfig?.appId === appId) {
121
122
  const cwd = process.cwd();
122
123
  const { deleteFolder } = await inquirer_1.default.prompt([
123
124
  {
@@ -128,10 +129,7 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
128
129
  },
129
130
  ]);
130
131
  if (deleteFolder) {
131
- if (!isSafeToDelete(cwd)) {
132
- (0, logger_1.logWarn)(en_1.messages.APP_DELETE_FOLDER_FAILED(cwd));
133
- }
134
- else {
132
+ if (isSafeToDelete(cwd)) {
135
133
  try {
136
134
  fs.rmSync(cwd, { recursive: true, force: true });
137
135
  (0, logger_1.logSuccess)(en_1.messages.APP_DELETE_FOLDER_SUCCESS(cwd));
@@ -140,6 +138,9 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
140
138
  (0, logger_1.logWarn)(en_1.messages.APP_DELETE_FOLDER_FAILED(cwd));
141
139
  }
142
140
  }
141
+ else {
142
+ (0, logger_1.logWarn)(en_1.messages.APP_DELETE_FOLDER_FAILED(cwd));
143
+ }
143
144
  }
144
145
  }
145
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"AA4DA,eAAO,MAAM,eAAe;YACA,MAAM;WAAS,OAAO;mBAiJjD,CAAC"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"AAyJA,eAAO,MAAM,eAAe;YACA,MAAM;WAAS,OAAO;mBAgEjD,CAAC"}
@@ -84,20 +84,8 @@ function formatFileTree(filePaths) {
84
84
  render(tree, ' ');
85
85
  return lines.join('\n');
86
86
  }
87
- exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
88
- // Refuse to scaffold inside an existing project app-config.json in cwd
89
- // means the user is already in a scaffolded project and likely meant to
90
- // run `brevo app update` instead.
91
- if (fs.existsSync(path.join(process.cwd(), 'app-config.json'))) {
92
- throw new errors_1.CliError(en_1.messages.APP_SCAFFOLD_ALREADY_IN_PROJECT);
93
- }
94
- let appId = options.appId;
95
- // Pick app if not specified
96
- if (!appId) {
97
- appId = await container_1.appService.pickApp('Select an app:');
98
- }
99
- // Fetch app details from API and sync local cache
100
- const spinner = (0, ui_1.createSpinner)('Fetching app details...', { silent: options.json });
87
+ async function fetchAppContext(appId, silent) {
88
+ const spinner = (0, ui_1.createSpinner)('Fetching app details...', { silent });
101
89
  const result = await container_1.appService.resolveAppCredentials(appId);
102
90
  spinner.stop();
103
91
  const appDetails = result?.app ?? null;
@@ -107,22 +95,18 @@ exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (optio
107
95
  }
108
96
  container_1.appService.syncAppCredentials(appId, result.app);
109
97
  }
110
- const clientId = appDetails?.client_id || constants_1.PLACEHOLDER_CLIENT_ID;
111
- const clientSecret = appDetails?.client_secret || 'YOUR_CLIENT_SECRET';
112
- // Use redirect URLs from the app (set during app create).
113
- // For the local test server, prefer a localhost URL from the registered
114
- // list. Fall back to DEFAULT_REDIRECT_URI so the scaffold works out of
115
- // the box even when only production URLs are registered.
116
98
  const serverRedirectUrls = appDetails?.redirect_uris ?? [];
117
99
  const redirectUrls = serverRedirectUrls.length > 0 ? serverRedirectUrls : [constants_1.DEFAULT_REDIRECT_URI];
118
100
  const localhostUri = redirectUrls.find((url) => url.startsWith('http://localhost') || url.startsWith('http://127.0.0.1'));
119
- const redirectUri = localhostUri || constants_1.DEFAULT_REDIRECT_URI;
120
- // Prompt for output directory — default to app name slugified for filesystem
121
- const slug = (appDetails?.name || 'my-app')
122
- .toLowerCase()
123
- .replaceAll(/[^a-z0-9]+/g, '-')
124
- .replace(/^-|-$/g, '') || 'my-app';
125
- const defaultDir = `./${slug}`;
101
+ return {
102
+ appDetails: appDetails,
103
+ clientId: appDetails?.client_id || constants_1.PLACEHOLDER_CLIENT_ID,
104
+ clientSecret: appDetails?.client_secret || 'YOUR_CLIENT_SECRET',
105
+ redirectUrls,
106
+ redirectUri: localhostUri || constants_1.DEFAULT_REDIRECT_URI,
107
+ };
108
+ }
109
+ async function resolveTargetDir(defaultDir) {
126
110
  const { outputDir } = await inquirer_1.default.prompt([
127
111
  {
128
112
  type: 'input',
@@ -132,71 +116,86 @@ exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (optio
132
116
  },
133
117
  ]);
134
118
  const targetDir = path.resolve(outputDir);
135
- // Handle existing directory
136
- let mergeOnly = false;
137
- if (fs.existsSync(targetDir)) {
138
- const { action } = await inquirer_1.default.prompt([
139
- {
140
- type: 'list',
141
- name: 'action',
142
- message: en_1.messages.APP_SCAFFOLD_DIR_EXISTS,
143
- choices: [
144
- { name: 'Overwrite existing files', value: 'overwrite' },
145
- { name: 'Merge (keep existing, add missing)', value: 'merge' },
146
- { name: 'Choose a different path', value: 'new' },
147
- ],
148
- },
149
- ]);
150
- if (action === 'new') {
151
- return (0, exports.scaffoldCommand)({ ...options, appId });
152
- }
153
- if (action === 'merge') {
154
- mergeOnly = true;
155
- }
119
+ if (!fs.existsSync(targetDir)) {
120
+ return { targetDir, mergeOnly: false, chooseAgain: false };
121
+ }
122
+ const { action } = await inquirer_1.default.prompt([
123
+ {
124
+ type: 'list',
125
+ name: 'action',
126
+ message: en_1.messages.APP_SCAFFOLD_DIR_EXISTS,
127
+ choices: [
128
+ { name: 'Overwrite existing files', value: 'overwrite' },
129
+ { name: 'Merge (keep existing, add missing)', value: 'merge' },
130
+ { name: 'Choose a different path', value: 'new' },
131
+ ],
132
+ },
133
+ ]);
134
+ return {
135
+ targetDir,
136
+ mergeOnly: action === 'merge',
137
+ chooseAgain: action === 'new',
138
+ };
139
+ }
140
+ function writeScaffoldFiles(files, targetDir, mergeOnly) {
141
+ let written = 0;
142
+ for (const file of files) {
143
+ const filePath = path.join(targetDir, file.name);
144
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
145
+ if (mergeOnly && fs.existsSync(filePath))
146
+ continue;
147
+ // Write .env.local with restricted permissions to protect secrets
148
+ const writeOptions = file.name.endsWith('.env.local') ? { mode: 0o600 } : {};
149
+ fs.writeFileSync(filePath, file.content, { encoding: 'utf-8', ...writeOptions });
150
+ written++;
151
+ }
152
+ return written;
153
+ }
154
+ exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
155
+ // Refuse to scaffold inside an existing project — app-config.json in cwd
156
+ // means the user is already in a scaffolded project and likely meant to
157
+ // run `brevo app update` instead.
158
+ if (fs.existsSync(path.join(process.cwd(), 'app-config.json'))) {
159
+ throw new errors_1.CliError(en_1.messages.APP_SCAFFOLD_ALREADY_IN_PROJECT);
156
160
  }
157
- const rawAppName = appDetails?.name || path.basename(targetDir);
158
- // Sanitize app name: strip characters that could break JSON or template injection
161
+ const appId = options.appId ?? (await container_1.appService.pickApp('Select an app:'));
162
+ const ctx = await fetchAppContext(appId, options.json);
163
+ const slug = (ctx.appDetails?.name || 'my-app')
164
+ .toLowerCase()
165
+ .replaceAll(/[^a-z0-9]+/g, '-')
166
+ .replace(/^-|-$/g, '') || 'my-app';
167
+ const { targetDir, mergeOnly, chooseAgain } = await resolveTargetDir(`./${slug}`);
168
+ if (chooseAgain) {
169
+ return (0, exports.scaffoldCommand)({ ...options, appId });
170
+ }
171
+ const rawAppName = ctx.appDetails?.name || path.basename(targetDir);
159
172
  const appName = rawAppName.replaceAll(/["\\\n\r\t]/g, '').trim() || 'my-app';
160
- const scopes = appDetails?.scopes ?? ['all'];
173
+ const scopes = ctx.appDetails?.scopes ?? ['all'];
161
174
  const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../../package.json'), 'utf-8'));
162
175
  const cliVersion = pkg.version;
163
176
  const vars = {
164
177
  '{{APP_NAME}}': appName,
165
178
  '{{APP_SLUG}}': slug,
166
179
  '{{APP_ID}}': String(appId),
167
- '{{CLIENT_ID}}': clientId,
168
- '{{CLIENT_SECRET}}': clientSecret,
169
- '{{REDIRECT_URI}}': redirectUri,
170
- '{{REDIRECT_URLS_JSON}}': JSON.stringify(redirectUrls),
180
+ '{{CLIENT_ID}}': ctx.clientId,
181
+ '{{CLIENT_SECRET}}': ctx.clientSecret,
182
+ '{{REDIRECT_URI}}': ctx.redirectUri,
183
+ '{{REDIRECT_URLS_JSON}}': JSON.stringify(ctx.redirectUrls),
171
184
  '{{SCOPES_JSON}}': JSON.stringify(scopes),
172
185
  '{{OAUTH_BASE}}': constants_1.OAUTH_BASE,
173
186
  '{{OAUTH_REALM}}': constants_1.OAUTH_REALM,
174
187
  '{{CLI_VERSION}}': cliVersion,
175
188
  '{{MIN_CLI_VERSION}}': constants_1.MIN_CLI_VERSION,
176
189
  };
177
- // Create directory structure
178
190
  fs.mkdirSync(path.join(targetDir, 'src', 'oauth'), { recursive: true });
179
- // Load all templates from .tmpl files with variable substitution
180
191
  const files = (0, templates_1.loadAllTemplates)(vars);
181
- let written = 0;
182
- for (const file of files) {
183
- const filePath = path.join(targetDir, file.name);
184
- // Ensure parent directory exists for nested files
185
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
186
- if (mergeOnly && fs.existsSync(filePath))
187
- continue;
188
- // Write .env.local with restricted permissions to protect secrets
189
- const writeOptions = file.name.endsWith('.env.local') ? { mode: 0o600 } : {};
190
- fs.writeFileSync(filePath, file.content, { encoding: 'utf-8', ...writeOptions });
191
- written++;
192
- }
192
+ const written = writeScaffoldFiles(files, targetDir, mergeOnly);
193
193
  if (options.json) {
194
194
  (0, json_output_1.jsonOutput)({ scaffolded: written, directory: targetDir });
195
195
  return;
196
196
  }
197
197
  (0, logger_1.logSuccess)(en_1.messages.APP_SCAFFOLD_SUCCESS(written));
198
198
  (0, logger_1.logInfo)(formatFileTree(files.map((f) => f.name)));
199
- // Show next steps
200
199
  const relativeDir = path.relative(process.cwd(), targetDir) || '.';
201
200
  (0, ui_1.printBox)(en_1.messages.APP_SCAFFOLD_NEXT_STEPS_TITLE, en_1.messages.APP_SCAFFOLD_NEXT_STEPS_LINES(relativeDir));
202
201
  });
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/app/start.ts"],"names":[],"mappings":"AAiGA,eAAO,MAAM,YAAY;cACK,MAAM;WAAS,MAAM;mBA0GlD,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/app/start.ts"],"names":[],"mappings":"AA0KA,eAAO,MAAM,YAAY;cACK,MAAM;WAAS,MAAM;mBA4BlD,CAAC"}
@@ -124,8 +124,7 @@ async function ensureRedirectRegistered(config, port) {
124
124
  (0, logger_1.logSuccess)(en_1.messages.APP_START_REDIRECT_REGISTERED(newRedirectUrl));
125
125
  return newRedirectUrl;
126
126
  }
127
- exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
128
- const { feature } = options;
127
+ function resolveFeatureEntry(feature) {
129
128
  if (!feature) {
130
129
  const available = Object.entries(FEATURES)
131
130
  .map(([name, f]) => ` ${name} ${f.description}`)
@@ -141,67 +140,37 @@ exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options)
141
140
  if (!fs.existsSync(entryFile)) {
142
141
  throw new errors_1.CliError(en_1.messages.APP_START_FEATURE_NOT_FOUND(featureConfig.entry));
143
142
  }
144
- // Check for node_modules inside the feature directory — package.json
145
- // is scoped per feature, so dependencies are installed alongside the entry.
146
143
  const featureDir = path.dirname(featureConfig.entry);
147
144
  if (!fs.existsSync(path.resolve(featureDir, 'node_modules'))) {
148
145
  throw new errors_1.CliError(en_1.messages.APP_START_NO_DEPS(featureDir));
149
146
  }
150
- // Derive port: explicit --port flag > redirect URI from app-config.json > DEFAULT_PORT
151
- const config = (0, config_1.readProjectConfig)();
152
- let port = constants_1.DEFAULT_PORT;
153
- if (options.port) {
154
- port = options.port;
155
- }
156
- else {
157
- const redirectUrl = config?.auth?.redirectUrls?.[0];
158
- if (redirectUrl) {
159
- try {
160
- const parsed = new URL(redirectUrl);
161
- if (parsed.port)
162
- port = Number(parsed.port);
163
- }
164
- catch {
165
- // invalid redirect URL — fall back to default
166
- }
167
- }
168
- }
169
- // Check port availability before spawning
170
- if (!(await (0, port_1.isPortAvailable)(port))) {
171
- throw new errors_1.CliError(options.port
172
- ? en_1.messages.APP_START_CUSTOM_PORT_IN_USE(port)
173
- : en_1.messages.APP_START_PORT_IN_USE(port));
147
+ return entryFile;
148
+ }
149
+ function resolvePort(config, optionsPort) {
150
+ if (optionsPort)
151
+ return optionsPort;
152
+ const redirectUrl = config?.auth?.redirectUrls?.[0];
153
+ if (!redirectUrl)
154
+ return constants_1.DEFAULT_PORT;
155
+ try {
156
+ const parsed = new URL(redirectUrl);
157
+ return parsed.port ? Number(parsed.port) : constants_1.DEFAULT_PORT;
174
158
  }
175
- // If the app is linked locally, make sure the resolved port is one of
176
- // its registered redirect URLs — otherwise the OAuth callback will be
177
- // rejected by Brevo at runtime. Skipped when there's no linked app
178
- // (no appId means we'd have nowhere to push the update).
179
- let redirectUri;
180
- if (config?.appId) {
181
- redirectUri = await ensureRedirectRegistered(config, port);
159
+ catch {
160
+ return constants_1.DEFAULT_PORT;
182
161
  }
183
- (0, logger_1.logInfo)(`\n Starting ${feature}...`);
184
- // Spawn the feature server using the current Node.js executable.
185
- // REDIRECT_URI is propagated whenever we have a registered localhost URL
186
- // on the resolved port — otherwise the child reads the (possibly stale)
187
- // value from .env.local, which would mismatch when --port overrides the
188
- // scaffold-time port.
189
- const childEnv = { ...process.env, PORT: String(port) };
190
- if (redirectUri)
191
- childEnv.REDIRECT_URI = redirectUri;
162
+ }
163
+ function runChildProcess(entryFile, childEnv, feature) {
192
164
  const child = (0, node_child_process_1.spawn)(process.execPath, [entryFile], {
193
165
  stdio: 'inherit',
194
166
  env: childEnv,
195
167
  });
196
- // Forward signals for clean shutdown — use prependListener so child
197
- // is killed before the global SIGINT/SIGTERM handlers in bin/index.ts
198
- // call process.exit().
199
168
  const onSignal = (signal) => {
200
169
  child.kill(signal);
201
170
  };
202
171
  process.prependListener('SIGINT', onSignal);
203
172
  process.prependListener('SIGTERM', onSignal);
204
- await new Promise((resolve, reject) => {
173
+ return new Promise((resolve, reject) => {
205
174
  child.on('close', (code) => {
206
175
  process.removeListener('SIGINT', onSignal);
207
176
  process.removeListener('SIGTERM', onSignal);
@@ -219,5 +188,26 @@ exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options)
219
188
  reject(new errors_1.CliError(en_1.messages.APP_START_FAILED(feature, err.message)));
220
189
  });
221
190
  });
191
+ }
192
+ exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
193
+ const { feature } = options;
194
+ const entryFile = resolveFeatureEntry(feature);
195
+ const config = (0, config_1.readProjectConfig)();
196
+ const port = resolvePort(config, options.port);
197
+ if (!(await (0, port_1.isPortAvailable)(port))) {
198
+ throw new errors_1.CliError(options.port
199
+ ? en_1.messages.APP_START_CUSTOM_PORT_IN_USE(port)
200
+ : en_1.messages.APP_START_PORT_IN_USE(port));
201
+ }
202
+ // If the app is linked locally, make sure the resolved port is one of
203
+ // its registered redirect URLs — otherwise the OAuth callback will be
204
+ // rejected by Brevo at runtime. Skipped when there's no linked app
205
+ // (no appId means we'd have nowhere to push the update).
206
+ const redirectUri = config?.appId ? await ensureRedirectRegistered(config, port) : undefined;
207
+ (0, logger_1.logInfo)(`\n Starting ${feature}...`);
208
+ const childEnv = { ...process.env, PORT: String(port) };
209
+ if (redirectUri)
210
+ childEnv.REDIRECT_URI = redirectUri;
211
+ await runChildProcess(entryFile, childEnv, feature);
222
212
  });
223
213
  //# sourceMappingURL=start.js.map