@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,199 @@
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 createProductCommand() {
6
+ const product = new Command('product').description('Product analytics');
7
+ // product best-sellers
8
+ product
9
+ .command('best-sellers')
10
+ .description('Get best selling products')
11
+ .option('--limit <number>', 'Number of products to return', '10')
12
+ .option('--sort <field>', 'Sort by: revenue, quantity, orders', 'revenue')
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/products/best-sellers`, {
23
+ params: { limit: options.limit, sort_by: options.sort },
24
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
25
+ });
26
+ if (!response.data.success) {
27
+ error('Failed to fetch best sellers');
28
+ process.exit(1);
29
+ }
30
+ const { products, total_revenue } = response.data.data;
31
+ if (format === OutputFormat.JSON) {
32
+ outputJson(response.data.data);
33
+ }
34
+ else {
35
+ console.log('\n🏆 Best Selling Products\n');
36
+ outputPretty(products.map((p) => ({
37
+ Rank: p.rank,
38
+ Title: p.title.length > 30 ? p.title.slice(0, 27) + '...' : p.title,
39
+ Revenue: `¥${p.revenue.toFixed(2)}`,
40
+ Units: p.units_sold,
41
+ Orders: p.orders,
42
+ Share: `${p.revenue_share.toFixed(1)}%`,
43
+ })), ['Rank', 'Title', 'Revenue', 'Units', 'Orders', 'Share']);
44
+ info(`Total Revenue: ¥${total_revenue.toFixed(2)}`);
45
+ }
46
+ }
47
+ catch (err) {
48
+ handleApiError(err);
49
+ }
50
+ });
51
+ // product abc-analysis
52
+ product
53
+ .command('abc-analysis')
54
+ .description('ABC inventory analysis')
55
+ .option('--pretty', 'Output in pretty table format')
56
+ .action(async (options) => {
57
+ const cfg = getConfig();
58
+ if (!cfg.accessToken) {
59
+ error('Not logged in. Run: bi-cli auth login');
60
+ process.exit(1);
61
+ }
62
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
63
+ try {
64
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/products/abc-analysis`, {
65
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
66
+ });
67
+ if (!response.data.success) {
68
+ error('Failed to fetch ABC analysis');
69
+ process.exit(1);
70
+ }
71
+ const { summary, products, total_revenue } = response.data.data;
72
+ if (format === OutputFormat.JSON) {
73
+ outputJson(response.data.data);
74
+ }
75
+ else {
76
+ console.log('\n📊 ABC Analysis Summary\n');
77
+ outputPretty({
78
+ 'Category A (High Value)': `${summary.A.count} products (${summary.A.percent_of_products.toFixed(1)}%) - ¥${summary.A.revenue.toFixed(2)}`,
79
+ 'Category B (Medium Value)': `${summary.B.count} products (${summary.B.percent_of_products.toFixed(1)}%) - ¥${summary.B.revenue.toFixed(2)}`,
80
+ 'Category C (Low Value)': `${summary.C.count} products (${summary.C.percent_of_products.toFixed(1)}%) - ¥${summary.C.revenue.toFixed(2)}`,
81
+ 'Total Revenue': `¥${total_revenue.toFixed(2)}`,
82
+ });
83
+ console.log('\n📦 Top Products by Category\n');
84
+ const topProducts = products.slice(0, 15);
85
+ outputPretty(topProducts.map((p) => ({
86
+ Category: p.category,
87
+ Title: p.title.length > 25 ? p.title.slice(0, 22) + '...' : p.title,
88
+ Revenue: `¥${p.revenue.toFixed(2)}`,
89
+ Units: p.units,
90
+ 'Revenue %': `${p.revenue_percent.toFixed(1)}%`,
91
+ })), ['Category', 'Title', 'Revenue', 'Units', 'Revenue %']);
92
+ }
93
+ }
94
+ catch (err) {
95
+ handleApiError(err);
96
+ }
97
+ });
98
+ // product price-analysis
99
+ product
100
+ .command('price-analysis')
101
+ .description('Price point analysis')
102
+ .option('--pretty', 'Output in pretty table format')
103
+ .action(async (options) => {
104
+ const cfg = getConfig();
105
+ if (!cfg.accessToken) {
106
+ error('Not logged in. Run: bi-cli auth login');
107
+ process.exit(1);
108
+ }
109
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
110
+ try {
111
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/products/price-analysis`, {
112
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
113
+ });
114
+ if (!response.data.success) {
115
+ error('Failed to fetch price analysis');
116
+ process.exit(1);
117
+ }
118
+ const { price_ranges, totals } = response.data.data;
119
+ if (format === OutputFormat.JSON) {
120
+ outputJson(response.data.data);
121
+ }
122
+ else {
123
+ console.log('\n💰 Price Distribution Analysis\n');
124
+ outputPretty(price_ranges.map((r) => ({
125
+ Range: r.range,
126
+ Products: r.products,
127
+ Revenue: `¥${r.revenue.toFixed(2)}`,
128
+ Units: r.units,
129
+ 'Avg Price': `¥${r.avg_price.toFixed(2)}`,
130
+ 'Revenue Share': `${r.revenue_share.toFixed(1)}%`,
131
+ })), ['Range', 'Products', 'Revenue', 'Units', 'Avg Price', 'Revenue Share']);
132
+ info(`Total Revenue: ¥${totals.revenue.toFixed(2)} | Total Units: ${totals.units}`);
133
+ }
134
+ }
135
+ catch (err) {
136
+ handleApiError(err);
137
+ }
138
+ });
139
+ // product performance
140
+ product
141
+ .command('performance')
142
+ .description('Get product performance metrics')
143
+ .option('--days <number>', 'Number of days', '30')
144
+ .option('--limit <number>', 'Number of products', '20')
145
+ .option('--pretty', 'Output in pretty table format')
146
+ .action(async (options) => {
147
+ const cfg = getConfig();
148
+ if (!cfg.accessToken) {
149
+ error('Not logged in. Run: bi-cli auth login');
150
+ process.exit(1);
151
+ }
152
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
153
+ try {
154
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/products/performance`, {
155
+ params: { days: options.days, limit: options.limit },
156
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
157
+ });
158
+ if (!response.data.success) {
159
+ error('Failed to fetch product performance');
160
+ process.exit(1);
161
+ }
162
+ const { products, period } = response.data.data;
163
+ if (format === OutputFormat.JSON) {
164
+ outputJson(response.data.data);
165
+ }
166
+ else {
167
+ console.log(`\n📈 Product Performance (Last ${period.days} days)\n`);
168
+ outputPretty(products.map((p) => ({
169
+ Title: p.title.length > 20 ? p.title.slice(0, 17) + '...' : p.title,
170
+ Price: `¥${p.price.toFixed(2)}`,
171
+ Revenue: `¥${p.sales.revenue.toFixed(2)}`,
172
+ Units: p.sales.units,
173
+ Stock: p.inventory,
174
+ 'Days Stock': p.metrics.days_of_stock.toFixed(0),
175
+ 'Margin %': `${p.metrics.margin_percent.toFixed(1)}%`,
176
+ })), ['Title', 'Price', 'Revenue', 'Units', 'Stock', 'Days Stock', 'Margin %']);
177
+ }
178
+ }
179
+ catch (err) {
180
+ handleApiError(err);
181
+ }
182
+ });
183
+ return product;
184
+ }
185
+ function handleApiError(err) {
186
+ const axiosError = err;
187
+ const errorObj = err;
188
+ if (axiosError.response?.status === 401) {
189
+ error('Authentication failed. Please login again: bi-cli auth login');
190
+ }
191
+ else if (axiosError.response?.data?.error) {
192
+ error(`Error: ${axiosError.response.data.error.message}`);
193
+ }
194
+ else {
195
+ error(`Request failed: ${errorObj.message || 'Unknown error'}`);
196
+ }
197
+ process.exit(1);
198
+ }
199
+ //# sourceMappingURL=product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/commands/product.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createSalesCommand(): Command;
3
+ //# sourceMappingURL=sales.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales.d.ts","sourceRoot":"","sources":["../../src/commands/sales.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,kBAAkB,IAAI,OAAO,CA0F5C"}
@@ -0,0 +1,85 @@
1
+ import { Command } from 'commander';
2
+ import axios from 'axios';
3
+ import { getConfig } from '../config/index.js';
4
+ import { outputJson, outputPretty, error, OutputFormat } from '../utils/output.js';
5
+ export function createSalesCommand() {
6
+ const sales = new Command('sales').description('Sales analytics');
7
+ // sales get
8
+ sales
9
+ .command('get')
10
+ .description('Get sales data')
11
+ .option('--days <number>', 'Number of days to fetch', '7')
12
+ .option('--pretty', 'Output in pretty table format (default: JSON)')
13
+ .action(async (options) => {
14
+ const cfg = getConfig();
15
+ if (!cfg.accessToken) {
16
+ error('Not logged in. Run: bi-cli auth login');
17
+ process.exit(1);
18
+ }
19
+ const days = parseInt(options.days, 10);
20
+ if (isNaN(days) || days < 1 || days > 365) {
21
+ error('Days must be a number between 1 and 365');
22
+ process.exit(1);
23
+ }
24
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
25
+ try {
26
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/sales`, {
27
+ params: { days },
28
+ headers: {
29
+ Authorization: `Bearer ${cfg.accessToken}`,
30
+ },
31
+ });
32
+ if (!response.data.success) {
33
+ error('Failed to fetch sales data');
34
+ process.exit(1);
35
+ }
36
+ const { summary, daily } = response.data.data;
37
+ if (format === OutputFormat.JSON) {
38
+ outputJson(response.data.data);
39
+ }
40
+ else {
41
+ // Pretty format with tables
42
+ console.log('\n📊 Sales Summary\n');
43
+ outputPretty({
44
+ 'Total Revenue': `¥${summary.total_revenue.toFixed(2)}`,
45
+ 'Total Orders': summary.total_orders,
46
+ 'Average Order Value': `¥${summary.avg_order_value.toFixed(2)}`,
47
+ 'Unique Customers': summary.unique_customers,
48
+ });
49
+ if (daily.length > 0) {
50
+ console.log('\n📅 Daily Breakdown\n');
51
+ outputPretty(daily.map((d) => ({
52
+ Date: d.date,
53
+ Revenue: `¥${Number(d.total_revenue).toFixed(2)}`,
54
+ Orders: d.order_count,
55
+ AOV: `¥${Number(d.avg_order_value).toFixed(2)}`,
56
+ Customers: d.unique_customers,
57
+ })), ['Date', 'Revenue', 'Orders', 'AOV', 'Customers']);
58
+ }
59
+ // Show metadata
60
+ if (response.data.meta.cached) {
61
+ console.log('ℹ️ Data from cache');
62
+ }
63
+ else if (response.data.meta.query_time_ms) {
64
+ console.log(`⏱️ Query time: ${response.data.meta.query_time_ms}ms`);
65
+ }
66
+ }
67
+ }
68
+ catch (err) {
69
+ const axiosError = err;
70
+ const errorObj = err;
71
+ if (axiosError.response?.status === 401) {
72
+ error('Authentication failed. Please login again: bi-cli auth login');
73
+ }
74
+ else if (axiosError.response?.data?.error) {
75
+ error(`Error: ${axiosError.response.data.error.message}`);
76
+ }
77
+ else {
78
+ error(`Failed to fetch sales data: ${errorObj.message || 'Unknown error'}`);
79
+ }
80
+ process.exit(1);
81
+ }
82
+ });
83
+ return sales;
84
+ }
85
+ //# sourceMappingURL=sales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales.js","sourceRoot":"","sources":["../../src/commands/sales.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createTrendsCommand(): Command;
3
+ //# sourceMappingURL=trends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trends.d.ts","sourceRoot":"","sources":["../../src/commands/trends.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+EpC,wBAAgB,mBAAmB,IAAI,OAAO,CAmQ7C"}
@@ -0,0 +1,224 @@
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 createTrendsCommand() {
6
+ const trends = new Command('trends').description('Trend analytics');
7
+ // trends revenue
8
+ trends
9
+ .command('revenue')
10
+ .description('Get revenue trend over time')
11
+ .option('--days <number>', 'Number of days', '30')
12
+ .option('--granularity <type>', 'Granularity: hourly, daily, weekly', 'daily')
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/trends/revenue`, {
23
+ params: { days: options.days, granularity: options.granularity },
24
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
25
+ });
26
+ if (!response.data.success) {
27
+ error('Failed to fetch revenue trend');
28
+ process.exit(1);
29
+ }
30
+ const { statistics, trend, period } = response.data.data;
31
+ if (format === OutputFormat.JSON) {
32
+ outputJson(response.data.data);
33
+ }
34
+ else {
35
+ console.log(`\n📈 Revenue Trend (Last ${period.days} days, ${period.granularity})\n`);
36
+ // Statistics
37
+ const trendIcon = statistics.trend_direction === 'up'
38
+ ? '↑'
39
+ : statistics.trend_direction === 'down'
40
+ ? '↓'
41
+ : '→';
42
+ outputPretty({
43
+ 'Total Revenue': `¥${statistics.total_revenue.toFixed(2)}`,
44
+ 'Average Revenue': `¥${statistics.avg_revenue.toFixed(2)}`,
45
+ 'Trend Direction': `${trendIcon} ${statistics.trend_direction}`,
46
+ 'Data Points': statistics.data_points,
47
+ });
48
+ // Recent data points
49
+ console.log('\n📅 Recent Data\n');
50
+ const recentTrend = trend.slice(-10);
51
+ outputPretty(recentTrend.map((t) => ({
52
+ Period: t.period.split('T')[0],
53
+ Revenue: `¥${t.revenue.toFixed(2)}`,
54
+ Orders: t.orders,
55
+ 'MA(7)': t.moving_avg_7 ? `¥${t.moving_avg_7.toFixed(2)}` : '-',
56
+ })), ['Period', 'Revenue', 'Orders', 'MA(7)']);
57
+ }
58
+ }
59
+ catch (err) {
60
+ handleApiError(err);
61
+ }
62
+ });
63
+ // trends heatmap
64
+ trends
65
+ .command('heatmap')
66
+ .description('Orders heatmap by day and hour')
67
+ .option('--days <number>', 'Number of days', '30')
68
+ .option('--pretty', 'Output in pretty table format')
69
+ .action(async (options) => {
70
+ const cfg = getConfig();
71
+ if (!cfg.accessToken) {
72
+ error('Not logged in. Run: bi-cli auth login');
73
+ process.exit(1);
74
+ }
75
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
76
+ try {
77
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/trends/orders-heatmap`, {
78
+ params: { days: options.days },
79
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
80
+ });
81
+ if (!response.data.success) {
82
+ error('Failed to fetch heatmap data');
83
+ process.exit(1);
84
+ }
85
+ const { peak_times, heatmap } = response.data.data;
86
+ if (format === OutputFormat.JSON) {
87
+ outputJson(response.data.data);
88
+ }
89
+ else {
90
+ console.log('\n🔥 Peak Order Times\n');
91
+ outputPretty(peak_times.map((p, i) => ({
92
+ Rank: i + 1,
93
+ Day: p.day,
94
+ Hour: p.hour,
95
+ Orders: p.orders,
96
+ })), ['Rank', 'Day', 'Hour', 'Orders']);
97
+ console.log('\n📊 Daily Summary\n');
98
+ outputPretty(heatmap.map((d) => {
99
+ const totalOrders = d.hours.reduce((sum, h) => sum + h.orders, 0);
100
+ const totalRevenue = d.hours.reduce((sum, h) => sum + h.revenue, 0);
101
+ const peakHour = d.hours.reduce((max, h) => (h.orders > max.orders ? h : max), d.hours[0]);
102
+ return {
103
+ Day: d.day,
104
+ 'Total Orders': totalOrders,
105
+ 'Total Revenue': `¥${totalRevenue.toFixed(2)}`,
106
+ 'Peak Hour': `${peakHour.hour}:00`,
107
+ };
108
+ }), ['Day', 'Total Orders', 'Total Revenue', 'Peak Hour']);
109
+ }
110
+ }
111
+ catch (err) {
112
+ handleApiError(err);
113
+ }
114
+ });
115
+ // trends seasonality
116
+ trends
117
+ .command('seasonality')
118
+ .description('Monthly/seasonal patterns')
119
+ .option('--pretty', 'Output in pretty table format')
120
+ .action(async (options) => {
121
+ const cfg = getConfig();
122
+ if (!cfg.accessToken) {
123
+ error('Not logged in. Run: bi-cli auth login');
124
+ process.exit(1);
125
+ }
126
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
127
+ try {
128
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/trends/seasonality`, {
129
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
130
+ });
131
+ if (!response.data.success) {
132
+ error('Failed to fetch seasonality data');
133
+ process.exit(1);
134
+ }
135
+ const { monthly_pattern, insights } = response.data.data;
136
+ if (format === OutputFormat.JSON) {
137
+ outputJson(response.data.data);
138
+ }
139
+ else {
140
+ console.log('\n📅 Monthly Performance Pattern\n');
141
+ outputPretty(monthly_pattern.map((m) => ({
142
+ Month: m.month_name.slice(0, 3),
143
+ Revenue: `¥${m.revenue.toFixed(2)}`,
144
+ Orders: m.orders,
145
+ 'Avg Order': `¥${m.avg_order_value.toFixed(2)}`,
146
+ Index: `${m.index.toFixed(0)}%`,
147
+ })), ['Month', 'Revenue', 'Orders', 'Avg Order', 'Index']);
148
+ console.log('\n💡 Insights\n');
149
+ outputPretty({
150
+ 'Peak Months': insights.peak_months.join(', ') || 'N/A',
151
+ 'Low Months': insights.low_months.join(', ') || 'N/A',
152
+ 'Avg Monthly Revenue': `¥${insights.avg_monthly_revenue.toFixed(2)}`,
153
+ });
154
+ }
155
+ }
156
+ catch (err) {
157
+ handleApiError(err);
158
+ }
159
+ });
160
+ // trends forecast
161
+ trends
162
+ .command('forecast')
163
+ .description('Revenue forecast')
164
+ .option('--days <number>', 'Number of days to forecast', '7')
165
+ .option('--pretty', 'Output in pretty table format')
166
+ .action(async (options) => {
167
+ const cfg = getConfig();
168
+ if (!cfg.accessToken) {
169
+ error('Not logged in. Run: bi-cli auth login');
170
+ process.exit(1);
171
+ }
172
+ const format = options.pretty ? OutputFormat.PRETTY : OutputFormat.JSON;
173
+ try {
174
+ const response = await axios.get(`${cfg.backendUrl}/api/v1/trends/forecast`, {
175
+ params: { forecast_days: options.days },
176
+ headers: { Authorization: `Bearer ${cfg.accessToken}` },
177
+ });
178
+ if (!response.data.success) {
179
+ error('Failed to generate forecast');
180
+ process.exit(1);
181
+ }
182
+ const { trend, forecast, baseline_days, disclaimer } = response.data.data;
183
+ if (format === OutputFormat.JSON) {
184
+ outputJson(response.data.data);
185
+ }
186
+ else {
187
+ console.log('\n🔮 Revenue Forecast\n');
188
+ const trendIcon = trend.direction === 'up' ? '↑' : trend.direction === 'down' ? '↓' : '→';
189
+ outputPretty({
190
+ 'Trend Direction': `${trendIcon} ${trend.direction}`,
191
+ 'Daily Change': `¥${trend.daily_change.toFixed(2)}`,
192
+ 'Based on': `${baseline_days} days of data`,
193
+ });
194
+ console.log('\n📅 Predicted Revenue\n');
195
+ outputPretty(forecast.map((f) => ({
196
+ Date: f.date,
197
+ Day: f.day_of_week.slice(0, 3),
198
+ 'Predicted Revenue': `¥${f.predicted_revenue.toFixed(2)}`,
199
+ Confidence: f.confidence,
200
+ })), ['Date', 'Day', 'Predicted Revenue', 'Confidence']);
201
+ info(disclaimer);
202
+ }
203
+ }
204
+ catch (err) {
205
+ handleApiError(err);
206
+ }
207
+ });
208
+ return trends;
209
+ }
210
+ function handleApiError(err) {
211
+ const axiosError = err;
212
+ const errorObj = err;
213
+ if (axiosError.response?.status === 401) {
214
+ error('Authentication failed. Please login again: bi-cli auth login');
215
+ }
216
+ else if (axiosError.response?.data?.error) {
217
+ error(`Error: ${axiosError.response.data.error.message}`);
218
+ }
219
+ else {
220
+ error(`Request failed: ${errorObj.message || 'Unknown error'}`);
221
+ }
222
+ process.exit(1);
223
+ }
224
+ //# sourceMappingURL=trends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trends.js","sourceRoot":"","sources":["../../src/commands/trends.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import Conf from 'conf';
2
+ export interface CliConfig {
3
+ environment: 'production' | 'stage' | 'development';
4
+ authUrl: string;
5
+ backendUrl: string;
6
+ accessToken?: string;
7
+ refreshToken?: string;
8
+ }
9
+ export declare const config: Conf<CliConfig>;
10
+ /**
11
+ * Get CLI configuration.
12
+ *
13
+ * Supports environment variables for CI/development:
14
+ * - BI_CLI_TOKEN: Access token (overrides stored token)
15
+ * - BI_CLI_BACKEND_URL: Backend URL (overrides stored URL)
16
+ * - BI_CLI_AUTH_URL: Auth URL (overrides stored URL)
17
+ */
18
+ export declare function getConfig(): CliConfig;
19
+ export declare function setConfig(key: keyof CliConfig, value: any): void;
20
+ export declare function clearAuth(): void;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,YAAY,GAAG,OAAO,GAAG,aAAa,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,MAAM,iBAQjB,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAQrC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAMhE;AAED,wBAAgB,SAAS,IAAI,IAAI,CAGhC"}
@@ -0,0 +1,39 @@
1
+ import Conf from 'conf';
2
+ export const config = new Conf({
3
+ projectName: 'optima-bi-cli',
4
+ defaults: {
5
+ environment: 'production',
6
+ authUrl: 'https://auth.optima.chat',
7
+ backendUrl: 'https://bi-api.optima.chat',
8
+ },
9
+ encryptionKey: 'optima-bi-cli-secret-key-change-in-production',
10
+ });
11
+ /**
12
+ * Get CLI configuration.
13
+ *
14
+ * Supports environment variables for CI/development:
15
+ * - BI_CLI_TOKEN: Access token (overrides stored token)
16
+ * - BI_CLI_BACKEND_URL: Backend URL (overrides stored URL)
17
+ * - BI_CLI_AUTH_URL: Auth URL (overrides stored URL)
18
+ */
19
+ export function getConfig() {
20
+ return {
21
+ environment: config.get('environment'),
22
+ authUrl: process.env.BI_CLI_AUTH_URL || config.get('authUrl'),
23
+ backendUrl: process.env.BI_CLI_BACKEND_URL || config.get('backendUrl'),
24
+ accessToken: process.env.BI_CLI_TOKEN || config.get('accessToken'),
25
+ refreshToken: config.get('refreshToken'),
26
+ };
27
+ }
28
+ export function setConfig(key, value) {
29
+ // Clear the key first if it exists and value is an object
30
+ if (config.has(key) && typeof value === 'object' && value !== null) {
31
+ config.delete(key);
32
+ }
33
+ config.set(key, value);
34
+ }
35
+ export function clearAuth() {
36
+ config.delete('accessToken');
37
+ config.delete('refreshToken');
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAY;IACxC,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE;QACR,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,0BAA0B;QACnC,UAAU,EAAE,4BAA4B;KACzC;IACD,aAAa,EAAE,+CAA+C;CAC/D,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QACtC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7D,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACtE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QAClE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAoB,EAAE,KAAU;IACxD,0DAA0D;IAC1D,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}