@solidnumber/cli 1.7.2 → 1.7.3

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 (110) hide show
  1. package/dist/commands/audit.js +1 -1
  2. package/dist/commands/audit.js.map +1 -1
  3. package/dist/commands/brand.js +122 -0
  4. package/dist/commands/brand.js.map +1 -1
  5. package/dist/commands/clone.d.ts.map +1 -1
  6. package/dist/commands/clone.js +67 -0
  7. package/dist/commands/clone.js.map +1 -1
  8. package/dist/commands/completion.d.ts.map +1 -1
  9. package/dist/commands/completion.js +4 -0
  10. package/dist/commands/completion.js.map +1 -1
  11. package/dist/commands/demo.d.ts +12 -0
  12. package/dist/commands/demo.d.ts.map +1 -0
  13. package/dist/commands/demo.js +257 -0
  14. package/dist/commands/demo.js.map +1 -0
  15. package/dist/commands/init.d.ts +11 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +377 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/inventory.js +5 -5
  20. package/dist/commands/inventory.js.map +1 -1
  21. package/dist/commands/payment.js +101 -0
  22. package/dist/commands/payment.js.map +1 -1
  23. package/dist/commands/push.d.ts.map +1 -1
  24. package/dist/commands/push.js +42 -0
  25. package/dist/commands/push.js.map +1 -1
  26. package/dist/commands/sandbox.d.ts.map +1 -1
  27. package/dist/commands/sandbox.js +113 -0
  28. package/dist/commands/sandbox.js.map +1 -1
  29. package/dist/index.js +4 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/config.d.ts.map +1 -1
  32. package/dist/lib/config.js +4 -4
  33. package/dist/lib/config.js.map +1 -1
  34. package/package.json +2 -1
  35. package/dist/__tests__/commands/auth.test.d.ts +0 -6
  36. package/dist/__tests__/commands/auth.test.d.ts.map +0 -1
  37. package/dist/__tests__/commands/auth.test.js +0 -91
  38. package/dist/__tests__/commands/auth.test.js.map +0 -1
  39. package/dist/__tests__/commands/billing.test.d.ts +0 -6
  40. package/dist/__tests__/commands/billing.test.d.ts.map +0 -1
  41. package/dist/__tests__/commands/billing.test.js +0 -141
  42. package/dist/__tests__/commands/billing.test.js.map +0 -1
  43. package/dist/__tests__/commands/company.test.d.ts +0 -6
  44. package/dist/__tests__/commands/company.test.d.ts.map +0 -1
  45. package/dist/__tests__/commands/company.test.js +0 -129
  46. package/dist/__tests__/commands/company.test.js.map +0 -1
  47. package/dist/__tests__/commands/deploy.test.d.ts +0 -8
  48. package/dist/__tests__/commands/deploy.test.d.ts.map +0 -1
  49. package/dist/__tests__/commands/deploy.test.js +0 -190
  50. package/dist/__tests__/commands/deploy.test.js.map +0 -1
  51. package/dist/__tests__/commands/history.test.d.ts +0 -8
  52. package/dist/__tests__/commands/history.test.d.ts.map +0 -1
  53. package/dist/__tests__/commands/history.test.js +0 -213
  54. package/dist/__tests__/commands/history.test.js.map +0 -1
  55. package/dist/__tests__/commands/import.test.d.ts +0 -4
  56. package/dist/__tests__/commands/import.test.d.ts.map +0 -1
  57. package/dist/__tests__/commands/import.test.js +0 -71
  58. package/dist/__tests__/commands/import.test.js.map +0 -1
  59. package/dist/__tests__/commands/logs.test.d.ts +0 -5
  60. package/dist/__tests__/commands/logs.test.d.ts.map +0 -1
  61. package/dist/__tests__/commands/logs.test.js +0 -124
  62. package/dist/__tests__/commands/logs.test.js.map +0 -1
  63. package/dist/__tests__/commands/migrate.test.d.ts +0 -9
  64. package/dist/__tests__/commands/migrate.test.d.ts.map +0 -1
  65. package/dist/__tests__/commands/migrate.test.js +0 -277
  66. package/dist/__tests__/commands/migrate.test.js.map +0 -1
  67. package/dist/__tests__/commands/pages.test.d.ts +0 -5
  68. package/dist/__tests__/commands/pages.test.d.ts.map +0 -1
  69. package/dist/__tests__/commands/pages.test.js +0 -103
  70. package/dist/__tests__/commands/pages.test.js.map +0 -1
  71. package/dist/__tests__/commands/push.test.d.ts +0 -6
  72. package/dist/__tests__/commands/push.test.d.ts.map +0 -1
  73. package/dist/__tests__/commands/push.test.js +0 -113
  74. package/dist/__tests__/commands/push.test.js.map +0 -1
  75. package/dist/__tests__/commands/sandbox.test.d.ts +0 -5
  76. package/dist/__tests__/commands/sandbox.test.d.ts.map +0 -1
  77. package/dist/__tests__/commands/sandbox.test.js +0 -132
  78. package/dist/__tests__/commands/sandbox.test.js.map +0 -1
  79. package/dist/__tests__/commands/serve.test.d.ts +0 -5
  80. package/dist/__tests__/commands/serve.test.d.ts.map +0 -1
  81. package/dist/__tests__/commands/serve.test.js +0 -115
  82. package/dist/__tests__/commands/serve.test.js.map +0 -1
  83. package/dist/__tests__/commands/site.test.d.ts +0 -5
  84. package/dist/__tests__/commands/site.test.d.ts.map +0 -1
  85. package/dist/__tests__/commands/site.test.js +0 -92
  86. package/dist/__tests__/commands/site.test.js.map +0 -1
  87. package/dist/__tests__/commands/test.test.d.ts +0 -5
  88. package/dist/__tests__/commands/test.test.d.ts.map +0 -1
  89. package/dist/__tests__/commands/test.test.js +0 -220
  90. package/dist/__tests__/commands/test.test.js.map +0 -1
  91. package/dist/__tests__/integration/smoke.test.d.ts +0 -7
  92. package/dist/__tests__/integration/smoke.test.d.ts.map +0 -1
  93. package/dist/__tests__/integration/smoke.test.js +0 -135
  94. package/dist/__tests__/integration/smoke.test.js.map +0 -1
  95. package/dist/__tests__/lib/api-client.test.d.ts +0 -6
  96. package/dist/__tests__/lib/api-client.test.d.ts.map +0 -1
  97. package/dist/__tests__/lib/api-client.test.js +0 -74
  98. package/dist/__tests__/lib/api-client.test.js.map +0 -1
  99. package/dist/__tests__/lib/company-isolation.test.d.ts +0 -19
  100. package/dist/__tests__/lib/company-isolation.test.d.ts.map +0 -1
  101. package/dist/__tests__/lib/company-isolation.test.js +0 -96
  102. package/dist/__tests__/lib/company-isolation.test.js.map +0 -1
  103. package/dist/__tests__/lib/config.test.d.ts +0 -6
  104. package/dist/__tests__/lib/config.test.d.ts.map +0 -1
  105. package/dist/__tests__/lib/config.test.js +0 -131
  106. package/dist/__tests__/lib/config.test.js.map +0 -1
  107. package/dist/__tests__/setup.d.ts +0 -4
  108. package/dist/__tests__/setup.d.ts.map +0 -1
  109. package/dist/__tests__/setup.js +0 -25
  110. package/dist/__tests__/setup.js.map +0 -1
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ /**
3
+ * Demo company for agency prospects — the killer sales tool
4
+ *
5
+ * solid demo create plumber "Joe's Plumbing" → Live demo with AI
6
+ * solid demo create plumber "Joe's" --expires 72h → Auto-destroys after 72h
7
+ * solid demo list → Active demos
8
+ * solid demo convert <id> --tier starter → Convert demo to paid
9
+ * solid demo delete <id> → Clean up
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.demoCommand = void 0;
49
+ const commander_1 = require("commander");
50
+ const chalk_1 = __importDefault(require("chalk"));
51
+ const config_1 = require("../lib/config");
52
+ const api_client_1 = require("../lib/api-client");
53
+ const ui_1 = require("../lib/ui");
54
+ exports.demoCommand = new commander_1.Command('demo')
55
+ .description('Create live demo companies for prospects — AI answers the phone');
56
+ // ── Create demo ──────────────────────────────────────────────────
57
+ exports.demoCommand
58
+ .command('create <template> <name>')
59
+ .description('Spin up a live demo with AI agents and a real phone number')
60
+ .option('--expires <duration>', 'Auto-destroy after duration (e.g., 72h, 7d)', '72h')
61
+ .option('--password <pass>', 'Set a demo login password')
62
+ .option('--open', 'Open in browser after creation')
63
+ .action(async (template, name, options) => {
64
+ if (!config_1.config.isLoggedIn()) {
65
+ console.error(chalk_1.default.red('Not logged in. Run `solid auth login` first.'));
66
+ process.exit(1);
67
+ }
68
+ const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
69
+ const originalCompanyId = config_1.config.companyId;
70
+ console.log('');
71
+ console.log(ui_1.ui.header(`Creating Demo — ${name}`));
72
+ console.log('');
73
+ const spinner = ora('Provisioning company...').start();
74
+ try {
75
+ // Step 1: Create company
76
+ const createRes = await api_client_1.apiClient.companyCreate(name);
77
+ const company = createRes.data.company || createRes.data;
78
+ const companyId = company.id || company.company_id;
79
+ const slug = company.slug || name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
80
+ // Step 2: Switch and apply template
81
+ spinner.text = 'Applying industry template...';
82
+ await api_client_1.apiClient.companySwitch(companyId);
83
+ await api_client_1.apiClient.templateClone(template);
84
+ // Step 3: Set demo metadata (expires, password)
85
+ spinner.text = 'Configuring demo...';
86
+ const expiresHours = parseExpires(options.expires);
87
+ const expiresAt = new Date(Date.now() + expiresHours * 60 * 60 * 1000);
88
+ await api_client_1.apiClient.post('/api/v1/companies/me/settings', {
89
+ demo_mode: true,
90
+ demo_expires_at: expiresAt.toISOString(),
91
+ demo_password: options.password || `demo-${Date.now().toString(36).slice(-4)}`,
92
+ }).catch(() => { }); // Best-effort — settings endpoint may not support all fields yet
93
+ // Step 4: Check if voice/phone is available
94
+ let phoneNumber = null;
95
+ try {
96
+ spinner.text = 'Checking voice AI...';
97
+ const phoneRes = await api_client_1.apiClient.get('/api/v1/phone-numbers');
98
+ const phones = phoneRes.data.phone_numbers || [];
99
+ if (phones.length > 0) {
100
+ phoneNumber = phones[0].number || phones[0].phone_number;
101
+ }
102
+ }
103
+ catch {
104
+ // Voice not provisioned — skip
105
+ }
106
+ // Switch back to original company
107
+ if (originalCompanyId && originalCompanyId !== companyId) {
108
+ await api_client_1.apiClient.companySwitch(originalCompanyId).catch(() => { });
109
+ config_1.config.companyId = originalCompanyId;
110
+ }
111
+ spinner.succeed(chalk_1.default.green('Demo ready'));
112
+ console.log('');
113
+ console.log(` ${chalk_1.default.bold('Company ID:')} ${companyId}`);
114
+ console.log(` ${chalk_1.default.bold('Template:')} ${template}`);
115
+ console.log(` ${chalk_1.default.bold('URL:')} ${chalk_1.default.cyan(`https://${slug}.solidnumber.com`)}`);
116
+ if (phoneNumber) {
117
+ console.log(` ${chalk_1.default.bold('AI Phone:')} ${chalk_1.default.green(phoneNumber)} ${chalk_1.default.dim('— call it live')}`);
118
+ }
119
+ console.log(` ${chalk_1.default.bold('Password:')} ${options.password || chalk_1.default.dim('(auto-generated)')}`);
120
+ console.log(` ${chalk_1.default.bold('Expires:')} ${expiresAt.toLocaleDateString()} ${expiresAt.toLocaleTimeString()} ${chalk_1.default.dim(`(${options.expires})`)}`);
121
+ console.log('');
122
+ console.log(chalk_1.default.dim(' Share the URL with your prospect.'));
123
+ if (phoneNumber) {
124
+ console.log(chalk_1.default.dim(' Have them call the number — AI answers as their business.'));
125
+ }
126
+ console.log('');
127
+ console.log(` ${chalk_1.default.dim('Convert to paid:')} ${chalk_1.default.cyan(`solid demo convert ${companyId} --tier starter`)}`);
128
+ console.log(` ${chalk_1.default.dim('Clean up:')} ${chalk_1.default.cyan(`solid demo delete ${companyId}`)}`);
129
+ console.log('');
130
+ if (options.open) {
131
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
132
+ exec(`open "https://${slug}.solidnumber.com"`);
133
+ }
134
+ }
135
+ catch (error) {
136
+ spinner.fail(chalk_1.default.red('Failed to create demo'));
137
+ console.error((0, api_client_1.handleApiError)(error).message);
138
+ // Restore original company
139
+ if (originalCompanyId) {
140
+ await api_client_1.apiClient.companySwitch(originalCompanyId).catch(() => { });
141
+ config_1.config.companyId = originalCompanyId;
142
+ }
143
+ }
144
+ });
145
+ // ── Convert demo to paid ─────────────────────────────────────────
146
+ exports.demoCommand
147
+ .command('convert <companyId>')
148
+ .description('Convert a demo to a paid company')
149
+ .option('--tier <tier>', 'Subscription tier (starter, builder, professional, enterprise)', 'starter')
150
+ .action(async (companyId, options) => {
151
+ if (!config_1.config.isLoggedIn()) {
152
+ console.error(chalk_1.default.red('Not logged in. Run `solid auth login` first.'));
153
+ process.exit(1);
154
+ }
155
+ const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
156
+ const spinner = ora(`Converting company ${companyId} to ${options.tier}...`).start();
157
+ try {
158
+ // Generate a checkout link for the company
159
+ const res = await api_client_1.apiClient.post('/api/v1/billing/checkout-link', {
160
+ company_id: parseInt(companyId),
161
+ tier: options.tier,
162
+ });
163
+ const data = res.data;
164
+ const checkoutUrl = data.url || data.checkout_url;
165
+ if (checkoutUrl) {
166
+ spinner.succeed(chalk_1.default.green('Checkout link generated'));
167
+ console.log('');
168
+ console.log(` ${chalk_1.default.bold('Tier:')} ${options.tier}`);
169
+ console.log(` ${chalk_1.default.bold('Checkout:')} ${chalk_1.default.cyan(checkoutUrl)}`);
170
+ console.log('');
171
+ console.log(chalk_1.default.dim(' Send this link to the client to complete payment.'));
172
+ console.log(chalk_1.default.dim(' Once paid, demo restrictions are removed automatically.'));
173
+ console.log('');
174
+ // Try to open in browser
175
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
176
+ exec(`open "${checkoutUrl}"`);
177
+ }
178
+ else {
179
+ spinner.succeed(chalk_1.default.green('Company converted'));
180
+ console.log(chalk_1.default.dim(' Demo mode disabled. Company is now active.'));
181
+ }
182
+ }
183
+ catch (error) {
184
+ spinner.fail(chalk_1.default.red('Failed to convert'));
185
+ console.error((0, api_client_1.handleApiError)(error).message);
186
+ }
187
+ });
188
+ // ── List demos ───────────────────────────────────────────────────
189
+ exports.demoCommand
190
+ .command('list')
191
+ .description('List all companies (find your demos)')
192
+ .action(async () => {
193
+ if (!config_1.config.isLoggedIn()) {
194
+ console.error(chalk_1.default.red('Not logged in. Run `solid auth login` first.'));
195
+ process.exit(1);
196
+ }
197
+ const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
198
+ const spinner = ora('Loading companies...').start();
199
+ try {
200
+ const res = await api_client_1.apiClient.companiesList();
201
+ const companies = res.data.companies || [];
202
+ spinner.stop();
203
+ console.log('');
204
+ console.log(ui_1.ui.header(`${companies.length} Companies`));
205
+ console.log('');
206
+ for (const c of companies) {
207
+ const isActive = c.id === config_1.config.companyId;
208
+ const marker = isActive ? chalk_1.default.green('● ') : ' ';
209
+ console.log(`${marker}${chalk_1.default.bold(c.name)} ${chalk_1.default.dim('ID:' + c.id)} ${chalk_1.default.dim(c.role)}`);
210
+ }
211
+ console.log('');
212
+ console.log(chalk_1.default.dim(' Convert: solid demo convert <id> --tier starter'));
213
+ console.log(chalk_1.default.dim(' Delete: solid demo delete <id>'));
214
+ console.log('');
215
+ }
216
+ catch (error) {
217
+ spinner.fail(chalk_1.default.red('Failed'));
218
+ console.error((0, api_client_1.handleApiError)(error).message);
219
+ }
220
+ });
221
+ // ── Delete demo ──────────────────────────────────────────────────
222
+ exports.demoCommand
223
+ .command('delete <companyId>')
224
+ .description('Delete a demo company')
225
+ .action(async (companyId) => {
226
+ if (!config_1.config.isLoggedIn()) {
227
+ console.error(chalk_1.default.red('Not logged in. Run `solid auth login` first.'));
228
+ process.exit(1);
229
+ }
230
+ const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
231
+ const spinner = ora(`Deleting company ${companyId}...`).start();
232
+ try {
233
+ await api_client_1.apiClient.delete(`/api/v1/cli/companies/${companyId}`);
234
+ spinner.succeed(chalk_1.default.green(`Company ${companyId} deleted`));
235
+ }
236
+ catch (error) {
237
+ spinner.fail(chalk_1.default.red('Failed to delete'));
238
+ console.error((0, api_client_1.handleApiError)(error).message);
239
+ console.log(chalk_1.default.dim(' Note: Only demo/test companies can be deleted via CLI.'));
240
+ }
241
+ });
242
+ // ── Helpers ──────────────────────────────────────────────────────
243
+ function parseExpires(duration) {
244
+ const match = duration.match(/^(\d+)(h|d|w)$/);
245
+ if (!match)
246
+ return 72; // default 72 hours
247
+ const [, num, unit] = match;
248
+ const n = parseInt(num);
249
+ if (unit === 'h')
250
+ return n;
251
+ if (unit === 'd')
252
+ return n * 24;
253
+ if (unit === 'w')
254
+ return n * 24 * 7;
255
+ return 72;
256
+ }
257
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Project scaffolding — build apps on Solid# infrastructure
3
+ *
4
+ * solid init my-app → Interactive setup
5
+ * solid init my-app --type marketplace → Marketplace template
6
+ * solid init my-app --type saas → SaaS starter
7
+ * solid init my-app --type agency-dashboard → Agency management tool
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare const initCommand: Command;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyPpC,eAAO,MAAM,WAAW,SA4FpB,CAAC"}
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+ /**
3
+ * Project scaffolding — build apps on Solid# infrastructure
4
+ *
5
+ * solid init my-app → Interactive setup
6
+ * solid init my-app --type marketplace → Marketplace template
7
+ * solid init my-app --type saas → SaaS starter
8
+ * solid init my-app --type agency-dashboard → Agency management tool
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ var __importDefault = (this && this.__importDefault) || function (mod) {
44
+ return (mod && mod.__esModule) ? mod : { "default": mod };
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.initCommand = void 0;
48
+ const commander_1 = require("commander");
49
+ const chalk_1 = __importDefault(require("chalk"));
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const config_1 = require("../lib/config");
53
+ const ui_1 = require("../lib/ui");
54
+ const APP_TYPES = {
55
+ basic: {
56
+ name: 'Basic App',
57
+ description: 'Simple app connected to Solid# API',
58
+ files: {
59
+ 'package.json': JSON.stringify({
60
+ name: '{{name}}',
61
+ version: '0.1.0',
62
+ scripts: { start: 'node index.js', dev: 'node --watch index.js' },
63
+ dependencies: { '@solidnumber/sdk': '^1.0.0' },
64
+ }, null, 2),
65
+ 'index.js': `const { SolidClient } = require('@solidnumber/sdk');
66
+
67
+ const solid = new SolidClient({
68
+ apiKey: process.env.SOLID_API_KEY,
69
+ companyId: process.env.SOLID_COMPANY_ID ? parseInt(process.env.SOLID_COMPANY_ID) : undefined,
70
+ });
71
+
72
+ async function main() {
73
+ // Your app starts here
74
+ const health = await solid.health.check();
75
+ console.log('Connected to Solid#:', health.data.status);
76
+
77
+ const contacts = await solid.crm.contacts();
78
+ console.log('Contacts:', contacts.data);
79
+ }
80
+
81
+ main().catch(console.error);
82
+ `,
83
+ '.env.example': `SOLID_API_KEY=sk_solid_your_key_here
84
+ SOLID_COMPANY_ID=
85
+ `,
86
+ 'README.md': `# {{name}}
87
+
88
+ Built on [Solid#](https://solidnumber.com) infrastructure.
89
+
90
+ ## Setup
91
+
92
+ 1. \`npm install\`
93
+ 2. Copy \`.env.example\` to \`.env\` and add your API key
94
+ 3. \`npm start\`
95
+
96
+ ## Get your API key
97
+
98
+ \`\`\`bash
99
+ solid auth login
100
+ solid auth token create -n "{{name}}" -s "crm:read,pages:read,kb:read"
101
+ \`\`\`
102
+ `,
103
+ },
104
+ },
105
+ marketplace: {
106
+ name: 'Multi-Vendor Marketplace',
107
+ description: 'Each vendor is a Solid# company with AI agents',
108
+ files: {
109
+ 'package.json': JSON.stringify({
110
+ name: '{{name}}',
111
+ version: '0.1.0',
112
+ scripts: { start: 'node server.js', dev: 'node --watch server.js' },
113
+ dependencies: { '@solidnumber/sdk': '^1.0.0', express: '^4.18.0' },
114
+ }, null, 2),
115
+ 'server.js': `const express = require('express');
116
+ const { SolidClient } = require('@solidnumber/sdk');
117
+
118
+ const app = express();
119
+ const solid = new SolidClient({ apiKey: process.env.SOLID_API_KEY });
120
+
121
+ // List all vendor companies
122
+ app.get('/vendors', async (req, res) => {
123
+ const companies = await solid.companies.list();
124
+ res.json(companies.data);
125
+ });
126
+
127
+ // Vendor storefront — switch company context per request
128
+ app.get('/vendor/:companyId/products', async (req, res) => {
129
+ solid.switchCompany(parseInt(req.params.companyId));
130
+ const services = await solid.services.list();
131
+ res.json(services.data);
132
+ });
133
+
134
+ // Vendor AI chat
135
+ app.post('/vendor/:companyId/chat', express.json(), async (req, res) => {
136
+ solid.switchCompany(parseInt(req.params.companyId));
137
+ const reply = await solid.agents.chat('sarah', req.body.message);
138
+ res.json(reply.data);
139
+ });
140
+
141
+ app.listen(3000, () => console.log('Marketplace running on :3000'));
142
+ `,
143
+ '.env.example': `SOLID_API_KEY=sk_solid_your_key_here
144
+ `,
145
+ 'README.md': `# {{name}} — Multi-Vendor Marketplace
146
+
147
+ Each vendor is a Solid# company with their own AI agents, CRM, and services.
148
+
149
+ ## Architecture
150
+ - Each vendor = one Solid# company (created via \`solid company create\`)
151
+ - Vendor onboarding = \`solid clone <template> --company "Vendor Name"\`
152
+ - Each vendor gets AI agents, CRM, booking, payments
153
+ - Your app is the frontend connecting them all
154
+
155
+ ## Setup
156
+ 1. \`npm install\`
157
+ 2. Set \`SOLID_API_KEY\` in \`.env\`
158
+ 3. \`npm start\`
159
+ `,
160
+ },
161
+ },
162
+ saas: {
163
+ name: 'SaaS Starter',
164
+ description: 'Multi-tenant SaaS with Solid# backend',
165
+ files: {
166
+ 'package.json': JSON.stringify({
167
+ name: '{{name}}',
168
+ version: '0.1.0',
169
+ scripts: { start: 'node server.js', dev: 'node --watch server.js' },
170
+ dependencies: { '@solidnumber/sdk': '^1.0.0', express: '^4.18.0' },
171
+ }, null, 2),
172
+ 'server.js': `const express = require('express');
173
+ const { SolidClient } = require('@solidnumber/sdk');
174
+
175
+ const app = express();
176
+ app.use(express.json());
177
+
178
+ // Each customer = a Solid# company
179
+ // Your SaaS manages the companies, Solid# handles everything else
180
+
181
+ const admin = new SolidClient({ apiKey: process.env.SOLID_API_KEY });
182
+
183
+ // Onboard new customer
184
+ app.post('/signup', async (req, res) => {
185
+ const { businessName, industry } = req.body;
186
+
187
+ // Create company on Solid#
188
+ const company = await admin.companies.create(businessName, industry);
189
+ const companyId = company.data.company.id;
190
+
191
+ // Apply industry template
192
+ admin.switchCompany(companyId);
193
+ await admin.templates.clone(industry);
194
+
195
+ res.json({
196
+ companyId,
197
+ message: 'Business created with AI agents, website, CRM, and more',
198
+ dashboard: \`https://app.solidnumber.com/dashboard\`,
199
+ });
200
+ });
201
+
202
+ // Customer dashboard data
203
+ app.get('/customer/:id/dashboard', async (req, res) => {
204
+ admin.switchCompany(parseInt(req.params.id));
205
+ const [contacts, pages, agents] = await Promise.all([
206
+ admin.crm.contacts(),
207
+ admin.pages.list(),
208
+ admin.agents.list(),
209
+ ]);
210
+ res.json({ contacts: contacts.data, pages: pages.data, agents: agents.data });
211
+ });
212
+
213
+ app.listen(3000, () => console.log('SaaS running on :3000'));
214
+ `,
215
+ '.env.example': `SOLID_API_KEY=sk_solid_your_key_here
216
+ `,
217
+ 'README.md': `# {{name}} — SaaS on Solid#
218
+
219
+ Multi-tenant SaaS where each customer gets a full AI-powered business.
220
+
221
+ ## How it works
222
+ - \`POST /signup\` creates a Solid# company + applies industry template
223
+ - Each customer gets: AI agents, CRM, website, booking, payments
224
+ - You build the custom UI, Solid# handles the infrastructure
225
+
226
+ ## What you DON'T have to build
227
+ - Auth & multi-tenancy (530 tables with RLS)
228
+ - Payment processing (Stripe wired)
229
+ - AI agents (116 agents, SmartRouter, CognitiveLimiter)
230
+ - CRM, voice AI, website builder, SEO
231
+ `,
232
+ },
233
+ },
234
+ 'agency-dashboard': {
235
+ name: 'Agency Dashboard',
236
+ description: 'Manage all client companies from one interface',
237
+ files: {
238
+ 'package.json': JSON.stringify({
239
+ name: '{{name}}',
240
+ version: '0.1.0',
241
+ scripts: { start: 'node server.js', dev: 'node --watch server.js' },
242
+ dependencies: { '@solidnumber/sdk': '^1.0.0', express: '^4.18.0' },
243
+ }, null, 2),
244
+ 'server.js': `const express = require('express');
245
+ const { SolidClient } = require('@solidnumber/sdk');
246
+
247
+ const app = express();
248
+ const solid = new SolidClient({ apiKey: process.env.SOLID_API_KEY });
249
+
250
+ // All clients overview
251
+ app.get('/clients', async (req, res) => {
252
+ const companies = await solid.companies.list();
253
+ res.json(companies.data);
254
+ });
255
+
256
+ // Client health check
257
+ app.get('/clients/:id/health', async (req, res) => {
258
+ solid.switchCompany(parseInt(req.params.id));
259
+ const [health, agents] = await Promise.all([
260
+ solid.health.check(),
261
+ solid.agents.list(),
262
+ ]);
263
+ res.json({ health: health.data, agents: agents.data });
264
+ });
265
+
266
+ // Bulk KB update across all clients
267
+ app.post('/bulk/kb', express.json(), async (req, res) => {
268
+ const companies = await solid.companies.list();
269
+ const results = [];
270
+ for (const c of companies.data.companies) {
271
+ solid.switchCompany(c.id);
272
+ const result = await solid.kb.create(req.body).catch(e => ({ error: e.message }));
273
+ results.push({ company: c.name, result });
274
+ }
275
+ res.json(results);
276
+ });
277
+
278
+ app.listen(3000, () => console.log('Agency dashboard on :3000'));
279
+ `,
280
+ '.env.example': `SOLID_API_KEY=sk_solid_your_key_here
281
+ `,
282
+ 'README.md': `# {{name}} — Agency Dashboard
283
+
284
+ Manage all your Solid# client companies from one place.
285
+
286
+ ## Features
287
+ - View all clients at a glance
288
+ - Per-client health monitoring
289
+ - Bulk KB updates across all clients
290
+ - Revenue tracking per client
291
+ `,
292
+ },
293
+ },
294
+ };
295
+ exports.initCommand = new commander_1.Command('init')
296
+ .description('Scaffold a new app on Solid# infrastructure')
297
+ .argument('<name>', 'Project name')
298
+ .option('-t, --type <type>', 'App type (basic, marketplace, saas, agency-dashboard)', 'basic')
299
+ .option('--list', 'List available app types')
300
+ .action(async (name, options) => {
301
+ if (options.list) {
302
+ console.log('');
303
+ console.log(ui_1.ui.header('App Templates'));
304
+ console.log('');
305
+ for (const [key, tmpl] of Object.entries(APP_TYPES)) {
306
+ console.log(` ${chalk_1.default.bold.cyan(key.padEnd(20))} ${tmpl.name}`);
307
+ console.log(` ${' '.repeat(20)} ${chalk_1.default.dim(tmpl.description)}`);
308
+ }
309
+ console.log('');
310
+ console.log(chalk_1.default.dim(' Usage: solid init my-app --type marketplace'));
311
+ console.log('');
312
+ return;
313
+ }
314
+ const appType = APP_TYPES[options.type];
315
+ if (!appType) {
316
+ console.error(chalk_1.default.red(`Unknown type: ${options.type}`));
317
+ console.log(chalk_1.default.dim(` Available: ${Object.keys(APP_TYPES).join(', ')}`));
318
+ process.exit(1);
319
+ }
320
+ const projectDir = path.resolve(name);
321
+ if (fs.existsSync(projectDir)) {
322
+ console.error(chalk_1.default.red(`Directory already exists: ${projectDir}`));
323
+ process.exit(1);
324
+ }
325
+ const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
326
+ const spinner = ora(`Scaffolding ${appType.name}...`).start();
327
+ fs.mkdirSync(projectDir, { recursive: true });
328
+ for (const [filename, content] of Object.entries(appType.files)) {
329
+ const filePath = path.join(projectDir, filename);
330
+ const rendered = content.replace(/\{\{name\}\}/g, name);
331
+ fs.writeFileSync(filePath, rendered);
332
+ }
333
+ // Copy .gitignore
334
+ fs.writeFileSync(path.join(projectDir, '.gitignore'), 'node_modules/\n.env\ndist/\n');
335
+ // Generate CLAUDE.md for AI context
336
+ const claudeMd = `# ${name}
337
+
338
+ Built on [Solid#](https://solidnumber.com) infrastructure.
339
+
340
+ ## Architecture
341
+ - Backend: Solid# API (${config_1.config.apiUrl || 'https://api.solidnumber.com'})
342
+ - SDK: @solidnumber/sdk
343
+ - Type: ${appType.name}
344
+
345
+ ## API Key
346
+ Set \`SOLID_API_KEY\` in \`.env\`. Create one with:
347
+ \`\`\`bash
348
+ solid auth token create -n "${name}" -s "crm:read,pages:read,kb:read,agents:read"
349
+ \`\`\`
350
+
351
+ ## Solid# Resources
352
+ - API Docs: https://solidnumber.com/docs/api
353
+ - SDK Docs: https://solidnumber.com/docs/sdks
354
+ - CLI: npm i -g @solidnumber/cli
355
+ `;
356
+ fs.writeFileSync(path.join(projectDir, 'CLAUDE.md'), claudeMd);
357
+ spinner.succeed(chalk_1.default.green(`${appType.name} scaffolded`));
358
+ console.log('');
359
+ console.log(` ${chalk_1.default.bold('Project:')} ${name}`);
360
+ console.log(` ${chalk_1.default.bold('Type:')} ${appType.name}`);
361
+ console.log(` ${chalk_1.default.bold('Path:')} ${projectDir}`);
362
+ console.log('');
363
+ const files = Object.keys(appType.files);
364
+ for (const f of files) {
365
+ console.log(chalk_1.default.dim(` ${f}`));
366
+ }
367
+ console.log(chalk_1.default.dim(' .gitignore'));
368
+ console.log(chalk_1.default.dim(' CLAUDE.md'));
369
+ console.log('');
370
+ console.log(chalk_1.default.bold(' Next steps:'));
371
+ console.log(` ${chalk_1.default.cyan(`cd ${name}`)}`);
372
+ console.log(` ${chalk_1.default.cyan('npm install')}`);
373
+ console.log(` ${chalk_1.default.cyan('cp .env.example .env')} ${chalk_1.default.dim('← add your API key')}`);
374
+ console.log(` ${chalk_1.default.cyan('npm start')}`);
375
+ console.log('');
376
+ });
377
+ //# sourceMappingURL=init.js.map