Files
stamp/cmd/stamp/cmd_preview.go
Thomas 8049c505a0 Add TUI add and preview commands
Use charmbracelet/huh for an interactive add flow. Add a preview
subcommand to enter/exit per-project pre-release tags. Move stamp.toml
into .stamp/ and add ConfigPath helper. Prefer --snapshot then project
PreTag when computing versions and promote bumps to pre-release when
appropriate. Export CurrentVersion and add required TUI deps to go.mod.
2026-03-12 22:59:20 +01:00

99 lines
2.5 KiB
Go

package main
import (
"context"
"fmt"
"github.com/urfave/cli/v3"
"git.thokra.dev/thokra/stamp/internal/config"
)
func previewCmd() *cli.Command {
return &cli.Command{
Name: "preview",
Usage: "manage pre-release mode for a project",
Commands: []*cli.Command{
{
Name: "enter",
Usage: "put a project into pre-release mode",
ArgsUsage: "<project> <tag>",
Action: func(ctx context.Context, cmd *cli.Command) error {
if cmd.Args().Len() < 2 {
return fmt.Errorf("usage: stamp preview enter <project> <tag>")
}
projectName := cmd.Args().Get(0)
tag := cmd.Args().Get(1)
repoRoot, err := findRepoRoot(".")
if err != nil {
return err
}
cfg, err := config.Load(repoRoot)
if err != nil {
return err
}
project := cfg.FindProject(projectName)
if project == nil {
return fmt.Errorf("project %q not found in stamp.toml", projectName)
}
if project.PreTag != "" {
return fmt.Errorf("project %q is already in pre-release mode with tag %q — run `stamp preview exit %s` first",
projectName, project.PreTag, projectName)
}
project.PreTag = tag
if err := config.Save(repoRoot, cfg); err != nil {
return fmt.Errorf("saving stamp.toml: %w", err)
}
fmt.Printf("🔬 %s is now in pre-release mode (tag: %s).\n", projectName, tag)
fmt.Printf(" `stamp version` will produce versions like 1.2.3-%s.0\n", tag)
return nil
},
},
{
Name: "exit",
Usage: "take a project out of pre-release mode",
ArgsUsage: "<project>",
Action: func(ctx context.Context, cmd *cli.Command) error {
if cmd.Args().Len() == 0 {
return fmt.Errorf("usage: stamp preview exit <project>")
}
projectName := cmd.Args().First()
repoRoot, err := findRepoRoot(".")
if err != nil {
return err
}
cfg, err := config.Load(repoRoot)
if err != nil {
return err
}
project := cfg.FindProject(projectName)
if project == nil {
return fmt.Errorf("project %q not found in stamp.toml", projectName)
}
if project.PreTag == "" {
return fmt.Errorf("project %q is not in pre-release mode", projectName)
}
project.PreTag = ""
if err := config.Save(repoRoot, cfg); err != nil {
return fmt.Errorf("saving stamp.toml: %w", err)
}
fmt.Printf("✓ %s is no longer in pre-release mode. The next `stamp version` will produce a normal release.\n", projectName)
return nil
},
},
},
}
}