You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2020/12/18 10:46:08 UTC

[skywalking-cli] 01/02: chore: reorganize the project layout

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch chore/project-layout
in repository https://gitbox.apache.org/repos/asf/skywalking-cli.git

commit 2ed3443179b3995f44d5588c66716fe24b6f0341
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Fri Dec 18 18:42:19 2020 +0800

    chore: reorganize the project layout
---
 CONTRIBUTING.md                                    | 12 +++---
 Makefile                                           | 10 ++---
 README.md                                          |  4 +-
 {graphql/schema => api}/schema.go                  |  2 +-
 assets/assets.go                                   |  2 +-
 cmd/{ => swctl}/main.go                            | 22 +++++-----
 {example => examples}/global.yml                   |  0
 go.mod                                             |  3 +-
 go.sum                                             | 33 ++++++++++++++-
 gqlgen.yml                                         |  6 +--
 .../commands}/dashboard/dashboard.go               |  2 +-
 .../commands}/dashboard/global/global.go           | 17 ++++----
 .../commands}/dashboard/global/metrics.go          | 17 ++++----
 .../commands}/endpoint/endpoint.go                 |  0
 {commands => internal/commands}/endpoint/list.go   |  6 +--
 .../commands/healthcheck/healthcheck.go            | 10 ++---
 .../commands}/instance/instance.go                 |  4 +-
 {commands => internal/commands}/instance/list.go   | 16 ++++----
 {commands => internal/commands}/instance/search.go | 18 ++++----
 .../commands}/interceptor/duration.go              | 14 +++----
 .../commands}/interceptor/duration_test.go         | 13 +++---
 .../commands}/interceptor/entity.go                | 23 +++++------
 .../commands}/interceptor/entity_test.go           | 35 ++++++++--------
 .../commands}/interceptor/interceptor.go           |  0
 .../commands}/interceptor/timezone.go              |  4 +-
 .../commands}/metrics/aggregation/topn.go          | 25 ++++++-----
 .../commands}/metrics/linear/linear-metrics.go     | 20 ++++-----
 .../metrics/linear/multiple-linear-metrics.go      | 22 +++++-----
 .../commands}/metrics/list/list-metrics.go         |  6 +--
 {commands => internal/commands}/metrics/metrics.go | 10 ++---
 .../commands}/metrics/single/single-metrics.go     | 19 ++++-----
 .../metrics/thermodynamic/thermodynamic.go         | 19 ++++-----
 {commands => internal/commands}/service/list.go    | 20 ++++-----
 {commands => internal/commands}/service/service.go |  0
 {commands => internal/commands}/trace/list.go      | 28 ++++++-------
 {commands => internal/commands}/trace/trace.go     |  6 +--
 {commands => internal}/flags/duration.go           | 12 +++---
 {commands => internal}/flags/entity.go             |  0
 {commands => internal}/flags/flags.go              |  0
 {commands => internal}/flags/instance.go           |  0
 {commands => internal}/flags/metrics.go            | 11 +++--
 {commands => internal}/flags/search.go             |  0
 {logger => internal/logger}/log.go                 |  0
 {commands => internal}/model/order.go              | 13 +++---
 {commands => internal}/model/scope.go              | 13 +++---
 {commands => internal}/model/step.go               | 13 +++---
 {display => pkg/display}/display.go                | 10 ++---
 .../display}/displayable/displayable.go            |  6 ++-
 {display => pkg/display}/graph/dashboard/global.go | 24 +++++------
 {display => pkg/display}/graph/gauge/gauge.go      | 14 +++----
 {display => pkg/display}/graph/graph.go            | 24 +++++------
 {display => pkg/display}/graph/heatmap/heatmap.go  | 16 ++++----
 {display => pkg/display}/graph/linear/linear.go    |  0
 {display => pkg/display}/graph/tree/adapter.go     | 28 ++++++-------
 {display => pkg/display}/graph/tree/list.go        | 22 +++++-----
 {display => pkg/display}/graph/tree/tree.go        |  2 +-
 {display => pkg/display}/json/json.go              |  2 +-
 {display => pkg/display}/json/json_test.go         | 13 +++---
 {display => pkg/display}/table/table.go            |  4 +-
 {display => pkg/display}/table/table_test.go       | 13 +++---
 {display => pkg/display}/yaml/yaml.go              |  2 +-
 {display => pkg/display}/yaml/yaml_test.go         | 13 +++---
 {graphql => pkg/graphql}/client/client.go          |  2 +-
 {graphql => pkg/graphql}/common/common.go          | 10 ++---
 {graphql => pkg/graphql}/dashboard/global.go       | 48 +++++++++++-----------
 {graphql => pkg/graphql}/metadata/metadata.go      | 26 ++++++------
 {graphql => pkg/graphql}/metrics/metrics.go        | 27 ++++++------
 {graphql => pkg/graphql}/trace/trace.go            | 12 +++---
 {graphql => pkg/graphql}/utils/adapter.go          | 12 +++---
 {graphql => pkg/graphql}/utils/adapter_test.go     | 17 ++++----
 {graphql => pkg/graphql}/utils/constants.go        | 23 +++++------
 grpc/health.go => pkg/healthcheck/grpc.go          |  4 +-
 {lib => pkg}/heatmap/axes/axes.go                  |  0
 {lib => pkg}/heatmap/axes/label.go                 |  2 +-
 {lib => pkg}/heatmap/heatmap.go                    |  2 +-
 {lib => pkg}/heatmap/options.go                    |  0
 {util => pkg/util}/io.go                           |  2 +-
 {util => pkg/util}/lang.go                         |  0
 {util => pkg/util}/math.go                         |  0
 {hack => scripts}/boilerplate.go.txt               |  0
 {hack => scripts}/build-header.sh                  |  0
 {test => scripts}/test_commands.sh                 |  0
 82 files changed, 452 insertions(+), 438 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9688f0d..6a9d939 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -47,17 +47,17 @@ make
 ```
 
 ## Writing a new command
-All commands files locate in directory [`commands`](commands), and an individual directory for each second-level command,
-an individual `go` file for each third-level command, for example, there is a directory [`service`](commands/service) for command `swctl service`, 
-and a [`list.go`](commands/service/list.go) file for `swctl service list` command.
+All commands files locate in directory [`commands`](internal/commands), and an individual directory for each second-level command,
+an individual `go` file for each third-level command, for example, there is a directory [`service`](internal/commands/service) for command `swctl service`, 
+and a [`list.go`](internal/commands/service/list.go) file for `swctl service list` command.
 
 Determine what entity your command will operate on, and put your command `go` file into that directory, or create one if it doesn't exist,
 for example, if you want to create a command to `list` all the `instance`s of a service, create a directory `commands/instance`,
 and a `go` file `commands/instance/list.go`.
 
 ## Reusing common options
-There're some [common options](#common-options) that can be shared by multiple commands, check [`commands/flags`](commands/flags)
-to get all the shared options, and reuse them when possible, an example shares the options is [`commands/service/list.go`](commands/service/list.go#L35)
+There're some [common options](#common-options) that can be shared by multiple commands, check [`commands/flags`](internal/flags)
+to get all the shared options, and reuse them when possible, an example shares the options is [`commands/service/list.go`](internal/commands/service/list.go#L35)
 
 ## Linting your codes
 We have some rules for the code style and please lint your codes locally before opening a pull request
@@ -99,4 +99,4 @@ This section guides committers and PMC members to release SkyWalking CLI in Apac
 - [Send internal announcement](docs/How-to-release.md#make-the-internal-announcements)
 - [Wait at least 48 hours for test responses](docs/How-to-release.md#wait-at-least-48-hours-for-test-responses)
 - [Call for vote](docs/How-to-release.md#call-a-vote-in-dev)
-- [Publish release](docs/How-to-release.md#publish-release)
\ No newline at end of file
+- [Publish release](docs/How-to-release.md#publish-release)
diff --git a/Makefile b/Makefile
index e8017d5..2f70003 100644
--- a/Makefile
+++ b/Makefile
@@ -63,14 +63,14 @@ assets: tools
 	cd assets \
 		&& $(GO_BINDATA) --nocompress --nometadata --pkg assets --ignore '.*\.go' \
 			-o "assets.gen.go" ./... \
-		&& ../hack/build-header.sh assets.gen.go \
+		&& ../scripts/build-header.sh assets.gen.go \
 		&& cd ..
 
 gqlgen: tools
 	echo 'scalar Long' > query-protocol/schema.graphqls
 	$(GQL_GEN) generate
 	-rm -rf generated.go
-	-hack/build-header.sh graphql/schema/schema.go
+	-scripts/build-header.sh api/schema.go
 	-rm query-protocol/schema.graphqls
 	
 codegen: clean assets gqlgen
@@ -79,7 +79,7 @@ codegen: clean assets gqlgen
 .PHONY: $(PLATFORMS)
 $(PLATFORMS):
 	mkdir -p $(OUT_DIR)
-	GOOS=$(os) GOARCH=$(ARCH) $(GO_BUILD) $(GO_BUILD_FLAGS) -ldflags "$(GO_BUILD_LDFLAGS)" -o $(OUT_DIR)/$(BINARY)-$(VERSION)-$(os)-$(ARCH) cmd/main.go
+	GOOS=$(os) GOARCH=$(ARCH) $(GO_BUILD) $(GO_BUILD_FLAGS) -ldflags "$(GO_BUILD_LDFLAGS)" -o $(OUT_DIR)/$(BINARY)-$(VERSION)-$(os)-$(ARCH) cmd/swctl/main.go
 
 .PHONY: lint
 lint: codegen tools
@@ -163,6 +163,6 @@ test-commands:
 		docker container prune -f; \
 		docker run --name oap -p 12800:12800 -p 11800:11800 -d -e SW_HEALTH_CHECKER=default -e SW_TELEMETRY=prometheus apache/skywalking-oap-server:latest; \
 	fi
-	./test/test_commands.sh
+	./scripts/test_commands.sh
 	@docker container stop oap
-	@docker container prune -f
\ No newline at end of file
+	@docker container prune -f
diff --git a/README.md b/README.md
index 0c28b09..5a8a915 100644
--- a/README.md
+++ b/README.md
@@ -322,7 +322,7 @@ Ascii Graph, like coloring in terminal, so please use `json`  or `yaml` instead.
 | `--start` | See [Common options](#common-options) | See [Common options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common options](#common-options) |
 
-You can imitate the content of [the default template file](example/global.yml) to customize the dashboard.
+You can imitate the content of [the default template file](examples/global.yml) to customize the dashboard.
 
 </details>
 
@@ -341,7 +341,7 @@ You can imitate the content of [the default template file](example/global.yml) t
 | `--start` | See [Common options](#common-options) | See [Common options](#common-options) |
 | `--end` | See [Common options](#common-options) | See [Common options](#common-options) |
 
-You can imitate the content of [the default template file](example/global.yml) to customize the dashboard.
+You can imitate the content of [the default template file](examples/global.yml) to customize the dashboard.
 
 </details>
 
diff --git a/graphql/schema/schema.go b/api/schema.go
similarity index 99%
rename from graphql/schema/schema.go
rename to api/schema.go
index 8c0b78c..6b45fac 100644
--- a/graphql/schema/schema.go
+++ b/api/schema.go
@@ -17,7 +17,7 @@
 
 // Code generated by github.com/99designs/gqlgen, DO NOT EDIT.
 
-package schema
+package api
 
 import (
 	"fmt"
diff --git a/assets/assets.go b/assets/assets.go
index 8983ff9..665e0c3 100644
--- a/assets/assets.go
+++ b/assets/assets.go
@@ -18,7 +18,7 @@
 package assets
 
 import (
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 // Read reads all content from a file under assets, which is packed in to the binary
diff --git a/cmd/main.go b/cmd/swctl/main.go
similarity index 85%
rename from cmd/main.go
rename to cmd/swctl/main.go
index 189bd5a..46c7acb 100644
--- a/cmd/main.go
+++ b/cmd/swctl/main.go
@@ -21,24 +21,24 @@ import (
 	"io/ioutil"
 	"os"
 
-	"github.com/apache/skywalking-cli/commands/common"
-	"github.com/apache/skywalking-cli/commands/trace"
+	"github.com/apache/skywalking-cli/internal/commands/healthcheck"
+	"github.com/apache/skywalking-cli/internal/commands/trace"
 
-	"github.com/apache/skywalking-cli/commands/dashboard"
+	"github.com/apache/skywalking-cli/internal/commands/dashboard"
 
-	"github.com/apache/skywalking-cli/commands/metrics"
+	"github.com/apache/skywalking-cli/internal/commands/metrics"
 
-	"github.com/apache/skywalking-cli/commands/endpoint"
-	"github.com/apache/skywalking-cli/commands/instance"
+	"github.com/apache/skywalking-cli/internal/commands/endpoint"
+	"github.com/apache/skywalking-cli/internal/commands/instance"
 
 	"github.com/sirupsen/logrus"
 	"github.com/urfave/cli"
 	"github.com/urfave/cli/altsrc"
 
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/service"
-	"github.com/apache/skywalking-cli/logger"
-	"github.com/apache/skywalking-cli/util"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/commands/service"
+	"github.com/apache/skywalking-cli/internal/logger"
+	"github.com/apache/skywalking-cli/pkg/util"
 )
 
 var log *logrus.Logger
@@ -108,7 +108,7 @@ func main() {
 		service.Command,
 		metrics.Command,
 		trace.Command,
-		common.Command,
+		healthcheck.Command,
 		dashboard.Command,
 	}
 
diff --git a/example/global.yml b/examples/global.yml
similarity index 100%
rename from example/global.yml
rename to examples/global.yml
diff --git a/go.mod b/go.mod
index caf1f12..4dffc4f 100644
--- a/go.mod
+++ b/go.mod
@@ -20,7 +20,8 @@ require (
 	github.com/urfave/cli v1.22.1
 	golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect
 	golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect
-	google.golang.org/grpc v1.24.0
+	google.golang.org/grpc v1.27.0
+	google.golang.org/protobuf v1.25.0 // indirect
 	gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
 	gopkg.in/yaml.v2 v2.4.0
 )
diff --git a/go.sum b/go.sum
index e44a9b5..1f05b71 100644
--- a/go.sum
+++ b/go.sum
@@ -25,6 +25,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
@@ -40,6 +41,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -65,10 +68,21 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@@ -177,6 +191,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
@@ -326,6 +341,8 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -346,11 +363,23 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98
 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4=
 google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
-google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/gqlgen.yml b/gqlgen.yml
index 81cf26e..c613e5e 100644
--- a/gqlgen.yml
+++ b/gqlgen.yml
@@ -20,9 +20,9 @@ schema:
 skip_validation: true
 
 model:
-  filename: graphql/schema/schema.go
-  package: schema
+  filename: api/schema.go
+  package: api
 
 models:
   Long:
-    model: github.com/99designs/gqlgen/graphql.Int64
\ No newline at end of file
+    model: github.com/99designs/gqlgen/graphql.Int64
diff --git a/commands/dashboard/dashboard.go b/internal/commands/dashboard/dashboard.go
similarity index 93%
rename from commands/dashboard/dashboard.go
rename to internal/commands/dashboard/dashboard.go
index cb1c7c7..5d270da 100644
--- a/commands/dashboard/dashboard.go
+++ b/internal/commands/dashboard/dashboard.go
@@ -20,7 +20,7 @@ package dashboard
 import (
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/commands/dashboard/global"
+	"github.com/apache/skywalking-cli/internal/commands/dashboard/global"
 )
 
 var Command = cli.Command{
diff --git a/commands/dashboard/global/global.go b/internal/commands/dashboard/global/global.go
similarity index 80%
rename from commands/dashboard/global/global.go
rename to internal/commands/dashboard/global/global.go
index 577abde..b38fe20 100644
--- a/commands/dashboard/global/global.go
+++ b/internal/commands/dashboard/global/global.go
@@ -18,17 +18,16 @@
 package global
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/display/displayable"
-
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/graphql/dashboard"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
 )
 
 var GlobalCommand = cli.Command{
@@ -62,7 +61,7 @@ var GlobalCommand = cli.Command{
 		start := ctx.String("start")
 		step := ctx.Generic("step")
 
-		globalData := dashboard.Global(ctx, schema.Duration{
+		globalData := dashboard.Global(ctx, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
diff --git a/commands/dashboard/global/metrics.go b/internal/commands/dashboard/global/metrics.go
similarity index 78%
rename from commands/dashboard/global/metrics.go
rename to internal/commands/dashboard/global/metrics.go
index d5ffa40..87723a0 100644
--- a/commands/dashboard/global/metrics.go
+++ b/internal/commands/dashboard/global/metrics.go
@@ -18,14 +18,13 @@
 package global
 
 import (
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/dashboard"
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/api"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
 	"github.com/urfave/cli"
 )
 
@@ -52,7 +51,7 @@ var Metrics = cli.Command{
 		start := ctx.String("start")
 		step := ctx.Generic("step")
 
-		globalMetrics := dashboard.Metrics(ctx, schema.Duration{
+		globalMetrics := dashboard.Metrics(ctx, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
diff --git a/commands/endpoint/endpoint.go b/internal/commands/endpoint/endpoint.go
similarity index 100%
rename from commands/endpoint/endpoint.go
rename to internal/commands/endpoint/endpoint.go
diff --git a/commands/endpoint/list.go b/internal/commands/endpoint/list.go
similarity index 91%
rename from commands/endpoint/list.go
rename to internal/commands/endpoint/list.go
index 3c6767b..a1e66e0 100644
--- a/commands/endpoint/list.go
+++ b/internal/commands/endpoint/list.go
@@ -20,11 +20,11 @@ package endpoint
 import (
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/graphql/metadata"
+	"github.com/apache/skywalking-cli/pkg/graphql/metadata"
 
-	"github.com/apache/skywalking-cli/display"
+	"github.com/apache/skywalking-cli/pkg/display"
 )
 
 var ListCommand = cli.Command{
diff --git a/commands/common/common.go b/internal/commands/healthcheck/healthcheck.go
similarity index 87%
rename from commands/common/common.go
rename to internal/commands/healthcheck/healthcheck.go
index 7457569..8827557 100644
--- a/commands/common/common.go
+++ b/internal/commands/healthcheck/healthcheck.go
@@ -15,14 +15,14 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package common
+package healthcheck
 
 import (
+	"github.com/apache/skywalking-cli/pkg/healthcheck"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/graphql/common"
-	"github.com/apache/skywalking-cli/grpc"
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
+	"github.com/apache/skywalking-cli/pkg/graphql/common"
 )
 
 var Command = cli.Command{
@@ -56,7 +56,7 @@ var Command = cli.Command{
 		if !ctx.BoolT("grpc") {
 			return nil
 		}
-		retCode := grpc.HealthCheck(ctx.String("grpcAddr"), ctx.Bool("grpcTLS"))
+		retCode := healthcheck.HealthCheck(ctx.String("grpcAddr"), ctx.Bool("grpcTLS"))
 		if retCode != 0 {
 			return cli.NewExitError("gRPC: failed to check health", retCode)
 		}
diff --git a/commands/instance/instance.go b/internal/commands/instance/instance.go
similarity index 93%
rename from commands/instance/instance.go
rename to internal/commands/instance/instance.go
index 29c86a7..9277086 100644
--- a/commands/instance/instance.go
+++ b/internal/commands/instance/instance.go
@@ -20,9 +20,9 @@ package instance
 import (
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/graphql/metadata"
+	"github.com/apache/skywalking-cli/pkg/graphql/metadata"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 var Command = cli.Command{
diff --git a/commands/instance/list.go b/internal/commands/instance/list.go
similarity index 78%
rename from commands/instance/list.go
rename to internal/commands/instance/list.go
index 1cfcd88..800a7b1 100644
--- a/commands/instance/list.go
+++ b/internal/commands/instance/list.go
@@ -18,17 +18,17 @@
 package instance
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/graphql/metadata"
+	"github.com/apache/skywalking-cli/pkg/graphql/metadata"
 
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
 )
 
 var ListCommand = cli.Command{
@@ -47,7 +47,7 @@ var ListCommand = cli.Command{
 		start := ctx.String("start")
 		step := ctx.Generic("step")
 
-		instances := metadata.Instances(ctx, serviceID, schema.Duration{
+		instances := metadata.Instances(ctx, serviceID, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
diff --git a/commands/instance/search.go b/internal/commands/instance/search.go
similarity index 79%
rename from commands/instance/search.go
rename to internal/commands/instance/search.go
index 548606f..9a3ac62 100644
--- a/commands/instance/search.go
+++ b/internal/commands/instance/search.go
@@ -18,19 +18,19 @@
 package instance
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"regexp"
 
-	"github.com/apache/skywalking-cli/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/graphql/metadata"
+	"github.com/apache/skywalking-cli/pkg/graphql/metadata"
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
 )
 
 var SearchCommand = cli.Command{
@@ -50,13 +50,13 @@ var SearchCommand = cli.Command{
 
 		regex := ctx.String("regex")
 
-		instances := metadata.Instances(ctx, serviceID, schema.Duration{
+		instances := metadata.Instances(ctx, serviceID, api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		})
 
-		var result []schema.ServiceInstance
+		var result []api.ServiceInstance
 		if len(instances) > 0 {
 			for _, instance := range instances {
 				if ok, _ := regexp.Match(regex, []byte(instance.Name)); ok {
diff --git a/commands/interceptor/duration.go b/internal/commands/interceptor/duration.go
similarity index 91%
rename from commands/interceptor/duration.go
rename to internal/commands/interceptor/duration.go
index 6e382e0..47b2673 100644
--- a/commands/interceptor/duration.go
+++ b/internal/commands/interceptor/duration.go
@@ -18,18 +18,18 @@
 package interceptor
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"strconv"
 	"time"
 
-	"github.com/apache/skywalking-cli/graphql/utils"
+	"github.com/apache/skywalking-cli/pkg/graphql/utils"
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
-func TryParseTime(unparsed string) (schema.Step, time.Time, error) {
+func TryParseTime(unparsed string) (api.Step, time.Time, error) {
 	var possibleError error = nil
 	for step, layout := range utils.StepFormats {
 		t, err := time.Parse(layout, unparsed)
@@ -38,7 +38,7 @@ func TryParseTime(unparsed string) (schema.Step, time.Time, error) {
 		}
 		possibleError = err
 	}
-	return schema.StepSecond, time.Time{}, possibleError
+	return api.StepSecond, time.Time{}, possibleError
 }
 
 // DurationInterceptor sets the duration if absent, and formats it accordingly,
@@ -70,7 +70,7 @@ func DurationInterceptor(ctx *cli.Context) error {
 //   then: end := now + 30 units, where unit is the precision of `start`, (hours, minutes, etc.)
 // if --start is absent, --end is given,
 //   then: start := end - 30 units, where unit is the precision of `end`, (hours, minutes, etc.)
-func ParseDuration(start, end, timezone string) (startTime, endTime time.Time, step schema.Step, dt utils.DurationType) {
+func ParseDuration(start, end, timezone string) (startTime, endTime time.Time, step api.Step, dt utils.DurationType) {
 	logger.Log.Debugln("Start time:", start, "end time:", end, "timezone:", timezone)
 
 	now := time.Now()
@@ -86,7 +86,7 @@ func ParseDuration(start, end, timezone string) (startTime, endTime time.Time, s
 
 	// both are absent
 	if start == "" && end == "" {
-		return now.Add(-30 * time.Minute), now, schema.StepMinute, utils.BothAbsent
+		return now.Add(-30 * time.Minute), now, api.StepMinute, utils.BothAbsent
 	}
 
 	var err error
diff --git a/commands/interceptor/duration_test.go b/internal/commands/interceptor/duration_test.go
similarity index 94%
rename from commands/interceptor/duration_test.go
rename to internal/commands/interceptor/duration_test.go
index 10c8de5..b6be6b3 100644
--- a/commands/interceptor/duration_test.go
+++ b/internal/commands/interceptor/duration_test.go
@@ -18,11 +18,10 @@
 package interceptor
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"reflect"
 	"testing"
 	"time"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 func TestParseDuration(t *testing.T) {
@@ -37,7 +36,7 @@ func TestParseDuration(t *testing.T) {
 		args            args
 		wantedStartTime time.Time
 		wantedEndTime   time.Time
-		wantedStep      schema.Step
+		wantedStep      api.Step
 	}{
 		{
 			name: "Should set current time if start is absent",
@@ -47,7 +46,7 @@ func TestParseDuration(t *testing.T) {
 			},
 			wantedStartTime: now.Add(-30 * time.Minute),
 			wantedEndTime:   now,
-			wantedStep:      schema.StepMinute,
+			wantedStep:      api.StepMinute,
 		},
 		{
 			name: "Should set current time if end is absent",
@@ -57,7 +56,7 @@ func TestParseDuration(t *testing.T) {
 			},
 			wantedStartTime: now,
 			wantedEndTime:   now.Add(30 * time.Minute),
-			wantedStep:      schema.StepMinute,
+			wantedStep:      api.StepMinute,
 		},
 		{
 			name: "Should keep both if both are present",
@@ -67,7 +66,7 @@ func TestParseDuration(t *testing.T) {
 			},
 			wantedStartTime: now.Add(-10 * time.Minute),
 			wantedEndTime:   now.Add(10 * time.Minute),
-			wantedStep:      schema.StepMinute,
+			wantedStep:      api.StepMinute,
 		},
 		{
 			name: "Should set both if both are absent",
@@ -77,7 +76,7 @@ func TestParseDuration(t *testing.T) {
 			},
 			wantedStartTime: now.Add(-30 * time.Minute),
 			wantedEndTime:   now,
-			wantedStep:      schema.StepMinute,
+			wantedStep:      api.StepMinute,
 		},
 	}
 	for _, tt := range tests {
diff --git a/commands/interceptor/entity.go b/internal/commands/interceptor/entity.go
similarity index 81%
rename from commands/interceptor/entity.go
rename to internal/commands/interceptor/entity.go
index f9544ca..e88cfee 100644
--- a/commands/interceptor/entity.go
+++ b/internal/commands/interceptor/entity.go
@@ -18,12 +18,11 @@
 package interceptor
 
 import (
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/api"
 	"github.com/urfave/cli"
 )
 
-func ParseEntity(ctx *cli.Context) *schema.Entity {
+func ParseEntity(ctx *cli.Context) *api.Entity {
 	service := ctx.String("service")
 	normal := ctx.BoolT("isNormal")
 	instance := ctx.String("instance")
@@ -34,7 +33,7 @@ func ParseEntity(ctx *cli.Context) *schema.Entity {
 	destInstance := ctx.String("destServiceInstance")
 	destEndpoint := ctx.String("destEndpoint")
 
-	entity := &schema.Entity{
+	entity := &api.Entity{
 		ServiceName:             &service,
 		Normal:                  &normal,
 		ServiceInstanceName:     &instance,
@@ -50,21 +49,21 @@ func ParseEntity(ctx *cli.Context) *schema.Entity {
 }
 
 // parseScope defines the scope based on the input parameters.
-func parseScope(entity *schema.Entity) schema.Scope {
-	scope := schema.ScopeAll
+func parseScope(entity *api.Entity) api.Scope {
+	scope := api.ScopeAll
 
 	if *entity.DestEndpointName != "" {
-		scope = schema.ScopeEndpointRelation
+		scope = api.ScopeEndpointRelation
 	} else if *entity.DestServiceInstanceName != "" {
-		scope = schema.ScopeServiceInstanceRelation
+		scope = api.ScopeServiceInstanceRelation
 	} else if *entity.DestServiceName != "" {
-		scope = schema.ScopeServiceRelation
+		scope = api.ScopeServiceRelation
 	} else if *entity.EndpointName != "" {
-		scope = schema.ScopeEndpoint
+		scope = api.ScopeEndpoint
 	} else if *entity.ServiceInstanceName != "" {
-		scope = schema.ScopeServiceInstance
+		scope = api.ScopeServiceInstance
 	} else if *entity.ServiceName != "" {
-		scope = schema.ScopeService
+		scope = api.ScopeService
 	}
 
 	return scope
diff --git a/commands/interceptor/entity_test.go b/internal/commands/interceptor/entity_test.go
similarity index 85%
rename from commands/interceptor/entity_test.go
rename to internal/commands/interceptor/entity_test.go
index da3a03a..ab55aed 100644
--- a/commands/interceptor/entity_test.go
+++ b/internal/commands/interceptor/entity_test.go
@@ -18,9 +18,8 @@
 package interceptor
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"testing"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 func Test_parseScope(t *testing.T) {
@@ -28,12 +27,12 @@ func Test_parseScope(t *testing.T) {
 	nonEmpty := "test"
 	tests := []struct {
 		name string
-		args *schema.Entity
-		want schema.Scope
+		args *api.Entity
+		want api.Scope
 	}{
 		{
 			name: "all of names are empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &empty,
 				ServiceInstanceName:     &empty,
 				EndpointName:            &empty,
@@ -41,11 +40,11 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &empty,
 				DestEndpointName:        &empty,
 			},
-			want: schema.ScopeAll,
+			want: api.ScopeAll,
 		},
 		{
 			name: "all of names are not empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &nonEmpty,
 				ServiceInstanceName:     &nonEmpty,
 				EndpointName:            &nonEmpty,
@@ -53,11 +52,11 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &nonEmpty,
 				DestEndpointName:        &nonEmpty,
 			},
-			want: schema.ScopeEndpointRelation,
+			want: api.ScopeEndpointRelation,
 		},
 		{
 			name: "only serviceName is not empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &nonEmpty,
 				ServiceInstanceName:     &empty,
 				EndpointName:            &empty,
@@ -65,11 +64,11 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &empty,
 				DestEndpointName:        &empty,
 			},
-			want: schema.ScopeService,
+			want: api.ScopeService,
 		},
 		{
 			name: "instanceName is not empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &nonEmpty,
 				ServiceInstanceName:     &nonEmpty,
 				EndpointName:            &empty,
@@ -77,11 +76,11 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &empty,
 				DestEndpointName:        &empty,
 			},
-			want: schema.ScopeServiceInstance,
+			want: api.ScopeServiceInstance,
 		},
 		{
 			name: "endpointName is not empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &nonEmpty,
 				ServiceInstanceName:     &empty,
 				EndpointName:            &nonEmpty,
@@ -89,11 +88,11 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &empty,
 				DestEndpointName:        &empty,
 			},
-			want: schema.ScopeEndpoint,
+			want: api.ScopeEndpoint,
 		},
 		{
 			name: "destService is not empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &nonEmpty,
 				ServiceInstanceName:     &empty,
 				EndpointName:            &empty,
@@ -101,11 +100,11 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &empty,
 				DestEndpointName:        &empty,
 			},
-			want: schema.ScopeServiceRelation,
+			want: api.ScopeServiceRelation,
 		},
 		{
 			name: "destInstance is not empty",
-			args: &schema.Entity{
+			args: &api.Entity{
 				ServiceName:             &nonEmpty,
 				ServiceInstanceName:     &nonEmpty,
 				EndpointName:            &empty,
@@ -113,7 +112,7 @@ func Test_parseScope(t *testing.T) {
 				DestServiceInstanceName: &nonEmpty,
 				DestEndpointName:        &empty,
 			},
-			want: schema.ScopeServiceInstanceRelation,
+			want: api.ScopeServiceInstanceRelation,
 		},
 	}
 	for _, tt := range tests {
diff --git a/commands/interceptor/interceptor.go b/internal/commands/interceptor/interceptor.go
similarity index 100%
rename from commands/interceptor/interceptor.go
rename to internal/commands/interceptor/interceptor.go
diff --git a/commands/interceptor/timezone.go b/internal/commands/interceptor/timezone.go
similarity index 93%
rename from commands/interceptor/timezone.go
rename to internal/commands/interceptor/timezone.go
index c724276..f75c318 100644
--- a/commands/interceptor/timezone.go
+++ b/internal/commands/interceptor/timezone.go
@@ -22,8 +22,8 @@ import (
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/graphql/metadata"
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
+	"github.com/apache/skywalking-cli/pkg/graphql/metadata"
 )
 
 // TimezoneInterceptor sets the server timezone if the server supports the API,
diff --git a/commands/metrics/aggregation/topn.go b/internal/commands/metrics/aggregation/topn.go
similarity index 80%
rename from commands/metrics/aggregation/topn.go
rename to internal/commands/metrics/aggregation/topn.go
index a3505cf..8c383c3 100644
--- a/commands/metrics/aggregation/topn.go
+++ b/internal/commands/metrics/aggregation/topn.go
@@ -19,16 +19,15 @@ package aggregation
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strconv"
 
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/metrics"
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
 	"github.com/urfave/cli"
 )
 
@@ -44,9 +43,9 @@ var TopN = cli.Command{
 				Name:  "order",
 				Usage: "the `order` by which the top entities are sorted",
 				Value: &model.OrderEnumValue{
-					Enum:     schema.AllOrder,
-					Default:  schema.OrderDes,
-					Selected: schema.OrderDes,
+					Enum:     api.AllOrder,
+					Default:  api.OrderDes,
+					Selected: api.OrderDes,
 				},
 			},
 		},
@@ -75,13 +74,13 @@ var TopN = cli.Command{
 			topN = nn
 		}
 
-		duration := schema.Duration{
+		duration := api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step,
 		}
 
-		metricsValues := metrics.SortMetrics(ctx, schema.TopNCondition{
+		metricsValues := metrics.SortMetrics(ctx, api.TopNCondition{
 			Name:          metricsName,
 			ParentService: &parentService,
 			Normal:        &normal,
diff --git a/commands/metrics/linear/linear-metrics.go b/internal/commands/metrics/linear/linear-metrics.go
similarity index 76%
rename from commands/metrics/linear/linear-metrics.go
rename to internal/commands/metrics/linear/linear-metrics.go
index 717943c..9f0a11f 100644
--- a/commands/metrics/linear/linear-metrics.go
+++ b/internal/commands/metrics/linear/linear-metrics.go
@@ -18,14 +18,14 @@
 package linear
 
 import (
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/metrics"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/utils"
+	"github.com/apache/skywalking-cli/api"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
+	"github.com/apache/skywalking-cli/pkg/graphql/utils"
 
 	"github.com/urfave/cli"
 )
@@ -50,13 +50,13 @@ var Single = cli.Command{
 		metricsName := ctx.String("name")
 		entity := interceptor.ParseEntity(ctx)
 
-		duration := schema.Duration{
+		duration := api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValues := metrics.LinearIntValues(ctx, schema.MetricsCondition{
+		metricsValues := metrics.LinearIntValues(ctx, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
diff --git a/commands/metrics/linear/multiple-linear-metrics.go b/internal/commands/metrics/linear/multiple-linear-metrics.go
similarity index 77%
rename from commands/metrics/linear/multiple-linear-metrics.go
rename to internal/commands/metrics/linear/multiple-linear-metrics.go
index d5165cf..41d9af5 100644
--- a/commands/metrics/linear/multiple-linear-metrics.go
+++ b/internal/commands/metrics/linear/multiple-linear-metrics.go
@@ -19,16 +19,16 @@ package linear
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
 
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/metrics"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/utils"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
+	"github.com/apache/skywalking-cli/pkg/graphql/utils"
 
 	"github.com/urfave/cli"
 )
@@ -62,17 +62,17 @@ var Multiple = cli.Command{
 		labels := ctx.String("labels")
 		entity := interceptor.ParseEntity(ctx)
 
-		if *entity.ServiceName == "" && entity.Scope != schema.ScopeAll {
+		if *entity.ServiceName == "" && entity.Scope != api.ScopeAll {
 			return fmt.Errorf("the name of service should be specified when metrics' scope is not `All`")
 		}
 
-		duration := schema.Duration{
+		duration := api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValuesArray := metrics.MultipleLinearIntValues(ctx, schema.MetricsCondition{
+		metricsValuesArray := metrics.MultipleLinearIntValues(ctx, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: interceptor.ParseEntity(ctx),
 		}, strings.Split(labels, ","), duration)
diff --git a/commands/metrics/list/list-metrics.go b/internal/commands/metrics/list/list-metrics.go
similarity index 88%
rename from commands/metrics/list/list-metrics.go
rename to internal/commands/metrics/list/list-metrics.go
index 8b22349..8694b34 100644
--- a/commands/metrics/list/list-metrics.go
+++ b/internal/commands/metrics/list/list-metrics.go
@@ -20,9 +20,9 @@ package list
 import (
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/metrics"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
 )
 
 var Command = cli.Command{
diff --git a/commands/metrics/metrics.go b/internal/commands/metrics/metrics.go
similarity index 75%
rename from commands/metrics/metrics.go
rename to internal/commands/metrics/metrics.go
index 9ba471b..78196d7 100644
--- a/commands/metrics/metrics.go
+++ b/internal/commands/metrics/metrics.go
@@ -20,13 +20,13 @@ package metrics
 import (
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/commands/metrics/aggregation"
-	"github.com/apache/skywalking-cli/commands/metrics/list"
+	"github.com/apache/skywalking-cli/internal/commands/metrics/aggregation"
+	"github.com/apache/skywalking-cli/internal/commands/metrics/list"
 
-	"github.com/apache/skywalking-cli/commands/metrics/thermodynamic"
+	"github.com/apache/skywalking-cli/internal/commands/metrics/thermodynamic"
 
-	"github.com/apache/skywalking-cli/commands/metrics/linear"
-	"github.com/apache/skywalking-cli/commands/metrics/single"
+	"github.com/apache/skywalking-cli/internal/commands/metrics/linear"
+	"github.com/apache/skywalking-cli/internal/commands/metrics/single"
 )
 
 var Command = cli.Command{
diff --git a/commands/metrics/single/single-metrics.go b/internal/commands/metrics/single/single-metrics.go
similarity index 77%
rename from commands/metrics/single/single-metrics.go
rename to internal/commands/metrics/single/single-metrics.go
index 05469ec..9a1d826 100644
--- a/commands/metrics/single/single-metrics.go
+++ b/internal/commands/metrics/single/single-metrics.go
@@ -18,14 +18,13 @@
 package single
 
 import (
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/metrics"
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/api"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
 	"github.com/urfave/cli"
 )
 
@@ -49,13 +48,13 @@ var Command = cli.Command{
 		metricsName := ctx.String("name")
 		entity := interceptor.ParseEntity(ctx)
 
-		duration := schema.Duration{
+		duration := api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValue := metrics.IntValues(ctx, schema.MetricsCondition{
+		metricsValue := metrics.IntValues(ctx, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
diff --git a/commands/metrics/thermodynamic/thermodynamic.go b/internal/commands/metrics/thermodynamic/thermodynamic.go
similarity index 78%
rename from commands/metrics/thermodynamic/thermodynamic.go
rename to internal/commands/metrics/thermodynamic/thermodynamic.go
index 63d3f94..6d1f5d9 100644
--- a/commands/metrics/thermodynamic/thermodynamic.go
+++ b/internal/commands/metrics/thermodynamic/thermodynamic.go
@@ -18,14 +18,13 @@
 package thermodynamic
 
 import (
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/metrics"
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/api"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
 	"github.com/urfave/cli"
 )
 
@@ -50,13 +49,13 @@ var Command = cli.Command{
 		metricsName := ctx.String("name")
 		entity := interceptor.ParseEntity(ctx)
 
-		duration := schema.Duration{
+		duration := api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
 		}
 
-		metricsValues := metrics.Thermodynamic(ctx, schema.MetricsCondition{
+		metricsValues := metrics.Thermodynamic(ctx, api.MetricsCondition{
 			Name:   metricsName,
 			Entity: entity,
 		}, duration)
diff --git a/commands/service/list.go b/internal/commands/service/list.go
similarity index 77%
rename from commands/service/list.go
rename to internal/commands/service/list.go
index 14e2830..6b3983f 100644
--- a/commands/service/list.go
+++ b/internal/commands/service/list.go
@@ -18,17 +18,17 @@
 package service
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/graphql/metadata"
+	"github.com/apache/skywalking-cli/pkg/graphql/metadata"
 
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
 )
 
 var ListCommand = cli.Command{
@@ -47,17 +47,17 @@ var ListCommand = cli.Command{
 		start := ctx.String("start")
 		step := ctx.Generic("step")
 
-		var services []schema.Service
+		var services []api.Service
 
 		if args := ctx.Args(); len(args) == 0 {
-			services = metadata.AllServices(ctx, schema.Duration{
+			services = metadata.AllServices(ctx, api.Duration{
 				Start: start,
 				End:   end,
 				Step:  step.(*model.StepEnumValue).Selected,
 			})
 		} else {
 			service, _ := metadata.SearchService(ctx, args.First())
-			services = []schema.Service{service}
+			services = []api.Service{service}
 		}
 
 		return display.Display(ctx, &displayable.Displayable{Data: services})
diff --git a/commands/service/service.go b/internal/commands/service/service.go
similarity index 100%
rename from commands/service/service.go
rename to internal/commands/service/service.go
diff --git a/commands/trace/list.go b/internal/commands/trace/list.go
similarity index 80%
rename from commands/trace/list.go
rename to internal/commands/trace/list.go
index 0d875c7..f472160 100644
--- a/commands/trace/list.go
+++ b/internal/commands/trace/list.go
@@ -18,20 +18,20 @@
 package trace
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"strings"
 
-	"github.com/apache/skywalking-cli/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/commands/interceptor"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/commands/flags"
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/display"
+	"github.com/apache/skywalking-cli/internal/flags"
+	"github.com/apache/skywalking-cli/internal/model"
+	"github.com/apache/skywalking-cli/pkg/display"
 
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/trace"
+	"github.com/apache/skywalking-cli/pkg/graphql/trace"
 )
 
 const DefaultPageSize = 15
@@ -75,7 +75,7 @@ var ListCommand = cli.Command{
 		end := ctx.String("end")
 		step := ctx.Generic("step")
 
-		duration := schema.Duration{
+		duration := api.Duration{
 			Start: start,
 			End:   end,
 			Step:  step.(*model.StepEnumValue).Selected,
@@ -84,24 +84,24 @@ var ListCommand = cli.Command{
 		serviceInstanceID := ctx.String("service-instance-id")
 		traceID := ctx.String("trace-id")
 		tagStr := ctx.String("tags")
-		var tags []*schema.SpanTag = nil
+		var tags []*api.SpanTag = nil
 		if tagStr != "" {
 			tagArr := strings.Split(tagStr, ",")
 			for _, tag := range tagArr {
 				kv := strings.Split(tag, "=")
-				tags = append(tags, &schema.SpanTag{Key: kv[0], Value: &kv[1]})
+				tags = append(tags, &api.SpanTag{Key: kv[0], Value: &kv[1]})
 			}
 		}
 		pageNum := 1
 		needTotal := true
 
-		paging := schema.Pagination{
+		paging := api.Pagination{
 			PageNum:   &pageNum,
 			PageSize:  DefaultPageSize,
 			NeedTotal: &needTotal,
 		}
 
-		condition := &schema.TraceQueryCondition{
+		condition := &api.TraceQueryCondition{
 			ServiceID:         &serviceID,
 			ServiceInstanceID: &serviceInstanceID,
 			TraceID:           &traceID,
@@ -110,8 +110,8 @@ var ListCommand = cli.Command{
 			QueryDuration:     &duration,
 			MinTraceDuration:  nil,
 			MaxTraceDuration:  nil,
-			TraceState:        schema.TraceStateAll,
-			QueryOrder:        schema.QueryOrderByDuration,
+			TraceState:        api.TraceStateAll,
+			QueryOrder:        api.QueryOrderByDuration,
 			Tags:              tags,
 			Paging:            &paging,
 		}
diff --git a/commands/trace/trace.go b/internal/commands/trace/trace.go
similarity index 89%
rename from commands/trace/trace.go
rename to internal/commands/trace/trace.go
index a6dd408..32f4555 100644
--- a/commands/trace/trace.go
+++ b/internal/commands/trace/trace.go
@@ -22,9 +22,9 @@ import (
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display"
-	"github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/trace"
+	"github.com/apache/skywalking-cli/pkg/display"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/trace"
 )
 
 var Command = cli.Command{
diff --git a/commands/flags/duration.go b/internal/flags/duration.go
similarity index 83%
rename from commands/flags/duration.go
rename to internal/flags/duration.go
index 152ba0e..5e6e57c 100644
--- a/commands/flags/duration.go
+++ b/internal/flags/duration.go
@@ -18,13 +18,13 @@
 package flags
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/internal/model"
 )
 
-// DurationFlags are common flags that involves a duration, composed
+// DurationFlags are healthcheck flags that involves a duration, composed
 // by a start time, an end time, and a step, which is commonly used
 // in most of the commands
 var DurationFlags = []cli.Flag{
@@ -40,9 +40,9 @@ var DurationFlags = []cli.Flag{
 		Name:   "step",
 		Hidden: true,
 		Value: &model.StepEnumValue{
-			Enum:     schema.AllStep,
-			Default:  schema.StepMinute,
-			Selected: schema.StepMinute,
+			Enum:     api.AllStep,
+			Default:  api.StepMinute,
+			Selected: api.StepMinute,
 		},
 	},
 	cli.StringFlag{
diff --git a/commands/flags/entity.go b/internal/flags/entity.go
similarity index 100%
rename from commands/flags/entity.go
rename to internal/flags/entity.go
diff --git a/commands/flags/flags.go b/internal/flags/flags.go
similarity index 100%
rename from commands/flags/flags.go
rename to internal/flags/flags.go
diff --git a/commands/flags/instance.go b/internal/flags/instance.go
similarity index 100%
rename from commands/flags/instance.go
rename to internal/flags/instance.go
diff --git a/commands/flags/metrics.go b/internal/flags/metrics.go
similarity index 87%
rename from commands/flags/metrics.go
rename to internal/flags/metrics.go
index cda10a3..cb653ac 100644
--- a/commands/flags/metrics.go
+++ b/internal/flags/metrics.go
@@ -18,9 +18,8 @@
 package flags
 
 import (
-	"github.com/apache/skywalking-cli/commands/model"
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/api"
+	"github.com/apache/skywalking-cli/internal/model"
 	"github.com/urfave/cli"
 )
 
@@ -46,9 +45,9 @@ var MetricsFlags = []cli.Flag{
 		Name:  "scope",
 		Usage: "the scope of the metrics entity",
 		Value: &model.ScopeEnumValue{
-			Enum:     schema.AllScope,
-			Default:  schema.ScopeService,
-			Selected: schema.ScopeService,
+			Enum:     api.AllScope,
+			Default:  api.ScopeService,
+			Selected: api.ScopeService,
 		},
 	},
 }
diff --git a/commands/flags/search.go b/internal/flags/search.go
similarity index 100%
rename from commands/flags/search.go
rename to internal/flags/search.go
diff --git a/logger/log.go b/internal/logger/log.go
similarity index 100%
rename from logger/log.go
rename to internal/logger/log.go
diff --git a/commands/model/order.go b/internal/model/order.go
similarity index 86%
rename from commands/model/order.go
rename to internal/model/order.go
index 77a20ba..cb10ac7 100644
--- a/commands/model/order.go
+++ b/internal/model/order.go
@@ -19,16 +19,15 @@ package model
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 // OrderEnumValue defines the values domain of --order option
 type OrderEnumValue struct {
-	Enum     []schema.Order
-	Default  schema.Order
-	Selected schema.Order
+	Enum     []api.Order
+	Default  api.Order
+	Selected api.Order
 }
 
 // Set the --order value, from raw string to OrderEnumValue
@@ -39,8 +38,8 @@ func (s *OrderEnumValue) Set(value string) error {
 			return nil
 		}
 	}
-	orders := make([]string, len(schema.AllOrder))
-	for i, order := range schema.AllOrder {
+	orders := make([]string, len(api.AllOrder))
+	for i, order := range api.AllOrder {
 		orders[i] = order.String()
 	}
 	return fmt.Errorf("allowed orders are %s", strings.Join(orders, ", "))
diff --git a/commands/model/scope.go b/internal/model/scope.go
similarity index 86%
rename from commands/model/scope.go
rename to internal/model/scope.go
index 7adc5e2..bdf8f1c 100644
--- a/commands/model/scope.go
+++ b/internal/model/scope.go
@@ -19,16 +19,15 @@ package model
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 // ScopeEnumValue defines the values domain of --scope option
 type ScopeEnumValue struct {
-	Enum     []schema.Scope
-	Default  schema.Scope
-	Selected schema.Scope
+	Enum     []api.Scope
+	Default  api.Scope
+	Selected api.Scope
 }
 
 // Set the --scope value, from raw string to ScopeEnumValue
@@ -39,8 +38,8 @@ func (s *ScopeEnumValue) Set(value string) error {
 			return nil
 		}
 	}
-	scopes := make([]string, len(schema.AllScope))
-	for i, scope := range schema.AllScope {
+	scopes := make([]string, len(api.AllScope))
+	for i, scope := range api.AllScope {
 		scopes[i] = scope.String()
 	}
 	return fmt.Errorf("allowed scopes are %s", strings.Join(scopes, ", "))
diff --git a/commands/model/step.go b/internal/model/step.go
similarity index 87%
rename from commands/model/step.go
rename to internal/model/step.go
index 8f363be..9fc8e08 100644
--- a/commands/model/step.go
+++ b/internal/model/step.go
@@ -19,16 +19,15 @@ package model
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 // StepEnumValue defines the values domain of --step option
 type StepEnumValue struct {
-	Enum     []schema.Step
-	Default  schema.Step
-	Selected schema.Step
+	Enum     []api.Step
+	Default  api.Step
+	Selected api.Step
 }
 
 // Set the --step value, from raw string to StepEnumValue
@@ -39,8 +38,8 @@ func (s *StepEnumValue) Set(value string) error {
 			return nil
 		}
 	}
-	steps := make([]string, len(schema.AllStep))
-	for i, step := range schema.AllStep {
+	steps := make([]string, len(api.AllStep))
+	for i, step := range api.AllStep {
 		steps[i] = step.String()
 	}
 	return fmt.Errorf("allowed steps are %s", strings.Join(steps, ", "))
diff --git a/display/display.go b/pkg/display/display.go
similarity index 84%
rename from display/display.go
rename to pkg/display/display.go
index 9e7d132..9dd17b8 100644
--- a/display/display.go
+++ b/pkg/display/display.go
@@ -21,15 +21,15 @@ import (
 	"fmt"
 	"strings"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/display/graph"
+	"github.com/apache/skywalking-cli/pkg/display/graph"
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display/json"
-	"github.com/apache/skywalking-cli/display/table"
-	"github.com/apache/skywalking-cli/display/yaml"
+	"github.com/apache/skywalking-cli/pkg/display/json"
+	"github.com/apache/skywalking-cli/pkg/display/table"
+	"github.com/apache/skywalking-cli/pkg/display/yaml"
 )
 
 const (
diff --git a/display/displayable/displayable.go b/pkg/display/displayable/displayable.go
similarity index 91%
rename from display/displayable/displayable.go
rename to pkg/display/displayable/displayable.go
index d4678f4..eff05d0 100644
--- a/display/displayable/displayable.go
+++ b/pkg/display/displayable/displayable.go
@@ -17,11 +17,13 @@
 
 package displayable
 
-import "github.com/apache/skywalking-cli/graphql/schema"
+import (
+	"github.com/apache/skywalking-cli/api"
+)
 
 type Displayable struct {
 	Data      interface{}
 	Condition interface{}
-	Duration  schema.Duration
+	Duration  api.Duration
 	Title     string
 }
diff --git a/display/graph/dashboard/global.go b/pkg/display/graph/dashboard/global.go
similarity index 93%
rename from display/graph/dashboard/global.go
rename to pkg/display/graph/dashboard/global.go
index 0865a2e..74d1ab9 100644
--- a/display/graph/dashboard/global.go
+++ b/pkg/display/graph/dashboard/global.go
@@ -20,14 +20,14 @@ package dashboard
 import (
 	"context"
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"math"
 	"strings"
 	"time"
 
-	"github.com/apache/skywalking-cli/commands/interceptor"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/utils"
-	lib "github.com/apache/skywalking-cli/lib/heatmap"
+	"github.com/apache/skywalking-cli/internal/commands/interceptor"
+	"github.com/apache/skywalking-cli/pkg/graphql/utils"
+	lib "github.com/apache/skywalking-cli/pkg/heatmap"
 
 	"github.com/mattn/go-runewidth"
 	"github.com/mum4k/termdash"
@@ -37,10 +37,10 @@ import (
 	"github.com/mum4k/termdash/terminal/terminalapi"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/display/graph/gauge"
-	"github.com/apache/skywalking-cli/display/graph/heatmap"
-	"github.com/apache/skywalking-cli/display/graph/linear"
-	"github.com/apache/skywalking-cli/graphql/dashboard"
+	"github.com/apache/skywalking-cli/pkg/display/graph/gauge"
+	"github.com/apache/skywalking-cli/pkg/display/graph/heatmap"
+	"github.com/apache/skywalking-cli/pkg/display/graph/linear"
+	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
 
 	"github.com/mum4k/termdash/cell"
 	"github.com/mum4k/termdash/container"
@@ -353,10 +353,10 @@ func refresh(con context.Context, ctx *cli.Context, interval time.Duration) {
 // updateDuration will check if the duration changes after adding the interval.
 // If the duration doesn't change, an error will be returned, and the dashboard will not refresh.
 // Otherwise, a new duration will be returned, which is used to get the latest global data.
-func updateDuration(interval time.Duration) (schema.Duration, error) {
+func updateDuration(interval time.Duration) (api.Duration, error) {
 	step, _, err := interceptor.TryParseTime(initStartStr)
 	if err != nil {
-		return schema.Duration{}, err
+		return api.Duration{}, err
 	}
 
 	curStartTime = curStartTime.Add(interval)
@@ -366,12 +366,12 @@ func updateDuration(interval time.Duration) (schema.Duration, error) {
 	curEndStr := curEndTime.Format(utils.StepFormats[step])
 
 	if curStartStr == initStartStr && curEndStr == initEndStr {
-		return schema.Duration{}, fmt.Errorf("the duration does not update")
+		return api.Duration{}, fmt.Errorf("the duration does not update")
 	}
 
 	initStartStr = curStartStr
 	initEndStr = curEndStr
-	return schema.Duration{
+	return api.Duration{
 		Start: curStartStr,
 		End:   curEndStr,
 		Step:  step,
diff --git a/display/graph/gauge/gauge.go b/pkg/display/graph/gauge/gauge.go
similarity index 93%
rename from display/graph/gauge/gauge.go
rename to pkg/display/graph/gauge/gauge.go
index a99234d..510732a 100644
--- a/display/graph/gauge/gauge.go
+++ b/pkg/display/graph/gauge/gauge.go
@@ -20,15 +20,15 @@ package gauge
 import (
 	"context"
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"math"
 	"strconv"
 	"strings"
 
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/graphql/dashboard"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/util"
+	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
+	"github.com/apache/skywalking-cli/pkg/util"
 
 	"github.com/mum4k/termdash"
 	"github.com/mum4k/termdash/cell"
@@ -50,7 +50,7 @@ type MetricColumn struct {
 }
 
 // Update updates the MetricColumn's `Absolute` and `BorderTitle`.
-func (mc *MetricColumn) Update(data []*schema.SelectedRecord) error {
+func (mc *MetricColumn) Update(data []*api.SelectedRecord) error {
 	for i, item := range data {
 		// The number of `SelectedRecord` data may exceed the number of gauges in a `MetricColumn`.
 		if i >= len(mc.gauges) {
@@ -79,7 +79,7 @@ func (mc *MetricColumn) Update(data []*schema.SelectedRecord) error {
 	return nil
 }
 
-func NewMetricColumn(column []*schema.SelectedRecord, config *dashboard.MetricTemplate) (*MetricColumn, error) {
+func NewMetricColumn(column []*api.SelectedRecord, config *dashboard.MetricTemplate) (*MetricColumn, error) {
 	var ret MetricColumn
 
 	t, err := text.New()
@@ -193,7 +193,7 @@ func layout(columns []grid.Element) ([]container.Option, error) {
 	return gridOpts, nil
 }
 
-func Display(ctx *cli.Context, metrics [][]*schema.SelectedRecord) error {
+func Display(ctx *cli.Context, metrics [][]*api.SelectedRecord) error {
 	t, err := termbox.New()
 	if err != nil {
 		return err
@@ -251,7 +251,7 @@ func Display(ctx *cli.Context, metrics [][]*schema.SelectedRecord) error {
 }
 
 // findMaxValue finds the maximum value in the array of `schema.SelectedRecord`.
-func findMaxValue(column []*schema.SelectedRecord) (int, error) {
+func findMaxValue(column []*api.SelectedRecord) (int, error) {
 	var ret int
 
 	for _, c := range column {
diff --git a/display/graph/graph.go b/pkg/display/graph/graph.go
similarity index 79%
rename from display/graph/graph.go
rename to pkg/display/graph/graph.go
index 22aad02..c050cfd 100644
--- a/display/graph/graph.go
+++ b/pkg/display/graph/graph.go
@@ -19,28 +19,28 @@ package graph
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"reflect"
 	"strings"
 
 	"github.com/urfave/cli"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
-	db "github.com/apache/skywalking-cli/display/graph/dashboard"
-	"github.com/apache/skywalking-cli/display/graph/gauge"
-	"github.com/apache/skywalking-cli/display/graph/heatmap"
-	"github.com/apache/skywalking-cli/display/graph/linear"
-	"github.com/apache/skywalking-cli/display/graph/tree"
-	"github.com/apache/skywalking-cli/graphql/dashboard"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
+	db "github.com/apache/skywalking-cli/pkg/display/graph/dashboard"
+	"github.com/apache/skywalking-cli/pkg/display/graph/gauge"
+	"github.com/apache/skywalking-cli/pkg/display/graph/heatmap"
+	"github.com/apache/skywalking-cli/pkg/display/graph/linear"
+	"github.com/apache/skywalking-cli/pkg/display/graph/tree"
+	"github.com/apache/skywalking-cli/pkg/graphql/dashboard"
 )
 
 type (
-	Thermodynamic      = schema.HeatMap
+	Thermodynamic      = api.HeatMap
 	LinearMetrics      = map[string]float64
 	MultiLinearMetrics = []LinearMetrics
-	Trace              = schema.Trace
-	TraceBrief         = schema.TraceBrief
-	GlobalMetrics      = [][]*schema.SelectedRecord
+	Trace              = api.Trace
+	TraceBrief         = api.TraceBrief
+	GlobalMetrics      = [][]*api.SelectedRecord
 	GlobalData         = dashboard.GlobalData
 )
 
diff --git a/display/graph/heatmap/heatmap.go b/pkg/display/graph/heatmap/heatmap.go
similarity index 86%
rename from display/graph/heatmap/heatmap.go
rename to pkg/display/graph/heatmap/heatmap.go
index 12f64d4..44ab961 100644
--- a/display/graph/heatmap/heatmap.go
+++ b/pkg/display/graph/heatmap/heatmap.go
@@ -20,6 +20,7 @@ package heatmap
 import (
 	"context"
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
 
 	"github.com/mum4k/termdash"
@@ -30,15 +31,14 @@ import (
 	"github.com/mum4k/termdash/terminal/terminalapi"
 	"github.com/mum4k/termdash/widgetapi"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/utils"
-	"github.com/apache/skywalking-cli/lib/heatmap"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/utils"
+	"github.com/apache/skywalking-cli/pkg/heatmap"
 )
 
 const rootID = "root"
 
-func NewHeatMapWidget(data schema.HeatMap) (hp *heatmap.HeatMap, err error) {
+func NewHeatMapWidget(data api.HeatMap) (hp *heatmap.HeatMap, err error) {
 	hp, err = heatmap.NewHeatMap()
 	if err != nil {
 		return hp, err
@@ -48,14 +48,14 @@ func NewHeatMapWidget(data schema.HeatMap) (hp *heatmap.HeatMap, err error) {
 	return
 }
 
-func SetData(hp *heatmap.HeatMap, data schema.HeatMap) {
+func SetData(hp *heatmap.HeatMap, data api.HeatMap) {
 	hpColumns, yLabels := processData(data)
 	hp.SetColumns(hpColumns)
 	hp.SetYLabels(yLabels)
 }
 
 // processData converts data into hpColumns and yValues for the heat map.
-func processData(data schema.HeatMap) (hpColumns map[string][]int64, yLabels []string) {
+func processData(data api.HeatMap) (hpColumns map[string][]int64, yLabels []string) {
 	hpColumns = utils.HeatMapToMap(&data)
 	yLabels = utils.BucketsToStrings(data.Buckets)
 	return
@@ -97,7 +97,7 @@ func Display(displayable *d.Displayable) error {
 		return err
 	}
 
-	data := displayable.Data.(schema.HeatMap)
+	data := displayable.Data.(api.HeatMap)
 	hp, err := NewHeatMapWidget(data)
 	if err != nil {
 		return err
diff --git a/display/graph/linear/linear.go b/pkg/display/graph/linear/linear.go
similarity index 100%
rename from display/graph/linear/linear.go
rename to pkg/display/graph/linear/linear.go
diff --git a/display/graph/tree/adapter.go b/pkg/display/graph/tree/adapter.go
similarity index 89%
rename from display/graph/tree/adapter.go
rename to pkg/display/graph/tree/adapter.go
index 895b5fd..bceae0b 100644
--- a/display/graph/tree/adapter.go
+++ b/pkg/display/graph/tree/adapter.go
@@ -19,13 +19,13 @@ package tree
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
 
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/util"
+	"github.com/apache/skywalking-cli/pkg/util"
 )
 
-func Adapt(trace schema.Trace) (roots []*Node, serviceNames []string) {
+func Adapt(trace api.Trace) (roots []*Node, serviceNames []string) {
 	all := make(map[string]*Node)
 	set := make(map[string]bool)
 	var traceID string
@@ -73,7 +73,7 @@ func Adapt(trace schema.Trace) (roots []*Node, serviceNames []string) {
 	return roots, serviceNames
 }
 
-func buildTree(all map[string]*Node, seen map[string]bool, trace schema.Trace) {
+func buildTree(all map[string]*Node, seen map[string]bool, trace api.Trace) {
 	for len(seen) < len(trace.Spans) {
 		for _, span := range trace.Spans {
 			if seen[id(span)] {
@@ -96,13 +96,13 @@ func buildTree(all map[string]*Node, seen map[string]bool, trace schema.Trace) {
 	}
 }
 
-func virtualSpan(spanID int, ref schema.Ref) *schema.Span {
+func virtualSpan(spanID int, ref api.Ref) *api.Span {
 	endpointName := fmt.Sprintf("VNode: %s", ref.ParentSegmentID)
 	component := fmt.Sprintf("VirtualNode: #%d", spanID)
 	peer := "No Peer"
 	fail := true
 	layer := "Broken"
-	span := schema.Span{
+	span := api.Span{
 		TraceID:      ref.TraceID,
 		SegmentID:    ref.ParentSegmentID,
 		SpanID:       spanID,
@@ -120,27 +120,27 @@ func virtualSpan(spanID int, ref schema.Ref) *schema.Span {
 	return &span
 }
 
-func isRoot(span *schema.Span) bool {
+func isRoot(span *api.Span) bool {
 	return span.SpanID == 0 && span.ParentSpanID == -1 && len(span.Refs) == 0
 }
 
-func id(span *schema.Span) string {
+func id(span *api.Span) string {
 	return fmt.Sprintf("%s:%s:%d", span.TraceID, span.SegmentID, span.SpanID)
 }
 
-func pid(span *schema.Span) string {
+func pid(span *api.Span) string {
 	return fmt.Sprintf("%s:%s:%d", span.TraceID, span.SegmentID, span.ParentSpanID)
 }
 
-func id0(ref *schema.Ref) string {
+func id0(ref *api.Ref) string {
 	return fmt.Sprintf("%s:%s:%d", ref.TraceID, ref.ParentSegmentID, ref.ParentSpanID)
 }
 
-func id1(ref *schema.Ref) string {
+func id1(ref *api.Ref) string {
 	return fmt.Sprintf("%s:%s:%d", ref.TraceID, ref.ParentSegmentID, ref.ParentSpanID-1)
 }
 
-func node(span *schema.Span) *Node {
+func node(span *api.Span) *Node {
 	return &Node{
 		Children: []*Node{},
 		Value:    util.Stringify{Str: value(span)},
@@ -148,7 +148,7 @@ func node(span *schema.Span) *Node {
 	}
 }
 
-func value(span *schema.Span) string {
+func value(span *api.Span) string {
 	if *span.IsError {
 		return fmt.Sprintf(
 			"[|%s| %s [%s/%s]](mod:bold,fg:white,bg:red)",
@@ -161,7 +161,7 @@ func value(span *schema.Span) string {
 	)
 }
 
-func detail(span *schema.Span) string {
+func detail(span *api.Span) string {
 	var lines []string
 
 	lines = append(lines,
diff --git a/display/graph/tree/list.go b/pkg/display/graph/tree/list.go
similarity index 90%
rename from display/graph/tree/list.go
rename to pkg/display/graph/tree/list.go
index 8fa53bc..3b73428 100644
--- a/display/graph/tree/list.go
+++ b/pkg/display/graph/tree/list.go
@@ -19,17 +19,17 @@ package tree
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 	"strings"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/trace"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
+	"github.com/apache/skywalking-cli/pkg/graphql/trace"
 
 	ui "github.com/gizak/termui/v3"
 	"github.com/gizak/termui/v3/widgets"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 const DefaultPageSize = 15
@@ -38,8 +38,8 @@ const Detail = " Detail "
 const Quit = "<C-c>"
 
 func DisplayList(ctx *cli.Context, displayable *d.Displayable) error {
-	data := displayable.Data.(schema.TraceBrief)
-	condition := displayable.Condition.(*schema.TraceQueryCondition)
+	data := displayable.Data.(api.TraceBrief)
+	condition := displayable.Condition.(*api.TraceQueryCondition)
 	if err := ui.Init(); err != nil {
 		logger.Log.Fatalf("failed to initialize termui: %v", err)
 	}
@@ -89,8 +89,8 @@ func DisplayList(ctx *cli.Context, displayable *d.Displayable) error {
 	return nil
 }
 
-func draw(list *widgets.List, tree *widgets.Tree, detail, help *widgets.Paragraph, data schema.TraceBrief,
-	ctx *cli.Context, condition *schema.TraceQueryCondition) {
+func draw(list *widgets.List, tree *widgets.Tree, detail, help *widgets.Paragraph, data api.TraceBrief,
+	ctx *cli.Context, condition *api.TraceQueryCondition) {
 	x, y := ui.TerminalDimensions()
 
 	if data.Total != 0 {
@@ -124,8 +124,8 @@ func totalPages(total int) int {
 	return total/DefaultPageSize + 1
 }
 
-func listenTracesKeyboard(list *widgets.List, tree *widgets.Tree, data schema.TraceBrief, ctx *cli.Context,
-	detail, help *widgets.Paragraph, condition *schema.TraceQueryCondition) {
+func listenTracesKeyboard(list *widgets.List, tree *widgets.Tree, data api.TraceBrief, ctx *cli.Context,
+	detail, help *widgets.Paragraph, condition *api.TraceQueryCondition) {
 	uiEvents := ui.PollEvents()
 	listActive := true
 	for {
@@ -214,7 +214,7 @@ func getNodeData(ctx *cli.Context, traceID string) (nodes []*widgets.TreeNode, s
 	return nodes, serviceNames
 }
 
-func rows(data schema.TraceBrief, subLen int) []string {
+func rows(data api.TraceBrief, subLen int) []string {
 	var rows []string
 
 	for _, t := range data.Traces {
diff --git a/display/graph/tree/tree.go b/pkg/display/graph/tree/tree.go
similarity index 99%
rename from display/graph/tree/tree.go
rename to pkg/display/graph/tree/tree.go
index ee0e168..916c94c 100644
--- a/display/graph/tree/tree.go
+++ b/pkg/display/graph/tree/tree.go
@@ -24,7 +24,7 @@ import (
 	ui "github.com/gizak/termui/v3"
 	"github.com/gizak/termui/v3/widgets"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 type Node struct {
diff --git a/display/json/json.go b/pkg/display/json/json.go
similarity index 94%
rename from display/json/json.go
rename to pkg/display/json/json.go
index 12a506f..e3f2cf8 100644
--- a/display/json/json.go
+++ b/pkg/display/json/json.go
@@ -21,7 +21,7 @@ import (
 	"encoding/json"
 	"fmt"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 )
 
 func Display(displayable *d.Displayable) error {
diff --git a/display/json/json_test.go b/pkg/display/json/json_test.go
similarity index 79%
rename from display/json/json_test.go
rename to pkg/display/json/json_test.go
index 9d8ead4..fca6ec3 100644
--- a/display/json/json_test.go
+++ b/pkg/display/json/json_test.go
@@ -18,26 +18,25 @@
 package json
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"testing"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 )
 
 func TestJsonDisplay(t *testing.T) {
-	var result []schema.Service
+	var result []api.Service
 	display(t, result)
-	result = make([]schema.Service, 0)
+	result = make([]api.Service, 0)
 	display(t, result)
-	result = append(result, schema.Service{
+	result = append(result, api.Service{
 		ID:   "1",
 		Name: "json",
 	})
 	display(t, result)
 }
 
-func display(t *testing.T, result []schema.Service) {
+func display(t *testing.T, result []api.Service) {
 	if err := Display(&d.Displayable{Data: result}); err != nil {
 		t.Error(err)
 	}
diff --git a/display/table/table.go b/pkg/display/table/table.go
similarity index 93%
rename from display/table/table.go
rename to pkg/display/table/table.go
index 8e2227d..0c82376 100644
--- a/display/table/table.go
+++ b/pkg/display/table/table.go
@@ -21,9 +21,9 @@ import (
 	"encoding/json"
 	"os"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 
 	"github.com/olekukonko/tablewriter"
 )
diff --git a/display/table/table_test.go b/pkg/display/table/table_test.go
similarity index 80%
rename from display/table/table_test.go
rename to pkg/display/table/table_test.go
index ec2b265..ce7728b 100644
--- a/display/table/table_test.go
+++ b/pkg/display/table/table_test.go
@@ -18,26 +18,25 @@
 package table
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"testing"
 
-	"github.com/apache/skywalking-cli/display/displayable"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 )
 
 func TestTableDisplay(t *testing.T) {
-	var result []schema.Service
+	var result []api.Service
 	display(t, result)
-	result = make([]schema.Service, 0)
+	result = make([]api.Service, 0)
 	display(t, result)
-	result = append(result, schema.Service{
+	result = append(result, api.Service{
 		ID:   "1",
 		Name: "table",
 	})
 	display(t, result)
 }
 
-func display(t *testing.T, result []schema.Service) {
+func display(t *testing.T, result []api.Service) {
 	if err := Display(&displayable.Displayable{Data: result}); err != nil {
 		t.Error(err)
 	}
diff --git a/display/yaml/yaml.go b/pkg/display/yaml/yaml.go
similarity index 94%
rename from display/yaml/yaml.go
rename to pkg/display/yaml/yaml.go
index 3f3c98b..4cfe9af 100644
--- a/display/yaml/yaml.go
+++ b/pkg/display/yaml/yaml.go
@@ -20,7 +20,7 @@ package yaml
 import (
 	"fmt"
 
-	d "github.com/apache/skywalking-cli/display/displayable"
+	d "github.com/apache/skywalking-cli/pkg/display/displayable"
 
 	"gopkg.in/yaml.v2"
 )
diff --git a/display/yaml/yaml_test.go b/pkg/display/yaml/yaml_test.go
similarity index 80%
rename from display/yaml/yaml_test.go
rename to pkg/display/yaml/yaml_test.go
index aaada3a..e7d1fcb 100644
--- a/display/yaml/yaml_test.go
+++ b/pkg/display/yaml/yaml_test.go
@@ -18,26 +18,25 @@
 package yaml
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"testing"
 
-	"github.com/apache/skywalking-cli/display/displayable"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/pkg/display/displayable"
 )
 
 func TestYamlDisplay(t *testing.T) {
-	var result []schema.Service
+	var result []api.Service
 	display(t, result)
-	result = make([]schema.Service, 0)
+	result = make([]api.Service, 0)
 	display(t, result)
-	result = append(result, schema.Service{
+	result = append(result, api.Service{
 		ID:   "1",
 		Name: "yaml",
 	})
 	display(t, result)
 }
 
-func display(t *testing.T, result []schema.Service) {
+func display(t *testing.T, result []api.Service) {
 	if err := Display(&displayable.Displayable{Data: result}); err != nil {
 		t.Error(err)
 	}
diff --git a/graphql/client/client.go b/pkg/graphql/client/client.go
similarity index 97%
rename from graphql/client/client.go
rename to pkg/graphql/client/client.go
index ebadd9c..846f662 100644
--- a/graphql/client/client.go
+++ b/pkg/graphql/client/client.go
@@ -24,7 +24,7 @@ import (
 	"github.com/machinebox/graphql"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 func newClient(cliCtx *cli.Context) (client *graphql.Client) {
diff --git a/graphql/common/common.go b/pkg/graphql/common/common.go
similarity index 79%
rename from graphql/common/common.go
rename to pkg/graphql/common/common.go
index 1f1c417..651d81b 100644
--- a/graphql/common/common.go
+++ b/pkg/graphql/common/common.go
@@ -18,19 +18,19 @@
 package common
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/machinebox/graphql"
 	"github.com/urfave/cli"
 
 	"github.com/apache/skywalking-cli/assets"
-	"github.com/apache/skywalking-cli/graphql/client"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
 // CheckHealth intends to query the health status of OAP server
-func CheckHealth(ctx *cli.Context) schema.HealthStatus {
-	var response map[string]schema.HealthStatus
+func CheckHealth(ctx *cli.Context) api.HealthStatus {
+	var response map[string]api.HealthStatus
 
-	request := graphql.NewRequest(assets.Read("graphqls/common/checkHealth.graphql"))
+	request := graphql.NewRequest(assets.Read("graphqls/healthcheck/checkHealth.graphql"))
 
 	client.ExecuteQueryOrFail(ctx, request, &response)
 
diff --git a/graphql/dashboard/global.go b/pkg/graphql/dashboard/global.go
similarity index 78%
rename from graphql/dashboard/global.go
rename to pkg/graphql/dashboard/global.go
index c004acd..fd9aa48 100644
--- a/graphql/dashboard/global.go
+++ b/pkg/graphql/dashboard/global.go
@@ -19,6 +19,7 @@ package dashboard
 
 import (
 	"bytes"
+	"github.com/apache/skywalking-cli/api"
 	"io/ioutil"
 	"strings"
 	"sync"
@@ -29,9 +30,8 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/apache/skywalking-cli/assets"
-	"github.com/apache/skywalking-cli/graphql/metrics"
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/graphql/utils"
+	"github.com/apache/skywalking-cli/pkg/graphql/metrics"
+	"github.com/apache/skywalking-cli/pkg/graphql/utils"
 )
 
 type ButtonTemplate struct {
@@ -41,18 +41,18 @@ type ButtonTemplate struct {
 }
 
 type MetricTemplate struct {
-	Condition      schema.TopNCondition `mapstructure:"condition"`
-	Title          string               `mapstructure:"title"`
-	Aggregation    string               `mapstructure:"aggregation"`
-	AggregationNum string               `mapstructure:"aggregationNum"`
+	Condition      api.TopNCondition `mapstructure:"condition"`
+	Title          string            `mapstructure:"title"`
+	Aggregation    string            `mapstructure:"aggregation"`
+	AggregationNum string            `mapstructure:"aggregationNum"`
 }
 
 type ChartTemplate struct {
-	Condition   schema.MetricsCondition `mapstructure:"condition"`
-	Title       string                  `mapstructure:"title"`
-	Unit        string                  `mapstructure:"unit"`
-	Labels      string                  `mapstructure:"labels"`
-	LabelsIndex string                  `mapstructure:"labelsIndex"`
+	Condition   api.MetricsCondition `mapstructure:"condition"`
+	Title       string               `mapstructure:"title"`
+	Unit        string               `mapstructure:"unit"`
+	Labels      string               `mapstructure:"labels"`
+	LabelsIndex string               `mapstructure:"labelsIndex"`
 }
 
 type GlobalTemplate struct {
@@ -63,9 +63,9 @@ type GlobalTemplate struct {
 }
 
 type GlobalData struct {
-	Metrics         [][]*schema.SelectedRecord `json:"metrics"`
-	ResponseLatency []map[string]float64       `json:"responseLatency"`
-	HeatMap         schema.HeatMap             `json:"heatMap"`
+	Metrics         [][]*api.SelectedRecord `json:"metrics"`
+	ResponseLatency []map[string]float64    `json:"responseLatency"`
+	HeatMap         api.HeatMap             `json:"heatMap"`
 }
 
 // Use singleton pattern to make sure to load template only once.
@@ -138,8 +138,8 @@ func getButtonTexts(byteValue []byte) ([]string, error) {
 	return ret, nil
 }
 
-func Metrics(ctx *cli.Context, duration schema.Duration) [][]*schema.SelectedRecord {
-	var ret [][]*schema.SelectedRecord
+func Metrics(ctx *cli.Context, duration api.Duration) [][]*api.SelectedRecord {
+	var ret [][]*api.SelectedRecord
 
 	template, err := LoadTemplate(ctx.String("template"))
 	if err != nil {
@@ -158,7 +158,7 @@ func Metrics(ctx *cli.Context, duration schema.Duration) [][]*schema.SelectedRec
 	return ret
 }
 
-func responseLatency(ctx *cli.Context, duration schema.Duration) []map[string]float64 {
+func responseLatency(ctx *cli.Context, duration api.Duration) []map[string]float64 {
 	template, err := LoadTemplate(ctx.String("template"))
 	if err != nil {
 		return nil
@@ -179,21 +179,21 @@ func responseLatency(ctx *cli.Context, duration schema.Duration) []map[string]fl
 	return utils.MetricsValuesArrayToMap(duration, responseLatency)
 }
 
-func heatMap(ctx *cli.Context, duration schema.Duration) schema.HeatMap {
+func heatMap(ctx *cli.Context, duration api.Duration) api.HeatMap {
 	template, err := LoadTemplate(ctx.String("template"))
 	if err != nil {
-		return schema.HeatMap{}
+		return api.HeatMap{}
 	}
 
 	// Check if there is a template of heat map.
 	if template.HeatMap == (ChartTemplate{}) {
-		return schema.HeatMap{}
+		return api.HeatMap{}
 	}
 
 	return metrics.Thermodynamic(ctx, template.HeatMap.Condition, duration)
 }
 
-func Global(ctx *cli.Context, duration schema.Duration) *GlobalData {
+func Global(ctx *cli.Context, duration api.Duration) *GlobalData {
 	// Load template to `globalTemplate`, so the subsequent three calls can ues it directly.
 	_, err := LoadTemplate(ctx.String("template"))
 	if err != nil {
@@ -203,7 +203,7 @@ func Global(ctx *cli.Context, duration schema.Duration) *GlobalData {
 	// Use three goroutines to enable concurrent execution of three graphql queries.
 	var wg sync.WaitGroup
 	wg.Add(3)
-	var m [][]*schema.SelectedRecord
+	var m [][]*api.SelectedRecord
 	go func() {
 		m = Metrics(ctx, duration)
 		wg.Done()
@@ -213,7 +213,7 @@ func Global(ctx *cli.Context, duration schema.Duration) *GlobalData {
 		rl = responseLatency(ctx, duration)
 		wg.Done()
 	}()
-	var hm schema.HeatMap
+	var hm api.HeatMap
 	go func() {
 		hm = heatMap(ctx, duration)
 		wg.Done()
diff --git a/graphql/metadata/metadata.go b/pkg/graphql/metadata/metadata.go
similarity index 77%
rename from graphql/metadata/metadata.go
rename to pkg/graphql/metadata/metadata.go
index 49e88be..3866794 100644
--- a/graphql/metadata/metadata.go
+++ b/pkg/graphql/metadata/metadata.go
@@ -19,18 +19,18 @@ package metadata
 
 import (
 	"fmt"
+	"github.com/apache/skywalking-cli/api"
 
 	"github.com/apache/skywalking-cli/assets"
 
 	"github.com/machinebox/graphql"
 	"github.com/urfave/cli"
 
-	"github.com/apache/skywalking-cli/graphql/client"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func AllServices(cliCtx *cli.Context, duration schema.Duration) []schema.Service {
-	var response map[string][]schema.Service
+func AllServices(cliCtx *cli.Context, duration api.Duration) []api.Service {
+	var response map[string][]api.Service
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/AllServices.graphql"))
 	request.Var("duration", duration)
@@ -39,8 +39,8 @@ func AllServices(cliCtx *cli.Context, duration schema.Duration) []schema.Service
 	return response["result"]
 }
 
-func SearchService(cliCtx *cli.Context, serviceCode string) (service schema.Service, err error) {
-	var response map[string]schema.Service
+func SearchService(cliCtx *cli.Context, serviceCode string) (service api.Service, err error) {
+	var response map[string]api.Service
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/SearchService.graphql"))
 	request.Var("serviceCode", serviceCode)
@@ -56,8 +56,8 @@ func SearchService(cliCtx *cli.Context, serviceCode string) (service schema.Serv
 	return service, nil
 }
 
-func SearchEndpoints(cliCtx *cli.Context, serviceID, keyword string, limit int) []schema.Endpoint {
-	var response map[string][]schema.Endpoint
+func SearchEndpoints(cliCtx *cli.Context, serviceID, keyword string, limit int) []api.Endpoint {
+	var response map[string][]api.Endpoint
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/SearchEndpoints.graphql"))
 	request.Var("serviceId", serviceID)
@@ -69,8 +69,8 @@ func SearchEndpoints(cliCtx *cli.Context, serviceID, keyword string, limit int)
 	return response["result"]
 }
 
-func Instances(cliCtx *cli.Context, serviceID string, duration schema.Duration) []schema.ServiceInstance {
-	var response map[string][]schema.ServiceInstance
+func Instances(cliCtx *cli.Context, serviceID string, duration api.Duration) []api.ServiceInstance {
+	var response map[string][]api.ServiceInstance
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/Instances.graphql"))
 	request.Var("serviceId", serviceID)
@@ -81,13 +81,13 @@ func Instances(cliCtx *cli.Context, serviceID string, duration schema.Duration)
 	return response["result"]
 }
 
-func ServerTimeInfo(cliCtx *cli.Context) (schema.TimeInfo, error) {
-	var response map[string]schema.TimeInfo
+func ServerTimeInfo(cliCtx *cli.Context) (api.TimeInfo, error) {
+	var response map[string]api.TimeInfo
 
 	request := graphql.NewRequest(assets.Read("graphqls/metadata/ServerTimeInfo.graphql"))
 
 	if err := client.ExecuteQuery(cliCtx, request, &response); err != nil {
-		return schema.TimeInfo{}, err
+		return api.TimeInfo{}, err
 	}
 
 	return response["result"], nil
diff --git a/graphql/metrics/metrics.go b/pkg/graphql/metrics/metrics.go
similarity index 70%
rename from graphql/metrics/metrics.go
rename to pkg/graphql/metrics/metrics.go
index 8a73a58..094c12a 100644
--- a/graphql/metrics/metrics.go
+++ b/pkg/graphql/metrics/metrics.go
@@ -18,15 +18,14 @@
 package metrics
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/apache/skywalking-cli/assets"
-	"github.com/apache/skywalking-cli/graphql/client"
-	"github.com/apache/skywalking-cli/graphql/schema"
-
+	"github.com/apache/skywalking-cli/pkg/graphql/client"
 	"github.com/machinebox/graphql"
 	"github.com/urfave/cli"
 )
 
-func IntValues(ctx *cli.Context, condition schema.MetricsCondition, duration schema.Duration) int {
+func IntValues(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) int {
 	var response map[string]int
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/MetricsValue.graphql"))
@@ -39,8 +38,8 @@ func IntValues(ctx *cli.Context, condition schema.MetricsCondition, duration sch
 	return response["result"]
 }
 
-func LinearIntValues(ctx *cli.Context, condition schema.MetricsCondition, duration schema.Duration) schema.MetricsValues {
-	var response map[string]schema.MetricsValues
+func LinearIntValues(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) api.MetricsValues {
+	var response map[string]api.MetricsValues
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/MetricsValues.graphql"))
 
@@ -52,8 +51,8 @@ func LinearIntValues(ctx *cli.Context, condition schema.MetricsCondition, durati
 	return response["result"]
 }
 
-func MultipleLinearIntValues(ctx *cli.Context, condition schema.MetricsCondition, labels []string, duration schema.Duration) []schema.MetricsValues {
-	var response map[string][]schema.MetricsValues
+func MultipleLinearIntValues(ctx *cli.Context, condition api.MetricsCondition, labels []string, duration api.Duration) []api.MetricsValues {
+	var response map[string][]api.MetricsValues
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/LabeledMetricsValues.graphql"))
 
@@ -66,8 +65,8 @@ func MultipleLinearIntValues(ctx *cli.Context, condition schema.MetricsCondition
 	return response["result"]
 }
 
-func Thermodynamic(ctx *cli.Context, condition schema.MetricsCondition, duration schema.Duration) schema.HeatMap {
-	var response map[string]schema.HeatMap
+func Thermodynamic(ctx *cli.Context, condition api.MetricsCondition, duration api.Duration) api.HeatMap {
+	var response map[string]api.HeatMap
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/HeatMap.graphql"))
 
@@ -79,8 +78,8 @@ func Thermodynamic(ctx *cli.Context, condition schema.MetricsCondition, duration
 	return response["result"]
 }
 
-func SortMetrics(ctx *cli.Context, condition schema.TopNCondition, duration schema.Duration) []*schema.SelectedRecord {
-	var response map[string][]*schema.SelectedRecord
+func SortMetrics(ctx *cli.Context, condition api.TopNCondition, duration api.Duration) []*api.SelectedRecord {
+	var response map[string][]*api.SelectedRecord
 
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/SortMetrics.graphql"))
 	request.Var("condition", condition)
@@ -91,8 +90,8 @@ func SortMetrics(ctx *cli.Context, condition schema.TopNCondition, duration sche
 	return response["result"]
 }
 
-func ListMetrics(ctx *cli.Context, regex string) []*schema.MetricDefinition {
-	var response map[string][]*schema.MetricDefinition
+func ListMetrics(ctx *cli.Context, regex string) []*api.MetricDefinition {
+	var response map[string][]*api.MetricDefinition
 	request := graphql.NewRequest(assets.Read("graphqls/metrics/ListMetrics.graphql"))
 	request.Var("regex", regex)
 
diff --git a/graphql/trace/trace.go b/pkg/graphql/trace/trace.go
similarity index 80%
rename from graphql/trace/trace.go
rename to pkg/graphql/trace/trace.go
index fab21e7..f4de9f0 100644
--- a/graphql/trace/trace.go
+++ b/pkg/graphql/trace/trace.go
@@ -18,16 +18,16 @@
 package trace
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"github.com/machinebox/graphql"
 	"github.com/urfave/cli"
 
 	"github.com/apache/skywalking-cli/assets"
-	"github.com/apache/skywalking-cli/graphql/client"
-	"github.com/apache/skywalking-cli/graphql/schema"
+	"github.com/apache/skywalking-cli/pkg/graphql/client"
 )
 
-func Trace(ctx *cli.Context, traceID string) schema.Trace {
-	var response map[string]schema.Trace
+func Trace(ctx *cli.Context, traceID string) api.Trace {
+	var response map[string]api.Trace
 
 	request := graphql.NewRequest(assets.Read("graphqls/trace/Trace.graphql"))
 	request.Var("traceId", traceID)
@@ -37,8 +37,8 @@ func Trace(ctx *cli.Context, traceID string) schema.Trace {
 	return response["result"]
 }
 
-func Traces(ctx *cli.Context, condition *schema.TraceQueryCondition) schema.TraceBrief {
-	var response map[string]schema.TraceBrief
+func Traces(ctx *cli.Context, condition *api.TraceQueryCondition) api.TraceBrief {
+	var response map[string]api.TraceBrief
 
 	request := graphql.NewRequest(assets.Read("graphqls/trace/Traces.graphql"))
 	request.Var("condition", condition)
diff --git a/graphql/utils/adapter.go b/pkg/graphql/utils/adapter.go
similarity index 84%
rename from graphql/utils/adapter.go
rename to pkg/graphql/utils/adapter.go
index 1f5918f..1ada5f0 100644
--- a/graphql/utils/adapter.go
+++ b/pkg/graphql/utils/adapter.go
@@ -18,16 +18,16 @@
 package utils
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"strconv"
 	"strings"
 	"time"
 
-	"github.com/apache/skywalking-cli/graphql/schema"
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 // MetricsValuesArrayToMap converts Array of MetricsValues into a map that uses time as key.
-func MetricsValuesArrayToMap(duration schema.Duration, mvArray []schema.MetricsValues) []map[string]float64 {
+func MetricsValuesArrayToMap(duration api.Duration, mvArray []api.MetricsValues) []map[string]float64 {
 	ret := make([]map[string]float64, len(mvArray))
 	for _, mvs := range mvArray {
 		index, err := strconv.Atoi(strings.TrimSpace(*mvs.Label))
@@ -41,7 +41,7 @@ func MetricsValuesArrayToMap(duration schema.Duration, mvArray []schema.MetricsV
 }
 
 // MetricsValuesToMap converts MetricsValues into a map that uses time as key.
-func MetricsValuesToMap(duration schema.Duration, metricsValues schema.MetricsValues) map[string]float64 {
+func MetricsValuesToMap(duration api.Duration, metricsValues api.MetricsValues) map[string]float64 {
 	kvInts := metricsValues.Values.Values
 	ret := map[string]float64{}
 	format := StepFormats[duration.Step]
@@ -60,7 +60,7 @@ func MetricsValuesToMap(duration schema.Duration, metricsValues schema.MetricsVa
 }
 
 // HeatMapToMap converts a HeatMap into a map that uses time as key.
-func HeatMapToMap(hp *schema.HeatMap) map[string][]int64 {
+func HeatMapToMap(hp *api.HeatMap) map[string][]int64 {
 	ret := make(map[string][]int64)
 	for _, col := range hp.Values {
 		// col.id is a string represents date, like "202007292131",
@@ -78,7 +78,7 @@ func HeatMapToMap(hp *schema.HeatMap) map[string][]int64 {
 }
 
 // BucketsToStrings extracts strings from buckets as a chart's labels.
-func BucketsToStrings(buckets []*schema.Bucket) []string {
+func BucketsToStrings(buckets []*api.Bucket) []string {
 	var ret []string
 	for _, b := range buckets {
 		ret = append(ret, b.Min)
diff --git a/graphql/utils/adapter_test.go b/pkg/graphql/utils/adapter_test.go
similarity index 86%
rename from graphql/utils/adapter_test.go
rename to pkg/graphql/utils/adapter_test.go
index 1d8270d..f5d1444 100644
--- a/graphql/utils/adapter_test.go
+++ b/pkg/graphql/utils/adapter_test.go
@@ -18,16 +18,15 @@
 package utils
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"reflect"
 	"testing"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 func TestMetricsToMap(t *testing.T) {
 	type args struct {
-		duration      schema.Duration
-		metricsValues schema.MetricsValues
+		duration      api.Duration
+		metricsValues api.MetricsValues
 	}
 	tests := []struct {
 		name string
@@ -37,14 +36,14 @@ func TestMetricsToMap(t *testing.T) {
 		{
 			name: "Should convert to map",
 			args: args{
-				duration: schema.Duration{
+				duration: api.Duration{
 					Start: "2020-01-01 0000",
 					End:   "2020-01-01 0007",
-					Step:  schema.StepMinute,
+					Step:  api.StepMinute,
 				},
-				metricsValues: schema.MetricsValues{
-					Values: &schema.IntValues{
-						Values: []*schema.KVInt{
+				metricsValues: api.MetricsValues{
+					Values: &api.IntValues{
+						Values: []*api.KVInt{
 							{Value: 0},
 							{Value: 1},
 							{Value: 2},
diff --git a/graphql/utils/constants.go b/pkg/graphql/utils/constants.go
similarity index 74%
rename from graphql/utils/constants.go
rename to pkg/graphql/utils/constants.go
index 2f527e3..1b81b7a 100644
--- a/graphql/utils/constants.go
+++ b/pkg/graphql/utils/constants.go
@@ -18,25 +18,24 @@
 package utils
 
 import (
+	"github.com/apache/skywalking-cli/api"
 	"time"
-
-	"github.com/apache/skywalking-cli/graphql/schema"
 )
 
 // StepFormats is a mapping from schema.Step to its time format
-var StepFormats = map[schema.Step]string{
-	schema.StepSecond: "2006-01-02 150405",
-	schema.StepMinute: "2006-01-02 1504",
-	schema.StepHour:   "2006-01-02 15",
-	schema.StepDay:    "2006-01-02",
+var StepFormats = map[api.Step]string{
+	api.StepSecond: "2006-01-02 150405",
+	api.StepMinute: "2006-01-02 1504",
+	api.StepHour:   "2006-01-02 15",
+	api.StepDay:    "2006-01-02",
 }
 
 // StepDuration is a mapping from schema.Step to its time.Duration
-var StepDuration = map[schema.Step]time.Duration{
-	schema.StepSecond: time.Second,
-	schema.StepMinute: time.Minute,
-	schema.StepHour:   time.Hour,
-	schema.StepDay:    time.Hour * 24,
+var StepDuration = map[api.Step]time.Duration{
+	api.StepSecond: time.Second,
+	api.StepMinute: time.Minute,
+	api.StepHour:   time.Hour,
+	api.StepDay:    time.Hour * 24,
 }
 
 type DurationType string
diff --git a/grpc/health.go b/pkg/healthcheck/grpc.go
similarity index 97%
rename from grpc/health.go
rename to pkg/healthcheck/grpc.go
index 3b83ad2..f4c6357 100644
--- a/grpc/health.go
+++ b/pkg/healthcheck/grpc.go
@@ -15,14 +15,14 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package grpc
+package healthcheck
 
 import (
 	"context"
 	"crypto/tls"
 	"time"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
diff --git a/lib/heatmap/axes/axes.go b/pkg/heatmap/axes/axes.go
similarity index 100%
rename from lib/heatmap/axes/axes.go
rename to pkg/heatmap/axes/axes.go
diff --git a/lib/heatmap/axes/label.go b/pkg/heatmap/axes/label.go
similarity index 97%
rename from lib/heatmap/axes/label.go
rename to pkg/heatmap/axes/label.go
index e797dae..f1d0b53 100644
--- a/lib/heatmap/axes/label.go
+++ b/pkg/heatmap/axes/label.go
@@ -108,7 +108,7 @@ func xLabels(yEnd image.Point, graphWidth int, stringLabels []string, cellWidth
 
 // paddedLabelLength calculates the length of the padded label and
 // the column index corresponding to the label.
-// For example, the longest label's length is 5, like '12:34', and the cell's width is 3.
+// For examples, the longest label's length is 5, like '12:34', and the cell's width is 3.
 // So in order to better display, every three cells will display a label,
 // the label belongs to the middle column of the three columns,
 // and the padded length is 3*3, which is 9.
diff --git a/lib/heatmap/heatmap.go b/pkg/heatmap/heatmap.go
similarity index 99%
rename from lib/heatmap/heatmap.go
rename to pkg/heatmap/heatmap.go
index cdc466f..5c87730 100644
--- a/lib/heatmap/heatmap.go
+++ b/pkg/heatmap/heatmap.go
@@ -25,7 +25,7 @@ import (
 	"sort"
 	"sync"
 
-	"github.com/apache/skywalking-cli/lib/heatmap/axes"
+	"github.com/apache/skywalking-cli/pkg/heatmap/axes"
 
 	"github.com/mum4k/termdash/cell"
 	"github.com/mum4k/termdash/private/area"
diff --git a/lib/heatmap/options.go b/pkg/heatmap/options.go
similarity index 100%
rename from lib/heatmap/options.go
rename to pkg/heatmap/options.go
diff --git a/util/io.go b/pkg/util/io.go
similarity index 96%
rename from util/io.go
rename to pkg/util/io.go
index ee65b8e..3e957f4 100644
--- a/util/io.go
+++ b/pkg/util/io.go
@@ -21,7 +21,7 @@ import (
 	"os/user"
 	"strings"
 
-	"github.com/apache/skywalking-cli/logger"
+	"github.com/apache/skywalking-cli/internal/logger"
 )
 
 // UserHomeDir returns the current user's home directory absolute path,
diff --git a/util/lang.go b/pkg/util/lang.go
similarity index 100%
rename from util/lang.go
rename to pkg/util/lang.go
diff --git a/util/math.go b/pkg/util/math.go
similarity index 100%
rename from util/math.go
rename to pkg/util/math.go
diff --git a/hack/boilerplate.go.txt b/scripts/boilerplate.go.txt
similarity index 100%
rename from hack/boilerplate.go.txt
rename to scripts/boilerplate.go.txt
diff --git a/hack/build-header.sh b/scripts/build-header.sh
similarity index 100%
rename from hack/build-header.sh
rename to scripts/build-header.sh
diff --git a/test/test_commands.sh b/scripts/test_commands.sh
similarity index 100%
rename from test/test_commands.sh
rename to scripts/test_commands.sh