@@ -3,7 +3,6 @@ package core
 import (
 	"fmt"
 	"regexp"
-	"strconv"
 	"strings"
 
 	"github.com/MichaelMure/git-bug/repository"
@@ -13,13 +12,12 @@ const (
 	tokenConfigKeyPrefix = "git-bug.token"
 	tokenKeyValue        = "value"
 	tokenKeyTarget       = "target"
-	tokenKeyGlobal       = "global"
 	tokenKeyScopes       = "scopes"
 )
 
 // Token represent token related informations
 type Token struct {
-	Name   string
+	Id     string
 	Value  string
 	Target string
 	Global bool
@@ -27,9 +25,9 @@ type Token struct {
 }
 
 // NewToken instantiate a new token
-func NewToken(name, value, target string, global bool, scopes []string) *Token {
+func NewToken(id, value, target string, global bool, scopes []string) *Token {
 	return &Token{
-		Name:   name,
+		Id:     id,
 		Value:  value,
 		Target: target,
 		Global: global,
@@ -39,8 +37,8 @@ func NewToken(name, value, target string, global bool, scopes []string) *Token {
 
 // Validate ensure token important fields are valid
 func (t *Token) Validate() error {
-	if t.Name == "" {
-		return fmt.Errorf("missing token name")
+	if t.Id == "" {
+		return fmt.Errorf("missing token id")
 	}
 	if t.Value == "" {
 		return fmt.Errorf("missing token value")
@@ -51,8 +49,8 @@ func (t *Token) Validate() error {
 	return nil
 }
 
-func loadToken(repo repository.RepoConfig, name string, global bool) (*Token, error) {
-	keyPrefix := fmt.Sprintf("git-bug.token.%s", name)
+func loadToken(repo repository.RepoConfig, id string, global bool) (*Token, error) {
+	keyPrefix := fmt.Sprintf("git-bug.token.%s.", id)
 	var pairs map[string]string
 	var err error
 
@@ -62,7 +60,6 @@ func loadToken(repo repository.RepoConfig, name string, global bool) (*Token, er
 		if err != nil {
 			return nil, err
 		}
-
 	} else {
 		pairs, err = repo.ReadConfigs(keyPrefix)
 		if err != nil {
@@ -78,7 +75,7 @@ func loadToken(repo repository.RepoConfig, name string, global bool) (*Token, er
 	}
 
 	var ok bool
-	token := &Token{Name: name}
+	token := &Token{Id: id, Global: global}
 	token.Value, ok = result[tokenKeyValue]
 	if !ok {
 		return nil, fmt.Errorf("empty token value")
@@ -89,12 +86,6 @@ func loadToken(repo repository.RepoConfig, name string, global bool) (*Token, er
 		return nil, fmt.Errorf("empty token key")
 	}
 
-	if g, ok := result[tokenKeyGlobal]; !ok {
-		return nil, fmt.Errorf("empty token global")
-	} else if g == "true" {
-		token.Global = true
-	}
-
 	scopesString, ok := result[tokenKeyScopes]
 	if !ok {
 		return nil, fmt.Errorf("missing scopes config")
@@ -105,25 +96,25 @@ func loadToken(repo repository.RepoConfig, name string, global bool) (*Token, er
 }
 
 // GetToken loads a token from repo config
-func GetToken(repo repository.RepoConfig, name string) (*Token, error) {
-	return loadToken(repo, name, false)
+func GetToken(repo repository.RepoConfig, id string) (*Token, error) {
+	return loadToken(repo, id, false)
 }
 
 // GetGlobalToken loads a token from the global config
-func GetGlobalToken(repo repository.RepoConfig, name string) (*Token, error) {
-	return loadToken(repo, name, true)
+func GetGlobalToken(repo repository.RepoConfig, id string) (*Token, error) {
+	return loadToken(repo, id, true)
 }
 
 func listTokens(repo repository.RepoConfig, global bool) ([]string, error) {
 	var configs map[string]string
 	var err error
 	if global {
-		configs, err = repo.ReadConfigs(tokenConfigKeyPrefix + ".")
+		configs, err = repo.ReadGlobalConfigs(tokenConfigKeyPrefix + ".")
 		if err != nil {
 			return nil, err
 		}
 	} else {
-		configs, err = repo.ReadGlobalConfigs(tokenConfigKeyPrefix + ".")
+		configs, err = repo.ReadConfigs(tokenConfigKeyPrefix + ".")
 		if err != nil {
 			return nil, err
 		}
@@ -175,25 +166,19 @@ func storeToken(repo repository.RepoConfig, token *Token) error {
 	}
 
 	var err error
-	storeValueKey := fmt.Sprintf("git-bug.token.%s.%s", token.Name, tokenKeyValue)
+	storeValueKey := fmt.Sprintf("git-bug.token.%s.%s", token.Id, tokenKeyValue)
 	err = store(storeValueKey, token.Value)
 	if err != nil {
 		return err
 	}
 
-	storeTargetKey := fmt.Sprintf("git-bug.token.%s.%s", token.Name, tokenKeyTarget)
+	storeTargetKey := fmt.Sprintf("git-bug.token.%s.%s", token.Id, tokenKeyTarget)
 	err = store(storeTargetKey, token.Target)
 	if err != nil {
 		return err
 	}
 
-	storeGlobalKey := fmt.Sprintf("git-bug.token.%s.%s", token.Name, tokenKeyGlobal)
-	err = store(storeGlobalKey, strconv.FormatBool(token.Global))
-	if err != nil {
-		return err
-	}
-
-	storeScopesKey := fmt.Sprintf("git-bug.token.%s.%s", token.Name, tokenKeyScopes)
+	storeScopesKey := fmt.Sprintf("git-bug.token.%s.%s", token.Id, tokenKeyScopes)
 	err = store(storeScopesKey, strings.Join(token.Scopes, ","))
 	if err != nil {
 		return err
@@ -203,23 +188,23 @@ func storeToken(repo repository.RepoConfig, token *Token) error {
 }
 
 // StoreToken stores a token in the repo config
-func StoreToken(repo repository.RepoConfig, name, value, target string, scopes []string) error {
-	return storeToken(repo, NewToken(name, value, target, false, scopes))
+func StoreToken(repo repository.RepoConfig, token *Token) error {
+	return storeToken(repo, token)
 }
 
 // StoreGlobalToken stores a token in global config
-func StoreGlobalToken(repo repository.RepoConfig, name, value, target string, scopes []string) error {
-	return storeToken(repo, NewToken(name, value, target, true, scopes))
+func StoreGlobalToken(repo repository.RepoConfig, token *Token) error {
+	return storeToken(repo, token)
 }
 
 // RemoveToken removes a token from the repo config
-func RemoveToken(repo repository.RepoConfig, name string) error {
-	keyPrefix := fmt.Sprintf("git-bug.token.%s", name)
+func RemoveToken(repo repository.RepoConfig, id string) error {
+	keyPrefix := fmt.Sprintf("git-bug.token.%s", id)
 	return repo.RmConfigs(keyPrefix)
 }
 
 // RemoveGlobalToken removes a token from the repo config
-func RemoveGlobalToken(repo repository.RepoConfig, name string) error {
-	keyPrefix := fmt.Sprintf("git-bug.token.%s", name)
+func RemoveGlobalToken(repo repository.RepoConfig, id string) error {
+	keyPrefix := fmt.Sprintf("git-bug.token.%s", id)
 	return repo.RmGlobalConfigs(keyPrefix)
 }
  
  
  
    
    @@ -2,16 +2,18 @@ package commands
 
 import (
 	"fmt"
+	"strings"
 
 	"github.com/spf13/cobra"
 
 	"github.com/MichaelMure/git-bug/bridge/core"
 	"github.com/MichaelMure/git-bug/cache"
+	"github.com/MichaelMure/git-bug/util/colors"
 	"github.com/MichaelMure/git-bug/util/interrupt"
+	"github.com/MichaelMure/git-bug/util/text"
 )
 
 var (
-	bridgeTokenAll        bool
 	bridgeTokenLocalOnly  bool
 	bridgeTokenGlobalOnly bool
 )
@@ -24,25 +26,49 @@ func runTokenBridge(cmd *cobra.Command, args []string) error {
 	defer backend.Close()
 	interrupt.RegisterCleaner(backend.Close)
 
-	var tokens []string
-	if bridgeTokenLocalOnly || bridgeTokenAll {
+	var tokens []*core.Token
+	if !bridgeTokenGlobalOnly {
 		localTokens, err := core.ListTokens(backend)
 		if err != nil {
 			return err
 		}
-		tokens = localTokens
+
+		for _, id := range localTokens {
+			token, err := core.GetToken(repo, id)
+			if err != nil {
+				return err
+			}
+			tokens = append(tokens, token)
+		}
 	}
 
-	if bridgeTokenGlobalOnly || bridgeTokenAll {
+	if !bridgeTokenLocalOnly {
 		globalTokens, err := core.ListGlobalTokens(backend)
 		if err != nil {
 			return err
 		}
-		tokens = append(tokens, globalTokens...)
+
+		for _, id := range globalTokens {
+			token, err := core.GetGlobalToken(repo, id)
+			if err != nil {
+				return err
+			}
+			tokens = append(tokens, token)
+		}
 	}
 
-	for _, c := range tokens {
-		fmt.Println(c)
+	for _, token := range tokens {
+		valueFmt := text.LeftPadMaxLine(token.Value, 20, 0)
+		targetFmt := text.LeftPadMaxLine(token.Target, 10, 0)
+		scopesFmt := text.LeftPadMaxLine(strings.Join(token.Scopes, ","), 20, 0)
+
+		fmt.Printf("%s %s %s %s %s\n",
+			colors.Cyan(token.Id),
+			colors.Magenta(targetFmt),
+			colors.Yellow(token.Global),
+			valueFmt,
+			scopesFmt,
+		)
 	}
 	return nil
 }
@@ -57,8 +83,7 @@ var bridgeTokenCmd = &cobra.Command{
 
 func init() {
 	bridgeCmd.AddCommand(bridgeTokenCmd)
-	bridgeTokenCmd.Flags().BoolVarP(&bridgeTokenAll, "all", "a", false, "")
-	bridgeTokenCmd.Flags().BoolVarP(&bridgeTokenLocalOnly, "local", "l", true, "")
+	bridgeTokenCmd.Flags().BoolVarP(&bridgeTokenLocalOnly, "local", "l", false, "")
 	bridgeTokenCmd.Flags().BoolVarP(&bridgeTokenGlobalOnly, "global", "g", false, "")
 	bridgeTokenCmd.Flags().SortFlags = false
 }
  
  
  
    
    @@ -0,0 +1,44 @@
+package commands
+
+import (
+	"github.com/spf13/cobra"
+
+	"github.com/MichaelMure/git-bug/bridge/core"
+)
+
+var (
+	bridgeToken core.Token
+)
+
+func runBridgeTokenAdd(cmd *cobra.Command, args []string) error {
+	if bridgeToken.Global {
+		return core.StoreToken(
+			repo,
+			&bridgeToken,
+		)
+	}
+
+	return core.StoreGlobalToken(
+		repo,
+		&bridgeToken,
+	)
+}
+
+var bridgeTokenAddCmd = &cobra.Command{
+	Use:     "add",
+	Short:   "Configure and use bridge tokens.",
+	PreRunE: loadRepo,
+	RunE:    runBridgeTokenAdd,
+	Args:    cobra.NoArgs,
+}
+
+func init() {
+	bridgeTokenCmd.AddCommand(bridgeTokenAddCmd)
+	bridgeTokenAddCmd.Flags().StringVarP(&bridgeToken.Id, "id", "i", "", "")
+	bridgeTokenAddCmd.Flags().BoolVarP(&bridgeToken.Global, "global", "g", false, "")
+	bridgeTokenAddCmd.Flags().StringVarP(&bridgeToken.Value, "value", "v", "", "")
+	bridgeTokenAddCmd.Flags().StringVarP(&bridgeToken.Target, "target", "t", "", "")
+	bridgeTokenAddCmd.Flags().StringArrayVarP(&bridgeToken.Scopes, "scopes", "s", []string{}, "")
+	bridgeTokenAddCmd.Flags().SortFlags = false
+
+}