@optima-chat/bi-cli 0.2.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 (44) hide show
  1. package/dist/commands/analytics.d.ts +3 -0
  2. package/dist/commands/analytics.d.ts.map +1 -0
  3. package/dist/commands/analytics.js +228 -0
  4. package/dist/commands/analytics.js.map +1 -0
  5. package/dist/commands/auth.d.ts +3 -0
  6. package/dist/commands/auth.d.ts.map +1 -0
  7. package/dist/commands/auth.js +214 -0
  8. package/dist/commands/auth.js.map +1 -0
  9. package/dist/commands/product.d.ts +3 -0
  10. package/dist/commands/product.d.ts.map +1 -0
  11. package/dist/commands/product.js +199 -0
  12. package/dist/commands/product.js.map +1 -0
  13. package/dist/commands/sales.d.ts +3 -0
  14. package/dist/commands/sales.d.ts.map +1 -0
  15. package/dist/commands/sales.js +85 -0
  16. package/dist/commands/sales.js.map +1 -0
  17. package/dist/commands/trends.d.ts +3 -0
  18. package/dist/commands/trends.d.ts.map +1 -0
  19. package/dist/commands/trends.js +224 -0
  20. package/dist/commands/trends.js.map +1 -0
  21. package/dist/config/index.d.ts +21 -0
  22. package/dist/config/index.d.ts.map +1 -0
  23. package/dist/config/index.js +39 -0
  24. package/dist/config/index.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +52 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/utils/output.d.ts +11 -0
  30. package/dist/utils/output.d.ts.map +1 -0
  31. package/dist/utils/output.js +45 -0
  32. package/dist/utils/output.js.map +1 -0
  33. package/package.json +39 -0
  34. package/src/commands/analytics.ts +352 -0
  35. package/src/commands/auth.ts +277 -0
  36. package/src/commands/product.ts +327 -0
  37. package/src/commands/sales.ts +125 -0
  38. package/src/commands/trends.ts +355 -0
  39. package/src/config/index.ts +50 -0
  40. package/src/index.ts +64 -0
  41. package/src/utils/output.ts +52 -0
  42. package/test-auth.js +63 -0
  43. package/test-sales.js +45 -0
  44. package/tsconfig.json +13 -0
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createAnalyticsCommand(): Command;
3
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/commands/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyEpC,wBAAgB,sBAAsB,IAAI,OAAO,CAsQhD"}
@@ -0,0 +1,228 @@
1
+ import { Command } from 'commander';
2
+ import axios from 'axios';
3
+ import { getConfig } from '../config/index.js';
4
+ import { outputJson, outputPretty, error, OutputFormat, info } from '../utils/output.js';
5
+ export function createAnalyticsCommand() {
6
+ const analytics = new Command('analytics').description('Advanced analytics');
7
+ // analytics compare
8
+ analytics
9
+ .command('compare')
10
+ .description('Compare current period with previous period')
11
+ .option('--days <number>', 'Number of days', '30')
12
+ .option('--compare-to <type>', 'Compare to: previous_period or previous_year', 'previous_period')
13
+ .option('--pretty', 'Output in pretty table format')
14
+ .action(async (options) => {
15
+ const cfg = getConfig();
16
+ if (!cfg.accessToken) {
17
+ error('Not logged in. Run: bi-cli auth login');
18
+ process.exit(1);
19
+ }
20
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
21
+ try {
22
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/analytics/compare`, {
23
+ params: { days: options.days, compare_to: options.compareTo },
24
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
25
+ });
26
+ if (!response.data.success) {
27
+ error('Failed to fetch comparison data');
28
+ process.exit(1);
29
+ }
30
+ const { current, previous, changes, period } = response.data.data;
31
+ if (format === OutputFormat.JSON) {
32
+ outputJson(response.data.data);
33
+ }
34
+ else {
35
+ console.log(`\nšŸ“Š Period Comparison (${period.days} days vs ${period.compare_to.replace('_', ' ')})\n`);
36
+ const formatChange = (pct) => {
37
+ if (pct === null)
38
+ return '-';
39
+ const icon = pct > 0 ? '↑' : pct < 0 ? '↓' : '→';
40
+ const color = pct > 0 ? '+' : '';
41
+ return `${icon} ${color}${pct.toFixed(1)}%`;
42
+ };
43
+ const formatCurrency = (val) => {
44
+ if (val === null)
45
+ return '-';
46
+ return `Ā„${val.toFixed(2)}`;
47
+ };
48
+ outputPretty([
49
+ {
50
+ Metric: 'Revenue',
51
+ Current: formatCurrency(current.revenue),
52
+ Previous: formatCurrency(previous.revenue),
53
+ Change: formatChange(changes.revenue.percentage),
54
+ },
55
+ {
56
+ Metric: 'Orders',
57
+ Current: current.orders,
58
+ Previous: previous.orders,
59
+ Change: formatChange(changes.orders.percentage),
60
+ },
61
+ {
62
+ Metric: 'Avg Order Value',
63
+ Current: formatCurrency(current.avg_order_value),
64
+ Previous: formatCurrency(previous.avg_order_value),
65
+ Change: formatChange(changes.avg_order_value.percentage),
66
+ },
67
+ {
68
+ Metric: 'Customers',
69
+ Current: current.customers,
70
+ Previous: previous.customers,
71
+ Change: formatChange(changes.customers.percentage),
72
+ },
73
+ ], ['Metric', 'Current', 'Previous', 'Change']);
74
+ }
75
+ }
76
+ catch (err) {
77
+ handleApiError(err);
78
+ }
79
+ });
80
+ // analytics growth
81
+ analytics
82
+ .command('growth')
83
+ .description('Get growth trends over time')
84
+ .option('--period <type>', 'Period type: daily, weekly, monthly', 'daily')
85
+ .option('--limit <number>', 'Number of periods', '30')
86
+ .option('--pretty', 'Output in pretty table format')
87
+ .action(async (options) => {
88
+ const cfg = getConfig();
89
+ if (!cfg.accessToken) {
90
+ error('Not logged in. Run: bi-cli auth login');
91
+ process.exit(1);
92
+ }
93
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
94
+ try {
95
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/analytics/growth`, {
96
+ params: { period: options.period, limit: options.limit },
97
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
98
+ });
99
+ if (!response.data.success) {
100
+ error('Failed to fetch growth data');
101
+ process.exit(1);
102
+ }
103
+ const { trends, period_type } = response.data.data;
104
+ if (format === OutputFormat.JSON) {
105
+ outputJson(response.data.data);
106
+ }
107
+ else {
108
+ console.log(`\nšŸ“ˆ Growth Trends (${period_type})\n`);
109
+ const recentTrends = trends.slice(-15);
110
+ outputPretty(recentTrends.map((t) => ({
111
+ Period: t.period.split('T')[0],
112
+ Revenue: `Ā„${t.revenue.toFixed(2)}`,
113
+ Orders: t.orders,
114
+ Customers: t.customers,
115
+ Growth: t.revenue_growth !== null ? `${t.revenue_growth.toFixed(1)}%` : '-',
116
+ })), ['Period', 'Revenue', 'Orders', 'Customers', 'Growth']);
117
+ }
118
+ }
119
+ catch (err) {
120
+ handleApiError(err);
121
+ }
122
+ });
123
+ // analytics cohort
124
+ analytics
125
+ .command('cohort')
126
+ .description('Customer cohort analysis')
127
+ .option('--pretty', 'Output in pretty table format')
128
+ .action(async (options) => {
129
+ const cfg = getConfig();
130
+ if (!cfg.accessToken) {
131
+ error('Not logged in. Run: bi-cli auth login');
132
+ process.exit(1);
133
+ }
134
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
135
+ try {
136
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/analytics/cohort`, {
137
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
138
+ });
139
+ if (!response.data.success) {
140
+ error('Failed to fetch cohort data');
141
+ process.exit(1);
142
+ }
143
+ const { cohorts } = response.data.data;
144
+ if (format === OutputFormat.JSON) {
145
+ outputJson(response.data.data);
146
+ }
147
+ else {
148
+ console.log('\nšŸ‘„ Customer Cohort Analysis\n');
149
+ outputPretty(cohorts.map((c) => ({
150
+ Cohort: c.month.split('T')[0].slice(0, 7),
151
+ Customers: c.customers,
152
+ 'Avg LTV': `Ā„${c.avg_lifetime_value.toFixed(2)}`,
153
+ 'Avg Orders': c.avg_orders.toFixed(1),
154
+ 'Total Revenue': `Ā„${c.total_revenue.toFixed(2)}`,
155
+ })), ['Cohort', 'Customers', 'Avg LTV', 'Avg Orders', 'Total Revenue']);
156
+ }
157
+ }
158
+ catch (err) {
159
+ handleApiError(err);
160
+ }
161
+ });
162
+ // analytics funnel
163
+ analytics
164
+ .command('funnel')
165
+ .description('Order status funnel analysis')
166
+ .option('--days <number>', 'Number of days', '30')
167
+ .option('--pretty', 'Output in pretty table format')
168
+ .action(async (options) => {
169
+ const cfg = getConfig();
170
+ if (!cfg.accessToken) {
171
+ error('Not logged in. Run: bi-cli auth login');
172
+ process.exit(1);
173
+ }
174
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
175
+ try {
176
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/analytics/order-funnel`, {
177
+ params: { days: options.days },
178
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
179
+ });
180
+ if (!response.data.success) {
181
+ error('Failed to fetch funnel data');
182
+ process.exit(1);
183
+ }
184
+ const { funnel, dropoffs, total_orders, conversion_rate } = response.data.data;
185
+ if (format === OutputFormat.JSON) {
186
+ outputJson(response.data.data);
187
+ }
188
+ else {
189
+ console.log('\nšŸ”„ Order Funnel\n');
190
+ outputPretty(funnel.map((f) => ({
191
+ Stage: f.stage,
192
+ Count: f.count,
193
+ Amount: `Ā„${f.amount.toFixed(2)}`,
194
+ Percentage: `${f.percentage.toFixed(1)}%`,
195
+ })), ['Stage', 'Count', 'Amount', 'Percentage']);
196
+ if (dropoffs.length > 0) {
197
+ console.log('\nāŒ Dropoffs\n');
198
+ outputPretty(dropoffs.map((d) => ({
199
+ Status: d.status,
200
+ Count: d.count,
201
+ Amount: `Ā„${d.amount.toFixed(2)}`,
202
+ Percentage: `${d.percentage.toFixed(1)}%`,
203
+ })), ['Status', 'Count', 'Amount', 'Percentage']);
204
+ }
205
+ info(`Total Orders: ${total_orders} | Conversion Rate: ${conversion_rate.toFixed(1)}%`);
206
+ }
207
+ }
208
+ catch (err) {
209
+ handleApiError(err);
210
+ }
211
+ });
212
+ return analytics;
213
+ }
214
+ function handleApiError(err) {
215
+ const axiosError = err;
216
+ const errorObj = err;
217
+ if (axiosError.response?.status === 401) {
218
+ error('Authentication failed. Please login again: bi-cli auth login');
219
+ }
220
+ else if (axiosError.response?.data?.error) {
221
+ error(`Error: ${axiosError.response.data.error.message}`);
222
+ }
223
+ else {
224
+ error(`Request failed: ${errorObj.message || 'Unknown error'}`);
225
+ }
226
+ process.exit(1);
227
+ }
228
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/commands/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createAuthCommand(): Command;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,wBAAgB,iBAAiB,IAAI,OAAO,CAsP3C"}
@@ -0,0 +1,214 @@
1
+ import { Command } from 'commander';
2
+ import axios from 'axios';
3
+ import ora from 'ora';
4
+ import chalk from 'chalk';
5
+ import { setConfig, clearAuth, getConfig } from '../config/index.js';
6
+ import { success, error, info } from '../utils/output.js';
7
+ export function createAuthCommand() {
8
+ const auth = new Command('auth').description('Authentication commands');
9
+ // auth login
10
+ auth
11
+ .command('login')
12
+ .description('Login with OAuth 2.0 Device Flow')
13
+ .option('--env <environment>', 'Environment (production|stage|development)', 'production')
14
+ .action(async (options) => {
15
+ const { env } = options;
16
+ // Set URLs based on environment
17
+ const authUrls = {
18
+ production: 'https://auth.optima.chat',
19
+ stage: 'https://auth-stage.optima.chat',
20
+ development: 'http://localhost:4000',
21
+ };
22
+ const backendUrls = {
23
+ production: 'https://bi-api.optima.chat',
24
+ stage: 'https://bi-api-stage.optima.chat',
25
+ development: 'http://localhost:3001',
26
+ };
27
+ const authUrl = authUrls[env];
28
+ const backendUrl = backendUrls[env];
29
+ if (!authUrl || !backendUrl) {
30
+ error(`Invalid environment: ${env}`);
31
+ process.exit(1);
32
+ }
33
+ setConfig('environment', env);
34
+ setConfig('authUrl', authUrl);
35
+ setConfig('backendUrl', backendUrl);
36
+ info(`Logging in to ${env} environment...`);
37
+ try {
38
+ // Step 1: Request device code
39
+ const spinner = ora('Requesting device code...').start();
40
+ const deviceCodeRes = await axios.post(`${authUrl}/api/v1/oauth/device/authorize`, { client_id: 'bi-cli-aqkutatj' });
41
+ spinner.succeed('Device code received');
42
+ const { device_code, user_code, verification_uri, verification_uri_complete, expires_in, interval, } = deviceCodeRes.data;
43
+ // Use verification_uri_complete if available (includes code pre-filled)
44
+ const browserUrl = verification_uri_complete || verification_uri;
45
+ // Step 2: Display authorization instructions
46
+ console.log(chalk.bold('\nšŸ“‹ Authorization Required:\n'));
47
+ if (verification_uri_complete) {
48
+ console.log(` Opening browser with pre-filled code: ${chalk.yellow.bold(user_code)}`);
49
+ console.log(` URL: ${chalk.cyan(verification_uri_complete)}\n`);
50
+ }
51
+ else {
52
+ console.log(` 1. Visit: ${chalk.cyan(verification_uri)}`);
53
+ console.log(` 2. Enter code: ${chalk.yellow.bold(user_code)}\n`);
54
+ }
55
+ // Step 3: Open browser automatically
56
+ const { default: open } = await import('open');
57
+ await open(browserUrl);
58
+ info('Browser opened automatically');
59
+ // Step 4: Poll for token
60
+ const pollSpinner = ora('Waiting for authorization...').start();
61
+ const startTime = Date.now();
62
+ const expiresAt = startTime + expires_in * 1000;
63
+ let token = null;
64
+ let pollCount = 0;
65
+ while (Date.now() < expiresAt) {
66
+ await new Promise((resolve) => setTimeout(resolve, interval * 1000));
67
+ pollCount++;
68
+ try {
69
+ const tokenRes = await axios.post(`${authUrl}/api/v1/oauth/device/token`, new URLSearchParams({
70
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
71
+ client_id: 'bi-cli-aqkutatj',
72
+ device_code,
73
+ }), {
74
+ headers: {
75
+ 'Content-Type': 'application/x-www-form-urlencoded',
76
+ },
77
+ });
78
+ // Check if response contains an error (auth server returns 200 with error object)
79
+ if ('error' in tokenRes.data) {
80
+ const errorCode = tokenRes.data.error;
81
+ if (errorCode === 'authorization_pending') {
82
+ pollSpinner.text = `Waiting for authorization... (attempt ${pollCount})`;
83
+ continue;
84
+ }
85
+ else if (errorCode === 'slow_down') {
86
+ pollSpinner.text = `Slowing down polling... (attempt ${pollCount})`;
87
+ await new Promise((resolve) => setTimeout(resolve, 5000));
88
+ continue;
89
+ }
90
+ else {
91
+ pollSpinner.fail(`Polling failed: ${errorCode}`);
92
+ throw new Error(tokenRes.data.error_description);
93
+ }
94
+ }
95
+ token = tokenRes.data;
96
+ pollSpinner.text = `Authorization successful after ${pollCount} attempts`;
97
+ break;
98
+ }
99
+ catch (err) {
100
+ const error = err;
101
+ const errorCode = error.response?.data?.error;
102
+ if (errorCode === 'authorization_pending') {
103
+ // Continue polling
104
+ pollSpinner.text = `Waiting for authorization... (attempt ${pollCount})`;
105
+ continue;
106
+ }
107
+ else if (errorCode === 'slow_down') {
108
+ // Increase interval
109
+ pollSpinner.text = `Slowing down polling... (attempt ${pollCount})`;
110
+ await new Promise((resolve) => setTimeout(resolve, 5000));
111
+ continue;
112
+ }
113
+ else {
114
+ // Unexpected error
115
+ pollSpinner.fail(`Polling failed: ${errorCode || 'unknown error'}`);
116
+ throw err;
117
+ }
118
+ }
119
+ }
120
+ if (!token) {
121
+ pollSpinner.fail('Authorization timeout');
122
+ error('Please try again');
123
+ process.exit(1);
124
+ }
125
+ pollSpinner.succeed();
126
+ // Step 5: Save tokens
127
+ setConfig('accessToken', token.access_token);
128
+ setConfig('refreshToken', token.refresh_token);
129
+ // Step 6: Fetch user info (optional - just for display)
130
+ try {
131
+ const userInfo = await axios.get(`${authUrl}/api/v1/users/me`, {
132
+ headers: { Authorization: `Bearer ${token.access_token}` },
133
+ });
134
+ success(`Logged in as ${chalk.bold(userInfo.data.email)} (${userInfo.data.role})`);
135
+ }
136
+ catch (userInfoErr) {
137
+ // If fetching user info fails, still consider login successful
138
+ success('Login successful! Token saved.');
139
+ }
140
+ }
141
+ catch (err) {
142
+ const errorMsg = err instanceof Error ? err.message : 'Unknown error';
143
+ error(`Login failed: ${errorMsg}`);
144
+ process.exit(1);
145
+ }
146
+ });
147
+ // auth logout
148
+ auth
149
+ .command('logout')
150
+ .description('Logout and clear stored credentials')
151
+ .action(() => {
152
+ clearAuth();
153
+ success('Logged out successfully');
154
+ });
155
+ // auth whoami
156
+ auth
157
+ .command('whoami')
158
+ .description('Show current user information')
159
+ .action(async () => {
160
+ const cfg = getConfig();
161
+ if (!cfg.accessToken) {
162
+ error('Not logged in. Run: bi-cli auth login');
163
+ process.exit(1);
164
+ }
165
+ try {
166
+ const userInfo = await axios.get(`${cfg.authUrl}/api/v1/users/me`, {
167
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
168
+ });
169
+ console.log(chalk.bold('\nšŸ‘¤ Current User:\n'));
170
+ console.log(` Email: ${chalk.cyan(userInfo.data.email)}`);
171
+ console.log(` Role: ${chalk.yellow(userInfo.data.role)}`);
172
+ if (userInfo.data.merchant_id) {
173
+ console.log(` Merchant ID: ${chalk.gray(userInfo.data.merchant_id)}`);
174
+ }
175
+ console.log(` Environment: ${chalk.green(cfg.environment)}\n`);
176
+ }
177
+ catch (err) {
178
+ const axiosError = err;
179
+ if (axiosError.response?.status === 401) {
180
+ error('Token expired. Please login again: bi-cli auth login');
181
+ }
182
+ else {
183
+ const errorMsg = err instanceof Error ? err.message : 'Unknown error';
184
+ error(`Failed to fetch user info: ${errorMsg}`);
185
+ }
186
+ process.exit(1);
187
+ }
188
+ });
189
+ // auth switch
190
+ auth
191
+ .command('switch')
192
+ .description('Switch environment')
193
+ .option('--env <environment>', 'Environment (production|stage|development)', 'production')
194
+ .action((options) => {
195
+ const { env } = options;
196
+ const backendUrls = {
197
+ production: 'https://bi-api.optima.chat',
198
+ stage: 'https://bi-api-stage.optima.chat',
199
+ development: 'http://localhost:3001',
200
+ };
201
+ const backendUrl = backendUrls[env];
202
+ if (!backendUrl) {
203
+ error(`Invalid environment: ${env}`);
204
+ process.exit(1);
205
+ }
206
+ setConfig('environment', env);
207
+ setConfig('backendUrl', backendUrl);
208
+ clearAuth(); // Clear tokens when switching environment
209
+ success(`Switched to ${env} environment`);
210
+ info('Please login again: bi-cli auth login');
211
+ });
212
+ return auth;
213
+ }
214
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProductCommand(): Command;
3
+ //# sourceMappingURL=product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../src/commands/product.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,wBAAgB,oBAAoB,IAAI,OAAO,CA6N9C"}