- validate: offline hard rules (all+include, exclude-without-all, orphaned include entries vs pinned inventory) and lockfile/external-area divergence - vendor list: name/url/ref/rev/mode/item counts, human + json - vendor inspect: per-type inventory with frontmatter metadata and recorded warnings read from the external area, human + json - exit code 1 on invalid state for headless drift checks
63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/m3tam3re/agent-lib/internal/vendor"
|
|
)
|
|
|
|
func newVendorCmd() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "vendor",
|
|
Short: "Curate external sources into this work repository",
|
|
}
|
|
cmd.AddCommand(newVendorAddCmd())
|
|
cmd.AddCommand(newVendorListCmd())
|
|
cmd.AddCommand(newVendorInspectCmd())
|
|
return cmd
|
|
}
|
|
|
|
func newVendorAddCmd() *cobra.Command {
|
|
var ref string
|
|
var include []string
|
|
cmd := &cobra.Command{
|
|
Use: "add <name> <url>",
|
|
Short: "Vendor a new external git source",
|
|
Long: "Clones the source (in-process, via go-git), discovers skills, commands,\n" +
|
|
"agents and MCP fragments, materializes the selection under external/<name>/\n" +
|
|
"and pins URL, ref, revision, selection and renames in the lockfile.\n" +
|
|
"Default selection is everything; --include switches to an explicit list.",
|
|
Args: cobra.ExactArgs(2),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
opts := vendor.AddOptions{
|
|
Name: args[0],
|
|
URL: args[1],
|
|
Ref: ref,
|
|
Include: splitList(include),
|
|
}
|
|
if err := vendor.Add(".", opts, cmd.OutOrStdout()); err != nil {
|
|
return fmt.Errorf("vendor add: %w", err)
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
cmd.Flags().StringVar(&ref, "ref", "", "branch or tag to track (default: the source's default branch)")
|
|
cmd.Flags().StringSliceVar(&include, "include", nil, "comma-separated item ids to vendor (switches selection to include mode)")
|
|
return cmd
|
|
}
|
|
|
|
func splitList(in []string) []string {
|
|
var out []string
|
|
for _, s := range in {
|
|
for _, part := range strings.Split(s, ",") {
|
|
if t := strings.TrimSpace(part); t != "" {
|
|
out = append(out, t)
|
|
}
|
|
}
|
|
}
|
|
return out
|
|
}
|