aspera-cli 4.27.0 → 4.27.2

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 (142) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +46 -1
  4. data/CONTRIBUTING.md +1 -7
  5. data/TODO.md +50 -0
  6. data/docs/README.md +709 -489
  7. data/lib/aspera/agent/base.rb +10 -2
  8. data/lib/aspera/agent/connect.rb +7 -7
  9. data/lib/aspera/agent/desktop.rb +3 -3
  10. data/lib/aspera/agent/direct.rb +48 -19
  11. data/lib/aspera/agent/factory.rb +3 -3
  12. data/lib/aspera/agent/httpgw.rb +55 -14
  13. data/lib/aspera/agent/node.rb +2 -2
  14. data/lib/aspera/agent/transferd.rb +12 -12
  15. data/lib/aspera/api/aoc.rb +28 -28
  16. data/lib/aspera/api/cos_node.rb +10 -9
  17. data/lib/aspera/api/faspex.rb +2 -2
  18. data/lib/aspera/api/httpgw.rb +20 -20
  19. data/lib/aspera/api/node.rb +31 -53
  20. data/lib/aspera/ascmd.rb +13 -13
  21. data/lib/aspera/ascp/installation.rb +43 -36
  22. data/lib/aspera/ascp/management.rb +6 -6
  23. data/lib/aspera/assert.rb +12 -13
  24. data/lib/aspera/cli/ascp_actions.rb +7 -7
  25. data/lib/aspera/cli/async_transfer_store.rb +49 -5
  26. data/lib/aspera/cli/bootstrapper.rb +9 -9
  27. data/lib/aspera/cli/command_registry.rb +1 -1
  28. data/lib/aspera/cli/command_spec.rb +6 -3
  29. data/lib/aspera/cli/context.rb +3 -3
  30. data/lib/aspera/cli/extended_value.rb +26 -26
  31. data/lib/aspera/cli/formatter.rb +76 -54
  32. data/lib/aspera/cli/gem_checker.rb +1 -1
  33. data/lib/aspera/cli/hints.rb +2 -2
  34. data/lib/aspera/cli/http.rb +22 -29
  35. data/lib/aspera/cli/mailer.rb +7 -7
  36. data/lib/aspera/cli/mcp_tool.rb +31 -4
  37. data/lib/aspera/cli/option_declarator.rb +77 -0
  38. data/lib/aspera/cli/options.schema.yaml +273 -3
  39. data/lib/aspera/cli/parser.rb +539 -280
  40. data/lib/aspera/cli/plugins/alee.rb +1 -1
  41. data/lib/aspera/cli/plugins/aoc.rb +303 -314
  42. data/lib/aspera/cli/plugins/ats.rb +25 -21
  43. data/lib/aspera/cli/plugins/base.rb +357 -186
  44. data/lib/aspera/cli/plugins/basic_auth.rb +0 -12
  45. data/lib/aspera/cli/plugins/config.rb +76 -73
  46. data/lib/aspera/cli/plugins/console.rb +8 -8
  47. data/lib/aspera/cli/plugins/cos.rb +4 -3
  48. data/lib/aspera/cli/plugins/factory.rb +2 -2
  49. data/lib/aspera/cli/plugins/faspex5.rb +259 -248
  50. data/lib/aspera/cli/plugins/faspio.rb +7 -2
  51. data/lib/aspera/cli/plugins/httpgw.rb +1 -1
  52. data/lib/aspera/cli/plugins/mcp.rb +11 -11
  53. data/lib/aspera/cli/plugins/node.rb +227 -283
  54. data/lib/aspera/cli/plugins/orchestrator.rb +23 -23
  55. data/lib/aspera/cli/plugins/preview.rb +61 -64
  56. data/lib/aspera/cli/plugins/server.rb +36 -31
  57. data/lib/aspera/cli/plugins/shares.rb +174 -135
  58. data/lib/aspera/cli/preset_actions.rb +39 -19
  59. data/lib/aspera/cli/preset_manager.rb +74 -32
  60. data/lib/aspera/cli/result.rb +18 -16
  61. data/lib/aspera/cli/runner.rb +75 -39
  62. data/lib/aspera/cli/secret_finder.rb +1 -1
  63. data/lib/aspera/cli/sync_actions.rb +36 -35
  64. data/lib/aspera/cli/terminal_formatter.rb +2 -2
  65. data/lib/aspera/cli/transfer_actions.rb +17 -10
  66. data/lib/aspera/cli/transfer_agent.rb +44 -44
  67. data/lib/aspera/cli/transfer_progress.rb +7 -7
  68. data/lib/aspera/cli/vault_manager.rb +34 -12
  69. data/lib/aspera/cli/version.rb +1 -1
  70. data/lib/aspera/cli/wizard.rb +17 -20
  71. data/lib/aspera/colors.rb +3 -3
  72. data/lib/aspera/command_line_builder.rb +17 -16
  73. data/lib/aspera/command_line_converter.rb +1 -1
  74. data/lib/aspera/coverage.rb +1 -2
  75. data/lib/aspera/data_repository.rb +1 -1
  76. data/lib/aspera/dot_container.rb +8 -8
  77. data/lib/aspera/environment.rb +13 -13
  78. data/lib/aspera/faspex_gw.rb +4 -4
  79. data/lib/aspera/faspex_postproc.rb +14 -9
  80. data/lib/aspera/graphql.rb +4 -2
  81. data/lib/aspera/hash_ext.rb +2 -2
  82. data/lib/aspera/json_rpc/client.rb +1 -1
  83. data/lib/aspera/keychain/base.rb +10 -3
  84. data/lib/aspera/keychain/encrypted_hash.rb +92 -17
  85. data/lib/aspera/keychain/factory.rb +17 -5
  86. data/lib/aspera/keychain/hashicorp_vault.rb +1 -1
  87. data/lib/aspera/keychain/macos_security.rb +23 -25
  88. data/lib/aspera/keychain/one_password_api.rb +86 -0
  89. data/lib/aspera/keychain/one_password_base.rb +34 -0
  90. data/lib/aspera/keychain/one_password_cli.rb +98 -0
  91. data/lib/aspera/link_header.rb +2 -2
  92. data/lib/aspera/log.rb +13 -13
  93. data/lib/aspera/markdown.rb +5 -5
  94. data/lib/aspera/nagios.rb +8 -8
  95. data/lib/aspera/node_simulator.rb +33 -27
  96. data/lib/aspera/oauth/base.rb +4 -5
  97. data/lib/aspera/oauth/boot.rb +3 -3
  98. data/lib/aspera/oauth/factory.rb +5 -5
  99. data/lib/aspera/oauth/jwt.rb +5 -7
  100. data/lib/aspera/oauth/web.rb +4 -4
  101. data/lib/aspera/persistency_action_once.rb +4 -4
  102. data/lib/aspera/persistency_folder.rb +8 -8
  103. data/lib/aspera/preview/file_types.rb +4 -4
  104. data/lib/aspera/preview/generator.rb +49 -46
  105. data/lib/aspera/preview/options.rb +3 -2
  106. data/lib/aspera/preview/terminal.rb +5 -5
  107. data/lib/aspera/preview/utils.rb +65 -18
  108. data/lib/aspera/products/connect.rb +2 -2
  109. data/lib/aspera/products/desktop.rb +1 -1
  110. data/lib/aspera/products/other.rb +2 -2
  111. data/lib/aspera/products/transferd.rb +3 -3
  112. data/lib/aspera/proxy_auto_config.rb +10 -10
  113. data/lib/aspera/rest.rb +149 -115
  114. data/lib/aspera/rest_error_analyzer.rb +3 -3
  115. data/lib/aspera/rest_list.rb +10 -9
  116. data/lib/aspera/schema/IBM Aspera Node API-4.4.6.yaml +6232 -0
  117. data/lib/aspera/schema/IBM Aspera faspio Gateway API-1.0.0.yaml +249 -0
  118. data/lib/aspera/schema/IBM Aspera on Cloud API-0.2.6-enhanced.yaml +39 -0
  119. data/lib/aspera/schema/IBM_Aspera_Shares.yaml +4653 -0
  120. data/lib/aspera/schema/documentation.rb +17 -11
  121. data/lib/aspera/schema/reader.rb +78 -4
  122. data/lib/aspera/schema/registry.rb +26 -7
  123. data/lib/aspera/secret_hider.rb +5 -5
  124. data/lib/aspera/ssh.rb +64 -31
  125. data/lib/aspera/ssl.rb +3 -3
  126. data/lib/aspera/sync/database.rb +2 -2
  127. data/lib/aspera/sync/operations.rb +13 -13
  128. data/lib/aspera/temp_file_manager.rb +24 -4
  129. data/lib/aspera/transfer/faux_file.rb +2 -2
  130. data/lib/aspera/transfer/parameters.rb +15 -15
  131. data/lib/aspera/transfer/resumer.rb +9 -9
  132. data/lib/aspera/transfer/spec.rb +1 -1
  133. data/lib/aspera/transfer/spec.schema.yaml +1 -0
  134. data/lib/aspera/uri_reader.rb +52 -15
  135. data/lib/aspera/web_auth.rb +6 -5
  136. data/lib/aspera/web_server_simple.rb +9 -9
  137. data/lib/aspera/yaml.rb +4 -4
  138. data.tar.gz.sig +0 -0
  139. metadata +10 -4
  140. metadata.gz.sig +0 -0
  141. data/lib/aspera/cli/plugins/faspex.rb +0 -576
  142. data/lib/aspera/transfer/uri.rb +0 -56
data/docs/README.md CHANGED
@@ -1,9 +1,17 @@
1
1
  # Command Line Interface for IBM Aspera products
2
2
  <!--
3
+ EDITING GUIDELINES (developers and AI):
4
+ - This file is the source template for the generated README.md. Edit this file, not README.md.
5
+ - Do not use Unicode characters unless strictly necessary (e.g. wizard menu labels that must
6
+ match the actual on-screen UI text). Use plain ASCII equivalents instead:
7
+ apostrophe : ' (not ' or ')
8
+ dash : - (not en-dash U+2013, not em-dash U+2014, not --)
9
+ ellipsis : ... (not U+2026)
10
+ - Emphasis style: use **bold** (double asterisks) only. Do not use *single asterisk italic*, _underscore_, or __double underscore__ style.
3
11
  DO NOT EDIT: THIS FILE IS GENERATED, edit docs/README.erb.md.
4
12
  PANDOC_DEFAULTS_BEGIN
5
13
  metadata:
6
- subtitle: "ascli 4.27.0"
14
+ subtitle: "ascli 4.27.2"
7
15
  author: "Laurent Martin"
8
16
  PANDOC_DEFAULTS_END
9
17
  -->
@@ -25,7 +33,7 @@ Designed for automation, scripting, and integration scenarios, `ascli` enables o
25
33
  ### Key Features
26
34
 
27
35
  **Multi-Product Integration**
28
- : Unified interface supporting Aspera on Cloud, Faspex (v4 and v5), Shares, Node API, Console, Orchestrator, and High-Speed Transfer Server (HSTS).
36
+ : Unified interface supporting Aspera on Cloud, Faspex 5, Shares, Node API, Console, Orchestrator, and High-Speed Transfer Server (HSTS).
29
37
 
30
38
  **Flexible Authentication**
31
39
  : Support for OAuth 2.0, JWT, Basic Authentication, and SSH key-based authentication across different Aspera products.
@@ -78,7 +86,7 @@ Internally, `ascli` integrates several components:
78
86
  For programmatic integration with languages such as C/C++, Go, Python, NodeJS, and others, it is recommended to use the [Aspera APIs](https://ibm.biz/aspera_api) directly.
79
87
  These include:
80
88
 
81
- - REST APIs for products like Aspera on Cloud (AoC), Faspex, and Node
89
+ - REST APIs for products like Aspera on Cloud (AoC), Faspex 5, and Node
82
90
  - The Transfer Daemon with gRPC interfaces and language-specific stubs (C/C++, Python, .NET/C#, Java, Go, Ruby, Rust, and so on)
83
91
 
84
92
  These APIs are generally more suitable for long-term development and maintenance.
@@ -137,8 +145,8 @@ This section walks you through your first interaction with `ascli` on Linux.
137
145
 
138
146
  ```shell
139
147
  mkdir -p $HOME/bin
140
- tar zxvf ascli.4.27.0.linux-x86_64.tgz
141
- mv ascli.4.27.0.linux-x86_64 $HOME/bin/ascli
148
+ tar zxvf ascli.4.27.2.linux-x86_64.tgz
149
+ mv ascli.4.27.2.linux-x86_64 $HOME/bin/ascli
142
150
  export PATH=$PATH:$HOME/bin
143
151
  ```
144
152
 
@@ -152,7 +160,7 @@ ascli -v
152
160
  ```
153
161
 
154
162
  ```text
155
- 4.27.0
163
+ 4.27.2
156
164
  ```
157
165
 
158
166
  - Install the Aspera transfer runtime (tested version), as it is not included in the `ascli` package:
@@ -424,17 +432,19 @@ brew install ruby
424
432
  > Do not use it.
425
433
  > Use the required version of Ruby.
426
434
 
427
- This installs a recent Ruby suitable for `ascli`.
435
+ This installs a recent Ruby version suitable for `ascli`.
428
436
 
429
- To add Ruby to your `PATH` on Apple Silicon, add the following lines to your shell configuration file (that is, `~/.zshrc` if you are using `zsh`, or `~/.bash_profile` for `bash`):
437
+ After installation, Homebrew's Ruby is not on the `PATH` by default (this is shown at the end of the `brew install ruby` output and by `brew info ruby`).
438
+ Add it to your shell configuration file:
430
439
 
431
- ```shell
432
- PATH="$(brew --prefix ruby)/bin:$($(brew --prefix ruby)/bin/gem env gemdir)/bin:$PATH"
433
- ```
440
+ - **zsh** (default shell on macOS — run this once in a terminal):
434
441
 
435
- > [!NOTE]
436
- > This is what is displayed at the end of the installation of the ruby tap,
437
- > same as the message from: `brew info ruby`
442
+ ```shell
443
+ echo 'PATH="$(brew --prefix ruby)/bin:$($(brew --prefix ruby)/bin/gem env gemdir)/bin:$PATH"' >> ~/.zprofile
444
+ source ~/.zprofile
445
+ ```
446
+
447
+ - **bash** — replace `~/.zprofile` with `~/.bash_profile` in the commands above.
438
448
 
439
449
  #### Linux: Package
440
450
 
@@ -647,7 +657,7 @@ Those are not installed as part of dependencies because they involve compilation
647
657
  See [Gemfile](../Gemfile):
648
658
 
649
659
  | name | version | comment |
650
- |----------------------|----------|-------------------------------------------------------------------------------|
660
+ |---------------------|----------|-------------------------------------------------------------------------------|
651
661
  | rake | ~> 13.0 | |
652
662
  | debug | ~> 1.11 | (no jruby) |
653
663
  | grpc-tools | ~> 1.67 | |
@@ -662,8 +672,6 @@ See [Gemfile](../Gemfile):
662
672
  | mcp | ~> 1.2 | for ascli mcp server (MCP protocol support) |
663
673
  | rack | ~> 3.0 | for ascli mcp server HTTP transport (required by mcp StreamableHTTPTransport) |
664
674
  | grpc | ~> 1.71 | (no jruby) for Aspera Transfer Daemon |
665
- | symmetric-encryption | ~> 4.6 | for encrypted hash file secrets |
666
- | bigdecimal | ~> 3.1 | if RUBY_VERSION >= '3.4' for symmetric-encryption ? |
667
675
  | base64 | ~> 0.3 | if RUBY_VERSION >= '3.4' remove from standard gems |
668
676
  | sqlite3 | ~> 2.7 | (no jruby) for async DB |
669
677
  | jdbc-sqlite3 | ~> 3.46 | (jruby) for async DB |
@@ -690,8 +698,6 @@ gem install solargraph -v '~> 0.48'
690
698
  gem install mcp -v '~> 1.2'
691
699
  gem install rack -v '~> 3.0'
692
700
  gem install grpc -v '~> 1.71'
693
- gem install symmetric-encryption -v '~> 4.6'
694
- gem install bigdecimal -v '~> 3.1'
695
701
  gem install base64 -v '~> 0.3'
696
702
  gem install sqlite3 -v '~> 2.7'
697
703
  gem install jdbc-sqlite3 -v '~> 3.46'
@@ -822,7 +828,12 @@ If installation from a local file is preferred (air-gapped installation) instead
822
828
  ascli config transferd install --sdk-url=file:///macos-arm64-1.1.3-c6c7a2a.zip
823
829
  ```
824
830
 
825
- The format is: `file:///<PATH>`, where `<PATH>` can be either a relative path (not starting with `/`), or an absolute path.
831
+ The format is: `file:///<PATH>` (canonical form) or `file:<PATH>` (short form), where `<PATH>` can be either a relative path (not starting with `/`), or an absolute path (starting with `/`).
832
+
833
+ | Form | Relative example | Absolute example |
834
+ |------|-----------------|-----------------|
835
+ | Canonical | `file:///mydir/archive.zip` | `file:////home/user/archive.zip` |
836
+ | Short | `file:mydir/archive.zip` | `file:/home/user/archive.zip` |
826
837
 
827
838
  Supported platforms are listed in the [Release Notes](https://developer.ibm.com/apis/catalog/aspera--aspera-transfer-sdk/Release+notes) and archives can be downloaded from [Downloads](https://developer.ibm.com/apis/catalog/aspera--aspera-transfer-sdk/downloads/downloads.json).
828
839
 
@@ -887,11 +898,11 @@ Alternatively, the necessary gems can be packaged into a `tar.gz` archive as fol
887
898
 
888
899
  ```shell
889
900
  mkdir temp_folder
890
- gem install aspera-cli:4.27.0 --no-document --install-dir temp_folder
901
+ gem install aspera-cli:4.27.2 --no-document --install-dir temp_folder
891
902
  find temp_folder
892
- mv temp_folder/cache aspera-cli-4.27.0-gems
903
+ mv temp_folder/cache aspera-cli-4.27.2-gems
893
904
  rm -fr temp_folder
894
- tar zcvf aspera-cli-4.27.0-gems aspera-cli-4.27.0-gems.tgz
905
+ tar zcvf aspera-cli-4.27.2-gems aspera-cli-4.27.2-gems.tgz
895
906
  ```
896
907
 
897
908
  #### Unix-like: Alternative installation using `rvm`
@@ -1025,7 +1036,7 @@ ascli -v
1025
1036
  ```
1026
1037
 
1027
1038
  ```text
1028
- 4.27.0
1039
+ 4.27.2
1029
1040
  ```
1030
1041
 
1031
1042
  To keep persistency of configuration on the host, specify your user's configuration folder as a volume for the container.
@@ -1288,7 +1299,7 @@ ascli config echo @uri:https://curl.haxx.se/ca/cacert.pem --format=text
1288
1299
  To download that certificate store:
1289
1300
 
1290
1301
  ```shell
1291
- ascli config echo @uri:https://curl.haxx.se/ca/cacert.pem --format=text --output=/tmp/cacert.pem
1302
+ ascli config echo @uri:https://curl.haxx.se/ca/cacert.pem --format=text --out.file=/tmp/cacert.pem
1292
1303
  ```
1293
1304
 
1294
1305
  Then, use this store by setting the option `cert_stores` (or env var `SSL_CERT_FILE`).
@@ -1296,7 +1307,7 @@ Then, use this store by setting the option `cert_stores` (or env var `SSL_CERT_F
1296
1307
  To trust a specific certificate (for example, self-signed), **provided that the `CN` is correct**, save the certificate chain to a file:
1297
1308
 
1298
1309
  ```shell
1299
- ascli config remote_certificate chain https://localhost:9092 --insecure=yes --output=<SERVER_PRESET_NAME>.pem
1310
+ ascli config remote_certificate chain https://localhost:9092 --insecure=yes --out.file=<SERVER_PRESET_NAME>.pem
1300
1311
  ```
1301
1312
 
1302
1313
  > [!NOTE]
@@ -1430,28 +1441,25 @@ Typically, the `create` verb takes a resource creation data as a parameter.
1430
1441
  #### Identifiers
1431
1442
 
1432
1443
  Identifiers uniquely identify a resource.
1433
- They are typically located immediately after a verb, itself placed after the resource type.
1434
- Some resources accept selection using other unique identifier, other than the native identifier (typically: `id`), using the **percent selector**.
1444
+ They are typically located immediately after a verb like `show`, `modify` or `delete`, itself placed after the resource type, for example: `user show foobar`.
1445
+ Some resources accept selection using other unique identifier, other than the native identifier (typically: `id`), using the [**percent selector**](#percent-selector).
1435
1446
 
1436
1447
  ##### Percent selector
1437
1448
 
1438
- Some resources provide the following capability:
1439
- If the resource can also be uniquely identified by a name, then the name can be used instead of the identifier, using the **percent selector**.
1440
- For example, if the name of the user is `john` and a field for this resource named `name` has a value `john`:
1449
+ The **percent selector** is a special syntax that lets you identify a resource by any unique field, instead of its default identifier (typically a numeric `id`).
1441
1450
 
1442
- ```shell
1443
- ascli aoc admin user show %name:john
1444
- ```
1451
+ Syntax: `%<FIELD>:<VALUE>`
1445
1452
 
1446
- The percent selector allows identification of a resource by another unique identifier other than the native identifier (typically: `id`).
1453
+ - The leading `%` marks the argument as a percent selector (not a plain identifier).
1454
+ - `<FIELD>` is the name of the field to match on (e.g. `name`, `email`).
1455
+ - `<VALUE>` is the expected value of that field.
1447
1456
 
1448
- Syntax: `%<FIELD>:<VALUE>`
1457
+ The tool then looks up the resource whose `<FIELD>` equals `<VALUE>` and uses its native identifier internally.
1449
1458
 
1450
- When a command is executed on a resource, the resource is identified by a unique identifier that follows the command.
1451
- For example, in the following command, `<USER_ID>` is the user's identifier:
1459
+ For example, to show the user whose `name` field is `john`:
1452
1460
 
1453
1461
  ```shell
1454
- ascli aoc admin user show <USER_ID>
1462
+ ascli aoc admin user show %name:john
1455
1463
  ```
1456
1464
 
1457
1465
  #### Command Parameters
@@ -1601,7 +1609,9 @@ Command-line options, such as `--log-level=debug`, follow these conventions:
1601
1609
  Option name in config file use underscores (`_`) as word separators.
1602
1610
  Example: `--log-level=debug` is `log_level` in config file.
1603
1611
  - **Values**:
1604
- An options value is assigned using `=` (for example, `--log-level=debug`).
1612
+ An option's value is assigned using `=` (for example, `--log-level=debug`).
1613
+ Alternatively, the value can be provided as a separate, space-separated token (for example, `--log-level debug`).
1614
+ Both forms are equivalent.
1605
1615
  - **Prefix Usage**:
1606
1616
  Options support prefix matching (see [Enumerations](#enumerations)), though full names are recommended.
1607
1617
  - **Optionality**:
@@ -1614,7 +1624,7 @@ Exceptions and Special Cases:
1614
1624
  - **Short Forms**
1615
1625
 
1616
1626
  Some options have short forms.
1617
- For example, `-Ptoto` is equivalent to `--preset=toto`.
1627
+ For example, `-Ptoto` and `-P toto` are both equivalent to `--preset=toto` and `--preset toto`.
1618
1628
  See the manual or `-h` for details.
1619
1629
  - **Flags**
1620
1630
 
@@ -1626,9 +1636,10 @@ Exceptions and Special Cases:
1626
1636
  - [**dot-path notation**](#dot-path-notation)
1627
1637
  - **Cumulative Hashes**
1628
1638
 
1629
- When an option of type `Hash` is set, the value is deep-merged to an existing or default value.
1630
- Setting to `@none:` is equivalent to setting to `@json:{}`, that is, an empty `Hash`.
1631
- This can be used to start from an empty value, and not use the existing default value.
1639
+ When an option of type `Hash` is set, the value is deep-merged with any existing value.
1640
+ Setting to `@json:{}` starts from an empty hash (the existing value is discarded for that merge step).
1641
+ Setting to `@none:` explicitly disables the option: it is set to `nil` and any preset or default value is prevented from restoring it.
1642
+ This is useful, for example, to disable a vault or any Hash option that is configured in a default preset.
1632
1643
 
1633
1644
  Example:
1634
1645
 
@@ -1748,16 +1759,16 @@ The style of output can be set using the `format` option:
1748
1759
 
1749
1760
  By default, result of type `single_object` and `object_list` are displayed using format `table`.
1750
1761
 
1751
- #### Option: `table_style`
1762
+ #### Option: `--out.table`
1752
1763
 
1753
- The way `format`: `table` and `csv` are generated can be customized with option: `table_style` which expects a `Hash`.
1764
+ The way `format`: `table` and `csv` are generated can be customized with option `--out.table` which expects a `Hash`.
1754
1765
 
1755
1766
  For `format=table`, options are the ones described in gem [`terminal-table`](https://github.com/tj/terminal-table).
1756
1767
 
1757
1768
  For example, to display a table with thick Unicode borders:
1758
1769
 
1759
1770
  ```shell
1760
- ascli config preset over --table-style=@ruby:'{border: :unicode_thick_edge}'
1771
+ ascli config preset over --out.table=@ruby:'{border: :unicode_thick_edge}'
1761
1772
  ```
1762
1773
 
1763
1774
  > [!NOTE]
@@ -1774,10 +1785,10 @@ For `format=csv`, options are described in gem [`csv`](https://ruby.github.io/cs
1774
1785
  For example, to display a CSV with headers and quotes:
1775
1786
 
1776
1787
  ```shell
1777
- ascli config echo @json:'[{"name":"foo","id":1},{"name":"bar","id":8}]' --format=csv --table=@json:'{"headers":true,"force_quotes":true}'
1788
+ ascli config echo @json:'[{"name":"foo","id":1},{"name":"bar","id":8}]' --format=csv --out.table=@json:'{"headers":true,"force_quotes":true}'
1778
1789
  ```
1779
1790
 
1780
- #### Option: `flat_hash`: Single level `Hash`
1791
+ #### Option: `--out.flat`: Single level `Hash`
1781
1792
 
1782
1793
  This option controls how object fields are displayed for complex objects.
1783
1794
 
@@ -1811,7 +1822,7 @@ ascli config echo @json:'{"A":"a","B":[{"name":"B1","value":"b1"},{"name":"B2","
1811
1822
  ╰────────┴───────╯
1812
1823
  ```
1813
1824
 
1814
- For the same command, adding option `--flat=no`:
1825
+ For the same command, adding option `--out.flat=no`:
1815
1826
 
1816
1827
  ```text
1817
1828
  ╭───────┬────────────────────────────────────────────────────────────────────────╮
@@ -1824,7 +1835,7 @@ For the same command, adding option `--flat=no`:
1824
1835
  ╰───────┴────────────────────────────────────────────────────────────────────────╯
1825
1836
  ```
1826
1837
 
1827
- #### Option: `multi_single`
1838
+ #### Option: `--out.table.pivot`
1828
1839
 
1829
1840
  This option controls how result fields are displayed as columns or lines, when option `format` is set to `table`.
1830
1841
  Default is `no`.
@@ -1852,7 +1863,7 @@ The display of result is as follows:
1852
1863
  This parameter can be set as a global default with:
1853
1864
 
1854
1865
  ```shell
1855
- ascli config preset set GLOBAL multi_single single
1866
+ ascli config preset set GLOBAL out.table.pivot single
1856
1867
  ```
1857
1868
 
1858
1869
  Examples:
@@ -1860,7 +1871,7 @@ Examples:
1860
1871
  Simulate a result by executing this command:
1861
1872
 
1862
1873
  ```shell
1863
- ascli config echo @json:'<JSON_VALUE>' --multi-single=<no|yes|single>
1874
+ ascli config echo @json:'<JSON_VALUE>' --out.table.pivot=<no|yes|single>
1864
1875
  ```
1865
1876
 
1866
1877
  Example 1: A list of one object
@@ -1925,7 +1936,7 @@ Display with `yes` (multiple Simple):
1925
1936
  ╰───────┴───────╯
1926
1937
  ```
1927
1938
 
1928
- #### Option: `display`: Verbosity of output
1939
+ #### Option: `--out.level`: Verbosity of output
1929
1940
 
1930
1941
  Output messages are categorized in 3 types:
1931
1942
 
@@ -1933,17 +1944,17 @@ Output messages are categorized in 3 types:
1933
1944
  - `data` output contains the actual output of the command (object, or list of objects)
1934
1945
  - `error` output contains error messages
1935
1946
 
1936
- The option `display` controls the level of output:
1947
+ The option `--out.level` controls the level of output:
1937
1948
 
1938
1949
  - `info` displays all messages: `info`, `data`, and `error`
1939
1950
  - `data` display `data` and `error` messages
1940
1951
  - `error` display only error messages.
1941
1952
 
1942
- #### Option: `show_secrets`: Hide or show secrets in results
1953
+ #### Option: `--out.secrets`: Hide or show secrets in results
1943
1954
 
1944
1955
  - If value is `no` (default), then secrets are redacted from command results.
1945
1956
  - If value is `yes`, then secrets shown in clear in results.
1946
- - If `display` is `data`, secrets are included to allow piping results.
1957
+ - If `--out.level` is `data`, secrets are included to allow piping results.
1947
1958
 
1948
1959
  #### Option: `fields`: Selection of output object fields
1949
1960
 
@@ -2000,15 +2011,22 @@ In the above example, the same result is obtained with option:
2000
2011
  --select=@ruby:'->(i){i["ats_admin"]}'
2001
2012
  ```
2002
2013
 
2003
- Option `select` applies the filter after a possible "flattening" with option: `flat_hash`.
2014
+ Option `select` applies the filter after a possible "flattening" with option `--out.flat`.
2004
2015
 
2005
2016
  ### Extended Value Syntax
2006
2017
 
2018
+ An **Extended Value** is a structured value - typically a `Hash` (key/value dictionary) or `Array`, potentially nested - that is passed on the command line wherever a simple string is not sufficient.
2019
+
2007
2020
  Most options and arguments are specified by a simple string (for example, `username` or `url`).
2008
- Sometimes it is convenient to read a value from a file: for example read the PEM value of a private key, or a list of files.
2009
- Some options expect a more complex value such as `Hash` or `Array`.
2021
+ However, some situations require a complex structure:
2010
2022
 
2011
- The [Extended Value](#extended-value-syntax) Syntax allows specifying such values and even reading values from other sources than the command line itself.
2023
+ - An option expects a **structured value** (`Hash`, `Array`) rather than a plain string.
2024
+ - The value is too long or complex to type inline (for example, a PEM private key, a JSON body).
2025
+ - The value must be **read from a file, an environment variable, or a URL** at runtime rather than embedded in the command.
2026
+ - The value needs **type coercion**: for example, an integer `1` instead of the string `"1"`, or a boolean `true`.
2027
+
2028
+ The **Extended Value** syntax addresses all of these needs with a uniform, composable mechanism.
2029
+ It lets you specify **what the value is** and **how to obtain or decode it**, entirely on the command line.
2012
2030
 
2013
2031
  #### Syntax and Decoders
2014
2032
 
@@ -2046,11 +2064,11 @@ The following decoders are supported:
2046
2064
  | `s` | Any | `String` | Converts argument to `String`. |
2047
2065
  | `secret` | `String` | `String` | Ask password interactively (hides input). Argument is the prompt. |
2048
2066
  | `stdin` | `String` | `String` | Read from stdin in text mode. Argument: `<empty>`, `bin` or `chomp`. |
2049
- | `uri` | `String` | `String` | Read value from specified URL. for example, `--fpac=@uri:http://serv/f.pac` |
2067
+ | `uri` | `String` | `String` | Read value from specified URL. Supported schemes: `http:`, `https:`, `data:`, `file:`. for example, `--fpac=@uri:http://serv/f.pac` or `--key=@uri:file:/path/to/key.pem` |
2050
2068
  | `val` | `String` | `String` | Prevent decoders on the right to be decoded. for example, `--key=@val:@file:foo` sets the option `key` to value `@file:foo`. |
2051
2069
  | `yaml` | `String` | Any | Decode YAML. |
2052
2070
  | `zlib` | `String` | `String` | Decompress data using zlib. |
2053
- | `<empty>`| None | Any | The empty modifier, resulting as argument `@:`, parses remaining positional arguments as a `Hash` or `Array` using [dot-path](#dot-path-notation) notation.<br/>Use `END` to stop collection when further positional arguments must follow. |
2071
+ | `<empty>`| None | Any | The **dot-path** modifier: argument `@:` collects the following positional arguments as `key.subkey=value` assignments and builds a `Hash` or `Array` using [dot-path](#dot-path-notation) notation. Shell-friendly alternative to `@json:` for structured values.<br/>See [Positional Arguments with Dot-path](#positional-arguments-with-dot-path) for full syntax. Use `END` to stop collection when further positional arguments must follow. |
2054
2072
 
2055
2073
  > [!NOTE]
2056
2074
  > A few commands support a value of type `Proc` (lambda expression).
@@ -2066,11 +2084,85 @@ It expects a `@` to close the embedded [Extended Value](#extended-value-syntax)
2066
2084
  Option `parser` allows definition of a default parser when the positional parameter or option expects a `Hash` or `Array`.
2067
2085
  For example, with `--parser=json`, the parameter `{}` will be parsed as an empty JSON Hash, even without prefix `@json:`.
2068
2086
 
2087
+ #### Syntax Equivalences
2088
+
2089
+ There are four main ways to express a structured value (for example, a `Hash` with two keys).
2090
+ They are all equivalent and produce the same result:
2091
+
2092
+ | Syntax | Example | Best for |
2093
+ |--------|---------|----------|
2094
+ | `@json:` | `@json:'{"name":"alice","age":30}'` | Scripts, API payloads, copy-paste from docs |
2095
+ | `@yaml:` | `@yaml:@stdin:` + here-doc | Multi-line or deeply nested structures |
2096
+ | `@ruby:` | `@ruby:'{"name"=>"alice","age"=>30}'` | Advanced use: lambdas, file reads, logic |
2097
+ | dot-path (`key.subkey=value`) via `@:` | `@: name=alice age=30` | Interactive CLI, simple structures, no quoting |
2098
+
2099
+ All four examples above produce the same `Hash`: `{"name" => "alice", "age" => 30}`.
2100
+
2101
+ ```shell
2102
+ ascli config echo @json:'{"name":"alice","age":30}' --format=json
2103
+ ascli config echo @ruby:'{"name"=>"alice","age"=>30}' --format=json
2104
+ ascli config echo @: name=alice age=30 --format=json
2105
+ ```
2106
+
2107
+ ```json
2108
+ {"name":"alice","age":30}
2109
+ ```
2110
+
2111
+ > [!NOTE]
2112
+ > The dot-path form (`key.subkey=value` assignments via `@:`) does **not** need quotes for simple string values and is the most shell-friendly.
2113
+ > The `@json:` form requires enclosing in single quotes to protect `"` from the shell.
2114
+ > The `@ruby:` form accepts both single and double quotes and supports arbitrary Ruby expressions.
2115
+ > The `@yaml:` form is most convenient when combined with a shell **here-document** (`<<EOF`).
2116
+
2117
+ ##### Equivalences: Positional Parameter vs Option
2118
+
2119
+ The same `Hash` value `{"a":1,"b":"two"}` can be expressed differently depending on whether it is supplied as a **positional parameter** or as an **option**.
2120
+
2121
+ **As a positional parameter** (argument to a command):
2122
+
2123
+ ```shell
2124
+ # JSON form
2125
+ some_command @json:'{"a":1,"b":"two"}'
2126
+ # Dot-path form (END is optional when no positional argument follows)
2127
+ some_command @: a=1 b=two
2128
+ some_command @: a=1 b=two END
2129
+ ```
2130
+
2131
+ **As an option** named `opt`:
2132
+
2133
+ ```shell
2134
+ # JSON form
2135
+ --opt=@json:'{"a":1,"b":"two"}'
2136
+ # Dot-path form via option name (each key as a separate option flag)
2137
+ --opt.a=1 --opt.b=two
2138
+ # Dot-path form via option value (consumes following positional arguments)
2139
+ --opt=@: a=1 b=two END
2140
+ ```
2141
+
2142
+ > [!NOTE]
2143
+ > `--opt.a=1 --opt.b=two` and `--opt=@json:'{"a":1,"b":"two"}'` and `--opt=@: a=1 b=two` all produce the same `Hash` assigned to option `opt`.
2144
+ > The `--opt.key=value` form is the most concise when only a few keys need to be set.
2145
+ > Use `END` with `@:` when further positional arguments follow on the command line; it is optional otherwise.
2146
+
2147
+ #### Which Syntax to Choose?
2148
+
2149
+ **When in doubt: start with dot-path** (`--opt.key=value` for options, `@: key=value` for positional arguments).
2150
+ It requires no quoting, auto-converts types, and reads naturally on the command line.
2151
+ Switch to `@json:` when you already have a JSON payload from an API doc or external tool.
2152
+
2153
+ | Context | Recommended syntax | Reason |
2154
+ |---------|--------------------|--------|
2155
+ | Interactive CLI, simple values | dot-path `key.subkey=value` via `@:` or `--opt.key=value` | No quoting needed, auto-typed, readable |
2156
+ | Shell scripts, API payloads | `@json:` | Standard, portable, easy to copy from API docs |
2157
+ | Multi-line or nested structures in scripts | `@yaml:` + `@stdin:` heredoc | Readable, no escaping |
2158
+ | Dynamic values, lambdas, file reads | `@ruby:` | Full Ruby expressiveness |
2159
+
2069
2160
  #### Common Usage Examples
2070
2161
 
2071
- Example: Create a `Hash` value with the convenient `@json:` decoder:
2162
+ Example: Create a `Hash` value - for a small structure, the dot-path `key.subkey=value` form (via `@:`) is simpler; for larger or API-sourced structures, use `@json:`:
2072
2163
 
2073
2164
  ```shell
2165
+ ascli config echo @: key1=value1 key2=value2
2074
2166
  ascli config echo @json:'{"key1":"value1","key2":"value2"}'
2075
2167
  ```
2076
2168
 
@@ -2212,12 +2304,31 @@ This works for any `Hash` option or positional parameter that has a defined sche
2212
2304
 
2213
2305
  #### Testing Extended Value
2214
2306
 
2215
- In case of doubt of argument values after parsing, one can test using command `config echo`.
2216
- `config echo` takes exactly **one** argument which can use the [Extended Value](#extended-value-syntax) syntax.
2307
+ Two complementary commands help verify that a value is parsed as expected:
2308
+
2309
+ | What to check | Tool | How |
2310
+ |---|---|---|
2311
+ | Value of a **positional parameter** | `config echo` | Pass the expression as the sole argument |
2312
+ | Value of an **option** | `--show-config` | Append `--show-config` to any command line |
2313
+
2314
+ **Checking a positional parameter with `config echo`**:
2315
+
2316
+ `config echo` takes exactly **one** argument which can use the [Extended Value](#extended-value-syntax) syntax, and displays its parsed value.
2217
2317
  Unprocessed command line arguments are shown in the error message.
2218
2318
 
2219
- Example:
2220
- The shell parses three arguments (as `String`: `1`, `2` and `3`), so the additional two arguments are not processed by the `echo` command.
2319
+ ```shell
2320
+ ascli config echo @json:'{"a":1,"b":"two"}' --format=json
2321
+ ascli config echo @: a=1 b=two --format=json
2322
+ ```
2323
+
2324
+ ```json
2325
+ {"a":1,"b":"two"}
2326
+ ```
2327
+
2328
+ > [!NOTE]
2329
+ > The value is shown after both shell command-line parsing and `ascli` [Extended Value](#extended-value-syntax) parsing.
2330
+
2331
+ Example: the shell parses three arguments (`1`, `2`, `3`), but `config echo` only processes the first:
2221
2332
 
2222
2333
  ```shell
2223
2334
  ascli config echo 1 2 3
@@ -2228,10 +2339,19 @@ ascli config echo 1 2 3
2228
2339
  ERROR: Argument: unprocessed values: ["2", "3"]
2229
2340
  ```
2230
2341
 
2231
- `config echo` displays the value of the **first** argument using the current output `format`.
2342
+ **Checking an option value with `--show-config`**:
2232
2343
 
2233
- > [!NOTE]
2234
- > It gets its value after shell command-line parsing and `ascli` [Extended Value](#extended-value-syntax) parsing.
2344
+ Adding `--show-config` to any command line performs a dry run and displays the resolved value of all options that would be used, without executing the command.
2345
+
2346
+ To display a specific option, add `--fields=<option_name>`.
2347
+ Add `--flat=no` when the option holds a structured value (`Hash`, `Array`) to display it as-is rather than flattened into dot-path keys:
2348
+
2349
+ ```shell
2350
+ ascli --opt=@json:'{"a":1,"b":"two"}' some_plugin --show-config --fields=opt --flat=no
2351
+ ascli --opt.a=1 --opt.b=two some_plugin --show-config --fields=opt --flat=no
2352
+ ```
2353
+
2354
+ Both lines above display the same resolved value for option `opt`.
2235
2355
 
2236
2356
  In the following examples (using a POSIX shell, such as `bash`), several equivalent commands are provided.
2237
2357
  For all examples, most special character handling is not specific to `ascli`:
@@ -2421,6 +2541,22 @@ Example:
2421
2541
  ascli config preset set demo_server password <PASSWORD>
2422
2542
  ```
2423
2543
 
2544
+ The parameter name supports **dot-notation** to set nested hash options.
2545
+ If an intermediate hash already exists, the new value is **deep-merged** into it (existing sibling keys are preserved).
2546
+
2547
+ ```shell
2548
+ ascli config preset set GLOBAL out.table.pivot single
2549
+ ascli config preset set GLOBAL out.level data
2550
+ ```
2551
+
2552
+ The parameter value is **automatically coerced** to its natural type: integers, floats and booleans (`true`/`false`) are stored as native YAML types rather than strings.
2553
+
2554
+ To **delete** a key from a preset, pass `@none:` as the value (evaluates to `nil`):
2555
+
2556
+ ```shell
2557
+ ascli config preset set GLOBAL out.table.pivot @none:
2558
+ ```
2559
+
2424
2560
  A full terminal based overview of the configuration can be displayed using:
2425
2561
 
2426
2562
  ```shell
@@ -2433,6 +2569,20 @@ A list of [Option Preset](#option-preset) can be displayed using:
2433
2569
  ascli config preset list
2434
2570
  ```
2435
2571
 
2572
+ Any key starting with `_` (underscore) in a preset is treated as a comment and is ignored when the preset is applied.
2573
+ This is useful to annotate presets directly in the configuration file:
2574
+
2575
+ ```yaml
2576
+ demo_server:
2577
+ _comment: "Demo server - public credentials"
2578
+ url: ssh://demo.asperasoft.com:33001
2579
+ username: asperaweb
2580
+ password: demoaspera
2581
+ ```
2582
+
2583
+ > [!NOTE]
2584
+ > Comment keys are preserved and visible in `config preset overview` for inspection, but are never injected as CLI options.
2585
+
2436
2586
  A good practice is to not manually edit the configuration file and use modification commands instead.
2437
2587
  If necessary, the configuration file can be opened in a text editor with:
2438
2588
 
@@ -2473,7 +2623,9 @@ Usually, [Option presets](#option-preset) are used to contain pre-defined option
2473
2623
  When a plugin is invoked, the preset associated with the name of the plugin is loaded, unless the option `--no-default` (or `-N`) is used.
2474
2624
 
2475
2625
  > [!NOTE]
2476
- > Special plugin name: `config` can be associated with a preset that is loaded initially, typically used for default values.
2626
+ > The special plugin name `config` in the `default` preset points to a preset containing **global default options**
2627
+ > (such as `--log-level`, `--vault`, `--interactive`), loaded before any plugin is invoked.
2628
+ > To set global default options, use the `GLOBAL` keyword (see [Plugin: `config`](#plugin-config-configuration)).
2477
2629
 
2478
2630
  Operations on this preset are done using regular `config` operations:
2479
2631
 
@@ -2528,7 +2680,8 @@ When `ascli` starts, it looks for the `default` Option Preset and checks the val
2528
2680
  If set, it loads the options independently of the plugin used.
2529
2681
 
2530
2682
  > [!NOTE]
2531
- > If no global default is set by the user, `ascli` will use `global_common_defaults` when setting global options (for example, `config ascp use`)
2683
+ > If `default.config` is not set, `ascli` automatically uses `global_common_defaults` as the global preset name
2684
+ > and saves that mapping in the configuration file the first time the `GLOBAL` keyword is used.
2532
2685
 
2533
2686
  > [!TIP]
2534
2687
  > If you do not know the name of the global preset, you can use `GLOBAL` to refer to it.
@@ -2549,13 +2702,10 @@ Set a global parameter:
2549
2702
  ascli config preset set GLOBAL version_check_days 0
2550
2703
  ```
2551
2704
 
2552
- If the default global Option Preset is not set, and you want to use a different name:
2705
+ If you want to use a custom name instead of `global_common_defaults`:
2553
2706
 
2554
2707
  ```shell
2555
2708
  ascli config preset set default config <GLOBAL_OPTIONS_NAME>
2556
- ```
2557
-
2558
- ```shell
2559
2709
  ascli config preset set GLOBAL version_check_days 0
2560
2710
  ```
2561
2711
 
@@ -2584,12 +2734,12 @@ check_update
2584
2734
  coffee
2585
2735
  coffee --log-level=trace2 --log-format=caller
2586
2736
  coffee --ui=text
2587
- coffee --ui=text --image.text=true
2588
- coffee --ui=text --image=@json:'{"text":true,"double":false}'
2737
+ coffee --ui=text --out.img.text=true
2738
+ coffee --ui=text --out.img=@json:'{"text":true,"double":false}'
2589
2739
  commands
2590
2740
  detect app.example.com
2591
- detect https://faspex5.example.com/path
2592
- detect https://faspex5.example.com/path faspex5
2741
+ detect https://f5.example.com/path
2742
+ detect https://f5.example.com/path faspex5
2593
2743
  detect https://node.example.com/path
2594
2744
  detect https://server.example.com/path
2595
2745
  detect https://shares.example.com/path shares
@@ -2600,13 +2750,13 @@ doc
2600
2750
  doc github transfer-parameters
2601
2751
  doc local quick-start --ui=text
2602
2752
  doc toc
2603
- echo '<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50" fill="#069"/></svg>' --format=image --image.text=true
2753
+ echo '<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50" fill="#069"/></svg>' --format=image --out.img.text=true
2604
2754
  echo -- --special-string
2605
2755
  echo @base64:SGVsbG8gV29ybGQK
2606
2756
  echo @csvt:@stdin:
2607
2757
  echo @env:USER
2608
- echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --multi-single=single
2609
- echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --multi-single=yes
2758
+ echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --out.table.pivot=single
2759
+ echo @json:'[{"user":{"id":1,"name":"foo"},"project":"bar"}]' --out.table.pivot=yes
2610
2760
  echo @lines:@stdin:
2611
2761
  echo @list:,1,2,3
2612
2762
  echo @secret:
@@ -2643,7 +2793,7 @@ preset initialize conf_name @json:'{"p1":"v1","p2":"v2"}'
2643
2793
  preset list
2644
2794
  preset overview
2645
2795
  preset set GLOBAL sdk_folder 'product:IBM Aspera Connect'
2646
- preset set GLOBAL vault @: type=file file=/secure/vault_file
2796
+ preset set GLOBAL vault @: type=file name=/secure/vault_file
2647
2797
  preset set GLOBAL vault_password _simple_one_
2648
2798
  preset set GLOBAL version_check_days 0
2649
2799
  preset set conf_name param value
@@ -2668,12 +2818,12 @@ transferd list
2668
2818
  vault create @: label=my_label password=my_password_here 'description=my secret'
2669
2819
  vault delete foo --vault.type=system
2670
2820
  vault delete my_label
2821
+ vault ids
2671
2822
  vault info
2672
2823
  vault list
2673
2824
  vault show my_label
2674
2825
  wizard https://console.example.com/path console
2675
- wizard https://faspex4.example.com/path faspex --username=test --password=test
2676
- wizard https://faspex5.example.com/path faspex5 --key-path=my_private_key
2826
+ wizard https://f5.example.com/path faspex5 --key-path=my_private_key
2677
2827
  wizard https://node.example.com/path node --username=test --password=test
2678
2828
  wizard https://orch.example.com/path orchestrator --username=test --password=test
2679
2829
  wizard https://server.example.com/path server --username=my_username --password=my_password
@@ -2783,7 +2933,7 @@ Copy the completion script to Fish's completions directory:
2783
2933
  cp $(gem contents aspera-cli | grep fish_autocomplete) ~/.config/fish/completions/ascli.fish
2784
2934
  ```
2785
2935
 
2786
- No further configuration is needed Fish loads files from `~/.config/fish/completions/` automatically.
2936
+ No further configuration is needed - Fish loads files from `~/.config/fish/completions/` automatically.
2787
2937
 
2788
2938
  Once active, press `Tab` to complete commands at any depth:
2789
2939
 
@@ -2833,7 +2983,7 @@ The user is told where to place the associated public key PEM in the application
2833
2983
 
2834
2984
  #### Example of configuration for a plugin
2835
2985
 
2836
- For Faspex, Shares, Node (including ATS, Aspera Transfer Service), Console,
2986
+ For Faspex 5, Shares, Node (including ATS, Aspera Transfer Service), Console,
2837
2987
  only username/password and URL are required (either on command line, or from configuration file).
2838
2988
  Those can be usually provided on the command line:
2839
2989
 
@@ -2894,7 +3044,7 @@ For security reasons, those secrets shall not be exposed in clear, either:
2894
3044
 
2895
3045
  Instead, they shall be hidden (logs, output) or encrypted (configuration).
2896
3046
 
2897
- Terminal output (command result) secret removal is controlled by option `show_secrets` (default: `no`).
3047
+ Terminal output (command result) secret removal is controlled by option `--out.secrets` (default: `no`).
2898
3048
  Log secret removal is controlled by option `log_secrets` (default: `no`).
2899
3049
  Mandatory command line options can be requested interactively (for example, password) using option `interactive`.
2900
3050
  It is possible to use [Extended Value](#extended-value-syntax) `@secret:[name]` to ask for a secret interactively.
@@ -2907,24 +3057,20 @@ export ASCLI_PASSWORD
2907
3057
 
2908
3058
  Another possibility is to retrieve values from a secret vault.
2909
3059
 
2910
- The vault is used with options `vault` and `vault_password`.
2911
-
2912
- `vault` shall be a `Hash` describing the vault:
2913
-
2914
- ```json
2915
- {"type":"system","name":"ascli"}
2916
- ```
2917
-
2918
- `vault_password` specifies the password for the vault.
2919
-
2920
- Although it can be specified on command line, for security reason you should avoid exposing the secret.
2921
- For example, it can be securely specified on command line like this:
3060
+ The vault is configured with option `vault` (a `Hash` describing the vault type and parameters, see sections below) and unlocked with option `vault_password`.
3061
+ To avoid exposing the vault password in the shell history, provide it via an environment variable:
2922
3062
 
2923
3063
  ```shell
2924
- read -s ASCLI_VAULT_PASSWORD
2925
- export ASCLI_VAULT_PASSWORD
3064
+ export ASCLI_VAULT_PASSWORD=<YOUR_PASSWORD>
2926
3065
  ```
2927
3066
 
3067
+ > [!TIP]
3068
+ > Set it interactively using `read` so that it is not recorded in the shell history:
3069
+ >
3070
+ > ```shell
3071
+ > read -rs ASCLI_VAULT_PASSWORD && export ASCLI_VAULT_PASSWORD
3072
+ > ```
3073
+
2928
3074
  #### Vault: IBM HashiCorp Vault
2929
3075
 
2930
3076
  <https://developer.hashicorp.com/vault>
@@ -2949,6 +3095,14 @@ vault server -dev -dev-root-token-id=dev-only-token
2949
3095
  | **type** | `String` | `file`: Encrypted file secret store. |
2950
3096
  | `name` | `String` | Path to the encrypted vault file. Relative paths are resolved from the configuration folder.<br/>Default: `vault.bin`. |
2951
3097
  | `type` | `String` | Vault type selector.<br/>Allowed values: `file`. |
3098
+ | **type** | `String` | `1password`: 1Password secret store (Connect REST API or CLI). |
3099
+ | `account` | `String` | Account shorthand for `op` (used when `source` is `cli`). Uses the default account if omitted. |
3100
+ | `source` | `String` | Backend source. Use `api` for the Connect REST API, `cli` for the `op` CLI.<br/>Allowed values: `api`, `cli`.<br/>Default: `api`. |
3101
+ | `token` | `String` | Bearer token for the Connect API (required when `source` is `api`). Defaults to the value of `vault_password`. |
3102
+ | `type` | `String` | Vault type selector.<br/>Allowed values: `1password`. |
3103
+ | `url` | `String` | Base URL of the 1Password Connect server (required when `source` is `api`).<br/>Example: `http://localhost:8080`. |
3104
+ | `vault_id` | `String` | ID of the 1Password vault to use (required when `source` is `api`). |
3105
+ | `vault` | `String` | Name or ID of the 1Password vault to use with the CLI (used when `source` is `cli`). Uses the default vault if omitted. |
2952
3106
 
2953
3107
  ```shell
2954
3108
  --vault=@json:'{"type":"vault","url":"http://127.0.0.1:8200"}' --vault_password=dev-only-token
@@ -2973,21 +3127,106 @@ It is possible to store and use secrets encrypted in a file using option `vault`
2973
3127
  {"type":"file","name":"vault.bin"}
2974
3128
  ```
2975
3129
 
2976
- #### Vault: Operations
3130
+ To configure the encrypted file vault as the default, set the `vault` option in the global preset:
3131
+
3132
+ ```shell
3133
+ ascli config preset set GLOBAL vault @: type=file name=vault.bin
3134
+ ```
3135
+
3136
+ The vault file is created automatically on first use - no explicit initialization is needed.
3137
+
3138
+ > [!WARNING]
3139
+ > The `vault_password` option should **not** be stored in the config file: doing so would protect secrets with a password that is itself stored in plain text, defeating the purpose of the vault.
3140
+ > Use an environment variable as described above.
3141
+
3142
+ #### Vault: 1Password
3143
+
3144
+ Use `type: 1password` with a `source` parameter to select the backend.
2977
3145
 
2978
- For this use the `config vault` command.
3146
+ ##### Source: API (Connect REST API)
2979
3147
 
2980
- Then secrets can be manipulated using commands:
3148
+ <https://developer.1password.com/docs/connect/>
3149
+
3150
+ [1Password Connect](https://developer.1password.com/docs/connect/) exposes a local REST API backed by a 1Password vault.
3151
+ Deploy the Connect server with Docker, then point `ascli` at it:
3152
+
3153
+ ```shell
3154
+ docker run -d --name op-connect \
3155
+ -p 8080:8080 \
3156
+ -v /path/to/1password-credentials.json:/home/opuser/.op/1password-credentials.json \
3157
+ 1password/connect-api:latest
3158
+ ```
3159
+
3160
+ ```shell
3161
+ --vault=@json:'{"type":"1password","source":"api","url":"http://localhost:8080","vault_id":"<VAULT_ID>"}' \
3162
+ --vault_password=<CONNECT_TOKEN>
3163
+ ```
3164
+
3165
+ > [!TIP]
3166
+ > The `vault_id` is the alphanumeric ID shown in the 1Password web app under **Vault Settings**.
3167
+ > The `vault_password` holds the Connect bearer token generated when creating the Connect server credentials.
3168
+
3169
+ > [!NOTE]
3170
+ > The [1Password Service Accounts API](https://developer.1password.com/docs/service-accounts/) is also supported: use `url=https://api.1password.com` with a service account token as `vault_password`.
3171
+ > No local server is required in that case.
3172
+
3173
+ ##### Source: Cli (`op` CLI)
3174
+
3175
+ <https://developer.1password.com/docs/cli/>
3176
+
3177
+ Requires the `op` CLI to be installed and signed in.
3178
+ No server to deploy — authentication is handled by the 1Password desktop app (biometric unlock) or by `op signin`.
3179
+
3180
+ ```shell
3181
+ --vault=@json:'{"type":"1password","source":"cli"}'
3182
+ # or, to target a specific vault and account:
3183
+ --vault=@json:'{"type":"1password","source":"cli","vault":"<VAULT_NAME>","account":"<ACCOUNT_SHORTHAND>"}'
3184
+ ```
3185
+
3186
+ > [!TIP]
3187
+ > Install `op` on macOS with `brew install 1password-cli`, then connect it to the desktop app:
3188
+ > `op signin`
3189
+
3190
+ #### Vault: Operations
3191
+
3192
+ Secrets can be manipulated using the `config vault` command:
2981
3193
 
2982
3194
  - `create`
2983
3195
  - `show`
2984
3196
  - `list`
2985
3197
  - `delete`
3198
+ - `import`
3199
+
3200
+ To add a new password entry in the vault for label `<NAME>`:
3201
+
3202
+ ```shell
3203
+ ascli config vault create @: label=<NAME> password=@secret:password description='for this account'
3204
+ ```
3205
+
3206
+ #### Vault: Migration between vaults
3207
+
3208
+ To migrate all secrets from one vault backend to another (for example, from the encrypted file vault to 1Password), use `vault overview` piped into `vault import`.
3209
+
3210
+ > [!NOTE]
3211
+ > Use `overview` (not `list`) as the source: `list` returns only labels, while `overview` returns the full secret details needed for import.
2986
3212
 
2987
3213
  ```shell
2988
- ascli config vault create @json:'{"label":"<NAME>","password":"<PASSWORD>","description":"for this account"}'
3214
+ ascli config vault overview --format=json --out.level=data \
3215
+ --vault=@json:'{"type":"file","name":"<SOURCE_VAULT_FILE>"}' \
3216
+ --vault_password=<SOURCE_PASSWORD> | \
3217
+ ascli config vault import @json:@stdin: --bulk \
3218
+ --vault=@json:'{"type":"1password","url":"<CONNECT_URL>","vault_id":"<VAULT_ID>"}' \
3219
+ --vault_password=<CONNECT_TOKEN>
2989
3220
  ```
2990
3221
 
3222
+ > [!TIP]
3223
+ > Use `--out.level=data` on the `overview` command so that only the raw JSON array is written to stdout, with no table headers or status lines.
3224
+
3225
+ The `import` command accepts a JSON array where each element is a vault secret object (same schema as `create`).
3226
+ `--bulk` makes each entry reported individually in the result table; omit it to get a single-line summary.
3227
+ On error (for example a duplicate label), the default behavior is to stop (`--bfail=yes`).
3228
+ Pass `--bfail=no` to skip failures and continue with the remaining entries.
3229
+
2991
3230
  #### Configuration Finder
2992
3231
 
2993
3232
  When a secret is needed by a sub command, the command can search for existing configurations in the configuration file by setting option `secret` to the special value `PRESET`.
@@ -3003,25 +3242,37 @@ Example:
3003
3242
  ascli config preset update <PRESET_NAME> --url=... --username=... --password=...
3004
3243
  ```
3005
3244
 
3006
- For a more secure storage one can do:
3245
+ For more secure storage, first create a vault entry (see [Vault: Operations](#vault-operations)), then refer to it in the preset:
3007
3246
 
3008
3247
  ```shell
3009
3248
  ascli config preset update <PRESET_NAME> --url=... --username=... --password=@val:@vault:<VAULT_LABEL>.password
3010
3249
  ```
3011
3250
 
3251
+ > [!NOTE]
3252
+ > Use `@val:` in front of `@vault:` so that the [Extended Value](#extended-value-syntax) is not evaluated.
3253
+
3254
+ To migrate existing clear-text passwords from presets to the vault in one step, use the `secure` command.
3255
+ The vault must already be configured (option `vault`, see [Secret Vault](#secret-vault)).
3256
+
3012
3257
  ```shell
3013
- ascli config vault create @json:'{"label":"<VAULT_LABEL>","password":"<PASSWORD>"}'
3258
+ ascli config preset secure
3014
3259
  ```
3015
3260
 
3016
- > [!NOTE]
3017
- > Use `@val:` in front of `@vault:` so that the [Extended Value](#extended-value-syntax) is not evaluated.
3261
+ This scans all presets (or a single one if a name is provided) and, for every option whose name ends with `password` or `secret`, moves the value into the vault and replaces it with a `@vault:` reference.
3262
+
3263
+ ```shell
3264
+ ascli config preset secure <PRESET_NAME>
3265
+ ```
3266
+
3267
+ When a vault is configured, the `update`, `set`, and `ask` preset commands automatically move secret values (options ending with `password` or `secret`) into the vault as they are written, so no manual migration is needed.
3268
+ To disable this behavior for a single command, pass `--vault=@none:`.
3018
3269
 
3019
3270
  ### Private Key
3020
3271
 
3021
3272
  Some Aspera applications allow the user to be authenticated using [Public Key Cryptography](https://en.wikipedia.org/wiki/Public-key_cryptography):
3022
3273
 
3023
3274
  - For SSH: Server
3024
- - For OAuth JWT: AoC, Faspex5, Faspex, Shares
3275
+ - For OAuth JWT: AoC, Faspex5, Shares
3025
3276
 
3026
3277
  It consists in using a pair of associated keys: a private key and a public key.
3027
3278
  The same pair can be used for multiple applications.
@@ -3157,7 +3408,7 @@ Examples:
3157
3408
  - Display image as colorized text (requires `rmagick`)
3158
3409
 
3159
3410
  ```shell
3160
- ascli config image https://eudemo.asperademo.com/wallpaper.jpg --ui=text --image.text=true
3411
+ ascli config image https://eudemo.asperademo.com/wallpaper.jpg --ui=text --out.img.text=true
3161
3412
  ```
3162
3413
 
3163
3414
  - Display image from byte stream as image in terminal (requires iTerm2-compatible terminal)
@@ -3574,12 +3825,10 @@ Parameters in transfer-spec can be modified with option `ts`.
3574
3825
 
3575
3826
  #### Asynchronous Transfer Mode
3576
3827
 
3577
- For agents that delegate transfers to an external daemon (`desktop`, `node`, `connect`, `transferd`),
3578
- the transfer lives entirely in that daemon — `ascli` does not need to stay connected while it runs.
3579
3828
  Adding `asynchronous: true` to the `transfer` option makes `ascli` return immediately after
3580
3829
  submitting the transfer, without waiting for completion.
3581
3830
 
3582
- The returned `job_id` can be used at any time, even in a later invocation, to check progress:
3831
+ The returned `job_id` can be used at any time to check progress:
3583
3832
 
3584
3833
  ```shell
3585
3834
  # Start a download and return immediately
@@ -3596,21 +3845,28 @@ ascli config transfer list
3596
3845
  ascli config transfer cleanup
3597
3846
  ```
3598
3847
 
3599
- | Agent | Async support | Status source |
3600
- |---|---|---|
3601
- | `desktop` | | JSON-RPC `get_transfer` (auto-discovered URL) |
3602
- | `node` | | REST `ops/transfers/{id}` |
3603
- | `connect` | | REST `transfers/info/{id}` (auto-discovered URL) |
3604
- | `transferd` | | gRPC `monitor_transfers` |
3605
- | `direct` | in-process only | `@sessions` (not persisted across process restarts) |
3606
- | `httpgw` | | Synchronous by nature — error if requested |
3848
+ All transfer agents support asynchronous mode:
3849
+
3850
+ | Agent | Status source | Persisted across restart |
3851
+ | ----------- | ----------------------------------------------------------------------------- | ------------------------ |
3852
+ | `desktop` | JSON-RPC `get_transfer` (auto-discovered URL) | Yes |
3853
+ | `node` | REST `ops/transfers/{id}` | Yes |
3854
+ | `connect` | REST `transfers/info/{id}` (auto-discovered URL) | Yes |
3855
+ | `transferd` | gRPC `monitor_transfers` | Yes |
3856
+ | `direct` | In-process thread state (re-queryable while process lives, e.g. MCP mode) | No — returns `unknown` after restart |
3857
+ | `httpgw` | In-process thread state (re-queryable while process lives, e.g. MCP mode) | No — returns `unknown` after restart |
3858
+
3859
+ For `direct` and `httpgw`, the transfer runs as a Ruby thread inside the `ascli` process.
3860
+ The `job_id` is persisted on disk but the live thread state is only available as long as the same process is running.
3861
+ If the process is restarted, `config transfer status` returns `unknown` for those jobs.
3607
3862
 
3608
3863
  > [!NOTE]
3609
- > **`asynchronous` and MCP** When `ascli` is used as an MCP server, an AI assistant calling
3864
+ > **`asynchronous` and MCP** - When `ascli` is used as an MCP server, an AI assistant calling
3610
3865
  > a transfer command may time out or cancel the request and retry, causing duplicate transfers.
3611
- > Using `asynchronous: true` eliminates this risk: the transfer is submitted once to the external
3612
- > daemon, the `job_id` is returned immediately, and the AI can poll
3866
+ > Using `asynchronous: true` eliminates this risk: the transfer is submitted immediately,
3867
+ > the `job_id` is returned, and the AI can poll
3613
3868
  > `config transfer status <job_id>` to track progress without any risk of duplication.
3869
+ > This works with all agents, including `direct` and `httpgw`.
3614
3870
 
3615
3871
  #### Agent: Direct
3616
3872
 
@@ -3651,14 +3907,14 @@ max( sleep_max, sleep_initial * sleep_factor ^ iter_index )
3651
3907
  To display the native progress bar of `ascp`, use:
3652
3908
 
3653
3909
  ```shell
3654
- --progress-bar=no --transfer.quiet=false`
3910
+ --progress-bar=no --transfer.quiet=false
3655
3911
  ```
3656
3912
 
3657
3913
  To skip usage of management port (which disables custom progress bar), set option `monitor` to `false`.
3658
3914
  In that, use the native progress bar:
3659
3915
 
3660
3916
  ```shell
3661
- --transfer.monitor=false --transfer.quiet=false`
3917
+ --transfer.monitor=false --transfer.quiet=false
3662
3918
  ```
3663
3919
 
3664
3920
  By default, Ruby's root CA store is used to validate any HTTPS endpoint used by `ascp` (for example, WSS).
@@ -3936,7 +4192,7 @@ Parameters provided in option `transfer` are:
3936
4192
  Example:
3937
4193
 
3938
4194
  ```shell
3939
- ascli faspex package recv 323 --transfer.url=https://asperagw.example.com:9443/aspera/http-gwy --transfer=httpgw
4195
+ ascli faspex5 packages recv 323 --transfer.url=https://asperagw.example.com:9443/aspera/http-gwy --transfer=httpgw
3940
4196
  ```
3941
4197
 
3942
4198
  > [!NOTE]
@@ -4019,7 +4275,7 @@ To remove a (deep) key from transfer spec, set the value to `null`.
4019
4275
  > Default transfer spec values can be displayed with command:
4020
4276
 
4021
4277
  ```shell
4022
- ascli config ascp info --fields=ts --flat-hash=no
4278
+ ascli config ascp info --fields=ts --out.flat=no
4023
4279
  ```
4024
4280
 
4025
4281
  It is possible to specify `ascp` options when the `transfer` option is set to [`direct`](#agent-direct) using `transfer` option parameter: `ascp_args`.
@@ -4086,7 +4342,7 @@ ascli config ascp schema transferd --format=jsonpp
4086
4342
  | T | Transferd |
4087
4343
 
4088
4344
  | Field | Type | Description |
4089
- |--------------------------------|-----------------------|----------------------------------------------------------------------------------|
4345
+ |--------------------------------|-----------------|----------------------------------------------------------------------------------|
4090
4346
  | `apply_local_docroot` | `Bool` | Apply local docroot to source paths.<br/>(A, T)<br/>(`--apply-local-docroot`) |
4091
4347
  | `authentication` | `String` | Set to `token` for SSH bypass keys, else password asked if not provided.<br/>(C) |
4092
4348
  | `cipher_allowed` | `String` | Returned by node API. Valid literals include `aes-128` and `none`.<br/>(C)<br/>Allowed values: `none`, `aes-128`, `aes-192`, `aes-256`, `aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb`, `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm`. |
@@ -4108,7 +4364,7 @@ ascli config ascp schema transferd --format=jsonpp
4108
4364
  | `fasp_proxy` | `Hash` | Proxy for communications between the remote server and the (local) client.<br/>(T) |
4109
4365
  | `file_checksum` | `String` | Enable checksum reporting for transferred files by specifying the hash to use.<br/>(A, N)<br/>Allowed values: `sha-512`, `sha-384`, `sha-256`, `sha1`, `md5`, `none`.<br/>Default: `none`.<br/>(`--file-checksum={enum}`) |
4110
4366
  | `http_fallback_port` | `Integer` | Specifies HTTP port when no cipher is used.<br/>(`-t {integer}`) |
4111
- | `http_fallback` | `["boolean", "string"]` | When true(1), attempts to perform an HTTP transfer if a FASP transfer cannot be performed.<br/>(`-y (conversion){boolean\|string}`) |
4367
+ | `http_fallback` | `Bool, String` | When true(1), attempts to perform an HTTP transfer if a FASP transfer cannot be performed.<br/>(`-y (conversion){boolean\|string}`) |
4112
4368
  | `https_fallback_port` | `Integer` | Specifies HTTPS port when cipher is used.<br/>(`-t {integer}`) |
4113
4369
  | `icos` | `Hash` | Configuration parameters for IBM Cloud Object Storage (ICOS).<br/>(T) |
4114
4370
  | `keepalive` | `Bool` | The session is running in persistent session mode.<br/>(A, T)<br/>(`--keepalive`) |
@@ -4137,7 +4393,7 @@ ascli config ascp schema transferd --format=jsonpp
4137
4393
  | `preserve_remote_acls` | `String` | Preserve remote access control lists.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--remote-preserve-acls={enum}`) |
4138
4394
  | `preserve_remote_extended_attrs` | `String` | Preserve remote extended attributes.<br/>(A, T)<br/>Allowed values: `none`, `native`, `metafile`.<br/>Default: `none`.<br/>(`--remote-preserve-xattrs={enum}`) |
4139
4395
  | `preserve_source_access_time` | `Bool` | Preserve the time logged for when the source file was accessed.<br/>(A, T)<br/>(`--preserve-source-access-time`) |
4140
- | `preserve_times` | `Bool` | Preserve file timestamps.<br/>(A, N, T)<br/>(`-p {boolean}`) |
4396
+ | `preserve_times` | `Bool` | Preserve file timestamps.<br/>(A, N, T)<br/>(`-p`) |
4141
4397
  | `proxy` | `String` | Specify the address of the Aspera high-speed proxy server.<br/>`dnat(s)://[user[:password]@]server:port`<br/>Default ports for DNAT and DNATS protocols are 9091 and 9092.<br/>Password, if specified here, overrides the value of environment variable `ASPERA_PROXY_PASS`.<br/>(A)<br/>(`--proxy={string}`) |
4142
4398
  | `rate_policy_allowed` | `String` | Specifies most aggressive rate policy that is allowed. Returned by node API.<br/>(C)<br/>Allowed values: `low`, `fair`, `high`, `fixed`. |
4143
4399
  | `rate_policy` | `String` | The transfer rate policy to use when sharing bandwidth. Allowable values:<br/>- `high` : When sharing bandwidth, transfer at twice the rate of a transfer using a fair policy.<br/>- `fair` : (Default) Share bandwidth equally with other traffic.<br/>- `low` : Use only unused bandwidth.<br/>- `fixed` : Transfer at the target rate, regardless of the actual network capacity. Do not share bandwidth. Aspera recommends that you do not use this setting except under special circumstances, otherwise the destination storage can be damaged.<br/>Allowed values: `low`, `fair`, `high`, `fixed`.<br/>(`--policy={enum}`) |
@@ -4151,7 +4407,7 @@ ascli config ascp schema transferd --format=jsonpp
4151
4407
  | `remove_empty_source_directory` | `Bool` | Remove empty source subdirectories and remove the source directory itself, if empty.<br/>(A)<br/>(`--remove-empty-source-directory`) |
4152
4408
  | `remove_skipped` | `Bool` | Must also have `remove_after_transfer` set to `true`. Defaults to `false`. If `true`, skipped files will be removed as well.<br/>(A, C, N)<br/>(`--remove-skipped`) |
4153
4409
  | `resume_policy` | `String` | If a transfer is interrupted or fails to finish, this policy directs the transfer to resume without retransferring the files. Allowable values:<br/>- `none` : Always re-transfer the entire file.<br/>- `attrs` : Compare file attributes and resume if they match, and re-transfer if they do not.<br/>- `sparse_csum` : Compare file attributes and the sparse file checksums; resume if they match, and re-transfer if they do not.<br/>- `full_csum` : Compare file attributes and the full file checksums; resume if they match, and re-transfer if they do not.<br/>Note: transferd uses values: `attributes`, `sparse_checksum`, `full_checksum`.<br/>Allowed values: `none`, `attrs`, `sparse_csum`, `full_csum`.<br/>Default: `faspmgr:none;other:sparse_csum`.<br/>(`-k (conversion){enum}`) |
4154
- | `retry_duration` | `["integer", "string"]` | Specifies how long to wait before retrying transfer (e.g. `5min`).<br/>(T) |
4410
+ | `retry_duration` | `Integer, String` | Specifies how long to wait before retrying transfer (e.g. `5min`).<br/>(T) |
4155
4411
  | `save_before_overwrite` | `Bool` | If a transfer would result in an existing file <filename>.<ext> being overwritten, move that file to <filename>.yyyy.mm.dd.hh.mm.ss.index.<ext> (where index is set to 1 at the beginning of each new second and incremented for each file saved in this manner during the same second) in the same directory before writing the new file.<br/>File attributes are maintained in the renamed file.<br/>(A, N, T)<br/>(`--save-before-overwrite`) |
4156
4412
  | `skip_duplicate_check` | `Bool` | Don't check for duplicate files at the destination.<br/>(A, T)<br/>(`--skip-dir-traversal-dupes`) |
4157
4413
  | `skip_special_files` | `Bool` | All assets other than files, directories and symbolic links are considered special. A transfer will fail if the user attempts to transfer special assets. If `true`, `ascp` skips special assets and proceeds with the transfer of all other assets.<br/>(A, T)<br/>(`--skip-special-files`) |
@@ -4501,7 +4757,7 @@ Define a name for the server, for example: `ascli_job` as `<NAME>` below.
4501
4757
 
4502
4758
  [Service]
4503
4759
  Type=oneshot
4504
- ExecStart=/home/xfer/bin/ascli_tool preview scan --logger=syslog --display=error
4760
+ ExecStart=/home/xfer/bin/ascli_tool preview scan --logger=syslog --out.level=error
4505
4761
  User=xfer
4506
4762
  Group=xfer
4507
4763
  ```
@@ -4554,8 +4810,8 @@ Example of `crontab` for user `xfer`.
4554
4810
 
4555
4811
  ```shell
4556
4812
  crontab<<EOF
4557
- 0 * * * * /home/xfer/bin/ascli_tool preview scan --logger=syslog --display=error
4558
- 2-59 * * * * /home/xfer/bin/ascli_tool preview trev --logger=syslog --display=error
4813
+ 0 * * * * /home/xfer/bin/ascli_tool preview scan --logger=syslog --out.level=error
4814
+ 2-59 * * * * /home/xfer/bin/ascli_tool preview trev --logger=syslog --out.level=error
4559
4815
  EOF
4560
4816
  ```
4561
4817
 
@@ -4865,10 +5121,10 @@ Key query parameters:
4865
5121
  ```text
4866
5122
  ascli -h
4867
5123
  NAME
4868
- ascli -- a command line tool for Aspera Applications (v4.27.0)
5124
+ ascli -- a command line tool for Aspera Applications (v4.27.2)
4869
5125
 
4870
5126
  SYNOPSIS
4871
- ascli COMMANDS [OPTIONS] [ARGS]
5127
+ ascli [GLOBAL_OPTIONS] <command> [OPTIONS] [ARGS]
4872
5128
 
4873
5129
  DESCRIPTION
4874
5130
  Use Aspera application to perform operations on command line.
@@ -4887,79 +5143,80 @@ COMMANDS
4887
5143
  OPTIONS
4888
5144
  Options begin with a '-' (minus), and value is provided on command line.
4889
5145
  Special values are supported beginning with special prefix @pfx:, where pfx is one of:
4890
- val, base64, csvt, env, file, uri, json, lines, list, none, path, re, ruby, s, secret, stdin, yaml, zlib, extend, , preset, vault
4891
- Dates format is 'DD-MM-YY HH:MM:SS', or 'now' or '-<num>h'
5146
+ val, base64, csvt, env, file, uri, json, lines, list, none, path, re, ruby, s, secret, stdin, yaml, zlib, extend, preset, vault
5147
+ Dates format is 'YYYY-MM-DD HH:MM:SS', or 'now' or '-<num>h'
4892
5148
 
4893
5149
  ARGS
4894
5150
  Some commands require mandatory arguments, e.g. a path.
4895
5151
 
4896
- OPTIONS: config
4897
- --interactive=ENUM Use interactive input of missing params
4898
- --ask-options=ENUM Ask even optional options
4899
- --display=ENUM Output only some information
4900
- --format=ENUM Output format
4901
- --output=VALUE Destination for results
4902
- --fields=VALUE Comma separated list of: fields, or ALL, or DEF
4903
- --select=VALUE Select only some items in lists: column, value
4904
- --table-style=VALUE (Table) Display style
4905
- --flat-hash=ENUM (Table) Display deep values as additional keys
4906
- --multi-single=ENUM (Table) Control how object list is displayed as single table, or multiple objects
4907
- --show-secrets=ENUM Show secrets on command output
4908
- --image=VALUE Options for displaying images and thumbnails in the terminal
4909
- -h, --help Show this message
4910
- --show-config Display parameters used for the provided action
4911
- -v, --version Display version
4912
- --ui=ENUM Method to start browser
4913
- --invalid-characters=VALUE Replacement character and invalid filename characters
4914
- --log-level=ENUM Log level
4915
- --log-format=VALUE Log formatter
4916
- --logger=ENUM Logging method
4917
- --log=VALUE Logging options (dot-notation: level, type, format, secrets)
4918
- --lock-port=VALUE Prevent dual execution of a command, e.g. in cron
4919
- --once-only=ENUM Process only new items (some commands)
4920
- --log-secrets=ENUM Show passwords in logs
4921
- --clean-temp=ENUM Cleanup temporary files on exit
4922
- --temp-folder=VALUE Temporary folder
4923
- --pid-file=VALUE Write process identifier to file, delete on exit
4924
- --parser=ENUM Default parser for structured parameters and options
4925
- --home=VALUE Home folder for tool
4926
- --config-file=VALUE Path to YAML file with preset configuration
4927
- --secret=VALUE Secret for access keys
4928
- --vault=VALUE Secret vault configuration
4929
- --vault-password=VALUE Vault password
4930
- --progress-bar=ENUM Display progress bar
4931
- --fpac=VALUE Proxy auto configuration script
4932
- --proxy-credentials=VALUE HTTP proxy credentials for fpac: user, password
4933
- --sql=VALUE SQL suffix appended to sqlite3 queries for admin subcommands (e.g. WHERE clause)
4934
- -P, --preset=VALUE Load the named option preset from current config file
4935
- --version-check-days=VALUE Period in days to check new version (zero to disable)
4936
- --plugin-folder=VALUE Folder where to find additional plugins
4937
- --sdk-url=VALUE Ascp: URL to get Aspera Transfer Executables
4938
- --locations-url=VALUE Ascp: URL to get download locations of Aspera Transfer Daemon
4939
- --sdk-folder=VALUE Ascp: Path to folder with ascp (or product with "product:")
4940
- --smtp=VALUE SMTP email server configuration
4941
- --notify-to=VALUE Email: Recipient for notification of transfers
4942
- --notify-template=VALUE Email: ERB template for notification of transfers
4943
- --cache-tokens=ENUM Save and reuse OAuth tokens
4944
- --query=VALUE Additional filter for for some commands (list/delete)
4945
- --bulk=ENUM Bulk operation (only some)
4946
- --bfail=ENUM Bulk operation error handling
4947
- -N, --no-default Do not load default configuration for plugin
4948
- --override=ENUM Wizard: override existing value
4949
- --default=ENUM Wizard: set as default configuration for specified plugin (also: update)
4950
- --key-path=VALUE Wizard: path to private key for JWT
4951
- --insecure=ENUM HTTP/S: Do not validate any certificate
4952
- --ignore-certificate=VALUE HTTP/S: Do not validate certificate for these URLs
4953
- --warn-insecure=ENUM HTTP/S: Issue a warning if certificate is ignored
4954
- --cert-stores=VALUE HTTP/S: List of folder with trusted certificates
4955
- --http-options=VALUE HTTP/S connection parameters for REST calls (not `ascp` WSS)
4956
- --http-proxy=VALUE HTTP/S: URL for proxy with optional credentials
4957
- --ts=VALUE Override transfer spec values
4958
- --to-folder=VALUE Destination folder for transferred files
4959
- --sources=VALUE How list of transferred files is provided (@args,@ts,Array)
4960
- --src-type=ENUM Type of file list
4961
- --transfer=VALUE Transfer agent type, or agent parameters with optional agent key
4962
- --transfer-info=VALUE Parameters for transfer agent
5152
+ OPTIONS: global
5153
+ --interactive=yes|no Use interactive input of missing params
5154
+ --ask-options=yes|no Ask even optional options
5155
+ --out=HASH Output rendering options (dot-notation: format, level, file, fields, select, table[.pivot], flat, secrets, img)
5156
+ --display=info|data|error Output only some information (deprecated: use --out.level)
5157
+ --format=ENUM Output format (also: --out.format)
5158
+ --output=VALUE Destination for results (deprecated: use --out.file)
5159
+ --fields=LIST Comma separated list of: fields, or ALL, or DEF (also: --out.fields)
5160
+ --select=HASH Select only some items in lists: column, value (also: --out.select)
5161
+ --table-style=HASH (Table) Display style (deprecated: use --out.table)
5162
+ --flat-hash=yes|no (Table) Display deep values as additional keys (deprecated: use --out.flat)
5163
+ --multi-single=no|yes|single (Table) Control how object list is displayed as single table, or multiple objects (deprecated: use --out.table.pivot)
5164
+ --show-secrets=yes|no Show secrets on command output (deprecated: use --out.secrets)
5165
+ --image=HASH Options for displaying images and thumbnails in the terminal (deprecated: use --out.img)
5166
+ -h, --help Show this message
5167
+ --show-config Display parameters used for the provided action
5168
+ -v, --version Display version
5169
+ --ui=text|graphical Method to start browser
5170
+ --invalid-characters=VALUE Replacement character and invalid filename characters
5171
+ --log-level=ENUM Log level
5172
+ --log-format=VALUE Log formatter
5173
+ --logger=stderr|stdout|syslog Logging method
5174
+ --log=HASH Logging options (dot-notation: level, type, format, secrets)
5175
+ --lock-port=INT Prevent dual execution of a command, e.g. in cron
5176
+ --once-only=yes|no Process only new items (some commands)
5177
+ --log-secrets=yes|no Show passwords in logs
5178
+ --clean-temp=yes|no Cleanup temporary files on exit
5179
+ --temp-folder=VALUE Temporary folder
5180
+ --pid-file=VALUE Write process identifier to file, delete on exit
5181
+ --parser=none|json|ruby|yaml Default parser for structured parameters and options
5182
+ --home=VALUE Home folder for tool
5183
+ --config-file=VALUE Path to YAML file with preset configuration
5184
+ --secret=VALUE Secret for access keys
5185
+ --vault=HASH Secret vault configuration
5186
+ --vault-password=VALUE Vault password
5187
+ --progress-bar=yes|no Display progress bar
5188
+ --fpac=VALUE Proxy auto configuration script
5189
+ --proxy-credentials=LIST HTTP proxy credentials for fpac: user, password
5190
+ --sql=VALUE SQL suffix appended to sqlite3 queries for admin subcommands (e.g. WHERE clause)
5191
+ -P, --preset=VALUE Load the named option preset from current config file
5192
+ --version-check-days=INT Period in days to check new version (zero to disable)
5193
+ --plugin-folder=VALUE Folder where to find additional plugins
5194
+ --sdk-url=VALUE Ascp: URL to get Aspera Transfer Executables
5195
+ --locations-url=VALUE Ascp: URL to get download locations of Aspera Transfer Daemon
5196
+ --sdk-folder=VALUE Ascp: Path to folder with ascp (or product with "product:")
5197
+ --smtp=HASH SMTP email server configuration
5198
+ --notify-to=VALUE Email: Recipient for notification of transfers
5199
+ --notify-template=VALUE Email: ERB template for notification of transfers
5200
+ --cache-tokens=yes|no Save and reuse OAuth tokens
5201
+ --query=HASH Additional filter for for some commands (list/delete)
5202
+ --bulk=yes|no Bulk operation (only some)
5203
+ --bfail=yes|no Bulk operation error handling
5204
+ -N, --no-default Do not load default configuration for plugin
5205
+ --override=yes|no Wizard: override existing value
5206
+ --default=yes|no Wizard: set as default configuration for specified plugin (also: update)
5207
+ --key-path=VALUE Wizard: path to private key for JWT
5208
+ --insecure=yes|no HTTP/S: Do not validate any certificate
5209
+ --ignore-certificate=LIST HTTP/S: Do not validate certificate for these URLs
5210
+ --warn-insecure=yes|no HTTP/S: Issue a warning if certificate is ignored
5211
+ --cert-stores=LIST HTTP/S: List of folder with trusted certificates
5212
+ --http-options=HASH HTTP/S connection parameters for REST calls (not `ascp` WSS)
5213
+ --http-proxy=VALUE HTTP/S: URL for proxy with optional credentials
5214
+ --ts=HASH Override transfer spec values
5215
+ --to-folder=VALUE Destination folder for transferred files
5216
+ --sources=VALUE How list of transferred files is provided (@args,@ts,Array)
5217
+ --src-type=list|pair Type of file list
5218
+ --transfer=HASH Transfer agent type, or agent parameters with optional agent key
5219
+ --transfer-info=HASH Parameters for transfer agent (deprecated: use --transfer instead)
4963
5220
 
4964
5221
  PLUGINS
4965
5222
  alee Aspera License Entitlement Engine
@@ -4967,7 +5224,6 @@ PLUGINS
4967
5224
  ats Aspera Transfer Service
4968
5225
  console Console
4969
5226
  cos IBM Cloud Object Storage
4970
- faspex Faspex v4
4971
5227
  faspex5 Faspex v5
4972
5228
  faspio faspio Gateway
4973
5229
  httpgw HTTP Gateway
@@ -5011,8 +5267,6 @@ For example: `--query=@json:'{"p[]":["v1","v2"]}'` leads to query: `?p[]=v1&p[]=
5011
5267
  `ascli` uses a plugin mechanism.
5012
5268
  The first level command (just after `ascli` on the command line) is the name of the concerned plugin which will execute the command.
5013
5269
  Each plugin usually represents commands sent to a specific application.
5014
- For instance, the plugin `faspex` allows operations on **Aspera Faspex**.
5015
-
5016
5270
  Available plugins can be found using command:
5017
5271
 
5018
5272
  ```shell
@@ -5031,7 +5285,7 @@ ascli config plugin list
5031
5285
 
5032
5286
  Most plugins will take the URL option: `url` to identify their location.
5033
5287
 
5034
- REST APIs of Aspera legacy applications (Aspera Node, Faspex 4, Shares, Console, Orchestrator) use simple username/password authentication: HTTP Basic Authentication using options: `username` and `password`.
5288
+ REST APIs of Aspera legacy applications (Aspera Node, Shares, Console, Orchestrator) use simple username/password authentication: HTTP Basic Authentication using options: `username` and `password`.
5035
5289
 
5036
5290
  Aspera on Cloud and Faspex 5 rely on OAuth.
5037
5291
 
@@ -5257,10 +5511,9 @@ ascli config echo "@json:$(@{ k = $var; x = $true } | ConvertTo-Json -Compress)"
5257
5511
 
5258
5512
  Some values provided to `ascli` (options, **Command Parameters**) are expected to be [Extended Value](#extended-value-syntax), that is, not a simple `String`, but a composite structure (`Hash`, `Array`).
5259
5513
 
5260
- Typically, the `@json:` modifier is used, it expects a [JSON](https://www.json.org/) value.
5261
- JSON itself has some special syntax: for example `"` is used to enclose a `String` which may be difficult to specify in shells for whom it is a special character.
5262
-
5263
- The [dot-path](#dot-path-notation) can also be used and can be easier to use because it does usually not require special characters.
5514
+ For small structures with a few keys, the [dot-path](#dot-path-notation) `key.subkey=value` notation (using `@:` to collect positional arguments, or `--opt.key=value` directly for options) is often the most convenient: it requires no quoting and reads naturally on the command line.
5515
+ For larger or more complex structures (deep nesting, arrays of hashes, values copied from API documentation), the `@json:` modifier is typically a better fit.
5516
+ `@json:` expects a [JSON](https://www.json.org/) value; note that `"` is used to enclose a `String` in JSON, which may be difficult to specify in shells — enclose the whole argument in single quotes to avoid this.
5264
5517
 
5265
5518
  Any option or **Command Parameter** expecting a `Hash` value accepts the special value `help` to display its schema.
5266
5519
  See [Schema Discovery with `help`](#schema-discovery-with-help).
@@ -5788,7 +6041,9 @@ The command `aoc admin <TYPE> list` lists all entities of given type.
5788
6041
  It uses paging and multiple requests if necessary.
5789
6042
 
5790
6043
  The option `query` can be optionally used.
5791
- It expects a `Hash` using [Extended Value](#extended-value-syntax) syntax, generally provided using: `--query=@json:{...}`.
6044
+ It expects a `Hash` using [Extended Value](#extended-value-syntax) syntax.
6045
+ For a single filter key, the dot-path option form is the most direct (for example, `--query.sort=name`).
6046
+ For multiple keys or values copied from API documentation, `--query=@json:{...}` is more suitable.
5792
6047
  Values are directly sent to the API call and used as a filter on server side.
5793
6048
 
5794
6049
  The following parameters are supported:
@@ -6019,7 +6274,7 @@ ascli aoc admin user list --query.q=dummyuser --fields=id,email
6019
6274
  ```
6020
6275
 
6021
6276
  ```shell
6022
- ascli aoc admin user list --query.q=dummyuser --fields=id --display=data --format=csv | ascli aoc admin user delete @lines:@stdin: --bulk=yes
6277
+ ascli aoc admin user list --query.q=dummyuser --fields=id --out.level=data --format=csv | ascli aoc admin user delete @lines:@stdin: --bulk=yes
6023
6278
  ```
6024
6279
 
6025
6280
  ```text
@@ -6149,7 +6404,7 @@ WS2ID=$(ascli aoc admin workspace list --query=@json:'{"q":"'"$WS2"'"}' --select
6149
6404
  c- Extract membership information
6150
6405
 
6151
6406
  ```shell
6152
- ascli aoc admin workspace_membership list --fields=manager,member_id,member_type,workspace_id --query=@json:'{"workspace_id":'"$WS1ID"'}' --format=jsonpp --output=ws1_members.json
6407
+ ascli aoc admin workspace_membership list --fields=manager,member_id,member_type,workspace_id --query=@json:'{"workspace_id":'"$WS1ID"'}' --format=jsonpp --out.file=ws1_members.json
6153
6408
  ```
6154
6409
 
6155
6410
  d- Convert to creation data for second workspace:
@@ -6224,7 +6479,7 @@ ascli aoc admin workspace_membership create @json:'{"workspace_id":<WORKSPACE_ID
6224
6479
  - Get a user's ID
6225
6480
 
6226
6481
  ```shell
6227
- ascli aoc admin user list --query=@json:'{"q":"manu.macron@example.com"}' --fields=id --format=csv --display=data
6482
+ ascli aoc admin user list --query=@json:'{"q":"manu.macron@example.com"}' --fields=id --format=csv --out.level=data
6228
6483
  ```
6229
6484
 
6230
6485
  User: <USER_ID>
@@ -6305,13 +6560,13 @@ Follow these steps to configure a new HSTS and link it to your existing Aspera o
6305
6560
  This key remains constant for the lifetime of your Organization.
6306
6561
 
6307
6562
  ```shell
6308
- ascli aoc admin organization show --fields=oauth_token_verification_key --show-secrets=yes --output=mypubkey.pem
6563
+ ascli aoc admin organization show --fields=oauth_token_verification_key --out.secrets=yes --out.file=mypubkey.pem
6309
6564
  ```
6310
6565
 
6311
6566
  It can also be retrieved from an existing node:
6312
6567
 
6313
6568
  ```shell
6314
- ascli aoc admin node do %name:'<NODE_NAME>' v3 access_keys show self --fields=token_verification_key --show-secrets=yes --output=mypubkey.pem
6569
+ ascli aoc admin node do %name:'<NODE_NAME>' v3 access_keys show self --fields=token_verification_key --out.secrets=yes --out.file=mypubkey.pem
6315
6570
  ```
6316
6571
 
6317
6572
  - Create an Access Key on the Self-Managed HSTS
@@ -6321,7 +6576,7 @@ ascli aoc admin node do %name:'<NODE_NAME>' v3 access_keys show self --fields=to
6321
6576
  > [!TIP]
6322
6577
  > In this command, "master node credentials" allowing access key creation are used.
6323
6578
  > The `id` and `secret` parameters are optional.
6324
- > If you omit them, you must add `--show-secrets=yes` to the command.
6579
+ > If you omit them, you must add `--out.secrets=yes` to the command.
6325
6580
  > Record the generated secret immediately; it cannot be retrieved later, only reset.
6326
6581
 
6327
6582
  ```shell
@@ -6366,7 +6621,7 @@ ascli node access_key do self permission / create @: access_type=user access_id=
6366
6621
  The following command will create and display a secret token to register a self-managed Aspera Transfer Server:
6367
6622
 
6368
6623
  ```shell
6369
- ascli aoc admin client_registration_token create @json:'{"data":{"name":"laurentnode","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}' --fields=token --show-secrets=yes
6624
+ ascli aoc admin client_registration_token create @json:'{"data":{"name":"laurentnode","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}' --fields=token --out.secrets=yes
6370
6625
  ```
6371
6626
 
6372
6627
  #### Example: Create an ATS Node
@@ -6427,7 +6682,7 @@ This is a two-steps procedure:
6427
6682
  Or, alternatively:
6428
6683
 
6429
6684
  ```shell
6430
- ascli aoc admin application instance list --query.aspera_app_type=packages --query.workspace_id=<WORKSPACE_ID> --fields=id --display=data
6685
+ ascli aoc admin application instance list --query.aspera_app_type=packages --query.workspace_id=<WORKSPACE_ID> --fields=id --out.level=data
6431
6686
  ```
6432
6687
 
6433
6688
  This displays the <APP_ID>.
@@ -6448,6 +6703,12 @@ See [File list](#list-of-files-for-transfers).
6448
6703
 
6449
6704
  The Aspera on Cloud **Packages** app lets you assemble copies of any number of files and folders into a digital "package" and send the package to others, pretty much like a web-mail application.
6450
6705
 
6706
+ > [!NOTE]
6707
+ > All `aoc packages` commands operate in a workspace context. The workspace is inferred
6708
+ > automatically when a default workspace is configured in the application. If no default is
6709
+ > set, provide one explicitly with `--workspace=NAME`. List available workspaces with
6710
+ > `ascli aoc user workspaces list`.
6711
+
6451
6712
  #### Send a Package
6452
6713
 
6453
6714
  General syntax:
@@ -6518,7 +6779,7 @@ ascli aoc files browse /src_folder
6518
6779
  To send a package with the file `10M.dat` from subfolder /src_folder:
6519
6780
 
6520
6781
  ```shell
6521
- ascli aoc files node_info /src_folder --format=json --display=data | ascli aoc packages send @json:'{"name":"test","recipients":["someuser@example.com"]}' 10M.dat --transfer=@json:@stdin:
6782
+ ascli aoc files node_info /src_folder --format=json --out.level=data | ascli aoc packages send @json:'{"name":"test","recipients":["someuser@example.com"]}' 10M.dat --transfer=@json:@stdin:
6522
6783
  ```
6523
6784
 
6524
6785
  #### Receive packages
@@ -6608,7 +6869,7 @@ Use command `find` to list recursively.
6608
6869
  For advanced users, it is also possible to pipe node information for the package and use node operations:
6609
6870
 
6610
6871
  ```shell
6611
- ascli aoc package node_info <PACKAGE_ID> / --format=json --show-secrets=yes --display=data | ascli node -N --preset=@json:@stdin: access_key do self browse /
6872
+ ascli aoc package node_info <PACKAGE_ID> / --format=json --out.secrets=yes --out.level=data | ascli node -N --preset=@json:@stdin: access_key do self browse /
6612
6873
  ```
6613
6874
 
6614
6875
  #### List packages
@@ -6653,7 +6914,7 @@ ascli aoc packages list --query=@json:'{"dropbox_name":"My Shared Inbox","archiv
6653
6914
  Using shared inbox identifier: first retrieve the ID of the shared inbox, and then list packages with the appropriate filter.
6654
6915
 
6655
6916
  ```shell
6656
- shared_box_id=$(ascli aoc packages shared_inboxes show --name='My Shared Inbox' --format=csv --display=data --fields=id)
6917
+ shared_box_id=$(ascli aoc packages shared_inboxes show --name='My Shared Inbox' --format=csv --out.level=data --fields=id)
6657
6918
  ```
6658
6919
 
6659
6920
  ```shell
@@ -6666,6 +6927,10 @@ The Files application presents a **Home** folder to users in a given workspace.
6666
6927
  Files located here are either user's files, or shared folders.
6667
6928
 
6668
6929
  > [!NOTE]
6930
+ > All `aoc files` commands operate in a workspace context. The workspace is inferred
6931
+ > automatically when a default workspace is configured in the application. If no default is
6932
+ > set, provide one explicitly with `--workspace=NAME`. List available workspaces with
6933
+ > `ascli aoc user workspaces list`.
6669
6934
  > All commands under `files` are the same as under `access_keys do self` for plugin `node`, that is, **gen4/access key** operations.
6670
6935
 
6671
6936
  #### Download Files
@@ -6746,7 +7011,7 @@ ascli aoc files permission --workspace=<WORKSPACE_NAME> <PATH_TO_FOLDER> ...
6746
7011
 
6747
7012
  > [!NOTE]
6748
7013
  > The workspace is identified by name, and folder by path, relative to the user's home.
6749
- > To use an identifier instead, one can use the percent selector, like `%id:<WS_ID>`.
7014
+ > To use an identifier instead, one can use the [percent selector](#percent-selector), like `%id:<WS_ID>`.
6750
7015
 
6751
7016
  ##### Admin Shared Folders
6752
7017
 
@@ -6758,7 +7023,7 @@ ascli aoc admin node do <NODE_ID> permission --workspace=<WORKSPACE_NAME> <PATH_
6758
7023
 
6759
7024
  > [!TIP]
6760
7025
  > The node is identified by identifier.
6761
- > To use a name instead, one can use the percent selector, like `%name:"<NODE_NAME>"`.
7026
+ > To use a name instead, one can use the [percent selector](#percent-selector), like `%name:"<NODE_NAME>"`.
6762
7027
  > The path is identifier by a path, one can specify a file ID, with `%id:123`.
6763
7028
  > If the ID is left blank: `%id:`, then it means `*`, that is, "all".
6764
7029
 
@@ -6987,7 +7252,7 @@ Procedure to send a file from org1 to org2:
6987
7252
  - Execute the following:
6988
7253
 
6989
7254
  ```shell
6990
- ascli -Porg1 aoc files node_info <DEST_FOLDER> --format=json --display=data | ascli -Porg2 aoc files upload <SOURCE_FILE> --transfer=@json:@stdin:
7255
+ ascli -Porg1 aoc files node_info <DEST_FOLDER> --format=json --out.level=data | ascli -Porg2 aoc files upload <SOURCE_FILE> --transfer=@json:@stdin:
6991
7256
  ```
6992
7257
 
6993
7258
  Explanation:
@@ -6997,7 +7262,7 @@ Explanation:
6997
7262
  - `aoc` uses the Aspera on Cloud plugin
6998
7263
  - `files node_info /<DEST_FOLDER>` generates transfer information including the Node API credential and root ID, suitable for the next command
6999
7264
  - `--format=json` formats the output as JSON (instead of the default text table)
7000
- - `--display=data` displays only the result, removing other information such as workspace name
7265
+ - `--out.level=data` displays only the result, removing other information such as workspace name
7001
7266
  - `|` pipes the standard output of the first command into the second one
7002
7267
  - `-Porg2 aoc` uses the Aspera on Cloud plugin and loads credentials for `org2`
7003
7268
  - `files upload <SOURCE_FILE>` uploads the file named `<SOURCE_FILE>` (located in `org2`) to `org1`
@@ -7040,7 +7305,7 @@ admin ats cluster list
7040
7305
  admin ats cluster show --cloud=aws --region=eu-west-1
7041
7306
  admin ats cluster show 1f412ae7-869a-445c-9c05-02ad16813be2
7042
7307
  admin auth_providers list
7043
- admin bearer_token --display=data
7308
+ admin bearer_token --out.level=data
7044
7309
  admin client list
7045
7310
  admin client_access_key list
7046
7311
  admin client_registration_token create @json:'{"data":{"name":"test_client_reg1","client_subject_scopes":["alee","aejd"],"client_subject_enabled":true}}'
@@ -7095,7 +7360,7 @@ automation workflow delete <id>
7095
7360
  automation workflow list
7096
7361
  automation workflow list --query.show_org_workflows=@val:true
7097
7362
  automation workflow list --select.name=test_workflow --fields=id
7098
- bearer_token --display=data
7363
+ bearer_token --out.level=data
7099
7364
  files bearer /
7100
7365
  files bearer_token_node / --cache-tokens=no
7101
7366
  files browse /
@@ -7127,7 +7392,7 @@ files show testdst/test_file.bin
7127
7392
  files sync admin status /data/local_sync
7128
7393
  files sync pull /testdst --to-folder=/data/local_sync @json:'{"reset":true,"transport":{"target_rate":my_bps}}'
7129
7394
  files thumbnail my_test_folder/video_file.mpg
7130
- files thumbnail my_test_folder/video_file.mpg --query=@json:'{"text":true,"double":true}'
7395
+ files thumbnail my_test_folder/video_file.mpg --query.text=true --query.double=true
7131
7396
  files transfer push /testsrc --to-folder=/testdst test_file.bin
7132
7397
  files upload --to-folder=/ test_file.bin --url=my_public_link_folder_no_pass
7133
7398
  files upload --to-folder=/testsrc test_file.bin
@@ -7142,8 +7407,8 @@ packages list
7142
7407
  packages list --query=@json:'{"dropbox_name":"my_shared_inbox_name","sort":"-received_at","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false}'
7143
7408
  packages receive <id> --to-folder=.
7144
7409
  packages receive <id> --to-folder=. /
7145
- packages receive ALL --once-only=yes --to-folder=. --lock-port=50101 --package-folder.fld.0=name --package-folder.fld.1=id --package-folder.opt=true
7146
- packages receive ALL --once-only=yes --to-folder=. --lock-port=50101 --query=@json:'{"dropbox_name":"my_shared_inbox_name","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false,"include_draft":false}' --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000}'
7410
+ packages receive ALL --once-only=yes --to-folder=. --query.max=5 --lock-port=50101 --package-folder.fld.0=name --package-folder.fld.1=id --package-folder.opt=true
7411
+ packages receive ALL --once-only=yes --to-folder=. --query.max=5 --lock-port=50101 --query=@json:'{"dropbox_name":"my_shared_inbox_name","archived":false,"received":true,"has_content":true,"exclude_dropbox_packages":false,"include_draft":false}' --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000}'
7147
7412
  packages receive INIT --once-only=yes --query.dropbox_name=my_shared_inbox_name
7148
7413
  packages send --workspace=my_workspace_shared_inbox --validate-metadata=yes @json:'{"name":"package title","recipients":["my_shared_inbox_meta"],"metadata":[{"input_type":"single-text","name":"Project Id","values":["123"]},{"input_type":"single-dropdown","name":"Type","values":["Opt2"]},{"input_type":"multiple-checkbox","name":"CheckThose","values":["Check1","Check2"]},{"input_type":"date","name":"Optional Date","values":["2021-01-13T15:02:00.000Z"]}]}' test_file.bin
7149
7414
  packages send --workspace=my_workspace_shared_inbox --validate-metadata=yes @json:'{"name":"package title","recipients":["my_shared_inbox_meta"],"metadata":{"Project Id":"456","Type":"Opt2","CheckThose":["Check1","Check2"],"Optional Date":"2021-01-13T15:02:00.000Z"}}' test_file.bin
@@ -7782,7 +8047,7 @@ ascli node access_key create @json:'{"id":"<ACCESS_KEY>","secret":"<SECRET>","st
7782
8047
  > [!TIP]
7783
8048
  > The `id` and `secret` fields are optional.
7784
8049
  > If not provided, they will be generated and returned into the result.
7785
- > In that case, provide option `--show-secrets=yes` to get the generated secret.
8050
+ > In that case, provide option `--out.secrets=yes` to get the generated secret.
7786
8051
 
7787
8052
  Access keys support extra overriding parameters using parameter: `configuration` and sub keys `transfer` and `server`.
7788
8053
  For example, an access key can be modified or created with the following options:
@@ -7914,7 +8179,7 @@ ascli node access_key modify %id:self @ruby:'{token_verification_key: File.read(
7914
8179
  - Create a Bearer token for the user:
7915
8180
 
7916
8181
  ```shell
7917
- ascli node bearer_token @file:./myorgkey.pem @json:'{"user_id":"'$my_user_id'","_validity":3600}' --output=bearer.txt
8182
+ ascli node bearer_token @file:./myorgkey.pem @json:'{"user_id":"'$my_user_id'","_validity":3600}' --out.file=bearer.txt
7918
8183
  ```
7919
8184
 
7920
8185
  > [!NOTE]
@@ -8161,7 +8426,7 @@ For more information on the JWT method, refer to the section below.
8161
8426
  If you have generated a private key with the wizard and lost the public key, you can retrieve the public key like this:
8162
8427
 
8163
8428
  ```shell
8164
- ascli faspex5 --show-config --show-secrets=yes --fields=private_key | ascli config pubkey @stdin: --show-secrets=yes
8429
+ ascli faspex5 --show-config --out.secrets=yes --fields=private_key | ascli config pubkey @stdin: --out.secrets=yes
8165
8430
  ```
8166
8431
 
8167
8432
  ### Faspex 5 JWT authentication
@@ -8307,7 +8572,7 @@ admin smtp test my_email_external
8307
8572
  admin workgroups list
8308
8573
  bearer_token
8309
8574
  gateway @: url=https://localhost:12346/aspera/faspex
8310
- health --url=https://faspex5.example.com/path
8575
+ health --url=https://f5.example.com/path
8311
8576
  invitation list
8312
8577
  invitations create @: email_address=aspera.user1+u@gmail.com
8313
8578
  packages browse <id> --query.recursive=true
@@ -8320,13 +8585,13 @@ packages list --query=@json:'{"mailbox":"inbox","status":"completed"}'
8320
8585
  packages receive --box=my_shared_box_name <id> --to-folder=.
8321
8586
  packages receive --box=my_workgroup --group-type=workgroups <id> --to-folder=.
8322
8587
  packages receive <id> --to-folder=. --ts.content_protection_password=my_secret_here
8323
- packages receive ALL --once-only=yes --to-folder=.
8588
+ packages receive ALL --once-only=yes --to-folder=. --query.max=5
8324
8589
  packages receive INIT --once-only=yes
8325
8590
  packages send --url=my_public_link_send_f5_user @json:'{"title":"test title"}' test_file.bin
8326
8591
  packages send --url=my_public_link_send_shared_box @json:'{"title":"test title"}' test_file.bin
8327
- packages send @json:'{"title":"test title","recipients":["my_shared_box_name"],"metadata":{"Options":"Opt1","TextInput":"example text"}}' test_file.bin
8592
+ packages send @: 'title=for shared inbox' recipients.0=my_shared_box_name metadata.Options=Opt1 'metadata.TextInput=example text' END test_file.bin
8593
+ packages send @: 'title=test title' recipients.0.name=my_username END test_file.bin --ts.content_protection_password=my_secret_here
8328
8594
  packages send @json:'{"title":"test title","recipients":["my_workgroup"]}' test_file.bin
8329
- packages send @json:'{"title":"test title","recipients":[{"name":"my_username"}]my_meta}' test_file.bin --ts.content_protection_password=my_secret_here
8330
8595
  packages send @json:'{"title":"test_webhook_ascli","recipients":["my_shared_box_name"]}' 'faux:///test1?1m'
8331
8596
  packages show --box=my_shared_box_name <id>
8332
8597
  packages show --box=my_workgroup --group-type=workgroups <id>
@@ -8334,20 +8599,21 @@ packages show <id>
8334
8599
  packages status <f5_pack_send_shared> @list:,failed,completed
8335
8600
  packages status <id>
8336
8601
  postprocessing @json:'{"url":"https://localhost:8553/asclihook","script_folder":"/path/to/scripts","cert":".../localhost.p12","key":"changeit"}'
8337
- shared browse %name:my_src
8602
+ shared browse %name:my_shared_folder_name
8338
8603
  shared list
8339
8604
  shared_folders browse %name:my_shared_folder_name
8340
8605
  shared_folders list
8341
8606
  user account
8342
8607
  user account --query.expand=true
8343
- user profile modify @json:'{"preference":{"connect_disabled":false}}'
8608
+ user profile modify @: preference.rows_per_page=10
8344
8609
  user profile show
8345
8610
  version
8346
8611
  ```
8347
8612
 
8348
8613
  Most commands correspond directly to REST API calls.
8349
8614
  Parameters to commands are carried through option `query`, as [Extended Value](#extended-value-syntax), for `list`, or through **Command Parameter** for creation.
8350
- One can conveniently use the JSON format with prefix `@json:`.
8615
+ For a single parameter, the dot-path option form is the most direct (for example, `--query.status=completed`).
8616
+ For multiple parameters or when copying directly from API documentation, `@json:` is more suitable.
8351
8617
 
8352
8618
  > [!TIP]
8353
8619
  > The API is listed in [Faspex 5 API Reference](https://developer.ibm.com/apis/catalog?search="faspex+5") under **IBM Aspera Faspex API**.
@@ -8550,7 +8816,7 @@ Option `--once-only=yes` can be used, for "cargo-like" behavior.
8550
8816
  Special package ID `INIT` initializes the persistency of already received packages when option `--once-only=yes` is used.
8551
8817
 
8552
8818
  Special package ID `ALL` selects all packages (of the selected box).
8553
- In this case, typically, only `completed` packages should be downloaded, so use option `--query=@json:'{"status":"completed"}'`.
8819
+ In this case, typically, only `completed` packages should be downloaded, so use option `--query.status=completed` (or equivalently `--query=@json:'{"status":"completed"}'`).
8554
8820
 
8555
8821
  If a package is password protected, then the content protection password is asked interactively.
8556
8822
  To keep the content encrypted, use option: `--ts=@json:'{"content_protection":null}'`, or provide the password instead of `null`.
@@ -8559,6 +8825,10 @@ To keep the content encrypted, use option: `--ts=@json:'{"content_protection":nu
8559
8825
 
8560
8826
  ### Faspex 5: List all shared inboxes and work groups
8561
8827
 
8828
+ > [!NOTE]
8829
+ > **Shared inboxes** (`faspex5 admin shared_inboxes`) are package recipients (dropboxes), accessible under the **Packages** app.
8830
+ > They are distinct from **shared folders** (`faspex5 shared_folders`), which are node-based storage access points accessible under the **Files** app.
8831
+
8562
8832
  If you are a regular user, to list work groups you belong to:
8563
8833
 
8564
8834
  ```shell
@@ -8604,6 +8874,10 @@ ascli faspex5 admin shared create @json:'{"name":"the shared inbox","metadata_pr
8604
8874
 
8605
8875
  ### Faspex 5: List content in Shared folder and send package from remote source
8606
8876
 
8877
+ > [!NOTE]
8878
+ > **Shared folders** (`faspex5 shared_folders`) provide node-based storage access, accessible under the **Files** app.
8879
+ > They are distinct from **shared inboxes** (`faspex5 admin shared_inboxes`), which are package recipients (dropboxes) accessible under the **Packages** app.
8880
+
8607
8881
  ```shell
8608
8882
  ascli faspex5 shared_folders list --fields=id,name
8609
8883
  ```
@@ -8625,7 +8899,7 @@ ascli faspex5 packages send @json:'{"title":"hello","recipients":[{"name":"_reci
8625
8899
  ```
8626
8900
 
8627
8901
  > [!TIP]
8628
- > The shared folder can be identified by its numerical `id` or by name using percent selector: `%<FIELD>:<VALUE>`. for example, `--shared-folder=3`
8902
+ > The shared folder can be identified by its numerical `id` or by name using [percent selector](#percent-selector): `%<FIELD>:<VALUE>`. for example, `--shared-folder=3`
8629
8903
 
8630
8904
  ### Faspex 5: Receive all packages (cargo)
8631
8905
 
@@ -8703,7 +8977,7 @@ ascli faspex5 admin accounts modify %name:some.user@example.com @json:'{"account
8703
8977
  ```
8704
8978
 
8705
8979
  > [!TIP]
8706
- > This example uses the percent selector, but the numerical ID can be used as well.
8980
+ > This example uses the [percent selector](#percent-selector), but the numerical ID can be used as well.
8707
8981
 
8708
8982
  To send a password reset link to a user, use command `reset_password` on the `account`.
8709
8983
 
@@ -8792,210 +9066,6 @@ If a command is missing, then it is still possible to execute command by calling
8792
9066
  curl -H "Authorization: $(ascli ascli bearer)" https://faspex5.example.com/aspera/faspex/api/v5/api_endpoint_here
8793
9067
  ```
8794
9068
 
8795
- ## Plugin: `faspex`: IBM Aspera Faspex v4
8796
-
8797
- > [!WARNING]
8798
- > Faspex v4 is end of support since September 30th, 2024.
8799
- > So this plugin for Faspex v4 is deprecated.
8800
- > If you still need to use Faspex4, then use `ascli` version 4.19.0 or earlier.
8801
-
8802
- > [!NOTE]
8803
- > For full details on Faspex API, refer to:
8804
- > [Reference on Developer Site](https://developer.ibm.com/apis/catalog/?search=faspex)
8805
-
8806
- This plugin uses APIs versions 3 Faspex v4.
8807
- The `v4` command requires the use of API v4, refer to the Faspex Admin manual on how to activate.
8808
-
8809
- ### Listing Packages
8810
-
8811
- Command: `faspex package list`
8812
-
8813
- #### Option `box`
8814
-
8815
- By default, it looks in box `inbox`, but the following boxes are also supported: `archive` and `sent`, selected with option `box`.
8816
-
8817
- #### Option `recipient`
8818
-
8819
- A user can receive a package because the recipient is:
8820
-
8821
- - The user himself (default)
8822
- - The user is member of a dropbox/workgroup: filter using option `recipient` set with value `*<name of dropbox/workgroup>`
8823
-
8824
- #### Option `query`
8825
-
8826
- As inboxes may be large, it is possible to use the following query parameters:
8827
-
8828
- | Parameter | Evaluation | Description |
8829
- |--------------|------------|----------------------------------------------------------------------|
8830
- | `count` | API | Number of items in one API call result (default=0, equivalent to 10) |
8831
- | `page` | API | ID of page in call (default=0) |
8832
- | `startIndex` | API | Index of item to start (default=0) |
8833
- | `max` | `ascli` | Maximum number of items |
8834
- | `pmax` | `ascli` | Maximum number of pages |
8835
-
8836
- (SQL query is `LIMIT <STARTINDEX>, <COUNT>`)
8837
-
8838
- The API is listed in [Faspex 4 API Reference](https://developer.ibm.com/apis/catalog/?search=faspex) under **Services (API v.3)**.
8839
-
8840
- If no parameter `max` or `pmax` is provided, then all packages will be listed in the inbox, which results in paged API calls (using parameters: `count` and `page`).
8841
- By default, `count` is `0` (`10`), it can be increased to issue less HTTP calls.
8842
-
8843
- #### Example: List packages in dropbox
8844
-
8845
- ```shell
8846
- ascli faspex package list --box=inbox --recipient='*<DROPBOX>' --query=@json:'{"max":20,"pmax":2,"count":20}'
8847
- ```
8848
-
8849
- List a maximum of 20 items grouped by pages of 20, with maximum 2 pages in received box (inbox) when received in dropbox `*<DROPBOX>`.
8850
-
8851
- ### Receiving a Package
8852
-
8853
- The command is `package recv`, possible methods are:
8854
-
8855
- - Provide a package ID with option `id`
8856
- - Provide a public link with option `link`
8857
- - Provide a `faspe:` URI with option `link`
8858
-
8859
- ```shell
8860
- ascli faspex package recv 12345
8861
- ascli faspex package recv --link=faspe://...
8862
- ```
8863
-
8864
- If the package is in a specific **dropbox**/**workgroup**, add option `recipient` for both the `list` and `recv` commands.
8865
-
8866
- ```shell
8867
- ascli faspex package list --recipient='*dropbox_name'
8868
- ascli faspex package recv 125 --recipient='*dropbox_name'
8869
- ```
8870
-
8871
- If `id` is set to `ALL`, then all packages are downloaded, and if option `once_only` is used, a persistency file is created to keep track of already downloaded packages.
8872
-
8873
- ### Sending a Package
8874
-
8875
- The command is `faspex package send`.
8876
- Package information (title, note, metadata, options) is provided in option `delivery_info`.
8877
- The content of `delivery_info` is directly the contents of the `send` v3 [API of Faspex 4](https://developer.ibm.com/apis/catalog/aspera--aspera-faspex-client-sdk/API%20v.3:%20Send%20Packages).
8878
-
8879
- Example:
8880
-
8881
- ```shell
8882
- ascli faspex package send --delivery-info=@json:'{"title":"<TITLE>","recipients":["someuser@example.com"]}' /tmp/file1 /home/bar/file2
8883
- ```
8884
-
8885
- If the recipient is a dropbox or workgroup: provide the name of the dropbox or workgroup preceded with `*` in the `recipients` field of the `delivery_info` option:
8886
- `"recipients":["*MyDropboxName"]`
8887
-
8888
- Additional optional parameters in mandatory option `delivery_info`:
8889
-
8890
- - Package Note: : `"note":"note this and that"`
8891
- - Package Metadata: `"metadata":{"Meta1":"Val1","Meta2":"Val2"}`
8892
-
8893
- It is possible to send from a remote source using option `remote_source`, providing either the numerical ID, or the name of the remote source using percent selector: `%name:<NAME>`.
8894
-
8895
- Remote source can be browsed if option `storage` is provided.
8896
- `storage` is a `Hash` [Extended Value](#extended-value-syntax).
8897
- The key is the storage name, as listed in `source list` command.
8898
- The value is a `Hash` with the following keys:
8899
-
8900
- - `node` is a `Hash` with keys: `url`, `username`, `password`
8901
- - `path` is the sub-path inside the node, as configured in Faspex
8902
-
8903
- ### Email notification on transfer
8904
-
8905
- Like for any transfer, a notification can be sent by email using options: `notify_to` and `notify_template`.
8906
-
8907
- Example:
8908
-
8909
- ```shell
8910
- ascli faspex package send --delivery-info=@json:'{"title":"test pkg 1","recipients":["aspera.user1@gmail.com"]}' ~/Documents/Samples/200KB.1 --notify-to=aspera.user1@gmail.com --notify-template=@ruby:'%Q{From: <%=from_name%> <<%=from_email%>>\nTo: <<%=to%>>\nSubject: Package sent: <%=ts["tags"]["aspera"]["faspex"]["metadata"]["_pkg_name"]%> files received\n\nTo user: <%=ts["tags"]["aspera"]["faspex"]["recipients"].first["email"]%>}'
8911
- ```
8912
-
8913
- In this example the notification template is directly provided on command line.
8914
- Package information placed in the message are directly taken from the tags in transfer spec.
8915
- The template can be placed in a file using modifier: `@file:`
8916
-
8917
- ### Operations on dropbox
8918
-
8919
- Example:
8920
-
8921
- ```shell
8922
- ascli faspex v4 dropbox create @json:'{"dropbox":{"e_wg_name":"test1","e_wg_desc":"test1"}}'
8923
- ascli faspex v4 dropbox list
8924
- ascli faspex v4 dropbox delete 36
8925
- ```
8926
-
8927
- ### Remote sources
8928
-
8929
- Faspex lacks an API to list the contents of a remote source (available in web UI).
8930
- To work around this, the Node API is used, for this it is required to set option: `storage` that links a storage name to a node configuration and sub path.
8931
-
8932
- Example:
8933
-
8934
- ```yaml
8935
- my_faspex_conf:
8936
- url: https://10.25.0.3/aspera/faspex
8937
- username: admin
8938
- password: MyUserPassword
8939
- storage:
8940
- my_storage:
8941
- node: "@preset:my_faspex_node"
8942
- path: /mydir
8943
- my_faspex_node:
8944
- url: https://10.25.0.3:9092
8945
- username: node_faspex
8946
- password: MyNodePassword
8947
- ```
8948
-
8949
- In this example, a Faspex storage named `my_storage` exists in Faspex, and is located
8950
- under the docroot in `/mydir` (this must be the same as configured in Faspex).
8951
- The node configuration name is `my_faspex_node` here.
8952
-
8953
- > [!NOTE]
8954
- > The v4 API provides an API for nodes and shares.
8955
-
8956
- ### Automated package download (cargo)
8957
-
8958
- It is possible to tell `ascli` to download newly received packages, much like the official cargo client, or drive.
8959
- See the [same section](#receive-new-packages-only-cargo) in the Aspera on Cloud plugin:
8960
-
8961
- ```shell
8962
- ascli faspex packages recv ALL --once-only=yes --lock-port=12345
8963
- ```
8964
-
8965
- ### Tested commands for `faspex`
8966
-
8967
- > [!NOTE]
8968
- > Add `ascli faspex` in front of the following commands:
8969
-
8970
- ```shell
8971
- address_book
8972
- dropbox list --recipient='*my_dbx'
8973
- health
8974
- login_methods
8975
- me
8976
- package list --query.max=5
8977
- package receive <id> --recipient='*my_dbx' --to-folder=.
8978
- package receive <id> --recipient='*my_wkg' --to-folder=.
8979
- package receive <id> --to-folder=.
8980
- package receive <id> --to-folder=. --box=sent
8981
- package receive ALL --once-only=yes --to-folder=. --query.max=10
8982
- package send --delivery-info=@json:'{"title":"package title","recipients":["my_email_internal","my_username"]}' test_file.bin
8983
- package send --delivery-info=@json:'{"title":"package title","recipients":["my_email_internal"]}' --remote-source=%name:my_src sample_source.txt
8984
- package send --delivery-info=@json:'{"title":"package title","recipients":[*my_dbx]}' test_file.bin
8985
- package send --delivery-info=@json:'{"title":"package title","recipients":[*my_wkg]}' test_file.bin
8986
- package send --link=https://app.example.com/send_to_dropbox_path --delivery-info.title='package title' test_file.bin
8987
- package send --link=https://app.example.com/send_to_user_path --delivery-info.title='package title' test_file.bin
8988
- source info %name:my_src --storage=@preset:faspex4_storage
8989
- source list
8990
- source node %name:my_src br / --storage=@preset:faspex4_storage
8991
- v4 dmembership list
8992
- v4 dropbox list
8993
- v4 metadata_profile list
8994
- v4 user list
8995
- v4 wmembership list
8996
- v4 workgroup list
8997
- ```
8998
-
8999
9069
  ## Plugin: `shares`: IBM Aspera Shares v1
9000
9070
 
9001
9071
  Aspera Shares supports the **Node API** for the file transfer part.
@@ -9555,9 +9625,17 @@ case "$*" in *trev*) tmout=10m ;; *) tmout=30m ;; esac
9555
9625
 
9556
9626
  - `trevents` : only recently uploaded files will be tested (transfer events)
9557
9627
  - `events` : only recently uploaded files will be tested (file events: not working)
9558
- - `scan` : recursively scan all files under the access key&apos;s **storage root**
9628
+ - `scan [path]` : generate previews for a file or recursively scan a folder. The default path is the access key&apos;s **storage root**. A file or folder can also be selected with `%id:<file_id>`.
9559
9629
  - `test` : test using a local file
9560
9630
 
9631
+ Use `--filter` with `scan`, `events`, or `trevents` to select files by name. It accepts a glob string, a regular expression using `@re:`, or a Proc using `@ruby:`. For example:
9632
+
9633
+ ```shell
9634
+ ascli preview scan /videos --filter='*.mp4'
9635
+ ascli preview scan %id:<file_id>
9636
+ ascli preview scan /videos --filter='@ruby:->(f){f["name"].end_with?(".mp4")}'
9637
+ ```
9638
+
9561
9639
  Once candidate are selected, a preview is always generated if it does not exist already, else if a preview already exist, it will be generated using one of three values for the `overwrite` option:
9562
9640
 
9563
9641
  - `always` : preview is always generated, even if it already exists and is newer than original
@@ -9575,8 +9653,6 @@ ascli preview scan --skip-folders=@json:'["/not_here"]'
9575
9653
 
9576
9654
  The option `folder_reset_cache` forces the node service to refresh folder contents using various methods.
9577
9655
 
9578
- When scanning the option `query` has the same behavior as for the `node access_keys do self find` command.
9579
-
9580
9656
  See the following section for details.
9581
9657
 
9582
9658
  ### Preview File types
@@ -9636,8 +9712,8 @@ Nevertheless, `ascli` may or may not have direct file system access to the acces
9636
9712
  ```shell
9637
9713
  check --skip-types=office
9638
9714
  events --once-only=yes --skip-types=office --log-level=info
9639
- scan --scan-id=1 --skip-types=office --log-level=info {"--file-access=aspera" => nil} --ts.target_rate_kbps=1000000
9640
- scan --skip-types=office --log-level=info --skip-folder=/special/folder
9715
+ scan %id:1 --skip-types=office --log-level=info --root-url=aspera: --ts.target_rate_kbps=1000000
9716
+ scan --skip-types=office --log-level=info --skip-folders=/special/folder
9641
9717
  show /etc/hosts --base=test
9642
9718
  show my_docx --base=test
9643
9719
  show my_mpg --base=test --video-png-conv=animated
@@ -9650,21 +9726,27 @@ test my_dcm --base=test --mimemagic=yes
9650
9726
  test my_jpg_unk --base=test --mimemagic=yes
9651
9727
  test my_mpg mp4 --base=test --video-conversion=clips
9652
9728
  test my_mpg mp4 --base=test --video-conversion=reencode
9653
- test my_mxf mp4 --base=test --video-conversion=blend --query=@json:'{"text":true,"double":true}'
9729
+ test my_mxf mp4 --base=test --video-conversion=blend --query.text=true --query.double=true
9654
9730
  trevents --once-only=yes --skip-types=office --log-level=info
9655
9731
  ```
9656
9732
 
9657
9733
  ## Plugin: `mcp`: Model Context Protocol server
9658
9734
 
9659
9735
  > [!WARNING]
9660
- > This plugin is **experimental**. The interface, options, and behaviour may change in future releases without notice.
9736
+ > This plugin is **experimental**.
9737
+ > The interface, options, and behavior may change in future releases without notice.
9661
9738
 
9662
9739
  The `mcp` plugin starts a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that exposes `ascli` to AI assistants and LLM-based tools.
9663
9740
  The server registers a single tool, `execute_ascli_command`, which executes any `ascli` command in-process and returns the result as text.
9664
9741
 
9665
- > [!NOTE]
9666
- > The `mcp` gem is required.
9667
- > Install it with: `gem install mcp`
9742
+ > [!IMPORTANT]
9743
+ > The `mcp` and `rack` gems are required.
9744
+ > Check section [Installing Optional Gems](#installing-optional-gems)
9745
+ > Install them with the following command:
9746
+
9747
+ ```shell
9748
+ gem install mcp rack
9749
+ ```
9668
9750
 
9669
9751
  ### Usage
9670
9752
 
@@ -9696,7 +9778,7 @@ The `server` command accepts an optional [Hash](#extended-value-syntax) argument
9696
9778
  | `max_line_bytes` | `integer` | 4194304 (4 MiB) | Maximum JSON frame size in bytes |
9697
9779
 
9698
9780
  > [!NOTE]
9699
- > **`stdio` transport and server description** The MCP protocol does not carry a `description` field in the `initialize` handshake.
9781
+ > **`stdio` transport and server description** - The MCP protocol does not carry a `description` field in the `initialize` handshake.
9700
9782
  > For `stdio` servers, AI clients (Claude Desktop, VS Code, Bob, …) cannot retrieve the description automatically.
9701
9783
  > Add a `"description"` field directly in the client's `mcpServers` configuration to display it in the UI.
9702
9784
 
@@ -9713,7 +9795,7 @@ The `server` command accepts an optional [Hash](#extended-value-syntax) argument
9713
9795
  | `max_sessions` | `integer` | - | Maximum number of concurrent sessions |
9714
9796
 
9715
9797
  > [!NOTE]
9716
- > **HTTP transport discovery endpoint** When using `http` transport, the server exposes a `GET /` endpoint that returns a JSON object with `name`, `version`, and `description` fields.
9798
+ > **HTTP transport discovery endpoint** - When using `http` transport, the server exposes a `GET /` endpoint that returns a JSON object with `name`, `version`, and `description` fields.
9717
9799
  > AI clients that support this convention (such as Bob) automatically read the description from this endpoint and display it in their MCP server list without any manual configuration.
9718
9800
 
9719
9801
  ### Examples
@@ -9738,12 +9820,60 @@ ascli mcp server @: instructions="Aspera transfer automation" protocol_version=2
9738
9820
 
9739
9821
  ### MCP client configuration
9740
9822
 
9741
- To register `ascli` as an MCP server in an AI client (e.g. Claude Desktop, VS Code, Bob), add the following to the client's MCP configuration file:
9823
+ #### Streamable HTTP transport
9824
+
9825
+ Start the server in a separate terminal first:
9826
+
9827
+ ```shell
9828
+ ascli mcp server @: transport=http port=3000
9829
+ ```
9830
+
9831
+ Then register it in the AI client's MCP configuration file.
9832
+
9833
+ For [**IBM Bob**](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob), add to `.bob/mcp.json` in your project (or `~/.bob/mcp.json` for global configuration):
9834
+
9835
+ ```json
9836
+ {
9837
+ "mcpServers": {
9838
+ "ascli": {
9839
+ "type": "streamable-http",
9840
+ "url": "http://localhost:3000/mcp"
9841
+ }
9842
+ }
9843
+ }
9844
+ ```
9845
+
9846
+ For other clients (Claude Desktop, VS Code, …):
9742
9847
 
9743
9848
  ```json
9744
9849
  {
9745
9850
  "mcpServers": {
9746
9851
  "ascli": {
9852
+ "type": "http",
9853
+ "url": "http://localhost:3000/mcp"
9854
+ }
9855
+ }
9856
+ }
9857
+ ```
9858
+
9859
+ > [!NOTE]
9860
+ > With `http` transport, the client connects to a running server process.
9861
+ > The server must be started and kept running independently before the AI client tries to connect.
9862
+
9863
+ #### `stdio` transport
9864
+
9865
+ The client launches `ascli` directly as a subprocess.
9866
+ Add the following to the AI client's MCP configuration file.
9867
+
9868
+ ##### IBM Bob `stdio`
9869
+
9870
+ For [**IBM Bob**](https://bob.ibm.com/docs/ide/configuration/mcp/mcp-in-bob), add to `.bob/mcp.json` in your project (or `~/.bob/mcp.json` for global configuration):
9871
+
9872
+ ```json
9873
+ {
9874
+ "mcpServers": {
9875
+ "ascli": {
9876
+ "type": "stdio",
9747
9877
  "command": "/path/to/bin/ascli",
9748
9878
  "args": ["mcp", "server"],
9749
9879
  "description": "Aspera CLI MCP server"
@@ -9752,23 +9882,45 @@ To register `ascli` as an MCP server in an AI client (e.g. Claude Desktop, VS Co
9752
9882
  }
9753
9883
  ```
9754
9884
 
9755
- > [!NOTE]
9756
- > **Development mode** — if the `ascli` gem is not installed and you are running directly from the source tree, Ruby will not find the `lib/` directory automatically.
9757
- > Add the `RUBYLIB` environment variable pointing to the `lib/` directory of the project:
9758
- >
9759
- > ```json
9760
- > {
9761
- > "mcpServers": {
9762
- > "ascli": {
9763
- > "command": "/path/to/aspera-cli/bin/ascli",
9764
- > "args": ["mcp", "server"],
9765
- > "env": {
9766
- > "RUBYLIB": "/path/to/aspera-cli/lib"
9767
- > }
9768
- > }
9769
- > }
9770
- > }
9771
- > ```
9885
+ For other clients (Claude Desktop, VS Code, …), the configuration is identical.
9886
+
9887
+ ##### Claude Desktop `stdio`
9888
+
9889
+ Find the configuration file as specified in [Claude Desktop Documentation](https://modelcontextprotocol.io/docs/2026-07-28/develop/connect-local-servers).
9890
+
9891
+ place this section in `mcpServers`:
9892
+
9893
+ ```json
9894
+ {
9895
+ "mcpServers": {
9896
+ "ascli": {
9897
+ "command": "ascli",
9898
+ "args": ["mcp", "server"]
9899
+ }
9900
+ },
9901
+ ...
9902
+ }
9903
+ ```
9904
+
9905
+ ##### Development mode for `stdio`
9906
+
9907
+ If the `ascli` gem is not installed and you are running directly from the source tree, Ruby will not find the `lib/` directory automatically.
9908
+ Add the `RUBYLIB` environment variable pointing to the `lib/` directory of the project:
9909
+
9910
+ ```json
9911
+ {
9912
+ "mcpServers": {
9913
+ "ascli": {
9914
+ "type": "stdio",
9915
+ "command": "/path/to/aspera-cli/bin/ascli",
9916
+ "args": ["mcp", "server"],
9917
+ "env": {
9918
+ "RUBYLIB": "/path/to/aspera-cli/lib"
9919
+ }
9920
+ }
9921
+ }
9922
+ }
9923
+ ```
9772
9924
 
9773
9925
  ### Tested commands for `mcp`
9774
9926
 
@@ -9789,6 +9941,74 @@ It covers tool visibility, self-discovery, Hash schema introspection, option lis
9789
9941
  documentation retrieval, live transfer tasks, truncation handling, error handling, and
9790
9942
  credential safety.
9791
9943
 
9944
+ ### MCP usage patterns for AI
9945
+
9946
+ > [!TIP]
9947
+ > This section is for AI assistants using the MCP server. Follow these patterns to avoid
9948
+ > common first-call failures and unnecessary retries.
9949
+
9950
+ #### Session bootstrap
9951
+
9952
+ Always start a session with two discovery calls before doing anything else:
9953
+
9954
+ ```
9955
+ ["config", "preset", "list"]
9956
+ ["config", "preset", "show", "default"]
9957
+ ```
9958
+
9959
+ The second call returns the `plugin → preset_name` mapping so you know which credentials
9960
+ are active for each plugin.
9961
+
9962
+ #### Command discovery
9963
+
9964
+ Always use `["config", "commands"]` to enumerate every available command and its syntax.
9965
+ Never guess command names from training data — names like `shared_folders` vs
9966
+ `shared_inboxes` are easily confused.
9967
+
9968
+ #### Schema introspection for Hash arguments
9969
+
9970
+ Whenever a command syntax shows a `<data>` argument, call `help` **before** the real call:
9971
+
9972
+ ```json
9973
+ ["<plugin>", "<cmd>", ..., "help"]
9974
+ ```
9975
+
9976
+ This returns a table of field names, types, and descriptions. Never infer field names from
9977
+ server error messages.
9978
+
9979
+ #### Async transfers and cross-call status tracking
9980
+
9981
+ The `direct` agent keeps transfer state in-memory. A job started in one MCP call **cannot**
9982
+ be monitored in a subsequent call — the in-memory agent is gone between calls.
9983
+
9984
+ Use the `transferd` agent when you need to check transfer status in a later call:
9985
+
9986
+ ```json
9987
+ ["server", "upload", "--transfer=transferd", "--to-folder=/dst", "/local/file"]
9988
+ ```
9989
+
9990
+ The `desktop` agent is also unaffected because it runs in an external process.
9991
+
9992
+ #### Workspace context for AoC
9993
+
9994
+ `aoc files` and `aoc packages` commands require a workspace context. If no default
9995
+ workspace is configured in the preset, always add `--workspace=NAME`:
9996
+
9997
+ ```
9998
+ ["aoc", "files", "ls", "/", "--workspace=MyWorkspace"]
9999
+ ```
10000
+
10001
+ List available workspaces with `["aoc", "user", "workspaces", "list"]`.
10002
+
10003
+ #### Admin operations and privilege checks
10004
+
10005
+ Before calling any `admin` sub-command, verify that the active preset has admin rights.
10006
+ `access_denied` typically means the wrong preset is active, not a syntax error. Check with:
10007
+
10008
+ ```
10009
+ ["config", "preset", "show", "<preset_name>"]
10010
+ ```
10011
+
9792
10012
  ## Operational Utilities
9793
10013
 
9794
10014
  This section covers the specialized modules and utilities used to integrate `ascli` into your broader operational infrastructure.
@@ -10323,14 +10543,14 @@ This can also be used with other folder-based applications: Aspera on Cloud, Sha
10323
10543
  #### Example: Unidirectional synchronization (download) from Aspera on Cloud Files
10324
10544
 
10325
10545
  ```shell
10326
- ascli aoc files download . --to-folder=. --lock-port=12345 --progress-bar=no --display=data --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000,"exclude_newer_than":-8,"delete_before_transfer":true}'
10546
+ ascli aoc files download . --to-folder=. --lock-port=12345 --progress-bar=no --out.level=data --ts=@json:'{"resume_policy":"sparse_csum","target_rate_kbps":50000,"exclude_newer_than":-8,"delete_before_transfer":true}'
10327
10547
  ```
10328
10548
 
10329
10549
  > [!NOTE]
10330
10550
  > Option `delete_before_transfer` will delete files locally, if they are not present on remote side.
10331
10551
 
10332
10552
  > [!NOTE]
10333
- > Options `progress` and `display` limit output for headless operation (for example, cron job)
10553
+ > Options `progress` and `--out.level` limit output for headless operation (for example, cron job)
10334
10554
 
10335
10555
  ### Health check and Nagios
10336
10556
 
@@ -10745,7 +10965,7 @@ Enjoy a coffee on me:
10745
10965
  ```shell
10746
10966
  ascli config coffee
10747
10967
  ascli config coffee --ui=text
10748
- ascli config coffee --ui=text --image.text=true
10968
+ ascli config coffee --ui=text --out.img.text=true
10749
10969
  ```
10750
10970
 
10751
10971
  ### References