ninedeploy 0.3.0 → 0.5.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 (90) hide show
  1. package/dist/commands/branding.d.ts +31 -0
  2. package/dist/commands/branding.d.ts.map +1 -0
  3. package/dist/commands/branding.js +48 -0
  4. package/dist/commands/branding.js.map +1 -0
  5. package/dist/commands/buildCache.d.ts +27 -0
  6. package/dist/commands/buildCache.d.ts.map +1 -0
  7. package/dist/commands/buildCache.js +46 -0
  8. package/dist/commands/buildCache.js.map +1 -0
  9. package/dist/commands/certificates.d.ts +15 -0
  10. package/dist/commands/certificates.d.ts.map +1 -0
  11. package/dist/commands/certificates.js +57 -0
  12. package/dist/commands/certificates.js.map +1 -0
  13. package/dist/commands/communityTemplates.d.ts +24 -0
  14. package/dist/commands/communityTemplates.d.ts.map +1 -0
  15. package/dist/commands/communityTemplates.js +79 -0
  16. package/dist/commands/communityTemplates.js.map +1 -0
  17. package/dist/commands/configPresets.d.ts +51 -0
  18. package/dist/commands/configPresets.d.ts.map +1 -0
  19. package/dist/commands/configPresets.js +166 -0
  20. package/dist/commands/configPresets.js.map +1 -0
  21. package/dist/commands/domains.d.ts +70 -0
  22. package/dist/commands/domains.d.ts.map +1 -0
  23. package/dist/commands/domains.js +97 -0
  24. package/dist/commands/domains.js.map +1 -0
  25. package/dist/commands/egress.d.ts +43 -0
  26. package/dist/commands/egress.d.ts.map +1 -0
  27. package/dist/commands/egress.js +80 -0
  28. package/dist/commands/egress.js.map +1 -0
  29. package/dist/commands/emailTemplates.d.ts +19 -0
  30. package/dist/commands/emailTemplates.d.ts.map +1 -0
  31. package/dist/commands/emailTemplates.js +86 -0
  32. package/dist/commands/emailTemplates.js.map +1 -0
  33. package/dist/commands/housekeeping.d.ts +24 -0
  34. package/dist/commands/housekeeping.d.ts.map +1 -1
  35. package/dist/commands/housekeeping.js +62 -1
  36. package/dist/commands/housekeeping.js.map +1 -1
  37. package/dist/commands/logs.d.ts +15 -0
  38. package/dist/commands/logs.d.ts.map +1 -0
  39. package/dist/commands/logs.js +58 -0
  40. package/dist/commands/logs.js.map +1 -0
  41. package/dist/commands/manage.d.ts +45 -0
  42. package/dist/commands/manage.d.ts.map +1 -1
  43. package/dist/commands/manage.js +153 -0
  44. package/dist/commands/manage.js.map +1 -1
  45. package/dist/commands/manifest.d.ts +12 -6
  46. package/dist/commands/manifest.d.ts.map +1 -1
  47. package/dist/commands/manifest.js +87 -12
  48. package/dist/commands/manifest.js.map +1 -1
  49. package/dist/commands/metrics.d.ts +37 -0
  50. package/dist/commands/metrics.d.ts.map +1 -0
  51. package/dist/commands/metrics.js +43 -0
  52. package/dist/commands/metrics.js.map +1 -0
  53. package/dist/commands/misc.d.ts +35 -0
  54. package/dist/commands/misc.d.ts.map +1 -1
  55. package/dist/commands/misc.js +135 -1
  56. package/dist/commands/misc.js.map +1 -1
  57. package/dist/commands/notifications.d.ts +59 -0
  58. package/dist/commands/notifications.d.ts.map +1 -0
  59. package/dist/commands/notifications.js +157 -0
  60. package/dist/commands/notifications.js.map +1 -0
  61. package/dist/commands/pgbouncer.d.ts +17 -0
  62. package/dist/commands/pgbouncer.d.ts.map +1 -0
  63. package/dist/commands/pgbouncer.js +46 -0
  64. package/dist/commands/pgbouncer.js.map +1 -0
  65. package/dist/commands/plugins.d.ts +3 -0
  66. package/dist/commands/plugins.d.ts.map +1 -1
  67. package/dist/commands/plugins.js +20 -1
  68. package/dist/commands/plugins.js.map +1 -1
  69. package/dist/commands/services.d.ts +14 -0
  70. package/dist/commands/services.d.ts.map +1 -1
  71. package/dist/commands/services.js +29 -0
  72. package/dist/commands/services.js.map +1 -1
  73. package/dist/commands/sso.d.ts +31 -0
  74. package/dist/commands/sso.d.ts.map +1 -0
  75. package/dist/commands/sso.js +77 -0
  76. package/dist/commands/sso.js.map +1 -0
  77. package/dist/commands/templates.d.ts +22 -0
  78. package/dist/commands/templates.d.ts.map +1 -0
  79. package/dist/commands/templates.js +122 -0
  80. package/dist/commands/templates.js.map +1 -0
  81. package/dist/commands/token.d.ts +10 -0
  82. package/dist/commands/token.d.ts.map +1 -1
  83. package/dist/commands/token.js +24 -1
  84. package/dist/commands/token.js.map +1 -1
  85. package/dist/index.js +292 -9
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/format.d.ts.map +1 -1
  88. package/dist/lib/format.js +18 -3
  89. package/dist/lib/format.js.map +1 -1
  90. package/package.json +3 -3
@@ -9,8 +9,33 @@ export declare function tplList(client: NineDeployClient): Promise<void>;
9
9
  export declare function tplDeploy(client: NineDeployClient, id: string): Promise<void>;
10
10
  /** `ninedeploy deploys list <serviceId>` */
11
11
  export declare function deploysList(client: NineDeployClient, svcIdStr: string): Promise<void>;
12
+ /**
13
+ * `ninedeploy deploys queue`
14
+ *
15
+ * Global queue view: every in-flight (queued / building / deploying) deploy
16
+ * across every service the caller can see. The same data the web panel's
17
+ * `/deploys` page renders, so an operator can audit the build pipeline
18
+ * without leaving the terminal or opening a browser tab.
19
+ */
20
+ export declare function deploysQueue(client: NineDeployClient): Promise<void>;
12
21
  /** `ninedeploy deploys rollback <serviceId> <deployId>` */
13
22
  export declare function deploysRollback(client: NineDeployClient, svcIdStr: string, depIdStr: string): Promise<void>;
23
+ /**
24
+ * `ninedeploy deploys cancel <serviceId> <deployId>`
25
+ *
26
+ * The route, the SDK method and the panel button all existed; the CLI was the
27
+ * one surface without it, so a deploy started from CI could only be stopped
28
+ * from a browser.
29
+ */
30
+ export declare function deploysCancel(client: NineDeployClient, svcIdStr: string, depIdStr: string): Promise<void>;
31
+ /**
32
+ * `ninedeploy deploys rm <serviceId> <deployId>`
33
+ *
34
+ * Removes a finished deployment from history, with its build log. Refused for
35
+ * an in-flight deployment (cancel it first) and for the one currently serving
36
+ * traffic — that row carries the digest a rollback re-deploys.
37
+ */
38
+ export declare function deploysRemove(client: NineDeployClient, svcIdStr: string, depIdStr: string, yes?: boolean): Promise<void>;
14
39
  /** `ninedeploy token create` */
15
40
  export declare function tokenCreate(client: NineDeployClient): Promise<void>;
16
41
  /** `ninedeploy token list` */
@@ -21,4 +46,14 @@ export declare function systemInfo(client: NineDeployClient): Promise<void>;
21
46
  export declare function systemUpdateCheck(client: NineDeployClient, force: boolean): Promise<void>;
22
47
  /** `ninedeploy system dashboard` */
23
48
  export declare function systemDashboard(client: NineDeployClient): Promise<void>;
49
+ /**
50
+ * `ninedeploy system rotate-keys`
51
+ *
52
+ * The command `.env.example` has told operators to run since the key-ring
53
+ * landed. It did not exist: `lib/keyRotation.rotateSecrets` was implemented and
54
+ * tested but had no caller anywhere in the product, so anyone who followed the
55
+ * documented rotation procedure and then dropped the retired key version was
56
+ * left holding ciphertext they could no longer decrypt.
57
+ */
58
+ export declare function systemRotateKeys(client: NineDeployClient): Promise<void>;
24
59
  //# sourceMappingURL=misc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIrD,kCAAkC;AAClC,wBAAsB,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED,oCAAoC;AACpC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;AAED,kCAAkC;AAClC,wBAAsB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrE;AAED,yCAAyC;AACzC,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnF;AAED,4CAA4C;AAC5C,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3F;AAED,2DAA2D;AAC3D,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjH;AAED,gCAAgC;AAChC,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED,8BAA8B;AAC9B,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,+BAA+B;AAC/B,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxE;AAED,uCAAuC;AACvC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;AAED,oCAAoC;AACpC,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7E"}
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,kCAAkC;AAClC,wBAAsB,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED,oCAAoC;AACpC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;AAED,kCAAkC;AAClC,wBAAsB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrE;AAED,yCAAyC;AACzC,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnF;AAED,4CAA4C;AAC5C,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3F;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC1E;AAED,2DAA2D;AAC3D,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjH;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/G;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5H;AAED,gCAAgC;AAChC,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzE;AAED,8BAA8B;AAC9B,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,+BAA+B;AAC/B,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxE;AAED,uCAAuC;AACvC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;AAED,oCAAoC;AACpC,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7E;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E"}
@@ -1,5 +1,6 @@
1
1
  import { c, error, fmtTime, header, info, kv, spinner, success, table, banner } from '../lib/format.js';
2
2
  import { prompt } from '../prompts.js';
3
+ import { parseScopes } from './token.js';
3
4
  /** `ninedeploy databases list` */
4
5
  export async function dbList(client) {
5
6
  header('Databases');
@@ -73,6 +74,54 @@ export async function deploysList(client, svcIdStr) {
73
74
  table(deps.map((d) => ({ id: d.id, status: d.status, commit: d.commitSha?.slice(0, 7) ?? '—', trigger: d.trigger, time: fmtTime(d.createdAt) })), ['id', 'status', 'commit', 'trigger', 'time']);
74
75
  });
75
76
  }
77
+ /**
78
+ * `ninedeploy deploys queue`
79
+ *
80
+ * Global queue view: every in-flight (queued / building / deploying) deploy
81
+ * across every service the caller can see. The same data the web panel's
82
+ * `/deploys` page renders, so an operator can audit the build pipeline
83
+ * without leaving the terminal or opening a browser tab.
84
+ */
85
+ export async function deploysQueue(client) {
86
+ header('Global deploy queue');
87
+ const data = await spinner('Fetching', () => client.deploys.queue());
88
+ const counts = data.byStatus ?? { queued: 0, building: 0, deploying: 0 };
89
+ const inFlight = data.items ?? [];
90
+ if (inFlight.length === 0) {
91
+ info('No in-flight deploys.');
92
+ kv('queued', counts.queued ?? 0);
93
+ kv('building', counts.building ?? 0);
94
+ kv('deploying', counts.deploying ?? 0);
95
+ return;
96
+ }
97
+ // The server returns items ordered claimed-first (building, then
98
+ // deploying, then queued). Per-service queue position is the 1-based
99
+ // index of this row among the `queued` siblings for the same
100
+ // service. In-flight rows (building / deploying) get a dash — the
101
+ // position number is only meaningful for rows waiting to start.
102
+ const queuedByService = new Map();
103
+ table(inFlight.map((row) => {
104
+ let pos;
105
+ if (row.status === 'queued') {
106
+ pos = (queuedByService.get(row.serviceId) ?? 0) + 1;
107
+ queuedByService.set(row.serviceId, pos);
108
+ }
109
+ else {
110
+ pos = 0;
111
+ }
112
+ return {
113
+ service: row.serviceName || `service:${row.serviceId}`,
114
+ serviceId: row.serviceId,
115
+ deploy: row.id,
116
+ status: row.status,
117
+ pos: pos > 0 ? `${pos}` : '—',
118
+ time: fmtTime(row.createdAt),
119
+ };
120
+ }), ['service', 'serviceId', 'deploy', 'status', 'pos', 'time']);
121
+ kv('queued', counts.queued ?? 0);
122
+ kv('building', counts.building ?? 0);
123
+ kv('deploying', counts.deploying ?? 0);
124
+ }
76
125
  /** `ninedeploy deploys rollback <serviceId> <deployId>` */
77
126
  export async function deploysRollback(client, svcIdStr, depIdStr) {
78
127
  const svcId = Number(svcIdStr);
@@ -87,12 +136,68 @@ export async function deploysRollback(client, svcIdStr, depIdStr) {
87
136
  error(err instanceof Error ? err.message : String(err));
88
137
  }
89
138
  }
139
+ /**
140
+ * `ninedeploy deploys cancel <serviceId> <deployId>`
141
+ *
142
+ * The route, the SDK method and the panel button all existed; the CLI was the
143
+ * one surface without it, so a deploy started from CI could only be stopped
144
+ * from a browser.
145
+ */
146
+ export async function deploysCancel(client, svcIdStr, depIdStr) {
147
+ const svcId = Number(svcIdStr);
148
+ const depId = Number(depIdStr);
149
+ if (!svcId || !depId)
150
+ return error('Usage: ninedeploy deploys cancel <serviceId> <deployId>');
151
+ try {
152
+ await spinner('Cancelling', () => client.deploys.cancel(svcId, depId));
153
+ // A queued deploy stops here; an in-flight one stops at the pipeline's next
154
+ // step boundary, with the previous version still serving.
155
+ success(`Deployment #${depId} cancelled.`);
156
+ }
157
+ catch (err) {
158
+ error(err instanceof Error ? err.message : String(err));
159
+ }
160
+ }
161
+ /**
162
+ * `ninedeploy deploys rm <serviceId> <deployId>`
163
+ *
164
+ * Removes a finished deployment from history, with its build log. Refused for
165
+ * an in-flight deployment (cancel it first) and for the one currently serving
166
+ * traffic — that row carries the digest a rollback re-deploys.
167
+ */
168
+ export async function deploysRemove(client, svcIdStr, depIdStr, yes = false) {
169
+ const svcId = Number(svcIdStr);
170
+ const depId = Number(depIdStr);
171
+ if (!svcId || !depId)
172
+ return error('Usage: ninedeploy deploys rm <serviceId> <deployId>');
173
+ if (!yes) {
174
+ const confirm = await prompt(`Permanently remove deployment #${depId} and its build log? (yes/no)`, 'no');
175
+ if (confirm.toLowerCase() !== 'yes')
176
+ return info('Aborted.');
177
+ }
178
+ try {
179
+ await spinner('Removing', () => client.deploys.remove(svcId, depId));
180
+ success(`Deployment #${depId} removed.`);
181
+ }
182
+ catch (err) {
183
+ error(err instanceof Error ? err.message : String(err));
184
+ }
185
+ }
90
186
  /** `ninedeploy token create` */
91
187
  export async function tokenCreate(client) {
92
188
  const name = await prompt('Token name', 'ci');
189
+ // read = safe methods only · write = mutate as a non-operator ·
190
+ // operator = no extra restriction. Blank = unrestricted (legacy tokens).
191
+ // G-08 fine-grained: also accept
192
+ // 'nd://scope/(read|write|admin)/<resource>' for per-resource
193
+ // restriction; the server's scopeCovers() expands the legacy
194
+ // shorthand against the URI form so a `write` token still
195
+ // covers every `nd://scope/write/<r>`.
196
+ const scopes = parseScopes(await prompt('Scopes (read,write,operator or nd://scope/(read|write|admin)/<resource> — blank = unrestricted)', 'write'));
93
197
  try {
94
- const tok = await spinner('Creating token', () => client.auth.tokens.create({ name }));
198
+ const tok = await spinner('Creating token', () => client.auth.tokens.create({ name, scopes }));
95
199
  success(`Token created: ${c.cyan(tok.token)}`);
200
+ info(`Scopes: ${tok.scopes.length ? tok.scopes.join(', ') : 'unrestricted (legacy)'}`);
96
201
  info('Store this securely — it won\'t be shown again.');
97
202
  }
98
203
  catch (err) {
@@ -180,4 +285,33 @@ export async function systemDashboard(client) {
180
285
  table(dash.recentDeploys.map((d) => ({ id: d.id, service: d.serviceName, status: d.status, time: fmtTime(d.createdAt) })), ['id', 'service', 'status', 'time']);
181
286
  });
182
287
  }
288
+ /**
289
+ * `ninedeploy system rotate-keys`
290
+ *
291
+ * The command `.env.example` has told operators to run since the key-ring
292
+ * landed. It did not exist: `lib/keyRotation.rotateSecrets` was implemented and
293
+ * tested but had no caller anywhere in the product, so anyone who followed the
294
+ * documented rotation procedure and then dropped the retired key version was
295
+ * left holding ciphertext they could no longer decrypt.
296
+ */
297
+ export async function systemRotateKeys(client) {
298
+ header('Rotate master key');
299
+ const status = await spinner('Reading key ring', () => client.settings.masterKey.get());
300
+ kv('Active version', c.bold(`v${status.activeVersion}`));
301
+ kv('Ring', status.knownVersions.map((v) => `v${v}`).join(', '));
302
+ if (!status.rotatable) {
303
+ return error('Only one key version is loaded — there is nothing to rotate onto. Add a new 32-byte key under a higher version in NINEDEPLOY_MASTER_KEYS, restart, then run this again.');
304
+ }
305
+ const confirm = await prompt(`Re-encrypt every stored secret onto v${status.activeVersion}? (yes/no)`, 'no');
306
+ if (confirm.toLowerCase() !== 'yes')
307
+ return info('Aborted.');
308
+ const res = await spinner('Re-encrypting', () => client.settings.masterKey.rotate());
309
+ success(`${res.rotated} secret value(s) re-encrypted under v${res.activeVersion}.`);
310
+ if (res.warning) {
311
+ info(res.warning);
312
+ }
313
+ else {
314
+ info('No stored backups reference an older key version — the retired key can be removed from NINEDEPLOY_MASTER_KEYS.');
315
+ }
316
+ }
183
317
  //# sourceMappingURL=misc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `ninedeploy notifications {list,create-webhook,test,rm}` — operator
3
+ * UI for the notification channel registry. PR #49 (G-06) adds
4
+ * the HMAC + body-template fields for the `webhook` channel type;
5
+ * the other types (slack, discord, telegram, ntfy, email) keep
6
+ * their existing surface and accept an opaque `configJson` blob.
7
+ */
8
+ import type { NineDeployClient } from '../client.js';
9
+ /** `ninedeploy notifications list` */
10
+ export declare function notificationsList(client: NineDeployClient): Promise<void>;
11
+ /**
12
+ * `ninedeploy notifications create-webhook <name> <url> [--secret s]
13
+ * [--header h] [--algo sha256|sha1]
14
+ * [--template k=v ...]`
15
+ *
16
+ * The `webhook` channel type is the G-06 outbound integration
17
+ * (HMAC-signed POST). The CLI builds a `configJson` blob from
18
+ * the flags and sends it through the existing channel create
19
+ * endpoint. `--template` accepts a flat key=value list (e.g.
20
+ * `--template title=Deploy message='${event} done'`) and
21
+ * assembles a JSON object that the server's `renderWebhookBody`
22
+ * expands at send time.
23
+ */
24
+ export declare function notificationsCreateWebhook(client: NineDeployClient, name: string, url: string, opts?: {
25
+ secret?: string;
26
+ header?: string;
27
+ algo?: 'sha256' | 'sha1';
28
+ eventFilter?: string;
29
+ template?: string[];
30
+ }): Promise<void>;
31
+ /**
32
+ * `ninedeploy notifications create-fcm <name> <deviceToken>
33
+ * --service-account <file>`
34
+ *
35
+ * The `fcm` channel type is the G-22 push-notification
36
+ * integration (Firebase Cloud Messaging HTTP v1). The
37
+ * device token is the FCM registration token of a
38
+ * target device; the service account JSON is the file
39
+ * Firebase issues when the operator creates a project
40
+ * service account with the `Firebase Cloud Messaging
41
+ * API` role. The CLI reads the file from disk so the
42
+ * service account never lands on the operator's shell
43
+ * history.
44
+ *
45
+ * Caveat: the service account's `private_key` is a PEM
46
+ * block; the SDK will store the rendered `configJson`
47
+ * encrypted at rest by `notificationChannels`. Treat
48
+ * the service account JSON as a secret — same posture
49
+ * as an SMTP password.
50
+ */
51
+ export declare function notificationsCreateFcm(client: NineDeployClient, name: string, deviceToken: string, opts: {
52
+ serviceAccount: string;
53
+ }): Promise<void>;
54
+ /** `ninedeploy notifications test <id>` — fire a test event
55
+ * through the channel so the operator can verify wiring. */
56
+ export declare function notificationsTest(client: NineDeployClient, idStr: string): Promise<void>;
57
+ /** `ninedeploy notifications rm <id>` */
58
+ export declare function notificationsRemove(client: NineDeployClient, idStr: string): Promise<void>;
59
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAgBrD,sCAAsC;AACtC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,GACL,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;6DAC6D;AAC7D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9F;AAED,yCAAyC;AACzC,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhG"}
@@ -0,0 +1,157 @@
1
+ import { c, error, header, info, spinner, success, table } from '../lib/format.js';
2
+ const num = (v, usage) => {
3
+ const n = Number(v);
4
+ if (!n) {
5
+ error(usage);
6
+ throw new Error(usage);
7
+ }
8
+ return n;
9
+ };
10
+ const fail = (err) => {
11
+ error(err instanceof Error ? err.message : String(err));
12
+ };
13
+ /** `ninedeploy notifications list` */
14
+ export async function notificationsList(client) {
15
+ header('Notification Channels');
16
+ const rows = await spinner('Fetching', () => client.notifications.listChannels());
17
+ if (rows.length === 0) {
18
+ info('No notification channels configured.');
19
+ return;
20
+ }
21
+ table(rows.map((r) => ({
22
+ id: r.id,
23
+ name: r.name,
24
+ type: r.type,
25
+ events: r.eventFilter || c.dim('(all)'),
26
+ active: r.active ? 'yes' : 'no',
27
+ })), ['id', 'name', 'type', 'events', 'active']);
28
+ }
29
+ /**
30
+ * `ninedeploy notifications create-webhook <name> <url> [--secret s]
31
+ * [--header h] [--algo sha256|sha1]
32
+ * [--template k=v ...]`
33
+ *
34
+ * The `webhook` channel type is the G-06 outbound integration
35
+ * (HMAC-signed POST). The CLI builds a `configJson` blob from
36
+ * the flags and sends it through the existing channel create
37
+ * endpoint. `--template` accepts a flat key=value list (e.g.
38
+ * `--template title=Deploy message='${event} done'`) and
39
+ * assembles a JSON object that the server's `renderWebhookBody`
40
+ * expands at send time.
41
+ */
42
+ export async function notificationsCreateWebhook(client, name, url, opts = {}) {
43
+ if (!name || !url) {
44
+ error('Usage: ninedeploy notifications create-webhook <name> <url> [--secret s] [--header h] [--algo sha256|sha1] [--template k=v ...]');
45
+ return;
46
+ }
47
+ const config = {};
48
+ if (opts.secret)
49
+ config.secret = opts.secret;
50
+ if (opts.header)
51
+ config.headerName = opts.header;
52
+ if (opts.algo)
53
+ config.algorithm = opts.algo;
54
+ if (opts.template && opts.template.length > 0) {
55
+ const tpl = {};
56
+ for (const raw of opts.template) {
57
+ const eq = raw.indexOf('=');
58
+ if (eq <= 0) {
59
+ error(`--template expects key=value pairs, got: ${raw}`);
60
+ return;
61
+ }
62
+ tpl[raw.slice(0, eq)] = raw.slice(eq + 1);
63
+ }
64
+ config.template = tpl;
65
+ }
66
+ try {
67
+ const ch = await client.notifications.createChannel({
68
+ name,
69
+ type: 'webhook',
70
+ target: url,
71
+ eventFilter: opts.eventFilter,
72
+ configJson: Object.keys(config).length > 0 ? JSON.stringify(config) : undefined,
73
+ });
74
+ success(`Webhook channel "${ch.name}" created (id: ${ch.id}).`);
75
+ if (opts.secret) {
76
+ info(`HMAC signature header: ${opts.header ?? 'X-NineDeploy-Signature'} (${opts.algo ?? 'sha256'})`);
77
+ }
78
+ if (opts.template && opts.template.length > 0) {
79
+ info(`Custom body template: ${opts.template.length} field(s)`);
80
+ }
81
+ }
82
+ catch (err) {
83
+ fail(err);
84
+ }
85
+ }
86
+ /**
87
+ * `ninedeploy notifications create-fcm <name> <deviceToken>
88
+ * --service-account <file>`
89
+ *
90
+ * The `fcm` channel type is the G-22 push-notification
91
+ * integration (Firebase Cloud Messaging HTTP v1). The
92
+ * device token is the FCM registration token of a
93
+ * target device; the service account JSON is the file
94
+ * Firebase issues when the operator creates a project
95
+ * service account with the `Firebase Cloud Messaging
96
+ * API` role. The CLI reads the file from disk so the
97
+ * service account never lands on the operator's shell
98
+ * history.
99
+ *
100
+ * Caveat: the service account's `private_key` is a PEM
101
+ * block; the SDK will store the rendered `configJson`
102
+ * encrypted at rest by `notificationChannels`. Treat
103
+ * the service account JSON as a secret — same posture
104
+ * as an SMTP password.
105
+ */
106
+ export async function notificationsCreateFcm(client, name, deviceToken, opts) {
107
+ if (!name || !deviceToken || !opts.serviceAccount) {
108
+ error('Usage: ninedeploy notifications create-fcm <name> <deviceToken> --service-account <file.json>');
109
+ return;
110
+ }
111
+ const fs = await import('node:fs/promises');
112
+ let sa;
113
+ try {
114
+ sa = await fs.readFile(opts.serviceAccount, 'utf8');
115
+ }
116
+ catch (err) {
117
+ error(`Failed to read service account JSON: ${err instanceof Error ? err.message : String(err)}`);
118
+ return;
119
+ }
120
+ try {
121
+ const ch = await client.notifications.createChannel({
122
+ name,
123
+ type: 'fcm',
124
+ target: deviceToken,
125
+ configJson: sa,
126
+ });
127
+ success(`FCM channel "${ch.name}" created (id: ${ch.id}).`);
128
+ info('Send a test event with `ninedeploy notifications test <id>` to verify wiring.');
129
+ }
130
+ catch (err) {
131
+ fail(err);
132
+ }
133
+ }
134
+ /** `ninedeploy notifications test <id>` — fire a test event
135
+ * through the channel so the operator can verify wiring. */
136
+ export async function notificationsTest(client, idStr) {
137
+ const id = num(idStr, 'Usage: ninedeploy notifications test <id>');
138
+ try {
139
+ await client.notifications.testChannel(id);
140
+ success(`Test event fired through channel #${id}.`);
141
+ }
142
+ catch (err) {
143
+ fail(err);
144
+ }
145
+ }
146
+ /** `ninedeploy notifications rm <id>` */
147
+ export async function notificationsRemove(client, idStr) {
148
+ const id = num(idStr, 'Usage: ninedeploy notifications rm <id>');
149
+ try {
150
+ await client.notifications.removeChannel(id);
151
+ success(`Channel #${id} removed.`);
152
+ }
153
+ catch (err) {
154
+ fail(err);
155
+ }
156
+ }
157
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `ninedeploy databases pgbouncer <dbId> <action>` — G-32
3
+ * PgBouncer sidecar. Only the `postgres` engine is
4
+ * supported; the server returns 422 for any other engine.
5
+ *
6
+ * Actions:
7
+ * - enable : start a co-located pgbouncer container and
8
+ * stamp the row.
9
+ * - disable : stop + remove the sidecar, clear the row.
10
+ * - status : print the current sidecar state and the
11
+ * pooled connection string.
12
+ */
13
+ import type { NineDeployClient } from '../client.js';
14
+ export declare function databasePgbouncer(client: NineDeployClient, dbIdStr: string, action: string, opts?: {
15
+ port?: number;
16
+ }): Promise<void>;
17
+ //# sourceMappingURL=pgbouncer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pgbouncer.d.ts","sourceRoot":"","sources":["../../src/commands/pgbouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAYrD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmCf"}
@@ -0,0 +1,46 @@
1
+ import { c, error, header, info, spinner, success } from '../lib/format.js';
2
+ const num = (v, usage) => {
3
+ const n = Number(v);
4
+ if (!n) {
5
+ error(usage);
6
+ throw new Error(usage);
7
+ }
8
+ return n;
9
+ };
10
+ export async function databasePgbouncer(client, dbIdStr, action, opts = {}) {
11
+ const dbId = num(dbIdStr, 'Usage: ninedeploy databases pgbouncer <dbId> <enable|disable|status>');
12
+ const normalized = action.toLowerCase();
13
+ if (!['enable', 'disable', 'status'].includes(normalized)) {
14
+ error('Action must be one of: enable, disable, status');
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ if (normalized === 'enable') {
19
+ const res = await spinner('Starting PgBouncer sidecar', () => client.databases.enablePgbouncer(dbId, opts.port ? { port: opts.port } : {}));
20
+ success(`PgBouncer sidecar started on port ${res.port}.`);
21
+ info(`Connection URL: ${res.pooledConnectionString ?? '(pending)'}`);
22
+ return;
23
+ }
24
+ if (normalized === 'disable') {
25
+ const res = await spinner('Stopping PgBouncer sidecar', () => client.databases.disablePgbouncer(dbId));
26
+ success('PgBouncer sidecar stopped.');
27
+ if (res.enabled)
28
+ info(`Sidecar still reporting enabled: ${res.containerName ?? '(unknown)'}`);
29
+ return;
30
+ }
31
+ // status
32
+ const res = await spinner('Reading sidecar status', () => client.databases.pgbouncerStatus(dbId));
33
+ header('PgBouncer sidecar');
34
+ info(`Enabled: ${res.enabled ? 'yes' : 'no'}`);
35
+ info(`Container: ${res.containerName ?? c.dim('(none)')}`);
36
+ info(`Port: ${res.port}`);
37
+ info(`Running: ${res.running ? 'yes' : c.yellow('no — enabled but container is down')}`);
38
+ if (res.poolMode)
39
+ info(`Pool mode: ${res.poolMode}`);
40
+ if (res.pooledConnectionString) {
41
+ console.log();
42
+ info(`Pooled URL (use this for new attachments):`);
43
+ console.log(` ${c.cyan(res.pooledConnectionString)}`);
44
+ }
45
+ }
46
+ //# sourceMappingURL=pgbouncer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pgbouncer.js","sourceRoot":"","sources":["../../src/commands/pgbouncer.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import type { NineDeployClient } from '@ninedeploy/sdk';
2
2
  export declare function pluginsList(client: NineDeployClient): Promise<void>;
3
3
  export declare function pluginsMarketplace(client: NineDeployClient): Promise<void>;
4
+ /** `ninedeploy plugins marketplace refresh` — bypass the
5
+ * 5-minute cache and re-fetch the live signed index. */
6
+ export declare function pluginsMarketplaceRefresh(client: NineDeployClient): Promise<void>;
4
7
  export declare function pluginsInstall(client: NineDeployClient, target: string, opts: {
5
8
  source?: 'marketplace' | 'npm' | 'git' | 'local';
6
9
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhF;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzG,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChF;AAED;yDACyD;AACzD,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvF;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzG,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF"}
@@ -14,11 +14,24 @@ export async function pluginsList(client) {
14
14
  })), ['id', 'name', 'version', 'type', 'status']);
15
15
  }
16
16
  export async function pluginsMarketplace(client) {
17
- const { catalog } = await client.plugins.marketplace();
17
+ const { catalog, live, keyId, fetchedAt } = await client.plugins.marketplace();
18
18
  if (catalog.length === 0) {
19
19
  console.log(' Marketplace catalog is currently empty.');
20
20
  return;
21
21
  }
22
+ // Surface the source (live signed index vs. static
23
+ // fallback) so the operator knows whether a planned
24
+ // install was discovered automatically or is a
25
+ // roadmap item.
26
+ const source = live
27
+ ? `live signed index (key=${keyId ?? 'unknown'})`
28
+ : 'static fallback (upstream unreachable or NINEDEPLOY_MARKETPLACE_URL not set)';
29
+ console.log(` Source: ${source}`);
30
+ if (fetchedAt) {
31
+ const ageMin = Math.max(0, Math.round((Date.now() - fetchedAt) / 60_000));
32
+ console.log(` Fetched: ${ageMin} min ago`);
33
+ }
34
+ console.log();
22
35
  table(catalog.map((c) => ({
23
36
  id: c.id,
24
37
  name: c.name,
@@ -28,6 +41,12 @@ export async function pluginsMarketplace(client) {
28
41
  status: c.isInstalled ? '✓ Installed' : 'Available',
29
42
  })), ['id', 'name', 'category', 'version', 'type', 'status']);
30
43
  }
44
+ /** `ninedeploy plugins marketplace refresh` — bypass the
45
+ * 5-minute cache and re-fetch the live signed index. */
46
+ export async function pluginsMarketplaceRefresh(client) {
47
+ const res = await client.plugins.marketplace({ refresh: true });
48
+ console.log(` ✓ Refreshed (${res.catalog.length} entries, live=${res.live}, keyId=${res.keyId ?? 'n/a'}).`);
49
+ }
31
50
  export async function pluginsInstall(client, target, opts) {
32
51
  const source = opts.source ?? 'marketplace';
33
52
  const res = await client.plugins.install({