From c700b9e5901acfebc6c4428e7e407df5eed1ecfd Mon Sep 17 00:00:00 2001 From: Cory O'Daniel Date: Tue, 3 Feb 2026 16:05:55 -0800 Subject: [PATCH 1/2] add mass package list command Adds `mass pkg list ` to list all packages in an environment, displayed in a table with ID, Name, Bundle, and Status. Co-Authored-By: Claude Opus 4.5 --- cmd/package.go | 48 +++++++++++++++++++++++++++++++++++ docs/helpdocs/package/list.md | 16 ++++++++++++ pkg/api/genqlient.graphql | 1 + pkg/api/zz_generated.go | 9 +++++++ 4 files changed, 74 insertions(+) create mode 100644 docs/helpdocs/package/list.md diff --git a/cmd/package.go b/cmd/package.go index 0aca9e5..6fd39fa 100644 --- a/cmd/package.go +++ b/cmd/package.go @@ -13,6 +13,7 @@ import ( "github.com/massdriver-cloud/mass/docs/helpdocs" "github.com/massdriver-cloud/mass/pkg/api" + "github.com/massdriver-cloud/mass/pkg/cli" "github.com/massdriver-cloud/mass/pkg/commands/pkg" "github.com/massdriver-cloud/mass/pkg/files" "github.com/massdriver-cloud/mass/pkg/prettylogs" @@ -133,10 +134,21 @@ func NewCmdPkg() *cobra.Command { } pkgResetCmd.Flags().BoolP("force", "f", false, "Skip confirmation prompt") + pkgListCmd := &cobra.Command{ + Use: `list -`, + Short: "List packages in an environment", + Aliases: []string{"ls"}, + Example: `mass package list ecomm-prod`, + Long: helpdocs.MustRender("package/list"), + Args: cobra.ExactArgs(1), + RunE: runPkgList, + } + pkgCmd.AddCommand(pkgConfigureCmd) pkgCmd.AddCommand(pkgDeployCmd) pkgCmd.AddCommand(pkgExportCmd) pkgCmd.AddCommand(pkgGetCmd) + pkgCmd.AddCommand(pkgListCmd) pkgCmd.AddCommand(pkgPatchCmd) pkgCmd.AddCommand(pkgCreateCmd) pkgCmd.AddCommand(pkgVersionCmd) @@ -517,3 +529,39 @@ func runPkgReset(cmd *cobra.Command, args []string) error { return nil } + +func runPkgList(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + environmentSlug := args[0] + + cmd.SilenceUsage = true + + mdClient, mdClientErr := client.New() + if mdClientErr != nil { + return fmt.Errorf("error initializing massdriver client: %w", mdClientErr) + } + + env, err := api.GetEnvironment(ctx, mdClient, environmentSlug) + if err != nil { + return err + } + + tbl := cli.NewTable("ID", "Name", "Bundle", "Status") + + for _, p := range env.Packages { + name := "" + if p.Manifest != nil { + name = p.Manifest.Name + } + bundleName := "" + if p.Bundle != nil { + bundleName = p.Bundle.Name + } + tbl.AddRow(p.Slug, name, bundleName, p.Status) + } + + tbl.Print() + + return nil +} diff --git a/docs/helpdocs/package/list.md b/docs/helpdocs/package/list.md new file mode 100644 index 0000000..67288cf --- /dev/null +++ b/docs/helpdocs/package/list.md @@ -0,0 +1,16 @@ +# List Packages + +Lists all packages in a Massdriver environment. + +## Usage + +```bash +mass package list - +``` + +## Examples + +```bash +# List all packages in the "ecomm" project's "prod" environment +mass package list ecomm-prod +``` diff --git a/pkg/api/genqlient.graphql b/pkg/api/genqlient.graphql index dfabe1a..74dd5a0 100644 --- a/pkg/api/genqlient.graphql +++ b/pkg/api/genqlient.graphql @@ -234,6 +234,7 @@ query getEnvironmentById($organizationId: ID!, $id: ID!) { } packages { id + slug params artifacts { id diff --git a/pkg/api/zz_generated.go b/pkg/api/zz_generated.go index 2a0ebc2..8e4df1f 100644 --- a/pkg/api/zz_generated.go +++ b/pkg/api/zz_generated.go @@ -2759,6 +2759,8 @@ func (v *getEnvironmentByIdEnvironmentCostMonthlySummaryAverageCostSample) GetAm type getEnvironmentByIdEnvironmentPackagesPackage struct { // Unique identifier Id string `json:"id"` + // Package slug identifier + Slug string `json:"slug"` // Package configuration parameters Params map[string]any `json:"-"` // Artifacts provisioned by this package @@ -2774,6 +2776,9 @@ type getEnvironmentByIdEnvironmentPackagesPackage struct { // GetId returns getEnvironmentByIdEnvironmentPackagesPackage.Id, and is useful for accessing the field via an interface. func (v *getEnvironmentByIdEnvironmentPackagesPackage) GetId() string { return v.Id } +// GetSlug returns getEnvironmentByIdEnvironmentPackagesPackage.Slug, and is useful for accessing the field via an interface. +func (v *getEnvironmentByIdEnvironmentPackagesPackage) GetSlug() string { return v.Slug } + // GetParams returns getEnvironmentByIdEnvironmentPackagesPackage.Params, and is useful for accessing the field via an interface. func (v *getEnvironmentByIdEnvironmentPackagesPackage) GetParams() map[string]any { return v.Params } @@ -2836,6 +2841,8 @@ func (v *getEnvironmentByIdEnvironmentPackagesPackage) UnmarshalJSON(b []byte) e type __premarshalgetEnvironmentByIdEnvironmentPackagesPackage struct { Id string `json:"id"` + Slug string `json:"slug"` + Params json.RawMessage `json:"params"` Artifacts []getEnvironmentByIdEnvironmentPackagesPackageArtifactsArtifact `json:"artifacts"` @@ -2861,6 +2868,7 @@ func (v *getEnvironmentByIdEnvironmentPackagesPackage) __premarshalJSON() (*__pr var retval __premarshalgetEnvironmentByIdEnvironmentPackagesPackage retval.Id = v.Id + retval.Slug = v.Slug { dst := &retval.Params @@ -5764,6 +5772,7 @@ query getEnvironmentById ($organizationId: ID!, $id: ID!) { } packages { id + slug params artifacts { id From 2a32d29f30b8dd0554b71d0936359dda0a4cd99f Mon Sep 17 00:00:00 2001 From: Cory O'Daniel Date: Wed, 4 Feb 2026 15:48:55 -0800 Subject: [PATCH 2/2] mass docs --- docs/generated/mass_package.md | 1 + docs/generated/mass_package_list.md | 49 +++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 docs/generated/mass_package_list.md diff --git a/docs/generated/mass_package.md b/docs/generated/mass_package.md index 19c616b..3c90ac7 100644 --- a/docs/generated/mass_package.md +++ b/docs/generated/mass_package.md @@ -36,6 +36,7 @@ Packages are used to: * [mass package destroy](/cli/commands/mass_package_destroy) - Destroy (decommission) a package * [mass package export](/cli/commands/mass_package_export) - Export packages * [mass package get](/cli/commands/mass_package_get) - Get a package +* [mass package list](/cli/commands/mass_package_list) - List packages in an environment * [mass package patch](/cli/commands/mass_package_patch) - Patch individual package parameter values * [mass package reset](/cli/commands/mass_package_reset) - Reset package status to 'Initialized' * [mass package version](/cli/commands/mass_package_version) - Set package version diff --git a/docs/generated/mass_package_list.md b/docs/generated/mass_package_list.md new file mode 100644 index 0000000..c849001 --- /dev/null +++ b/docs/generated/mass_package_list.md @@ -0,0 +1,49 @@ +--- +id: mass_package_list.md +slug: /cli/commands/mass_package_list +title: Mass Package List +sidebar_label: Mass Package List +--- +## mass package list + +List packages in an environment + +### Synopsis + +# List Packages + +Lists all packages in a Massdriver environment. + +## Usage + +```bash +mass package list - +``` + +## Examples + +```bash +# List all packages in the "ecomm" project's "prod" environment +mass package list ecomm-prod +``` + + +``` +mass package list - [flags] +``` + +### Examples + +``` +mass package list ecomm-prod +``` + +### Options + +``` + -h, --help help for list +``` + +### SEE ALSO + +* [mass package](/cli/commands/mass_package) - Manage packages of IaC deployed in environments.