diff --git a/docs/UPGRADING.md b/docs/UPGRADING.md
index 8b8ebcf7790..30cf55a9e42 100644
--- a/docs/UPGRADING.md
+++ b/docs/UPGRADING.md
@@ -4,6 +4,57 @@ Here you can find a list of migration guides to handle breaking changes between
 
 ## 0.36.0
 
+### CLI changed JSON output for some `lib`, `core`, `config`, `board`, and `sketch` commands.
+
+- `arduino-cli lib list --format json` results are now wrapped under `installed_libraries` key
+
+  ```
+  { "installed_libraries": [ {...}, {...} ] }
+  ```
+
+- `arduino-cli lib examples --format json` results are now wrapped under `examples` key
+
+  ```
+  { "examples": [ {...}, {...} ] }
+  ```
+
+- `arduino-cli core search --format json` and `arduino-cli core list --format json` results are now wrapped under
+  `platforms` key
+
+  ```
+  { "platforms": [ {...}, {...} ] }
+  ```
+
+- `arduino-cli config init --format json` now correctly returns a json object containg the config path
+
+  ```
+  { "config_path": "/home/user/.arduino15/arduino-cli.yaml" }
+  ```
+
+- `arduino-cli config dump --format json` results are now wrapped under `config` key
+
+  ```
+  { "config": { ... } }
+  ```
+
+- `arduino-cli board search --format json` results are now wrapped under `boards` key
+
+  ```
+  { "boards": [ {...}, {...} ] }
+  ```
+
+- `arduino-cli board list --format json` results are now wrapped under `detected_ports` key
+
+  ```
+  { "detected_ports": [ {...}, {...} ] }
+  ```
+
+- `arduino-cli sketch new` now correctly returns a json object containing the sketch path
+
+  ```
+  { "sketch_path": "/tmp/my_sketch" }
+  ```
+
 ### The gRPC `cc.arduino.cli.commands.v1.PlatformRelease` has been changed.
 
 We've added a new field called `compatible`. This field indicates if the current platform release is installable or not.
diff --git a/internal/cli/board/list.go b/internal/cli/board/list.go
index 82f2b9b74d2..a3872708d44 100644
--- a/internal/cli/board/list.go
+++ b/internal/cli/board/list.go
@@ -114,27 +114,27 @@ func watchList(inst *rpc.Instance) {
 // output from this command requires special formatting, let's create a dedicated
 // feedback.Result implementation
 type listResult struct {
-	ports []*result.DetectedPort
+	Ports []*result.DetectedPort `json:"detected_ports"`
 }
 
 func (dr listResult) Data() interface{} {
-	return dr.ports
+	return dr
 }
 
 func (dr listResult) String() string {
-	if len(dr.ports) == 0 {
+	if len(dr.Ports) == 0 {
 		return tr("No boards found.")
 	}
 
-	sort.Slice(dr.ports, func(i, j int) bool {
-		x, y := dr.ports[i].Port, dr.ports[j].Port
+	sort.Slice(dr.Ports, func(i, j int) bool {
+		x, y := dr.Ports[i].Port, dr.Ports[j].Port
 		return x.Protocol < y.Protocol ||
 			(x.Protocol == y.Protocol && x.Address < y.Address)
 	})
 
 	t := table.New()
 	t.SetHeader(tr("Port"), tr("Protocol"), tr("Type"), tr("Board Name"), tr("FQBN"), tr("Core"))
-	for _, detectedPort := range dr.ports {
+	for _, detectedPort := range dr.Ports {
 		port := detectedPort.Port
 		protocol := port.Protocol
 		address := port.Address
diff --git a/internal/cli/board/listall.go b/internal/cli/board/listall.go
index 74167c2014d..8d85d81c28b 100644
--- a/internal/cli/board/listall.go
+++ b/internal/cli/board/listall.go
@@ -23,7 +23,7 @@ import (
 
 	"github.com/arduino/arduino-cli/commands/board"
 	"github.com/arduino/arduino-cli/internal/cli/feedback"
-	fResult "github.com/arduino/arduino-cli/internal/cli/feedback/result"
+	"github.com/arduino/arduino-cli/internal/cli/feedback/result"
 	"github.com/arduino/arduino-cli/internal/cli/instance"
 	rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
 	"github.com/arduino/arduino-cli/table"
@@ -64,13 +64,13 @@ func runListAllCommand(cmd *cobra.Command, args []string) {
 		feedback.Fatal(tr("Error listing boards: %v", err), feedback.ErrGeneric)
 	}
 
-	feedback.PrintResult(resultAll{fResult.NewBoardListAllResponse(list)})
+	feedback.PrintResult(resultAll{result.NewBoardListAllResponse(list)})
 }
 
 // output from this command requires special formatting, let's create a dedicated
 // feedback.Result implementation
 type resultAll struct {
-	list *fResult.BoardListAllResponse
+	list *result.BoardListAllResponse
 }
 
 func (dr resultAll) Data() interface{} {
diff --git a/internal/cli/board/search.go b/internal/cli/board/search.go
index 9f8133fd80c..068dd0d0019 100644
--- a/internal/cli/board/search.go
+++ b/internal/cli/board/search.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/arduino/arduino-cli/commands/board"
 	"github.com/arduino/arduino-cli/internal/cli/feedback"
-	fResult "github.com/arduino/arduino-cli/internal/cli/feedback/result"
+	"github.com/arduino/arduino-cli/internal/cli/feedback/result"
 	"github.com/arduino/arduino-cli/internal/cli/instance"
 	rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
 	"github.com/arduino/arduino-cli/table"
@@ -61,32 +61,32 @@ func runSearchCommand(cmd *cobra.Command, args []string) {
 		feedback.Fatal(tr("Error searching boards: %v", err), feedback.ErrGeneric)
 	}
 
-	feedback.PrintResult(searchResults{fResult.NewBoardListItems(res.Boards)})
+	feedback.PrintResult(searchResults{result.NewBoardListItems(res.Boards)})
 }
 
 // output from this command requires special formatting so we create a dedicated
 // feedback.Result implementation
 type searchResults struct {
-	boards []*fResult.BoardListItem
+	Boards []*result.BoardListItem `json:"boards"`
 }
 
 func (r searchResults) Data() interface{} {
-	return r.boards
+	return r
 }
 
 func (r searchResults) String() string {
-	if len(r.boards) == 0 {
+	if len(r.Boards) == 0 {
 		return ""
 	}
 
 	t := table.New()
 	t.SetHeader(tr("Board Name"), tr("FQBN"), tr("Platform ID"), "")
 
-	sort.Slice(r.boards, func(i, j int) bool {
-		return r.boards[i].Name < r.boards[j].Name
+	sort.Slice(r.Boards, func(i, j int) bool {
+		return r.Boards[i].Name < r.Boards[j].Name
 	})
 
-	for _, item := range r.boards {
+	for _, item := range r.Boards {
 		hidden := ""
 		if item.IsHidden {
 			hidden = tr("(hidden)")
diff --git a/internal/cli/config/add.go b/internal/cli/config/add.go
index d375a0c578e..fe853df467e 100644
--- a/internal/cli/config/add.go
+++ b/internal/cli/config/add.go
@@ -25,33 +25,10 @@ import (
 	"github.com/spf13/cobra"
 )
 
-// // TODO: When update to go 1.18 or later, convert to generic
-// //       to allow uniquify() on any slice that supports
-// //       `comparable`
-// //       See https://gosamples.dev/generics-remove-duplicates-slice/
-// func uniquify[T comparable](s []T) []T {
-// 	// use a map, which enforces unique keys
-// 	inResult := make(map[T]bool)
-// 	var result []T
-// 	// loop through input slice **in order**,
-// 	// to ensure output retains that order
-// 	// (except that it removes duplicates)
-// 	for i := 0; i < len(s); i++ {
-// 		// attempt to use the element as a key
-// 		if _, ok := inResult[s[i]]; !ok {
-// 			// if key didn't exist in map,
-// 			// add to map and append to result
-// 			inResult[s[i]] = true
-// 			result = append(result, s[i])
-// 		}
-// 	}
-// 	return result
-// }
-
-func uniquifyStringSlice(s []string) []string {
+func uniquify[T comparable](s []T) []T {
 	// use a map, which enforces unique keys
-	inResult := make(map[string]bool)
-	var result []string
+	inResult := make(map[T]bool)
+	var result []T
 	// loop through input slice **in order**,
 	// to ensure output retains that order
 	// (except that it removes duplicates)
@@ -96,7 +73,7 @@ func runAddCommand(cmd *cobra.Command, args []string) {
 
 	v := configuration.Settings.GetStringSlice(key)
 	v = append(v, args[1:]...)
-	v = uniquifyStringSlice(v)
+	v = uniquify(v)
 	configuration.Settings.Set(key, v)
 
 	if err := configuration.Settings.WriteConfig(); err != nil {
diff --git a/internal/cli/config/dump.go b/internal/cli/config/dump.go
index 9e36a6f577a..b7636f68c4a 100644
--- a/internal/cli/config/dump.go
+++ b/internal/cli/config/dump.go
@@ -45,15 +45,15 @@ func runDumpCommand(cmd *cobra.Command, args []string) {
 // output from this command requires special formatting, let's create a dedicated
 // feedback.Result implementation
 type dumpResult struct {
-	data map[string]interface{}
+	Config map[string]interface{} `json:"config"`
 }
 
 func (dr dumpResult) Data() interface{} {
-	return dr.data
+	return dr
 }
 
 func (dr dumpResult) String() string {
-	bs, err := yaml.Marshal(dr.data)
+	bs, err := yaml.Marshal(dr.Config)
 	if err != nil {
 		// Should never happen
 		panic(tr("unable to marshal config to YAML: %v", err))
diff --git a/internal/cli/config/init.go b/internal/cli/config/init.go
index 471905c54cc..f2ef1effa46 100644
--- a/internal/cli/config/init.go
+++ b/internal/cli/config/init.go
@@ -108,8 +108,21 @@ func runInitCommand(cmd *cobra.Command, args []string) {
 	if err := newSettings.WriteConfigAs(configFileAbsPath.String()); err != nil {
 		feedback.Fatal(tr("Cannot create config file: %v", err), feedback.ErrGeneric)
 	}
+	feedback.PrintResult(initResult{ConfigFileAbsPath: configFileAbsPath})
+}
+
+// output from this command requires special formatting, let's create a dedicated
+// feedback.Result implementation
+type initResult struct {
+	ConfigFileAbsPath *paths.Path `json:"config_path"`
+}
+
+func (dr initResult) Data() interface{} {
+	return dr
+}
 
-	msg := tr("Config file written to: %s", configFileAbsPath.String())
+func (dr initResult) String() string {
+	msg := tr("Config file written to: %s", dr.ConfigFileAbsPath.String())
 	logrus.Info(msg)
-	feedback.Print(msg)
+	return msg
 }
diff --git a/internal/cli/config/set.go b/internal/cli/config/set.go
index f620fa183f5..339128c38f1 100644
--- a/internal/cli/config/set.go
+++ b/internal/cli/config/set.go
@@ -57,7 +57,7 @@ func runSetCommand(cmd *cobra.Command, args []string) {
 	var value interface{}
 	switch kind {
 	case reflect.Slice:
-		value = uniquifyStringSlice(args[1:])
+		value = uniquify(args[1:])
 	case reflect.String:
 		value = args[1]
 	case reflect.Bool:
diff --git a/internal/cli/core/list.go b/internal/cli/core/list.go
index 40ac933f027..6ef5c14b451 100644
--- a/internal/cli/core/list.go
+++ b/internal/cli/core/list.go
@@ -89,24 +89,24 @@ func GetList(inst *rpc.Instance, all bool, updatableOnly bool) []*rpc.PlatformSu
 func newCoreListResult(in []*rpc.PlatformSummary, updatableOnly bool) *coreListResult {
 	res := &coreListResult{updatableOnly: updatableOnly}
 	for _, platformSummary := range in {
-		res.platforms = append(res.platforms, result.NewPlatformSummary(platformSummary))
+		res.Platforms = append(res.Platforms, result.NewPlatformSummary(platformSummary))
 	}
 	return res
 }
 
 type coreListResult struct {
-	platforms     []*result.PlatformSummary
+	Platforms     []*result.PlatformSummary `json:"platforms"`
 	updatableOnly bool
 }
 
 // Data implements Result interface
 func (ir coreListResult) Data() interface{} {
-	return ir.platforms
+	return ir
 }
 
 // String implements Result interface
 func (ir coreListResult) String() string {
-	if len(ir.platforms) == 0 {
+	if len(ir.Platforms) == 0 {
 		if ir.updatableOnly {
 			return tr("All platforms are up to date.")
 		}
@@ -114,7 +114,7 @@ func (ir coreListResult) String() string {
 	}
 	t := table.New()
 	t.SetHeader(tr("ID"), tr("Installed"), tr("Latest"), tr("Name"))
-	for _, platform := range ir.platforms {
+	for _, platform := range ir.Platforms {
 		latestVersion := platform.LatestVersion.String()
 		if latestVersion == "" {
 			latestVersion = "n/a"
diff --git a/internal/cli/core/search.go b/internal/cli/core/search.go
index 0fc2389cdd8..fc2f247524c 100644
--- a/internal/cli/core/search.go
+++ b/internal/cli/core/search.go
@@ -86,27 +86,27 @@ func runSearchCommand(cmd *cobra.Command, args []string, allVersions bool) {
 // output from this command requires special formatting, let's create a dedicated
 // feedback.Result implementation
 type searchResults struct {
-	platforms   []*result.PlatformSummary
+	Platforms   []*result.PlatformSummary `json:"platforms"`
 	allVersions bool
 }
 
 func newSearchResult(in []*rpc.PlatformSummary, allVersions bool) *searchResults {
 	res := &searchResults{
-		platforms:   make([]*result.PlatformSummary, len(in)),
+		Platforms:   make([]*result.PlatformSummary, len(in)),
 		allVersions: allVersions,
 	}
 	for i, platformSummary := range in {
-		res.platforms[i] = result.NewPlatformSummary(platformSummary)
+		res.Platforms[i] = result.NewPlatformSummary(platformSummary)
 	}
 	return res
 }
 
 func (sr searchResults) Data() interface{} {
-	return sr.platforms
+	return sr
 }
 
 func (sr searchResults) String() string {
-	if len(sr.platforms) == 0 {
+	if len(sr.Platforms) == 0 {
 		return tr("No platforms matching your search.")
 	}
 
@@ -121,7 +121,7 @@ func (sr searchResults) String() string {
 		t.AddRow(platform.Id, release.Version, release.FormatName())
 	}
 
-	for _, platform := range sr.platforms {
+	for _, platform := range sr.Platforms {
 		// When allVersions is not requested we only show the latest compatible version
 		if !sr.allVersions {
 			addRow(platform, platform.GetLatestRelease())
diff --git a/internal/cli/lib/check_deps.go b/internal/cli/lib/check_deps.go
index 9a5666cd101..ce30c8df828 100644
--- a/internal/cli/lib/check_deps.go
+++ b/internal/cli/lib/check_deps.go
@@ -24,7 +24,7 @@ import (
 	"github.com/arduino/arduino-cli/commands/lib"
 	"github.com/arduino/arduino-cli/internal/cli/arguments"
 	"github.com/arduino/arduino-cli/internal/cli/feedback"
-	fResult "github.com/arduino/arduino-cli/internal/cli/feedback/result"
+	"github.com/arduino/arduino-cli/internal/cli/feedback/result"
 	"github.com/arduino/arduino-cli/internal/cli/instance"
 	rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
 	"github.com/fatih/color"
@@ -66,13 +66,13 @@ func runDepsCommand(cmd *cobra.Command, args []string) {
 		feedback.Fatal(tr("Error resolving dependencies for %[1]s: %[2]s", libRef, err), feedback.ErrGeneric)
 	}
 
-	feedback.PrintResult(&checkDepResult{deps: fResult.NewLibraryResolveDependenciesResponse(deps)})
+	feedback.PrintResult(&checkDepResult{deps: result.NewLibraryResolveDependenciesResponse(deps)})
 }
 
 // output from this command requires special formatting, let's create a dedicated
 // feedback.Result implementation
 type checkDepResult struct {
-	deps *fResult.LibraryResolveDependenciesResponse
+	deps *result.LibraryResolveDependenciesResponse
 }
 
 func (dr checkDepResult) Data() interface{} {
@@ -103,7 +103,7 @@ func (dr checkDepResult) String() string {
 	return res
 }
 
-func outputDep(dep *fResult.LibraryDependencyStatus) string {
+func outputDep(dep *result.LibraryDependencyStatus) string {
 	res := ""
 	green := color.New(color.FgGreen)
 	red := color.New(color.FgRed)
diff --git a/internal/cli/lib/examples.go b/internal/cli/lib/examples.go
index 17852f4003a..729a202d98b 100644
--- a/internal/cli/lib/examples.go
+++ b/internal/cli/lib/examples.go
@@ -94,11 +94,11 @@ type libraryExamples struct {
 }
 
 type libraryExamplesResult struct {
-	Examples []*libraryExamples
+	Examples []*libraryExamples `json:"examples"`
 }
 
 func (ir libraryExamplesResult) Data() interface{} {
-	return ir.Examples
+	return ir
 }
 
 func (ir libraryExamplesResult) String() string {
diff --git a/internal/cli/lib/list.go b/internal/cli/lib/list.go
index 75547a93d6d..8c489b102f5 100644
--- a/internal/cli/lib/list.go
+++ b/internal/cli/lib/list.go
@@ -67,7 +67,7 @@ func List(instance *rpc.Instance, args []string, all bool, updatable bool) {
 	}
 	feedback.PrintResult(installedResult{
 		onlyUpdates:   updatable,
-		installedLibs: installedLibsResult,
+		InstalledLibs: installedLibsResult,
 	})
 	logrus.Info("Done")
 }
@@ -118,24 +118,24 @@ func GetList(
 // output from this command requires special formatting, let's create a dedicated
 // feedback.Result implementation
 type installedResult struct {
+	InstalledLibs []*result.InstalledLibrary `json:"installed_libraries"`
 	onlyUpdates   bool
-	installedLibs []*result.InstalledLibrary
 }
 
 func (ir installedResult) Data() interface{} {
-	return ir.installedLibs
+	return ir
 }
 
 func (ir installedResult) String() string {
-	if len(ir.installedLibs) == 0 {
+	if len(ir.InstalledLibs) == 0 {
 		if ir.onlyUpdates {
 			return tr("No libraries update is available.")
 		}
 		return tr("No libraries installed.")
 	}
-	sort.Slice(ir.installedLibs, func(i, j int) bool {
-		return strings.ToLower(ir.installedLibs[i].Library.Name) < strings.ToLower(ir.installedLibs[j].Library.Name) ||
-			strings.ToLower(ir.installedLibs[i].Library.ContainerPlatform) < strings.ToLower(ir.installedLibs[j].Library.ContainerPlatform)
+	sort.Slice(ir.InstalledLibs, func(i, j int) bool {
+		return strings.ToLower(ir.InstalledLibs[i].Library.Name) < strings.ToLower(ir.InstalledLibs[j].Library.Name) ||
+			strings.ToLower(ir.InstalledLibs[i].Library.ContainerPlatform) < strings.ToLower(ir.InstalledLibs[j].Library.ContainerPlatform)
 	})
 
 	t := table.New()
@@ -145,7 +145,7 @@ func (ir installedResult) String() string {
 	t.SetColumnWidthMode(4, table.Average)
 
 	lastName := ""
-	for _, libMeta := range ir.installedLibs {
+	for _, libMeta := range ir.InstalledLibs {
 		lib := libMeta.Library
 		name := lib.Name
 		if name == lastName {
diff --git a/internal/integrationtest/board/board_test.go b/internal/integrationtest/board/board_test.go
index 46581575ca7..f4759f5b861 100644
--- a/internal/integrationtest/board/board_test.go
+++ b/internal/integrationtest/board/board_test.go
@@ -86,7 +86,7 @@ func TestBoardList(t *testing.T) {
 	require.NoError(t, err)
 	// check is a valid json and contains a list of ports
 	requirejson.Parse(t, stdout).
-		Query(`[ .[].port | select(.protocol == null or .protocol_label == null) ]`).
+		Query(`[ .detected_ports | .[].port | select(.protocol == null or .protocol_label == null) ]`).
 		MustBeEmpty()
 }
 
@@ -103,29 +103,30 @@ func TestBoardListMock(t *testing.T) {
 	require.NoError(t, err)
 
 	// check is a valid json and contains a list of ports
-	requirejson.Contains(t, stdout, `[
-		{
-		  "matching_boards": [
+	requirejson.Contains(t, stdout, `{
+		  "detected_ports": [
 			{
-			  "name": "Arduino Yún",
-			  "fqbn": "arduino:avr:yun"
+			  "matching_boards": [
+				{
+				  "name": "Arduino Yún",
+				  "fqbn": "arduino:avr:yun"
+				}
+			  ],
+			  "port": {
+				"address": "/dev/ttyCIAO",
+				"label": "Mocked Serial port",
+				"protocol": "serial",
+				"protocol_label": "Serial",
+				"properties": {
+				  "pid": "0x0041",
+				  "serial": "123456",
+				  "vid": "0x2341"
+				},
+				"hardware_id": "123456"
+			  }
 			}
-		  ],
-		  "port": {
-			"address": "/dev/ttyCIAO",
-			"label": "Mocked Serial port",
-			"protocol": "serial",
-			"protocol_label": "Serial",
-			"properties": {
-			  "pid": "0x0041",
-			  "serial": "123456",
-			  "vid": "0x2341"
-			},
-			"hardware_id": "123456"
-		  }
-		}
-	  ]
-	`)
+		  ]
+	}`)
 }
 
 func TestBoardListWithFqbnFilter(t *testing.T) {
@@ -144,8 +145,7 @@ func TestBoardListWithFqbnFilter(t *testing.T) {
 	// but it would succeed even if the filtering wasn't working properly
 	// TODO: find a way to simulate connected boards or create a unit test which
 	// mocks or initializes multiple components
-	requirejson.Parse(t, stdout).
-		MustBeEmpty()
+	requirejson.Query(t, stdout, `.boards | length`, `0`)
 }
 
 func TestBoardListWithFqbnFilterInvalid(t *testing.T) {
@@ -434,14 +434,15 @@ func TestBoardSearch(t *testing.T) {
 	// Verifies boards are returned
 	requirejson.NotEmpty(t, stdout)
 	// Verifies no board has FQBN set since no platform is installed
-	requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "0")
-	requirejson.Contains(t, stdout, `[
-		{"name": "Arduino UNO"},
-		{"name": "Arduino Yún"},
-		{"name": "Arduino Zero"},
-		{"name": "Arduino Nano 33 BLE"},
-		{"name": "Arduino Portenta H7"}
-	]`)
+	requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "0")
+	requirejson.Contains(t, stdout, `{
+		"boards": [
+				{"name": "Arduino UNO"},
+				{"name": "Arduino Yún"},
+				{"name": "Arduino Zero"},
+				{"name": "Arduino Nano 33 BLE"},
+				{"name": "Arduino Portenta H7"}
+		]}`)
 
 	// Search in non installed boards
 	stdout, _, err = cli.Run("board", "search", "--format", "json", "nano", "33")
@@ -449,11 +450,12 @@ func TestBoardSearch(t *testing.T) {
 	// Verifies boards are returned
 	requirejson.NotEmpty(t, stdout)
 	// Verifies no board has FQBN set since no platform is installed
-	requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "0")
-	requirejson.Contains(t, stdout, `[
-		{"name": "Arduino Nano 33 BLE"},
-		{"name": "Arduino Nano 33 IoT"}
-	]`)
+	requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "0")
+	requirejson.Contains(t, stdout, `{
+		"boards": [
+			{"name": "Arduino Nano 33 BLE"},
+			{"name": "Arduino Nano 33 IoT"}
+		]}`)
 
 	// Install a platform from index
 	_, _, err = cli.Run("core", "install", "arduino:avr@1.8.3")
@@ -463,27 +465,29 @@ func TestBoardSearch(t *testing.T) {
 	require.NoError(t, err)
 	requirejson.NotEmpty(t, stdout)
 	// Verifies some FQBNs are now returned after installing a platform
-	requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "26")
-	requirejson.Contains(t, stdout, `[
-		{
-			"name": "Arduino Yún",
-    		"fqbn": "arduino:avr:yun"
-		},
-		{
-			"name": "Arduino Uno",
-    		"fqbn": "arduino:avr:uno"
-		}
-	]`)
+	requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "26")
+	requirejson.Contains(t, stdout, `{
+		"boards": [
+			{
+				"name": "Arduino Yún",
+				"fqbn": "arduino:avr:yun"
+			},
+			{
+				"name": "Arduino Uno",
+				"fqbn": "arduino:avr:uno"
+			}
+		]}`)
 
 	stdout, _, err = cli.Run("board", "search", "--format", "json", "arduino", "yun")
 	require.NoError(t, err)
 	requirejson.NotEmpty(t, stdout)
-	requirejson.Contains(t, stdout, `[
-		{
-			"name": "Arduino Yún",
-			"fqbn": "arduino:avr:yun"
-		}
-	]`)
+	requirejson.Contains(t, stdout, `{
+		"boards": [
+			{
+				"name": "Arduino Yún",
+				"fqbn": "arduino:avr:yun"
+			}
+		]}`)
 
 	// Manually installs a core in sketchbooks hardware folder
 	gitUrl := "https://github.com/arduino/ArduinoCore-samd.git"
@@ -498,47 +502,50 @@ func TestBoardSearch(t *testing.T) {
 	require.NoError(t, err)
 	requirejson.NotEmpty(t, stdout)
 	// Verifies some FQBNs are now returned after installing a platform
-	requirejson.Query(t, stdout, "[ .[] | select(.fqbn) ] | length", "43")
-	requirejson.Contains(t, stdout, `[
-		{
-			"name": "Arduino Uno",
-    		"fqbn": "arduino:avr:uno"
-		},
-		{
-			"name": "Arduino Yún",
-    		"fqbn": "arduino:avr:yun"
-		},
-		{
-			"name": "Arduino MKR WiFi 1010",
-    		"fqbn": "arduino-beta-development:samd:mkrwifi1010"
-		},
-		{
-			"name": "Arduino MKR1000",
-    		"fqbn": "arduino-beta-development:samd:mkr1000"
-		},
-		{
-			"name": "Arduino MKRZERO",
-    		"fqbn": "arduino-beta-development:samd:mkrzero"
-		},
-		{
-			"name": "Arduino NANO 33 IoT",
-    		"fqbn": "arduino-beta-development:samd:nano_33_iot"
-		},
-		{
-			"fqbn": "arduino-beta-development:samd:arduino_zero_native"
-		}
-	]`)
+	requirejson.Query(t, stdout, "[ .boards[] | select(.fqbn) ] | length", "43")
+	requirejson.Contains(t, stdout, `{
+		"boards":
+		[
+			{
+				"name": "Arduino Uno",
+				"fqbn": "arduino:avr:uno"
+			},
+			{
+				"name": "Arduino Yún",
+				"fqbn": "arduino:avr:yun"
+			},
+			{
+				"name": "Arduino MKR WiFi 1010",
+				"fqbn": "arduino-beta-development:samd:mkrwifi1010"
+			},
+			{
+				"name": "Arduino MKR1000",
+				"fqbn": "arduino-beta-development:samd:mkr1000"
+			},
+			{
+				"name": "Arduino MKRZERO",
+				"fqbn": "arduino-beta-development:samd:mkrzero"
+			},
+			{
+				"name": "Arduino NANO 33 IoT",
+				"fqbn": "arduino-beta-development:samd:nano_33_iot"
+			},
+			{
+				"fqbn": "arduino-beta-development:samd:arduino_zero_native"
+			}
+		]}`)
 
 	stdout, _, err = cli.Run("board", "search", "--format", "json", "mkr1000")
 	require.NoError(t, err)
 	requirejson.NotEmpty(t, stdout)
 	// Verifies some FQBNs are now returned after installing a platform
-	requirejson.Contains(t, stdout, `[
-		{
-			"name": "Arduino MKR1000",
-    		"fqbn": "arduino-beta-development:samd:mkr1000"
-		}
-	]`)
+	requirejson.Contains(t, stdout, `{
+		"boards": [
+			{
+				"name": "Arduino MKR1000",
+				"fqbn": "arduino-beta-development:samd:mkr1000"
+			}
+		]}`)
 }
 
 func TestBoardAttach(t *testing.T) {
diff --git a/internal/integrationtest/board/hardware_loading_test.go b/internal/integrationtest/board/hardware_loading_test.go
index 9b4a3345c0c..a5daacdd71c 100644
--- a/internal/integrationtest/board/hardware_loading_test.go
+++ b/internal/integrationtest/board/hardware_loading_test.go
@@ -47,27 +47,28 @@ func TestHardwareLoading(t *testing.T) {
 			require.NoError(t, err)
 			jsonOut := requirejson.Parse(t, out)
 			jsonOut.LengthMustEqualTo(1)
-			jsonOut.MustContain(`[
-				{
-					"id": "arduino:avr",
-					"installed_version": "1.8.6",
-					"releases": {
-						"1.8.6": {
-							"name": "Arduino AVR Boards",
-							"boards": [
-								{
-									"name": "Arduino Uno",
-									"fqbn": "arduino:avr:uno"
-								},
-								{
-									"name": "Arduino Yún",
-									"fqbn": "arduino:avr:yun"
-								}
-							]
+			jsonOut.MustContain(`{
+				"platforms": [
+					{
+						"id": "arduino:avr",
+						"installed_version": "1.8.6",
+						"releases": {
+							"1.8.6": {
+								"name": "Arduino AVR Boards",
+								"boards": [
+									{
+										"name": "Arduino Uno",
+										"fqbn": "arduino:avr:uno"
+									},
+									{
+										"name": "Arduino Yún",
+										"fqbn": "arduino:avr:yun"
+									}
+								]
+							}
 						}
 					}
-				}
-			]`)
+				]}`)
 		}
 
 		{
@@ -154,60 +155,63 @@ func TestHardwareLoading(t *testing.T) {
 			out, _, err := cli.Run("core", "list", "--format", "json")
 			require.NoError(t, err)
 			jsonOut := requirejson.Parse(t, out)
-			jsonOut.LengthMustEqualTo(3)
-			jsonOut.MustContain(`[
-				{
-					"id": "arduino:avr",
-					"installed_version": "1.8.6",
-					"releases": {
-						"1.8.6": {
-							"name": "Arduino AVR Boards",
-							"boards": [
-								{
-									"name": "Arduino Uno",
-									"fqbn": "arduino:avr:uno"
-								},
-								{
-									"name": "Arduino Yún",
-									"fqbn": "arduino:avr:yun"
-								}
-							]
+			jsonOut.Query(`.platforms | length`).LengthMustEqualTo(3)
+			jsonOut.MustContain(`{
+				"platforms": [
+					{
+						"id": "arduino:avr",
+						"installed_version": "1.8.6",
+						"releases": {
+							"1.8.6": {
+								"name": "Arduino AVR Boards",
+								"boards": [
+									{
+										"name": "Arduino Uno",
+										"fqbn": "arduino:avr:uno"
+									},
+									{
+										"name": "Arduino Yún",
+										"fqbn": "arduino:avr:yun"
+									}
+								]
+							}
 						}
 					}
-				}
-			]`)
-			jsonOut.MustContain(`[
-				{
-					"id": "my_avr_platform:avr",
-					"installed_version": "9.9.9",
-					"releases": {
-						"9.9.9": {
-							"name": "My AVR Boards",
-							"boards": [
-								{
-									"name": "Arduino Yún",
-									"fqbn": "my_avr_platform:avr:custom_yun"
-								}
-							]
-						}
-					},
-					"manually_installed": true
-				}
-			]`)
+				]}`)
+			jsonOut.MustContain(`{
+				"platforms": [
+					{
+						"id": "my_avr_platform:avr",
+						"installed_version": "9.9.9",
+						"releases": {
+							"9.9.9": {
+								"name": "My AVR Boards",
+								"boards": [
+									{
+										"name": "Arduino Yún",
+										"fqbn": "my_avr_platform:avr:custom_yun"
+									}
+								]
+							}
+						},
+						"manually_installed": true
+					}
+				]}`)
 
 			//		require.False(t, myAVRPlatformAvrArch.Properties.ContainsKey("preproc.includes.flags"))
 
 			if runtime.GOOS != "windows" {
-				jsonOut.MustContain(`[
-					{
-						"id": "my_symlinked_avr_platform:avr",
-						"manually_installed": true,
-						"releases": {
-							"9.9.9": {
+				jsonOut.MustContain(`{
+					"platforms": [
+						{
+							"id": "my_symlinked_avr_platform:avr",
+							"manually_installed": true,
+							"releases": {
+								"9.9.9": {
+								}
 							}
 						}
-					}
-				]`)
+					]}`)
 			}
 		}
 
diff --git a/internal/integrationtest/compile_1/compile_test.go b/internal/integrationtest/compile_1/compile_test.go
index 78ceb5ca63c..7ab7ab97f5e 100644
--- a/internal/integrationtest/compile_1/compile_test.go
+++ b/internal/integrationtest/compile_1/compile_test.go
@@ -499,9 +499,11 @@ func compileWithExportBinariesConfig(t *testing.T, env *integrationtest.Environm
 	require.NoError(t, err)
 	requirejson.Contains(t, stdout, `
 		{
-			"sketch": {
-			"always_export_binaries": "true"
-	  		}
+			"config": {
+				"sketch": {
+					"always_export_binaries": "true"
+				}
+			}
 		}`)
 
 	// Test compilation with export binaries env var set
@@ -824,10 +826,8 @@ func TestCompileWithArchivesAndLongPaths(t *testing.T) {
 
 	stdout, _, err := cli.Run("lib", "examples", "ArduinoIoTCloud", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	var libOutput []map[string]interface{}
-	err = json.Unmarshal(stdout, &libOutput)
-	require.NoError(t, err)
-	sketchPath := paths.New(libOutput[0]["library"].(map[string]interface{})["install_dir"].(string))
+	libOutput := strings.Trim(requirejson.Parse(t, stdout).Query(`.examples.[0].library.install_dir`).String(), `"`)
+	sketchPath := paths.New(libOutput)
 	sketchPath = sketchPath.Join("examples", "ArduinoIoTCloud-Advanced")
 
 	_, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String(), "--config-file", "arduino-cli.yaml")
diff --git a/internal/integrationtest/config/config_test.go b/internal/integrationtest/config/config_test.go
index e21d6db55dc..4ccb5460acc 100644
--- a/internal/integrationtest/config/config_test.go
+++ b/internal/integrationtest/config/config_test.go
@@ -239,7 +239,7 @@ func TestDump(t *testing.T) {
 
 	stdout, _, err := cli.Run("config", "dump", "--config-file", configFile.String(), "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 
 	stdout, _, err = cli.Run("config", "init", "--additional-urls", "https://example.com")
 	require.NoError(t, err)
@@ -249,7 +249,7 @@ func TestDump(t *testing.T) {
 
 	stdout, _, err = cli.Run("config", "dump", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]")
 }
 
 func TestDumpWithConfigFileFlag(t *testing.T) {
@@ -265,7 +265,7 @@ func TestDumpWithConfigFileFlag(t *testing.T) {
 
 	stdout, _, err := cli.Run("config", "dump", "--config-file", configFile.String(), "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]")
 
 	stdout, _, err = cli.Run(
 		"config",
@@ -277,7 +277,7 @@ func TestDumpWithConfigFileFlag(t *testing.T) {
 		"json",
 	)
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://another-url.com\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://another-url.com\"]")
 }
 
 func TestAddRemoveSetDeleteOnUnexistingKey(t *testing.T) {
@@ -316,7 +316,7 @@ func TestAddSingleArgument(t *testing.T) {
 	// Verifies no additional urls are present
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 
 	// Adds one URL
 	url := "https://example.com"
@@ -326,7 +326,7 @@ func TestAddSingleArgument(t *testing.T) {
 	// Verifies URL has been saved
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]")
 
 	// Adds the same URL (should not error)
 	_, _, err = cli.Run("config", "add",
@@ -337,7 +337,7 @@ func TestAddSingleArgument(t *testing.T) {
 	// Verifies a second copy has NOT been added
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com\"]")
 }
 
 func TestAddMultipleArguments(t *testing.T) {
@@ -351,7 +351,7 @@ func TestAddMultipleArguments(t *testing.T) {
 	// Verifies no additional urls are present
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 
 	// Adds multiple URLs at the same time
 	urls := [3]string{
@@ -366,14 +366,16 @@ func TestAddMultipleArguments(t *testing.T) {
 	// Verifies URL has been saved
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/package_example_index.json",
-				"https://example.com/yet_another_package_example_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/package_example_index.json",
+					"https://example.com/yet_another_package_example_index.json"
+				]
+			}
 		}
 	}`)
 
@@ -384,14 +386,16 @@ func TestAddMultipleArguments(t *testing.T) {
 	// Verifies no change in result array
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/package_example_index.json",
-				"https://example.com/yet_another_package_example_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/package_example_index.json",
+					"https://example.com/yet_another_package_example_index.json"
+				]
+			}
 		}
 	}`)
 
@@ -407,15 +411,17 @@ func TestAddMultipleArguments(t *testing.T) {
 	// Verifies URL has been saved
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "3")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "3")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/package_example_index.json",
-				"https://example.com/a_third_package_example_index.json",
-				"https://example.com/yet_another_package_example_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/package_example_index.json",
+					"https://example.com/a_third_package_example_index.json",
+					"https://example.com/yet_another_package_example_index.json"
+				]
+			}
 		}
 	}`)
 }
@@ -431,7 +437,7 @@ func TestAddOnUnsupportedKey(t *testing.T) {
 	// Verifies default value
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"")
+	requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"")
 
 	// Tries and fails to add a new item
 	_, stderr, err := cli.Run("config", "add", "daemon.port", "50000", "--config-file", "arduino-cli.yaml")
@@ -441,7 +447,7 @@ func TestAddOnUnsupportedKey(t *testing.T) {
 	// Verifies value is not changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"")
+	requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"")
 }
 
 func TestRemoveSingleArgument(t *testing.T) {
@@ -463,14 +469,16 @@ func TestRemoveSingleArgument(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/package_example_index.json",
-				"https://example.com/yet_another_package_example_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/package_example_index.json",
+					"https://example.com/yet_another_package_example_index.json"
+				]
+			}
 		}
 	}`)
 
@@ -481,7 +489,7 @@ func TestRemoveSingleArgument(t *testing.T) {
 	// Verifies URLs has been removed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]")
 }
 
 func TestRemoveMultipleArguments(t *testing.T) {
@@ -503,14 +511,16 @@ func TestRemoveMultipleArguments(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/package_example_index.json",
-				"https://example.com/yet_another_package_example_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/package_example_index.json",
+					"https://example.com/yet_another_package_example_index.json"
+				]
+			}
 		}
 	}`)
 
@@ -521,7 +531,7 @@ func TestRemoveMultipleArguments(t *testing.T) {
 	// Verifies all URLs have been removed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 }
 
 func TestRemoveOnUnsupportedKey(t *testing.T) {
@@ -535,7 +545,7 @@ func TestRemoveOnUnsupportedKey(t *testing.T) {
 	// Verifies default value
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"")
+	requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"")
 
 	// Tries and fails to remove an item
 	_, stderr, err := cli.Run("config", "remove", "daemon.port", "50051", "--config-file", "arduino-cli.yaml")
@@ -545,7 +555,7 @@ func TestRemoveOnUnsupportedKey(t *testing.T) {
 	// Verifies value is not changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".daemon | .port", "\"50051\"")
+	requirejson.Query(t, stdout, ".config | .daemon | .port", "\"50051\"")
 }
 
 func TestSetSliceWithSingleArgument(t *testing.T) {
@@ -559,7 +569,7 @@ func TestSetSliceWithSingleArgument(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 
 	// Set an URL in the list
 	url := "https://example.com/package_example_index.json"
@@ -569,7 +579,7 @@ func TestSetSliceWithSingleArgument(t *testing.T) {
 	// Verifies value is changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com/package_example_index.json\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com/package_example_index.json\"]")
 
 	// Set an URL in the list
 	url = "https://example.com/yet_another_package_example_index.json"
@@ -579,7 +589,7 @@ func TestSetSliceWithSingleArgument(t *testing.T) {
 	// Verifies value is changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[\"https://example.com/yet_another_package_example_index.json\"]")
 }
 
 func TestSetSliceWithMultipleArguments(t *testing.T) {
@@ -593,7 +603,7 @@ func TestSetSliceWithMultipleArguments(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 
 	// Set some URLs in the list
 	urls := [7]string{
@@ -606,14 +616,16 @@ func TestSetSliceWithMultipleArguments(t *testing.T) {
 	// Verifies value is changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/first_package_index.json",
-        		"https://example.com/second_package_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/first_package_index.json",
+					"https://example.com/second_package_index.json"
+				]
+			}
 		}
 	}`)
 
@@ -628,14 +640,16 @@ func TestSetSliceWithMultipleArguments(t *testing.T) {
 	// Verifies previous value is overwritten
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "2")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "2")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/third_package_index.json",
-				"https://example.com/fourth_package_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/third_package_index.json",
+					"https://example.com/fourth_package_index.json"
+				]
+			}
 		}
 	}`)
 
@@ -658,16 +672,18 @@ func TestSetSliceWithMultipleArguments(t *testing.T) {
 	// Verifies all unique values exist in config
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls | length", "4")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls | length", "4")
 	requirejson.Contains(t, stdout, `
 	{
-		"board_manager": {
-			"additional_urls": [
-				"https://example.com/first_package_index.json",
-				"https://example.com/second_package_index.json",
-				"https://example.com/fifth_package_index.json",
-				"https://example.com/sixth_package_index.json"
-			]
+		"config": {
+			"board_manager": {
+				"additional_urls": [
+					"https://example.com/first_package_index.json",
+					"https://example.com/second_package_index.json",
+					"https://example.com/fifth_package_index.json",
+					"https://example.com/sixth_package_index.json"
+				]
+			}
 		}
 	}`)
 }
@@ -683,7 +699,7 @@ func TestSetStringWithSingleArgument(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".logging | .level", "\"info\"")
+	requirejson.Query(t, stdout, ".config | .logging | .level", "\"info\"")
 
 	// Changes value
 	_, _, err = cli.Run("config", "set", "logging.level", "trace", "--config-file", "arduino-cli.yaml")
@@ -692,7 +708,7 @@ func TestSetStringWithSingleArgument(t *testing.T) {
 	// Verifies value is changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".logging | .level", "\"trace\"")
+	requirejson.Query(t, stdout, ".config | .logging | .level", "\"trace\"")
 }
 
 func TestSetStringWithMultipleArguments(t *testing.T) {
@@ -706,7 +722,7 @@ func TestSetStringWithMultipleArguments(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".logging | .level", "\"info\"")
+	requirejson.Query(t, stdout, ".config | .logging | .level", "\"info\"")
 
 	// Tries to change value
 	_, stderr, err := cli.Run("config", "set", "logging.level", "trace", "debug")
@@ -725,7 +741,7 @@ func TestSetBoolWithSingleArgument(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "false")
+	requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "false")
 
 	// Changes value
 	_, _, err = cli.Run("config", "set", "library.enable_unsafe_install", "true", "--config-file", "arduino-cli.yaml")
@@ -734,7 +750,7 @@ func TestSetBoolWithSingleArgument(t *testing.T) {
 	// Verifies value is changed
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "true")
+	requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "true")
 }
 
 func TestSetBoolWithMultipleArguments(t *testing.T) {
@@ -748,7 +764,7 @@ func TestSetBoolWithMultipleArguments(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "false")
+	requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "false")
 
 	// Changes value
 	_, stderr, err := cli.Run("config", "set", "library.enable_unsafe_install", "true", "foo", "--config-file", "arduino-cli.yaml")
@@ -767,7 +783,7 @@ func TestDelete(t *testing.T) {
 	// Verifies default state
 	stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".library | .enable_unsafe_install", "false")
+	requirejson.Query(t, stdout, ".config | .library | .enable_unsafe_install", "false")
 
 	// Delete config key
 	_, _, err = cli.Run("config", "delete", "library.enable_unsafe_install", "--config-file", "arduino-cli.yaml")
@@ -784,7 +800,7 @@ func TestDelete(t *testing.T) {
 	// Verifies default state
 	stdout, _, err = cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, ".board_manager | .additional_urls", "[]")
+	requirejson.Query(t, stdout, ".config | .board_manager | .additional_urls", "[]")
 
 	// Delete config key and sub keys
 	_, _, err = cli.Run("config", "delete", "board_manager", "--config-file", "arduino-cli.yaml")
diff --git a/internal/integrationtest/core/core_test.go b/internal/integrationtest/core/core_test.go
index c9db2e7701e..e8b7c4ad3be 100644
--- a/internal/integrationtest/core/core_test.go
+++ b/internal/integrationtest/core/core_test.go
@@ -48,17 +48,19 @@ func TestCorrectHandlingOfPlatformVersionProperty(t *testing.T) {
 	// Trigger problematic call
 	out, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Contains(t, out, `[
-		{
-			"id":"DxCore-dev:megaavr",
-			"installed_version":"1.4.10",
-			"releases": {
-				"1.4.10": {
-					"name":"DxCore"
+	requirejson.Contains(t, out, `{
+		"platforms": [
+			{
+				"id":"DxCore-dev:megaavr",
+				"installed_version":"1.4.10",
+				"releases": {
+					"1.4.10": {
+						"name":"DxCore"
+					}
 				}
 			}
-		}
-	]`)
+		]
+	}`)
 }
 
 func TestCoreSearch(t *testing.T) {
@@ -84,20 +86,20 @@ func TestCoreSearch(t *testing.T) {
 	require.NoError(t, err)
 	requirejson.NotEmpty(t, out)
 	// Verify that "installed_version" is set
-	requirejson.Contains(t, out, `[{installed_version: "1.8.6"}]`)
+	requirejson.Contains(t, out, `{"platforms":[{installed_version: "1.8.6"}]}`)
 
 	// additional URL
 	out, _, err = cli.Run("core", "search", "test_core", "--format", "json", "--additional-urls="+url.String())
 	require.NoError(t, err)
-	requirejson.Len(t, out, 1)
+	requirejson.Query(t, out, `.platforms | length`, `1`)
 
 	// show all versions
 	out, _, err = cli.Run("core", "search", "test_core", "--all", "--format", "json", "--additional-urls="+url.String())
 	require.NoError(t, err)
-	requirejson.Query(t, out, `.[].releases | length`, "3")
+	requirejson.Query(t, out, `.platforms.[].releases | length`, "3")
 
 	checkPlatformIsInJSONOutput := func(stdout []byte, id, version string) {
-		jqquery := fmt.Sprintf(`[{id:"%s", releases:{"%s":{}}}]`, id, version)
+		jqquery := fmt.Sprintf(`{"platforms":[{id:"%s", releases:{"%s":{}}}]}`, id, version)
 		requirejson.Contains(t, out, jqquery, "platform %s@%s is missing from the output", id, version)
 	}
 
@@ -131,7 +133,7 @@ func TestCoreSearch(t *testing.T) {
 		require.NoError(t, err)
 
 		for _, id := range expectedIDs {
-			jqquery := fmt.Sprintf(`[{id:"%s"}]`, id)
+			jqquery := fmt.Sprintf(`{"platforms":[{id:"%s"}]}`, id)
 			requirejson.Contains(t, out, jqquery, "platform %s is missing from the output", id)
 		}
 	}
@@ -181,8 +183,8 @@ func TestCoreSearchNoArgs(t *testing.T) {
 	// Same thing in JSON format, also check the number of platforms found is the same
 	stdout, _, err = cli.Run("core", "search", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Contains(t, stdout, `[{"id": "test:x86", "releases": { "2.0.0": {"name":"test_core"}}}]`)
-	requirejson.Len(t, stdout, numPlatforms)
+	requirejson.Contains(t, stdout, `{"platforms":[{"id": "test:x86", "releases": { "2.0.0": {"name":"test_core"}}}]}`)
+	requirejson.Query(t, stdout, ".platforms | length", fmt.Sprint(numPlatforms))
 
 	// list all with additional urls, check the test core is there
 	stdout, _, err = cli.Run("core", "search", "--additional-urls="+url.String())
@@ -199,19 +201,20 @@ func TestCoreSearchNoArgs(t *testing.T) {
 	// same thing in JSON format, also check the number of platforms found is the same
 	stdout, _, err = cli.Run("core", "search", "--format", "json", "--additional-urls="+url.String())
 	require.NoError(t, err)
-	requirejson.Contains(t, stdout, `[
-		{
-			"id": "test:x86",
-			"installed_version": "2.0.0",
-			"latest_version": "2.0.0",
-			"releases": {
-				"1.0.0": {"name":"test_core", "compatible": true},
-				"2.0.0": {"name":"test_core", "compatible": true},
-				"3.0.0": {"name":"test_core", "compatible": false}
+	requirejson.Contains(t, stdout, `{
+		"platforms": [
+			{
+				"id": "test:x86",
+				"installed_version": "2.0.0",
+				"latest_version": "2.0.0",
+				"releases": {
+					"1.0.0": {"name":"test_core", "compatible": true},
+					"2.0.0": {"name":"test_core", "compatible": true},
+					"3.0.0": {"name":"test_core", "compatible": false}
+				}
 			}
-		}
-	]`)
-	requirejson.Len(t, stdout, numPlatforms)
+	]}`)
+	requirejson.Query(t, stdout, `.platforms | length`, fmt.Sprint(numPlatforms))
 }
 
 func TestCoreUpdateIndexUrlNotFound(t *testing.T) {
@@ -325,7 +328,7 @@ func TestCoreInstall(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, `.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.16"`)
+	requirejson.Query(t, stdout, `.platforms.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.16"`)
 
 	// Replace it with the same with --no-overwrite (should NOT fail)
 	_, _, err = cli.Run("core", "install", "arduino:avr@1.6.16", "--no-overwrite")
@@ -340,13 +343,13 @@ func TestCoreInstall(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err = cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, `.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.17"`)
+	requirejson.Query(t, stdout, `.platforms.[] | select(.id == "arduino:avr") | .installed_version`, `"1.6.17"`)
 
 	// Confirm core is listed as "updatable"
 	stdout, _, err = cli.Run("core", "list", "--updatable", "--format", "json")
 	require.NoError(t, err)
 	jsonout := requirejson.Parse(t, stdout)
-	q := jsonout.Query(`.[] | select(.id == "arduino:avr")`)
+	q := jsonout.Query(`.platforms.[] | select(.id == "arduino:avr")`)
 	q.Query(".installed_version").MustEqual(`"1.6.17"`)
 	latest := q.Query(".latest_version")
 
@@ -355,12 +358,12 @@ func TestCoreInstall(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err = cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, `.[] | select(.id == "arduino:avr") | .installed_version`, latest.String())
+	requirejson.Query(t, stdout, `.platforms.[] | select(.id == "arduino:avr") | .installed_version`, latest.String())
 
 	// double check the core isn't updatable anymore
 	stdout, _, err = cli.Run("core", "list", "--updatable", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.platforms | length`, `0`)
 }
 
 func TestCoreUninstall(t *testing.T) {
@@ -373,12 +376,12 @@ func TestCoreUninstall(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Contains(t, stdout, `[ { "id": "arduino:avr" } ]`)
+	requirejson.Contains(t, stdout, `{"platforms":[ { "id": "arduino:avr" } ]}`)
 	_, _, err = cli.Run("core", "uninstall", "arduino:avr")
 	require.NoError(t, err)
 	stdout, _, err = cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.platforms | length`, `0`)
 }
 
 func TestCoreUninstallToolDependencyRemoval(t *testing.T) {
@@ -456,7 +459,7 @@ func TestCoreSearchManuallyInstalledCoresNotPrinted(t *testing.T) {
 	// Verifies only cores in board manager are shown
 	stdout, _, err := cli.Run("core", "search", "--format", "json")
 	require.NoError(t, err)
-	requirejson.NotEmpty(t, stdout)
+	requirejson.Query(t, stdout, `.platforms | length > 0`, `true`)
 	oldJson := stdout
 
 	// Manually installs a core in sketchbooks hardware folder
@@ -471,7 +474,7 @@ func TestCoreSearchManuallyInstalledCoresNotPrinted(t *testing.T) {
 	// Verifies manually installed core is not shown
 	stdout, _, err = cli.Run("core", "search", "--format", "json")
 	require.NoError(t, err)
-	requirejson.NotContains(t, stdout, `[{"id": "arduino-beta-development:avr"}]`)
+	requirejson.NotContains(t, stdout, `{"platforms":[{"id": "arduino-beta-development:avr"}]}`)
 	require.Equal(t, oldJson, stdout)
 }
 
@@ -485,8 +488,8 @@ func TestCoreListAllManuallyInstalledCore(t *testing.T) {
 	// Verifies only cores in board manager are shown
 	stdout, _, err := cli.Run("core", "list", "--all", "--format", "json")
 	require.NoError(t, err)
-	requirejson.NotEmpty(t, stdout)
-	length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query("length").String())
+	requirejson.Query(t, stdout, `.platforms | length > 0`, `true`)
+	length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query(".platforms | length").String())
 	require.NoError(t, err)
 
 	// Manually installs a core in sketchbooks hardware folder
@@ -501,8 +504,8 @@ func TestCoreListAllManuallyInstalledCore(t *testing.T) {
 	// Verifies manually installed core is shown
 	stdout, _, err = cli.Run("core", "list", "--all", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, length+1)
-	requirejson.Contains(t, stdout, `[
+	requirejson.Query(t, stdout, `.platforms | length`, fmt.Sprint(length+1))
+	requirejson.Contains(t, stdout, `{"platforms":[
 		{
 			"id": "arduino-beta-development:avr",
 			"latest_version": "1.8.3",
@@ -512,7 +515,7 @@ func TestCoreListAllManuallyInstalledCore(t *testing.T) {
 				}
 			}
 		}
-	]`)
+	]}`)
 }
 
 func TestCoreListUpdatableAllFlags(t *testing.T) {
@@ -525,8 +528,8 @@ func TestCoreListUpdatableAllFlags(t *testing.T) {
 	// Verifies only cores in board manager are shown
 	stdout, _, err := cli.Run("core", "list", "--all", "--updatable", "--format", "json")
 	require.NoError(t, err)
-	requirejson.NotEmpty(t, stdout)
-	length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query("length").String())
+	requirejson.Query(t, stdout, `.platforms | length > 0`, `true`)
+	length, err := strconv.Atoi(requirejson.Parse(t, stdout).Query(".platforms | length").String())
 	require.NoError(t, err)
 
 	// Manually installs a core in sketchbooks hardware folder
@@ -541,8 +544,8 @@ func TestCoreListUpdatableAllFlags(t *testing.T) {
 	// Verifies using both --updatable and --all flags --all takes precedence
 	stdout, _, err = cli.Run("core", "list", "--all", "--updatable", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, length+1)
-	requirejson.Contains(t, stdout, `[
+	requirejson.Query(t, stdout, `.platforms | length`, fmt.Sprint(length+1))
+	requirejson.Contains(t, stdout, `{"platforms":[
 		{
 			"id": "arduino-beta-development:avr",
 			"latest_version": "1.8.3",
@@ -552,7 +555,7 @@ func TestCoreListUpdatableAllFlags(t *testing.T) {
 				}
 			}
 		}
-	]`)
+	]}`)
 }
 
 func TestCoreUpgradeRemovesUnusedTools(t *testing.T) {
@@ -618,8 +621,8 @@ func TestCoreListWithInstalledJson(t *testing.T) {
 	// Verifies installed core is correctly found and name is set
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Contains(t, stdout, `[
+	requirejson.Query(t, stdout, `.platforms | length`, `1`)
+	requirejson.Contains(t, stdout, `{"platforms":[
 		{
 			"id": "adafruit:avr",
 			"releases": {
@@ -628,7 +631,7 @@ func TestCoreListWithInstalledJson(t *testing.T) {
 				}
 			}
 		}
-	]`)
+	]}`)
 
 	// Deletes installed.json file, this file stores information about the core,
 	// that is used mostly when removing package indexes and their cores are still installed;
@@ -641,11 +644,11 @@ func TestCoreListWithInstalledJson(t *testing.T) {
 	// Verifies installed core is still found and name is set
 	stdout, _, err = cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.platforms | length`, `1`)
 	// Name for this core changes since if there's installed.json file we read it from
 	// platform.txt, turns out that this core has different names used in different files
 	// thus the change.
-	requirejson.Contains(t, stdout, `[
+	requirejson.Contains(t, stdout, `{"platforms":[
 		{
 			"id": "adafruit:avr",
 			"releases": {
@@ -654,7 +657,7 @@ func TestCoreListWithInstalledJson(t *testing.T) {
 				}
 			}
 		}
-	]`)
+	]}`)
 }
 
 func TestCoreSearchUpdateIndexDelay(t *testing.T) {
@@ -737,20 +740,20 @@ func TestCoreSearchSortedResults(t *testing.T) {
 
 	// verify that results are already sorted correctly
 	sortedDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String()
+		"[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String()
 	notSortedDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String()
+		"[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String()
 	require.Equal(t, sortedDeprecated, notSortedDeprecated)
 
 	sortedNotDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String()
+		"[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String()
 	notSortedNotDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String()
+		"[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String()
 	require.Equal(t, sortedNotDeprecated, notSortedNotDeprecated)
 
 	// verify that deprecated platforms are the last ones
 	platform := requirejson.Parse(t, stdout).Query(
-		"[ .[] | .id |=ascii_downcase | .id]").String()
+		"[ .platforms.[] | .id |=ascii_downcase | .id]").String()
 	require.Equal(t, platform, strings.TrimRight(notSortedNotDeprecated, "]")+","+strings.TrimLeft(notSortedDeprecated, "["))
 }
 
@@ -805,24 +808,23 @@ func TestCoreListSortedResults(t *testing.T) {
 	// test same behaviour with json output
 	stdout, _, err = cli.Run("core", "list", "--additional-urls="+url.String(), "--format=json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 3)
+	requirejson.Query(t, stdout, `.platforms | length`, `3`)
 
 	// verify that results are already sorted correctly
 	sortedDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String()
+		"[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id] | sort").String()
 	notSortedDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String()
+		"[ .platforms.[] | select(.deprecated == true) | .id |=ascii_downcase | .id]").String()
 	require.Equal(t, sortedDeprecated, notSortedDeprecated)
 
 	sortedNotDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String()
+		"[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id] | sort").String()
 	notSortedNotDeprecated := requirejson.Parse(t, stdout).Query(
-		"[ .[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String()
+		"[ .platforms.[] | select(.deprecated != true) | .id |=ascii_downcase | .id]").String()
 	require.Equal(t, sortedNotDeprecated, notSortedNotDeprecated)
 
 	// verify that deprecated platforms are the last ones
-	platform := requirejson.Parse(t, stdout).Query(
-		"[ .[] | .id |=ascii_downcase | .id]").String()
+	platform := requirejson.Parse(t, stdout).Query("[ .platforms.[] | .id |=ascii_downcase | .id]").String()
 	require.Equal(t, platform, strings.TrimRight(notSortedNotDeprecated, "]")+","+strings.TrimLeft(notSortedDeprecated, "["))
 }
 
@@ -854,8 +856,8 @@ func TestCoreListDeprecatedPlatformWithInstalledJson(t *testing.T) {
 	stdout, _, err := cli.Run("core", "list", "--additional-urls="+url.String(), "--format=json")
 	require.NoError(t, err)
 
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[] | .deprecated", "true")
+	requirejson.Query(t, stdout, `.platforms | length`, `1`)
+	requirejson.Query(t, stdout, ".platforms.[] | .deprecated", "true")
 }
 
 func TestCoreListPlatformWithoutPlatformTxt(t *testing.T) {
@@ -867,7 +869,7 @@ func TestCoreListPlatformWithoutPlatformTxt(t *testing.T) {
 
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 0)
+	requirejson.Query(t, stdout, `.platforms | length`, `0`)
 
 	// Simulates creation of a new core in the sketchbook hardware folder
 	// without a platforms.txt
@@ -879,9 +881,9 @@ func TestCoreListPlatformWithoutPlatformTxt(t *testing.T) {
 	// Verifies no core is installed
 	stdout, _, err = cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[] | .id", `"some-packager:some-arch"`)
-	requirejson.Query(t, stdout, ".[] | .releases[.installed_version].name", `"some-packager-some-arch"`)
+	requirejson.Query(t, stdout, `.platforms | length`, `1`)
+	requirejson.Query(t, stdout, ".platforms.[] | .id", `"some-packager:some-arch"`)
+	requirejson.Query(t, stdout, ".platforms.[] | .releases[.installed_version].name", `"some-packager-some-arch"`)
 }
 
 func TestCoreDownloadMultiplePlatforms(t *testing.T) {
@@ -899,7 +901,7 @@ func TestCoreDownloadMultiplePlatforms(t *testing.T) {
 	// Verifies no core is installed
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 0)
+	requirejson.Query(t, stdout, `.platforms | length`, `0`)
 
 	// Simulates creation of two new cores in the sketchbook hardware folder
 	wd, _ := paths.Getwd()
@@ -915,7 +917,7 @@ func TestCoreDownloadMultiplePlatforms(t *testing.T) {
 	// Verifies the two cores are detected
 	stdout, _, err = cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 2)
+	requirejson.Query(t, stdout, `.platforms | length`, `2`)
 
 	// Try to do an operation on the fake cores.
 	// The cli should not allow it since optimizing the casing results in finding two cores
@@ -939,13 +941,13 @@ func TestCoreWithMissingCustomBoardOptionsIsLoaded(t *testing.T) {
 
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.platforms | length`, `1`)
 	// Verifies platform is loaded except excluding board with missing options
-	requirejson.Contains(t, stdout, `[{"id": "arduino-beta-dev:platform_with_missing_custom_board_options"}]`)
-	requirejson.Query(t, stdout, ".[] | select(.id == \"arduino-beta-dev:platform_with_missing_custom_board_options\") | .releases[.installed_version].boards | length", "2")
+	requirejson.Contains(t, stdout, `{"platforms":[{"id": "arduino-beta-dev:platform_with_missing_custom_board_options"}]}`)
+	requirejson.Query(t, stdout, ".platforms.[] | select(.id == \"arduino-beta-dev:platform_with_missing_custom_board_options\") | .releases[.installed_version].boards | length", "2")
 	// Verify board with malformed options is not loaded
 	// while other board is loaded
-	requirejson.Contains(t, stdout, `[
+	requirejson.Contains(t, stdout, `{"platforms":[
 		{
 			"id": "arduino-beta-dev:platform_with_missing_custom_board_options",
 			"releases": {
@@ -961,7 +963,7 @@ func TestCoreWithMissingCustomBoardOptionsIsLoaded(t *testing.T) {
 				}
 			}
 		}
-	]`)
+	]}`)
 }
 
 func TestCoreListOutdatedCore(t *testing.T) {
@@ -977,11 +979,11 @@ func TestCoreListOutdatedCore(t *testing.T) {
 
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[0] | .installed_version", "\"1.8.6\"")
-	installedVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".[0] | .installed_version").String(), "\""))
+	requirejson.Query(t, stdout, `.platforms | length`, `1`)
+	requirejson.Query(t, stdout, ".platforms.[0] | .installed_version", "\"1.8.6\"")
+	installedVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".platforms.[0] | .installed_version").String(), "\""))
 	require.NoError(t, err)
-	latestVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".[0] | .latest_version").String(), "\""))
+	latestVersion, err := semver.Parse(strings.Trim(requirejson.Parse(t, stdout).Query(".platforms.[0] | .latest_version").String(), "\""))
 	require.NoError(t, err)
 	// Installed version must be older than latest
 	require.True(t, installedVersion.LessThan(latestVersion))
@@ -1115,7 +1117,7 @@ func TestCoreListWhenNoPlatformAreInstalled(t *testing.T) {
 
 	stdout, _, err := cli.Run("core", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.platforms | length`, `0`)
 
 	stdout, _, err = cli.Run("core", "list")
 	require.NoError(t, err)
@@ -1136,7 +1138,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 	stdout, _, err := cli.Run("core", "list", "--all", "--format", "json", additionalURLs)
 	require.NoError(t, err)
 	requirejson.Parse(t, stdout).
-		Query(`.[] | select(.id == "foo_vendor:avr")`).
+		Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`).
 		MustContain(`{
 			"installed_version": "",
 			"latest_version": "1.0.1",
@@ -1153,7 +1155,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 	stdout, _, err = cli.Run("core", "list", "--all", "--format", "json", additionalURLs)
 	require.NoError(t, err)
 	requirejson.Parse(t, stdout).
-		Query(`.[] | select(.id == "foo_vendor:avr")`).
+		Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`).
 		MustContain(`{
 			"latest_version": "1.0.1",
 			"installed_version": "1.0.1",
@@ -1171,14 +1173,14 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 	stdout, _, err = cli.Run("core", "list", "--format", "json", additionalURLs)
 	require.NoError(t, err)
 	requirejson.Parse(t, stdout).
-		Query(`.[] | select(.id == "foo_vendor:avr")`).
+		Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`).
 		MustContain(`{"installed_version": "1.0.0", "releases": {"1.0.0": {"compatible": true}}}`)
 
 	// Lists all updatable cores
 	stdout, _, err = cli.Run("core", "list", "--updatable", "--format", "json", additionalURLs)
 	require.NoError(t, err)
 	requirejson.Parse(t, stdout).
-		Query(`.[] | select(.id == "foo_vendor:avr")`).
+		Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`).
 		MustContain(`{"latest_version": "1.0.1", "releases": {"1.0.1": {"compatible": true}}}`)
 
 	// Show outdated cores, must show latest compatible
@@ -1194,7 +1196,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 	stdout, _, err = cli.Run("core", "list", "--format", "json", additionalURLs)
 	require.NoError(t, err)
 	requirejson.Parse(t, stdout).
-		Query(`.[] | select(.id == "foo_vendor:avr") | .releases[.installed_version]`).
+		Query(`.platforms | .[] | select(.id == "foo_vendor:avr") | .releases[.installed_version]`).
 		MustContain(`{"version": "1.0.1", "compatible": true}`)
 
 	// upgrade to latest incompatible not possible (1.0.1 -> 1.0.2)
@@ -1202,7 +1204,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err = cli.Run("core", "list", "--format", "json", additionalURLs)
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, `.[] | select(.id == "foo_vendor:avr") | .installed_version`, `"1.0.1"`)
+	requirejson.Query(t, stdout, `.platforms | .[] | select(.id == "foo_vendor:avr") | .installed_version`, `"1.0.1"`)
 
 	// When no compatible version are found return error
 	// When trying to install a platform with no compatible version fails
@@ -1220,7 +1222,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 		require.Equal(t, stdoutSearchAll, stdoutSearch)
 		for _, stdout := range [][]byte{stdoutSearchAll, stdoutSearch} {
 			requirejson.Parse(t, stdout).
-				Query(`.[] | select(.id == "foo_vendor:avr")`).
+				Query(`.platforms | .[] | select(.id == "foo_vendor:avr")`).
 				MustContain(`{
 					"latest_version": "1.0.1",
 					"releases": {
@@ -1230,7 +1232,7 @@ func TestCoreHavingIncompatibleDepTools(t *testing.T) {
 					}
 				}`)
 			requirejson.Parse(t, stdout).
-				Query(`.[] | select(.id == "incompatible_vendor:avr")`).
+				Query(`.platforms | .[] | select(.id == "incompatible_vendor:avr")`).
 				MustContain(`{"latest_version": "", "releases": { "1.0.0": {"compatible": false}}}`)
 		}
 		// In text mode, core search shows `n/a` for core that doesn't have any compatible version
diff --git a/internal/integrationtest/lib/lib_test.go b/internal/integrationtest/lib/lib_test.go
index b00948a0c4c..868f3f2097c 100644
--- a/internal/integrationtest/lib/lib_test.go
+++ b/internal/integrationtest/lib/lib_test.go
@@ -57,22 +57,22 @@ func TestLibUpgradeCommand(t *testing.T) {
 	require.NoError(t, err)
 	stdOut, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Contains(t, stdOut, `[ { "library":{ "name":"Servo", "version": "1.1.6" } } ]`)
+	requirejson.Contains(t, stdOut, `{"installed_libraries": [ { "library":{ "name":"Servo", "version": "1.1.6" } } ]}`)
 
 	_, _, err = cli.Run("lib", "upgrade", "Servo")
 	require.NoError(t, err)
 	stdOut, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
 	jsonOut := requirejson.Parse(t, stdOut)
-	jsonOut.MustNotContain(`[ { "library":{ "name":"Servo", "version": "1.1.6" } } ]`)
-	servoVersion := jsonOut.Query(`.[].library | select(.name=="Servo") | .version`).String()
+	jsonOut.MustNotContain(`{"installed_libraries": [{"library":{ "name":"Servo", "version": "1.1.6" }}]}`)
+	servoVersion := jsonOut.Query(`.installed_libraries.[].library | select(.name=="Servo") | .version`).String()
 
 	// Upgrade of already up-to-date library
 	_, _, err = cli.Run("lib", "upgrade", "Servo")
 	require.NoError(t, err)
 	stdOut, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdOut, `.[].library | select(.name=="Servo") | .version`, servoVersion)
+	requirejson.Query(t, stdOut, `.installed_libraries.[].library | select(.name=="Servo") | .version`, servoVersion)
 }
 
 func TestLibCommandsUsingNameInsteadOfDirName(t *testing.T) {
@@ -107,7 +107,7 @@ func TestLibInstallMultipleSameLibrary(t *testing.T) {
 	require.NoError(t, err)
 	// Count how many libraries with the name "Arduino SigFox for MKRFox1200" are installed
 	requirejson.Parse(t, jsonOut).
-		Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
+		Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
 		LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'")
 
 	// Check that 'lib upgrade' didn't create a double install
@@ -122,7 +122,7 @@ func TestLibInstallMultipleSameLibrary(t *testing.T) {
 	require.NoError(t, err)
 	// Count how many libraries with the name "Arduino SigFox for MKRFox1200" are installed
 	requirejson.Parse(t, jsonOut).
-		Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
+		Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
 		LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'")
 }
 
@@ -140,7 +140,7 @@ func TestDuplicateLibInstallDetection(t *testing.T) {
 	require.NoError(t, err)
 	jsonOut, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, jsonOut, 2, "Duplicate library install is not detected by the CLI")
+	requirejson.Query(t, jsonOut, `.installed_libraries | length`, `2`, "Duplicate library install is not detected by the CLI")
 
 	_, stdErr, err := cli.Run("lib", "install", "ArduinoOTA")
 	require.Error(t, err)
@@ -170,7 +170,7 @@ func TestDuplicateLibInstallFromGitDetection(t *testing.T) {
 	require.NoError(t, err)
 	// Count how many libraries with the name "Arduino SigFox for MKRFox1200" are installed
 	requirejson.Parse(t, jsonOut).
-		Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
+		Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
 		LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'")
 
 	// Try to make a double install by upgrade
@@ -181,7 +181,7 @@ func TestDuplicateLibInstallFromGitDetection(t *testing.T) {
 	jsonOut, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
 	requirejson.Parse(t, jsonOut).
-		Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
+		Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
 		LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'")
 
 	// Try to make a double install by zip-installing
@@ -206,7 +206,7 @@ func TestDuplicateLibInstallFromGitDetection(t *testing.T) {
 	jsonOut, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
 	requirejson.Parse(t, jsonOut).
-		Query(`[.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
+		Query(`[.installed_libraries.[].library.name | select(. == "Arduino SigFox for MKRFox1200")]`).
 		LengthMustEqualTo(1, "Found multiple installations of Arduino SigFox for MKRFox1200'")
 }
 
@@ -332,7 +332,7 @@ func TestList(t *testing.T) {
 	stdout, stderr, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
 	require.Empty(t, stderr)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 
 	// Install something we can list at a version older than latest
 	_, _, err = cli.Run("lib", "install", "ArduinoJson@6.11.0")
@@ -358,9 +358,9 @@ func TestList(t *testing.T) {
 	stdout, stderr, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
 	require.Empty(t, stderr)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
 	// be sure data contains the available version
-	requirejson.Query(t, stdout, `.[0] | .release | .version != ""`, "true")
+	requirejson.Query(t, stdout, `.installed_libraries.[0] | .release | .version != ""`, "true")
 
 	// Install something we can list without provides_includes field given in library.properties
 	_, _, err = cli.Run("lib", "install", "Arduino_APDS9960@1.0.3")
@@ -369,9 +369,9 @@ func TestList(t *testing.T) {
 	stdout, stderr, err = cli.Run("lib", "list", "Arduino_APDS9960", "--format", "json")
 	require.NoError(t, err)
 	require.Empty(t, stderr)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
 	// be sure data contains the correct provides_includes field
-	requirejson.Query(t, stdout, ".[0] | .library | .provides_includes | .[0]", `"Arduino_APDS9960.h"`)
+	requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .provides_includes | .[0]", `"Arduino_APDS9960.h"`)
 }
 
 func TestListExitCode(t *testing.T) {
@@ -451,14 +451,14 @@ func TestListWithFqbn(t *testing.T) {
 	stdout, stderr, err = cli.Run("lib", "list", "-b", "arduino:avr:uno", "--format", "json")
 	require.NoError(t, err)
 	require.Empty(t, stderr)
-	requirejson.Len(t, stdout, 6)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `6`)
 
 	// Verifies library is compatible
-	requirejson.Query(t, stdout, `sort_by(.library | .name) | .[0] | .library | .name`, `"ArduinoJson"`)
-	requirejson.Query(t, stdout, `sort_by(.library | .name) | .[0] | .library | .compatible_with | ."arduino:avr:uno"`, `true`)
+	requirejson.Query(t, stdout, `.installed_libraries | sort_by(.library | .name) | .[0] | .library | .name`, `"ArduinoJson"`)
+	requirejson.Query(t, stdout, `.installed_libraries | sort_by(.library | .name) | .[0] | .library | .compatible_with | ."arduino:avr:uno"`, `true`)
 
 	// Verifies bundled libs are shown if -b flag is used
-	requirejson.Parse(t, stdout).Query(`.[] | .library | select(.container_platform=="arduino:avr@1.8.6")`).MustNotBeEmpty()
+	requirejson.Parse(t, stdout).Query(`.installed_libraries.[] | .library | select(.container_platform=="arduino:avr@1.8.6")`).MustNotBeEmpty()
 }
 
 func TestListProvidesIncludesFallback(t *testing.T) {
@@ -481,9 +481,9 @@ func TestListProvidesIncludesFallback(t *testing.T) {
 	require.NoError(t, err)
 	require.Empty(t, stderr)
 
-	requirejson.Len(t, stdout, 6)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `6`)
 
-	requirejson.Query(t, stdout, "[.[] | .library | { (.name): .provides_includes }] | add",
+	requirejson.Query(t, stdout, "[.installed_libraries.[] | .library | { (.name): .provides_includes }] | add",
 		`{
 			"SPI": [
 		  		"SPI.h"
@@ -548,7 +548,7 @@ func TestInstall(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Parse(t, stdout).Query(`.[] | select(.library.name == "ILI9341_t3") | .library.version`).MustEqual(`"1.0"`)
+	requirejson.Parse(t, stdout).Query(`.installed_libraries.[] | select(.library.name == "ILI9341_t3") | .library.version`).MustEqual(`"1.0"`)
 	_, _, err = cli.Run("lib", "install", "ILI9341_t3@1")
 	require.NoError(t, err)
 	_, _, err = cli.Run("lib", "install", "ILI9341_t3@1.0.0")
@@ -565,7 +565,7 @@ func TestInstallLibraryWithDependencies(t *testing.T) {
 	// Verifies libraries are not installed
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 
 	// Install library
 	_, _, err = cli.Run("lib", "install", "MD_Parola@3.5.5")
@@ -574,7 +574,7 @@ func TestInstallLibraryWithDependencies(t *testing.T) {
 	// Verifies library's dependencies are correctly installed
 	stdout, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, `[ .[] | .library | .name ] | sort`, `["MD_MAX72XX","MD_Parola"]`)
+	requirejson.Query(t, stdout, `[.installed_libraries.[] | .library | .name ] | sort`, `["MD_MAX72XX","MD_Parola"]`)
 
 	// Try upgrading with --no-overwrite (should fail) and without --no-overwrite (should succeed)
 	_, _, err = cli.Run("lib", "install", "MD_Parola@3.6.1", "--no-overwrite")
@@ -603,7 +603,7 @@ func TestInstallNoDeps(t *testing.T) {
 	// Verifies libraries are not installed
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 
 	// Install library skipping dependencies installation
 	_, _, err = cli.Run("lib", "install", "MD_Parola@3.5.5", "--no-deps")
@@ -612,7 +612,7 @@ func TestInstallNoDeps(t *testing.T) {
 	// Verifies library's dependencies are not installed
 	stdout, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Query(t, stdout, `.[] | .library | .name`, `"MD_Parola"`)
+	requirejson.Query(t, stdout, `.installed_libraries.[] | .library | .name`, `"MD_Parola"`)
 }
 
 func TestInstallWithGitUrl(t *testing.T) {
@@ -712,7 +712,7 @@ func TestUninstallSpaces(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 0)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 }
 
 func TestLibOpsCaseInsensitive(t *testing.T) {
@@ -740,7 +740,7 @@ func TestLibOpsCaseInsensitive(t *testing.T) {
 	require.NoError(t, err)
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 0)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 }
 
 func TestSearch(t *testing.T) {
@@ -847,7 +847,7 @@ func TestLibListWithUpdatableFlag(t *testing.T) {
 	stdout, stderr, err = cli.Run("lib", "list", "--updatable", "--format", "json")
 	require.NoError(t, err)
 	require.Empty(t, stderr)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 
 	// Install outdated library
 	_, _, err = cli.Run("lib", "install", "ArduinoJson@6.11.0")
@@ -877,11 +877,11 @@ func TestLibListWithUpdatableFlag(t *testing.T) {
 	stdout, stderr, err = cli.Run("lib", "list", "--updatable", "--format", "json")
 	require.NoError(t, err)
 	require.Empty(t, stderr)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
 	// be sure data contains the available version
-	requirejson.Query(t, stdout, `.[0] | .library | .version`, `"6.11.0"`)
-	requirejson.Query(t, stdout, `.[0] | .release | .version != "6.11.0"`, `true`)
-	requirejson.Query(t, stdout, `.[0] | .release | .version != ""`, `true`)
+	requirejson.Query(t, stdout, `.installed_libraries.[0] | .library | .version`, `"6.11.0"`)
+	requirejson.Query(t, stdout, `.installed_libraries.[0] | .release | .version != "6.11.0"`, `true`)
+	requirejson.Query(t, stdout, `.installed_libraries.[0] | .release | .version != ""`, `true`)
 }
 
 func TestInstallWithGitUrlFromCurrentDirectory(t *testing.T) {
@@ -1041,8 +1041,8 @@ func TestLibExamples(t *testing.T) {
 
 	stdout, _, err := cli.Run("lib", "examples", "Arduino_JSON", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	examples := requirejson.Parse(t, stdout).Query(".[0] | .examples").String()
+	requirejson.Query(t, stdout, `.examples | length`, `1`)
+	examples := requirejson.Parse(t, stdout).Query(".examples.[0] | .examples").String()
 	examples = strings.ReplaceAll(examples, "\\\\", "\\")
 	require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Arduino_JSON", "examples", "JSONArray").String())
 	require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Arduino_JSON", "examples", "JSONKitchenSink").String())
@@ -1061,8 +1061,8 @@ func TestLibExamplesWithPdeFile(t *testing.T) {
 
 	stdout, _, err := cli.Run("lib", "examples", "Encoder", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	examples := requirejson.Parse(t, stdout).Query(".[0] | .examples").String()
+	requirejson.Query(t, stdout, `.examples | length`, `1`)
+	examples := requirejson.Parse(t, stdout).Query(".examples.[0] | .examples").String()
 	examples = strings.ReplaceAll(examples, "\\\\", "\\")
 	require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Encoder", "examples", "Basic").String())
 	require.Contains(t, examples, cli.SketchbookDir().Join("libraries", "Encoder", "examples", "NoInterrupts").String())
@@ -1082,10 +1082,10 @@ func TestLibExamplesWithCaseMismatch(t *testing.T) {
 
 	stdout, _, err := cli.Run("lib", "examples", "WiFiManager", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[0] | .examples | length", "14")
+	requirejson.Query(t, stdout, `.examples | length`, `1`)
+	requirejson.Query(t, stdout, ".examples.[0] | .examples | length", "14")
 
-	examples := requirejson.Parse(t, stdout).Query(".[0] | .examples").String()
+	examples := requirejson.Parse(t, stdout).Query(".examples.[0] | .examples").String()
 	examples = strings.ReplaceAll(examples, "\\\\", "\\")
 	examplesPath := cli.SketchbookDir().Join("libraries", "WiFiManager", "examples")
 	// Verifies sketches with correct casing are listed
@@ -1122,8 +1122,8 @@ func TestLibCommandsWithLibraryHavingInvalidVersion(t *testing.T) {
 	// Verifies library is correctly returned
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[0] | .library | .version", `"0.16.1"`)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
+	requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .version", `"0.16.1"`)
 
 	// Changes the version of the currently installed library so that it's
 	// invalid
@@ -1133,8 +1133,8 @@ func TestLibCommandsWithLibraryHavingInvalidVersion(t *testing.T) {
 	// Verifies version is now empty
 	stdout, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[0] | .library | .version", "null")
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
+	requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .version", "null")
 
 	// Upgrade library
 	_, _, err = cli.Run("lib", "upgrade", "WiFi101")
@@ -1143,8 +1143,8 @@ func TestLibCommandsWithLibraryHavingInvalidVersion(t *testing.T) {
 	// Verifies library has been updated
 	stdout, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
-	requirejson.Query(t, stdout, ".[0] | .library | .version != \"\"", "true")
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
+	requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .version != \"\"", "true")
 }
 
 func TestInstallZipLibWithMacosMetadata(t *testing.T) {
@@ -1301,10 +1301,10 @@ func TestUpgradeDoesNotTryToUpgradeBundledCoreLibrariesInSketchbook(t *testing.T
 
 	stdout, _, err := cli.Run("lib", "list", "--all", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 2)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `2`)
 	// Verify both libraries have the same name
-	requirejson.Query(t, stdout, ".[0] | .library | .name", `"USBHost"`)
-	requirejson.Query(t, stdout, ".[1] | .library | .name", `"USBHost"`)
+	requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .name", `"USBHost"`)
+	requirejson.Query(t, stdout, ".installed_libraries.[1] | .library | .name", `"USBHost"`)
 
 	stdout, _, err = cli.Run("lib", "upgrade")
 	require.NoError(t, err)
@@ -1333,10 +1333,10 @@ func TestUpgradeDoesNotTryToUpgradeBundledCoreLibraries(t *testing.T) {
 
 	stdout, _, err := cli.Run("lib", "list", "--all", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 2)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `2`)
 	// Verify both libraries have the same name
-	requirejson.Query(t, stdout, ".[0] | .library | .name", `"USBHost"`)
-	requirejson.Query(t, stdout, ".[1] | .library | .name", `"USBHost"`)
+	requirejson.Query(t, stdout, ".installed_libraries.[0] | .library | .name", `"USBHost"`)
+	requirejson.Query(t, stdout, ".installed_libraries.[1] | .library | .name", `"USBHost"`)
 
 	stdout, _, err = cli.Run("lib", "upgrade")
 	require.NoError(t, err)
@@ -1581,8 +1581,8 @@ func TestLibBundlesWhenLibWithTheSameNameIsInstalledGlobally(t *testing.T) {
 		stdout, _, err := cli.Run("lib", "list", "--all", "--fqbn", "arduino:samd:mkrzero", "USBHost", "--format", "json")
 		require.NoError(t, err)
 		j := requirejson.Parse(t, stdout)
-		j.Query(`.[0].library.name`).MustEqual(`"USBHost"`)
-		j.Query(`.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`)
+		j.Query(`.installed_libraries.[0].library.name`).MustEqual(`"USBHost"`)
+		j.Query(`.installed_libraries.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`)
 	}
 	_, _, err = cli.Run("lib", "install", "USBHost@1.0.5")
 	require.NoError(t, err)
@@ -1591,8 +1591,8 @@ func TestLibBundlesWhenLibWithTheSameNameIsInstalledGlobally(t *testing.T) {
 		stdout, _, err := cli.Run("lib", "list", "--all", "--fqbn", "arduino:samd:mkrzero", "USBHost", "--format", "json")
 		require.NoError(t, err)
 		j := requirejson.Parse(t, stdout)
-		j.Query(`.[0].library.name`).MustEqual(`"USBHost"`)
-		j.Query(`.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`)
+		j.Query(`.installed_libraries.[0].library.name`).MustEqual(`"USBHost"`)
+		j.Query(`.installed_libraries.[0].library.compatible_with."arduino:samd:mkrzero"`).MustEqual(`true`)
 	}
 
 	// See: https://github.com/arduino/arduino-cli/issues/1656
@@ -1605,8 +1605,8 @@ func TestLibBundlesWhenLibWithTheSameNameIsInstalledGlobally(t *testing.T) {
 		require.NoError(t, err)
 		stdout, _, err := cli.Run("lib", "examples", "--fqbn", "esp8266:esp8266:generic", "ArduinoOTA", "--format", "json")
 		require.NoError(t, err)
-		requirejson.Parse(t, stdout).Query(`.[].library.examples[0]`).MustContain(`"BasicOTA"`)
-		requirejson.Parse(t, stdout).Query(`.[].library.examples[1]`).MustContain(`"OTALeds"`)
+		requirejson.Parse(t, stdout).Query(`.examples.[].library.examples[0]`).MustContain(`"BasicOTA"`)
+		requirejson.Parse(t, stdout).Query(`.examples.[].library.examples[1]`).MustContain(`"OTALeds"`)
 	}
 }
 
@@ -1624,11 +1624,11 @@ func TestLibListDoesNotIncludeEmptyLibraries(t *testing.T) {
 	// Check that the output of lib list and lib examples is empty
 	stdout, _, err := cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `0`)
 
 	stdout, _, err = cli.Run("lib", "examples", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Empty(t, stdout)
+	requirejson.Query(t, stdout, `.examples | length`, `0`)
 
 	// Create a library with a header
 	libWithHeader := cli.SketchbookDir().Join("libraries", "libWithHeader")
@@ -1640,11 +1640,11 @@ func TestLibListDoesNotIncludeEmptyLibraries(t *testing.T) {
 	// Check that the output of lib list and lib examples contains the library
 	stdout, _, err = cli.Run("lib", "list", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.installed_libraries | length`, `1`)
 
 	stdout, _, err = cli.Run("lib", "examples", "--format", "json")
 	require.NoError(t, err)
-	requirejson.Len(t, stdout, 1)
+	requirejson.Query(t, stdout, `.examples | length`, `1`)
 }
 
 func TestDependencyResolver(t *testing.T) {