@reporting-bi/cli 0.0.2 → 0.0.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 (3) hide show
  1. package/README.md +21 -10
  2. package/dist/index.js +543 -13
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -29,18 +29,28 @@ Originally built for browser use (`rp-app-auth` login page), it may require adap
29
29
 
30
30
  **Important:** `rp-vscode` currently has its own auth implementation (`src/auth.ts`) with VS Code-specific OAuth2 flow (local HTTP callback server, VS Code secrets storage). This will be refactored to use `rp-auth-client-v2` instead, keeping only VS Code-specific concerns (secrets API, URI handler) in the extension.
31
31
 
32
- ## Planned Features
32
+ ## Features
33
33
 
34
- - **Authentication** — Login via `rp-auth-client-v2` (OAuth2, token storage & refresh)
35
- - **ETL management** — List, view, edit, and execute ETL threads
36
- - **SQL execution** — Run SQL queries against Reporting.bi databases
37
- - **Accounting management** — List and switch between accountings
38
- - **Schema inspection** — Browse database objects (tables, procedures, functions)
39
- - **Module management** — List accounting modules and definitions
34
+ - **Authentication** — OAuth2 login via browser, token storage & refresh
35
+ - **ETL** — List, view, search, and execute ETL threads
36
+ - **Jobs** — List, start, stop, and monitor SQL Agent jobs
37
+ - **Analytics** — Browse report contexts, execute reports, list dimensions/years
38
+ - **Users** — List users, view profiles, check access rights and roles
39
+ - **Definition** — Browse statements, dimensions, modules, scenarios, fiscal years
40
+ - **MDM** — Browse master data tables, view values, export as CSV
41
+ - **Helpdesk** — List/view tickets, read messages, create new tickets
42
+ - **Wiki** — Full CRUD for wiki pages (list, read, search, save, delete)
43
+ - **Accounting** — List and switch between accountings
44
+
45
+ All commands output formatted tables by default, with `--json` flag for raw JSON output.
46
+
47
+ ## Installation
48
+
49
+ See [INSTALL.md](INSTALL.md) for installation instructions.
40
50
 
41
51
  ## Tech Stack
42
52
 
43
- - Node.js + TypeScript
53
+ - Node.js + TypeScript, bundled with esbuild (zero runtime dependencies)
44
54
  - `@reporting/rp-auth-client-v2` — Shared authentication client (OAuth2)
45
55
  - `@reporting/rp-client` — HTTP client for Reporting.bi microservices
46
56
  - `@reporting/rp-types` — Shared TypeScript types
@@ -48,6 +58,7 @@ Originally built for browser use (`rp-app-auth` login page), it may require adap
48
58
  ## Development
49
59
 
50
60
  ```bash
51
- yarn build # compile TypeScript
52
- yarn watch # compile in watch mode
61
+ yarn build # bundle with esbuild
62
+ yarn watch # bundle in watch mode
63
+ yarn release # bump version, build, commit, push, publish to npm
53
64
  ```
package/dist/index.js CHANGED
@@ -663,16 +663,16 @@ var require_side_channel_list = __commonJS({
663
663
  "use strict";
664
664
  var inspect = require_object_inspect();
665
665
  var $TypeError = require_type();
666
- var listGetNode = function(list3, key, isDelete) {
667
- var prev = list3;
666
+ var listGetNode = function(list7, key, isDelete) {
667
+ var prev = list7;
668
668
  var curr;
669
669
  for (; (curr = prev.next) != null; prev = curr) {
670
670
  if (curr.key === key) {
671
671
  prev.next = curr.next;
672
672
  if (!isDelete) {
673
673
  curr.next = /** @type {NonNullable<typeof list.next>} */
674
- list3.next;
675
- list3.next = curr;
674
+ list7.next;
675
+ list7.next = curr;
676
676
  }
677
677
  return curr;
678
678
  }
@@ -2106,9 +2106,9 @@ var require_stringify = __commonJS({
2106
2106
  }
2107
2107
  return [formatter(prefix) + "=" + formatter(String(obj))];
2108
2108
  }
2109
- var values = [];
2109
+ var values2 = [];
2110
2110
  if (typeof obj === "undefined") {
2111
- return values;
2111
+ return values2;
2112
2112
  }
2113
2113
  var objKeys;
2114
2114
  if (generateArrayPrefix === "comma" && isArray(obj)) {
@@ -2138,7 +2138,7 @@ var require_stringify = __commonJS({
2138
2138
  sideChannel.set(object, step);
2139
2139
  var valueSideChannel = getSideChannel();
2140
2140
  valueSideChannel.set(sentinel, sideChannel);
2141
- pushToArray(values, stringify2(
2141
+ pushToArray(values2, stringify2(
2142
2142
  value,
2143
2143
  keyPrefix,
2144
2144
  generateArrayPrefix,
@@ -2159,7 +2159,7 @@ var require_stringify = __commonJS({
2159
2159
  valueSideChannel
2160
2160
  ));
2161
2161
  }
2162
- return values;
2162
+ return values2;
2163
2163
  };
2164
2164
  var normalizeStringifyOptions = function normalizeStringifyOptions2(opts) {
2165
2165
  if (!opts) {
@@ -3423,8 +3423,8 @@ async function get(id, flags) {
3423
3423
  async function read(id, flags) {
3424
3424
  const lang = flags.lang || DEFAULT_LANG;
3425
3425
  const service = createService("wiki");
3426
- const content = await service.get(`pageContent/${lang}/${id}`, void 0, { parseResponse: false });
3427
- process.stdout.write(content || "");
3426
+ const content2 = await service.get(`pageContent/${lang}/${id}`, void 0, { parseResponse: false });
3427
+ process.stdout.write(content2 || "");
3428
3428
  }
3429
3429
  async function search(query, flags) {
3430
3430
  const service = createService("wiki");
@@ -3452,10 +3452,10 @@ async function readContent(flags) {
3452
3452
  async function save(id, flags) {
3453
3453
  const lang = flags.lang || DEFAULT_LANG;
3454
3454
  const service = createService("wiki");
3455
- const content = await readContent(flags);
3455
+ const content2 = await readContent(flags);
3456
3456
  const page = {
3457
3457
  lang,
3458
- content
3458
+ content: content2
3459
3459
  };
3460
3460
  if (id) page.id_wiki_page = parseInt(id);
3461
3461
  if (flags.name) page.name = flags.name;
@@ -3506,8 +3506,517 @@ async function wiki(args2) {
3506
3506
  }
3507
3507
  }
3508
3508
 
3509
+ // src/commands/etl.ts
3510
+ var fs3 = __toESM(require("node:fs"));
3511
+ async function list3(flags) {
3512
+ const service = createService("etl");
3513
+ const threads = await service.get("threads");
3514
+ output(threads || [], flags);
3515
+ }
3516
+ async function get2(id, flags) {
3517
+ const service = createService("etl");
3518
+ const thread = await service.get(`threads/${id}`);
3519
+ output(thread, flags);
3520
+ }
3521
+ async function content(id, flags) {
3522
+ const service = createService("etl");
3523
+ const text = await service.get(`threadContent/${id}`, void 0, { parseResponse: false });
3524
+ process.stdout.write(text || "");
3525
+ }
3526
+ async function exec2(id, flags) {
3527
+ const service = createService("etl");
3528
+ let body = void 0;
3529
+ if (flags.file) {
3530
+ body = fs3.readFileSync(flags.file, "utf-8");
3531
+ } else if (flags.sql) {
3532
+ body = flags.sql;
3533
+ }
3534
+ const result = await service.post(`exec/${id}`, body, { parseResponse: false });
3535
+ process.stdout.write(result || "");
3536
+ }
3537
+ async function search2(query, flags) {
3538
+ const service = createService("etl");
3539
+ const results = await service.get("search", { q: query });
3540
+ output(results || [], flags);
3541
+ }
3542
+ async function etl(args2) {
3543
+ const { positional, flags } = parseArgs(args2);
3544
+ const [subcommand, ...rest] = positional;
3545
+ switch (subcommand) {
3546
+ case "list":
3547
+ return list3(flags);
3548
+ case "get":
3549
+ if (!rest[0]) {
3550
+ console.error("Usage: rp etl get <id>");
3551
+ process.exit(1);
3552
+ }
3553
+ return get2(rest[0], flags);
3554
+ case "content":
3555
+ if (!rest[0]) {
3556
+ console.error("Usage: rp etl content <id>");
3557
+ process.exit(1);
3558
+ }
3559
+ return content(rest[0], flags);
3560
+ case "exec":
3561
+ if (!rest[0]) {
3562
+ console.error('Usage: rp etl exec <id> [--sql "..."] [--file path]');
3563
+ process.exit(1);
3564
+ }
3565
+ return exec2(rest[0], flags);
3566
+ case "search":
3567
+ if (!rest[0]) {
3568
+ console.error("Usage: rp etl search <query>");
3569
+ process.exit(1);
3570
+ }
3571
+ return search2(rest[0], flags);
3572
+ default:
3573
+ console.log("Usage: rp etl <list|get|content|exec|search> [options]");
3574
+ break;
3575
+ }
3576
+ }
3577
+
3578
+ // src/commands/jobs.ts
3579
+ async function list4(flags) {
3580
+ const service = createService("jobs");
3581
+ const jobs2 = await service.get("userJobs");
3582
+ output(jobs2 || [], flags);
3583
+ }
3584
+ async function start(jobName, flags) {
3585
+ const service = createService("jobs");
3586
+ await service.get("start", { job_name: jobName });
3587
+ console.log(`Job "${jobName}" started.`);
3588
+ }
3589
+ async function stop(jobName, flags) {
3590
+ const service = createService("jobs");
3591
+ await service.get("stop", { job_name: jobName });
3592
+ console.log(`Job "${jobName}" stopped.`);
3593
+ }
3594
+ async function statusCmd(flags) {
3595
+ const service = createService("jobs");
3596
+ const statuses = await service.get("jobStatuses");
3597
+ output(statuses || [], flags);
3598
+ }
3599
+ async function jobs(args2) {
3600
+ const { positional, flags } = parseArgs(args2);
3601
+ const [subcommand, ...rest] = positional;
3602
+ switch (subcommand) {
3603
+ case "list":
3604
+ return list4(flags);
3605
+ case "start":
3606
+ if (!rest[0]) {
3607
+ console.error("Usage: rp jobs start <job_name>");
3608
+ process.exit(1);
3609
+ }
3610
+ return start(rest[0], flags);
3611
+ case "stop":
3612
+ if (!rest[0]) {
3613
+ console.error("Usage: rp jobs stop <job_name>");
3614
+ process.exit(1);
3615
+ }
3616
+ return stop(rest[0], flags);
3617
+ case "status":
3618
+ return statusCmd(flags);
3619
+ default:
3620
+ console.log("Usage: rp jobs <list|start|stop|status> [options]");
3621
+ break;
3622
+ }
3623
+ }
3624
+
3625
+ // src/commands/analytics.ts
3626
+ async function contexts(flags) {
3627
+ const service = createService("analytics");
3628
+ const ctxs = await service.get("namedContext");
3629
+ output(ctxs || [], flags);
3630
+ }
3631
+ async function getContext(id, flags) {
3632
+ const service = createService("analytics");
3633
+ const ctx = await service.get(`context/${id}`);
3634
+ output(ctx, flags);
3635
+ }
3636
+ async function report(id, flags) {
3637
+ const service = createService("analytics");
3638
+ const index = flags.index || "0";
3639
+ const result = await service.get(`report/${id}/${index}`, void 0, { parseResponse: false });
3640
+ process.stdout.write(result || "");
3641
+ }
3642
+ async function dimensions(flags) {
3643
+ const module2 = flags.module || flags.m;
3644
+ if (!module2) {
3645
+ console.error("Usage: rp analytics dimensions --module <module>");
3646
+ process.exit(1);
3647
+ }
3648
+ const service = createService("definition");
3649
+ const dims = await service.get(`visibleDimensions/${module2}`);
3650
+ output(dims || [], flags);
3651
+ }
3652
+ async function periods(flags) {
3653
+ const service = createService("analytics");
3654
+ const tree = await service.get("years");
3655
+ output(tree || [], flags);
3656
+ }
3657
+ async function analytics(args2) {
3658
+ const { positional, flags } = parseArgs(args2);
3659
+ const [subcommand, ...rest] = positional;
3660
+ switch (subcommand) {
3661
+ case "contexts":
3662
+ return contexts(flags);
3663
+ case "context":
3664
+ if (!rest[0]) {
3665
+ console.error("Usage: rp analytics context <id>");
3666
+ process.exit(1);
3667
+ }
3668
+ return getContext(rest[0], flags);
3669
+ case "report":
3670
+ if (!rest[0]) {
3671
+ console.error("Usage: rp analytics report <context_id> [--index N]");
3672
+ process.exit(1);
3673
+ }
3674
+ return report(rest[0], flags);
3675
+ case "dimensions":
3676
+ return dimensions(flags);
3677
+ case "years":
3678
+ return periods(flags);
3679
+ default:
3680
+ console.log("Usage: rp analytics <contexts|context|report|dimensions|years> [options]");
3681
+ break;
3682
+ }
3683
+ }
3684
+
3685
+ // src/commands/users.ts
3686
+ async function list5(flags) {
3687
+ const service = createService("users");
3688
+ const users2 = await service.get("allUsers");
3689
+ output(users2 || [], flags);
3690
+ }
3691
+ async function get3(user, flags) {
3692
+ const service = createService("users");
3693
+ const result = await service.get(user);
3694
+ output(result, flags);
3695
+ }
3696
+ async function rights(flags) {
3697
+ const service = createService("users");
3698
+ const result = await service.get("userRights");
3699
+ output(result || [], flags);
3700
+ }
3701
+ async function roles(flags) {
3702
+ const service = createService("users");
3703
+ const result = await service.get("accessRoles");
3704
+ output(result || [], flags);
3705
+ }
3706
+ async function users(args2) {
3707
+ const { positional, flags } = parseArgs(args2);
3708
+ const [subcommand, ...rest] = positional;
3709
+ switch (subcommand) {
3710
+ case "list":
3711
+ return list5(flags);
3712
+ case "get":
3713
+ return get3(rest[0] || "me", flags);
3714
+ case "me":
3715
+ return get3("me", flags);
3716
+ case "rights":
3717
+ return rights(flags);
3718
+ case "roles":
3719
+ return roles(flags);
3720
+ default:
3721
+ console.log("Usage: rp users <list|get|me|rights|roles> [options]");
3722
+ break;
3723
+ }
3724
+ }
3725
+
3726
+ // src/commands/def.ts
3727
+ async function statements(flags) {
3728
+ const service = createService("definition");
3729
+ const result = await service.get("finStatements");
3730
+ output(result || [], flags);
3731
+ }
3732
+ async function statement(id, flags) {
3733
+ const service = createService("definition");
3734
+ const result = await service.get(`finStatement/${id}`);
3735
+ output(result, flags);
3736
+ }
3737
+ async function dimensions2(flags) {
3738
+ const module2 = flags.module || flags.m;
3739
+ if (!module2) {
3740
+ console.error("Usage: rp def dimensions --module <module>");
3741
+ process.exit(1);
3742
+ }
3743
+ const service = createService("definition");
3744
+ const result = await service.get(`dimensions/${module2}`);
3745
+ output(result || [], flags);
3746
+ }
3747
+ async function modules(flags) {
3748
+ const service = createService("definition");
3749
+ const result = await service.get("modules");
3750
+ output(result || [], flags);
3751
+ }
3752
+ async function scenarios(flags) {
3753
+ const service = createService("definition");
3754
+ const result = await service.get("scenarios");
3755
+ output(result || [], flags);
3756
+ }
3757
+ async function fiscalYears(flags) {
3758
+ const service = createService("definition");
3759
+ const result = await service.get("fiscalYears");
3760
+ output(result || [], flags);
3761
+ }
3762
+ async function def(args2) {
3763
+ const { positional, flags } = parseArgs(args2);
3764
+ const [subcommand, ...rest] = positional;
3765
+ switch (subcommand) {
3766
+ case "statements":
3767
+ return statements(flags);
3768
+ case "statement":
3769
+ if (!rest[0]) {
3770
+ console.error("Usage: rp def statement <id>");
3771
+ process.exit(1);
3772
+ }
3773
+ return statement(rest[0], flags);
3774
+ case "dimensions":
3775
+ return dimensions2(flags);
3776
+ case "modules":
3777
+ return modules(flags);
3778
+ case "scenarios":
3779
+ return scenarios(flags);
3780
+ case "fiscal-years":
3781
+ return fiscalYears(flags);
3782
+ default:
3783
+ console.log("Usage: rp def <statements|statement|dimensions|modules|scenarios|fiscal-years> [options]");
3784
+ break;
3785
+ }
3786
+ }
3787
+
3788
+ // src/commands/mdm.ts
3789
+ async function tables(flags) {
3790
+ const service = createService("mdm");
3791
+ const result = await service.get("tableDefinitions");
3792
+ output(result || [], flags);
3793
+ }
3794
+ async function table(id, flags) {
3795
+ const service = createService("mdm");
3796
+ const result = await service.get(`tableDefinition/${id}`);
3797
+ output(result, flags);
3798
+ }
3799
+ async function columns(id, flags) {
3800
+ const service = createService("mdm");
3801
+ const result = await service.get(`columnDefinitions/${id}`);
3802
+ output(result || [], flags);
3803
+ }
3804
+ async function values(id, flags) {
3805
+ const service = createService("mdm");
3806
+ const result = await service.get(`values/${id}`);
3807
+ output(result || [], flags);
3808
+ }
3809
+ async function exportCsv(id, flags) {
3810
+ const service = createService("mdm");
3811
+ const type = flags.type || "mdm";
3812
+ const result = await service.get(`export/${id}/${type}`, void 0, { parseResponse: false });
3813
+ process.stdout.write(result || "");
3814
+ }
3815
+ async function mdm(args2) {
3816
+ const { positional, flags } = parseArgs(args2);
3817
+ const [subcommand, ...rest] = positional;
3818
+ switch (subcommand) {
3819
+ case "tables":
3820
+ return tables(flags);
3821
+ case "table":
3822
+ if (!rest[0]) {
3823
+ console.error("Usage: rp mdm table <id>");
3824
+ process.exit(1);
3825
+ }
3826
+ return table(rest[0], flags);
3827
+ case "columns":
3828
+ if (!rest[0]) {
3829
+ console.error("Usage: rp mdm columns <id>");
3830
+ process.exit(1);
3831
+ }
3832
+ return columns(rest[0], flags);
3833
+ case "values":
3834
+ if (!rest[0]) {
3835
+ console.error("Usage: rp mdm values <id>");
3836
+ process.exit(1);
3837
+ }
3838
+ return values(rest[0], flags);
3839
+ case "export":
3840
+ if (!rest[0]) {
3841
+ console.error("Usage: rp mdm export <id> [--type mdm|sql]");
3842
+ process.exit(1);
3843
+ }
3844
+ return exportCsv(rest[0], flags);
3845
+ default:
3846
+ console.log("Usage: rp mdm <tables|table|columns|values|export> [options]");
3847
+ break;
3848
+ }
3849
+ }
3850
+
3851
+ // src/commands/helpdesk.ts
3852
+ async function list6(flags) {
3853
+ const service = createService("helpdesk");
3854
+ const tickets = await service.get("tickets");
3855
+ output(tickets || [], flags);
3856
+ }
3857
+ async function get4(id, flags) {
3858
+ const service = createService("helpdesk");
3859
+ const ticket = await service.get(`ticket/${id}`);
3860
+ output(ticket, flags);
3861
+ }
3862
+ async function messages(id, flags) {
3863
+ const service = createService("helpdesk");
3864
+ const msgs = await service.get(`messages/${id}`);
3865
+ output(msgs || [], flags);
3866
+ }
3867
+ async function create(flags) {
3868
+ const subject = flags.subject;
3869
+ const text = flags.text;
3870
+ if (!subject) {
3871
+ console.error('Usage: rp helpdesk create --subject "..." [--text "..."] [--priority N]');
3872
+ process.exit(1);
3873
+ }
3874
+ const service = createService("helpdesk");
3875
+ const ticket = { subject };
3876
+ if (flags.priority) ticket.priority = parseInt(flags.priority);
3877
+ const result = await service.post("ticket", ticket);
3878
+ if (text && result?.id_request) {
3879
+ await service.post("message", { id_request: result.id_request, text });
3880
+ }
3881
+ output(result, flags);
3882
+ }
3883
+ async function helpdesk(args2) {
3884
+ const { positional, flags } = parseArgs(args2);
3885
+ const [subcommand, ...rest] = positional;
3886
+ switch (subcommand) {
3887
+ case "list":
3888
+ return list6(flags);
3889
+ case "get":
3890
+ if (!rest[0]) {
3891
+ console.error("Usage: rp helpdesk get <id>");
3892
+ process.exit(1);
3893
+ }
3894
+ return get4(rest[0], flags);
3895
+ case "messages":
3896
+ if (!rest[0]) {
3897
+ console.error("Usage: rp helpdesk messages <ticket_id>");
3898
+ process.exit(1);
3899
+ }
3900
+ return messages(rest[0], flags);
3901
+ case "create":
3902
+ return create(flags);
3903
+ default:
3904
+ console.log("Usage: rp helpdesk <list|get|messages|create> [options]");
3905
+ break;
3906
+ }
3907
+ }
3908
+
3509
3909
  // USAGE.md
3510
- var USAGE_default = 'Reporting.bi CLI\n\nUsage: rp <command> [options]\n\nCommands:\n login [domain] [--accounting <id>] Login to a Reporting.bi instance (opens browser)\n logout [domain] Logout and revoke tokens (default: active connection)\n use <domain> [--accounting <id>] Switch active connection and/or set accounting\n status Show all connections and active status\n\nAccounting:\n accounting list List available accountings\n\nWiki:\n wiki list List all pages\n wiki get <id> [--lang cs] Get page metadata (JSON)\n wiki read <id> [--lang cs] Get page content (plain text)\n wiki search <query> Search pages\n wiki save [id] [--lang cs] [--name n] Save/create a page (content from --file, --content, or stdin)\n wiki delete <id> [--lang cs] Delete a page\n\nDefault domain: https://reporting.bi\nDefault language: cs\n\nExamples:\n rp login http://localhost:3011 --accounting 100000\n rp use https://reporting.bi --accounting 100000\n rp status\n\n rp wiki list\n rp wiki read 42\n rp wiki search "query"\n rp wiki save 42 --file ./page.md\n rp wiki save --name "New page" --content "Hello"\n cat doc.md | rp wiki save 42\n rp wiki delete 42\n';
3910
+ var USAGE_default = `Reporting.bi CLI
3911
+
3912
+ Usage: rp <command> [options]
3913
+
3914
+ Commands:
3915
+ login [domain] [--accounting <id>] Login to a Reporting.bi instance (opens browser)
3916
+ logout [domain] Logout and revoke tokens (default: active connection)
3917
+ use <domain> [--accounting <id>] Switch active connection and/or set accounting
3918
+ status Show all connections and active status
3919
+
3920
+ Accounting:
3921
+ accounting list List available accountings
3922
+
3923
+ ETL:
3924
+ etl list List all threads
3925
+ etl get <id> Get thread metadata
3926
+ etl content <id> Get thread SQL content (plain text)
3927
+ etl exec <id> [--sql "..."|--file f] Execute thread (optionally with custom SQL)
3928
+ etl search <query> Search threads
3929
+
3930
+ Jobs:
3931
+ jobs list List available jobs
3932
+ jobs start <job_name> Start a job
3933
+ jobs stop <job_name> Stop a running job
3934
+ jobs status Show status of all jobs
3935
+
3936
+ Analytics:
3937
+ analytics contexts List saved report contexts
3938
+ analytics context <id> Get report context details
3939
+ analytics report <context_id> Execute report and get results
3940
+ analytics dimensions --module <m> List dimensions for a module
3941
+ analytics years List available years
3942
+
3943
+ Users:
3944
+ users list List all users
3945
+ users get [username] Get user profile (default: me)
3946
+ users me Get current user profile
3947
+ users rights Show current user's access rights
3948
+ users roles List access roles
3949
+
3950
+ Definition:
3951
+ def statements List all statements
3952
+ def statement <id> Get statement definition
3953
+ def dimensions --module <m> List dimensions for a module
3954
+ def modules List available modules
3955
+ def scenarios List scenarios
3956
+ def fiscal-years List fiscal years
3957
+
3958
+ MDM:
3959
+ mdm tables List MDM table definitions
3960
+ mdm table <id> Get table definition
3961
+ mdm columns <id> Get column definitions for a table
3962
+ mdm values <id> Get table values
3963
+ mdm export <id> [--type mdm|sql] Export table as CSV
3964
+
3965
+ Helpdesk:
3966
+ helpdesk list List all tickets
3967
+ helpdesk get <id> Get ticket details
3968
+ helpdesk messages <ticket_id> Get ticket messages
3969
+ helpdesk create --subject "..." [--text "..."] [--priority N] Create a ticket
3970
+
3971
+ Wiki:
3972
+ wiki list List all pages
3973
+ wiki get <id> [--lang cs] Get page metadata
3974
+ wiki read <id> [--lang cs] Get page content (plain text)
3975
+ wiki search <query> Search pages
3976
+ wiki save [id] [--lang cs] [--name n] Save/create a page (content from --file, --content, or stdin)
3977
+ wiki delete <id> [--lang cs] Delete a page
3978
+
3979
+ Global options:
3980
+ --json Output raw JSON instead of table format
3981
+
3982
+ Default domain: https://reporting.bi
3983
+ Default language: cs
3984
+
3985
+ Examples:
3986
+ rp login http://localhost:3011 --accounting 100000
3987
+ rp use https://reporting.bi --accounting 100000
3988
+ rp status
3989
+
3990
+ rp etl list
3991
+ rp etl exec 42
3992
+ rp etl content 42
3993
+
3994
+ rp jobs list
3995
+ rp jobs start "My Job"
3996
+ rp jobs status
3997
+
3998
+ rp analytics contexts
3999
+ rp analytics report 123
4000
+
4001
+ rp users me
4002
+ rp users list --json
4003
+
4004
+ rp def statements
4005
+ rp def modules
4006
+
4007
+ rp mdm tables
4008
+ rp mdm values 5
4009
+ rp mdm export 5 > data.csv
4010
+
4011
+ rp helpdesk list
4012
+ rp helpdesk create --subject "Bug report" --text "Details here"
4013
+
4014
+ rp wiki list
4015
+ rp wiki read 42
4016
+ rp wiki search "query"
4017
+ rp wiki save 42 --file ./page.md
4018
+ cat doc.md | rp wiki save 42
4019
+ `;
3511
4020
 
3512
4021
  // src/index.ts
3513
4022
  var [command, ...args] = process.argv.slice(2);
@@ -3527,6 +4036,27 @@ switch (command) {
3527
4036
  case "accounting":
3528
4037
  accounting(args);
3529
4038
  break;
4039
+ case "etl":
4040
+ etl(args);
4041
+ break;
4042
+ case "jobs":
4043
+ jobs(args);
4044
+ break;
4045
+ case "analytics":
4046
+ analytics(args);
4047
+ break;
4048
+ case "users":
4049
+ users(args);
4050
+ break;
4051
+ case "def":
4052
+ def(args);
4053
+ break;
4054
+ case "mdm":
4055
+ mdm(args);
4056
+ break;
4057
+ case "helpdesk":
4058
+ helpdesk(args);
4059
+ break;
3530
4060
  case "status":
3531
4061
  status();
3532
4062
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reporting-bi/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "license": "UNLICENSED",
5
5
  "description": "Reporting.bi CLI — command-line interface for the Reporting.bi platform",
6
6
  "main": "./dist/index.js",
@@ -14,7 +14,7 @@
14
14
  "build": "yarn node build.mjs",
15
15
  "watch": "yarn build --watch",
16
16
  "deploy-installers": "cp install.sh ../rp-static/install-cli.sh && cp install.ps1 ../rp-static/install-cli.ps1",
17
- "release": "yarn node -e \"const p=require('./package.json');const v=p.version.split('.');v[2]++;p.version=v.join('.');require('fs').writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n')\" && yarn build && git add package.json && git commit -m \"rp-cli v$(yarn node -p \"require('./package.json').version\")\" && yarn npm publish --access public"
17
+ "release": "yarn node -e \"const p=require('./package.json');const v=p.version.split('.');v[2]++;p.version=v.join('.');require('fs').writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n')\" && yarn build && git add package.json && git commit -m \"rp-cli v$(yarn node -p \"require('./package.json').version\")\" && git push && yarn npm publish --access public"
18
18
  },
19
19
  "dependencies": {},
20
20
  "devDependencies": {