docs: def ls_packages(self):
          """
          List packages in this store.
          """
          packages = []
          pkgdir = os.path.join(self._path, self.PKG_DIR)
          if not os.path.isdir(pkgdir):
              return []
          for team in sub_dirs(pkgdir):
              for user in sub_dirs(self.team_path(team)):
                  for pkg in sub_dirs(self.user_path(team, user)):
                      pkgpath = self.package_path(team, user, pkg)
                      pkgmap = {h : [] for h in sub_files(os.path.join(pkgpath, PackageStore.CONTENTS_DIR))}
                      for tag in sub_files(os.path.join(pkgpath, PackageStore.TAGS_DIR)):
                          with open(os.path.join(pkgpath, PackageStore.TAGS_DIR, tag), 'r') as tagfile:
                              pkghash = tagfile.read()
                              pkgmap[pkghash].append(tag)
                      for pkghash, tags in pkgmap.items():
                          # add teams here if any other than DEFAULT_TEAM should be hidden.
                          team_token = '' if team in (DEFAULT_TEAM,) else team + ':'
                          fullpkg = "{team}{owner}/{pkg}".format(team=team_token, owner=user, pkg=pkg)
                          # Add an empty string tag for untagged hashes
                          displaytags = tags if tags else [""]
                          # Display a separate full line per tag like Docker
                          for tag in displaytags:
                              packages.append((fullpkg, str(tag), pkghash))
  
          return packages