Add Owner and PublicName fields to TownConfig (gt-6r18e.3)

Adds federation identity fields to town.json:
- Owner: email address for entity identity (defaults to git user.email)
- PublicName: public display name (defaults to town name)

Schema version bumped to 2. Existing town.json files remain compatible
as new fields are optional.

Also adds --owner and --public-name flags to 'gt install'.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-30 16:17:18 -08:00
parent 2112804aba
commit 4d4f23eb18
2 changed files with 39 additions and 15 deletions

View File

@@ -17,12 +17,14 @@ import (
) )
var ( var (
installForce bool installForce bool
installName string installName string
installNoBeads bool installOwner string
installGit bool installPublicName string
installGitHub string installNoBeads bool
installPrivate bool installGit bool
installGitHub string
installPrivate bool
) )
var installCmd = &cobra.Command{ var installCmd = &cobra.Command{
@@ -56,6 +58,8 @@ Examples:
func init() { func init() {
installCmd.Flags().BoolVarP(&installForce, "force", "f", false, "Overwrite existing HQ") installCmd.Flags().BoolVarP(&installForce, "force", "f", false, "Overwrite existing HQ")
installCmd.Flags().StringVarP(&installName, "name", "n", "", "Town name (defaults to directory name)") installCmd.Flags().StringVarP(&installName, "name", "n", "", "Town name (defaults to directory name)")
installCmd.Flags().StringVar(&installOwner, "owner", "", "Owner email for entity identity (defaults to git config user.email)")
installCmd.Flags().StringVar(&installPublicName, "public-name", "", "Public display name (defaults to town name)")
installCmd.Flags().BoolVar(&installNoBeads, "no-beads", false, "Skip town beads initialization") installCmd.Flags().BoolVar(&installNoBeads, "no-beads", false, "Skip town beads initialization")
installCmd.Flags().BoolVar(&installGit, "git", false, "Initialize git with .gitignore") installCmd.Flags().BoolVar(&installGit, "git", false, "Initialize git with .gitignore")
installCmd.Flags().StringVar(&installGitHub, "github", "", "Create GitHub repo (format: owner/repo)") installCmd.Flags().StringVar(&installGitHub, "github", "", "Create GitHub repo (format: owner/repo)")
@@ -115,12 +119,29 @@ func runInstall(cmd *cobra.Command, args []string) error {
} }
fmt.Printf(" ✓ Created mayor/\n") fmt.Printf(" ✓ Created mayor/\n")
// Determine owner (defaults to git user.email)
owner := installOwner
if owner == "" {
out, err := exec.Command("git", "config", "user.email").Output()
if err == nil {
owner = strings.TrimSpace(string(out))
}
}
// Determine public name (defaults to town name)
publicName := installPublicName
if publicName == "" {
publicName = townName
}
// Create town.json in mayor/ // Create town.json in mayor/
townConfig := &config.TownConfig{ townConfig := &config.TownConfig{
Type: "town", Type: "town",
Version: config.CurrentTownVersion, Version: config.CurrentTownVersion,
Name: townName, Name: townName,
CreatedAt: time.Now(), Owner: owner,
PublicName: publicName,
CreatedAt: time.Now(),
} }
townPath := filepath.Join(mayorDir, "town.json") townPath := filepath.Join(mayorDir, "town.json")
if err := config.SaveTownConfig(townPath, townConfig); err != nil { if err := config.SaveTownConfig(townPath, townConfig); err != nil {

View File

@@ -8,10 +8,12 @@ import (
// TownConfig represents the main town identity (mayor/town.json). // TownConfig represents the main town identity (mayor/town.json).
type TownConfig struct { type TownConfig struct {
Type string `json:"type"` // "town" Type string `json:"type"` // "town"
Version int `json:"version"` // schema version Version int `json:"version"` // schema version
Name string `json:"name"` // town identifier Name string `json:"name"` // town identifier (internal)
CreatedAt time.Time `json:"created_at"` Owner string `json:"owner,omitempty"` // owner email (entity identity)
PublicName string `json:"public_name,omitempty"` // public display name
CreatedAt time.Time `json:"created_at"`
} }
// MayorConfig represents town-level behavioral configuration (mayor/config.json). // MayorConfig represents town-level behavioral configuration (mayor/config.json).
@@ -70,7 +72,8 @@ type AgentState struct {
} }
// CurrentTownVersion is the current schema version for TownConfig. // CurrentTownVersion is the current schema version for TownConfig.
const CurrentTownVersion = 1 // Version 2: Added Owner and PublicName fields for federation identity.
const CurrentTownVersion = 2
// CurrentRigsVersion is the current schema version for RigsConfig. // CurrentRigsVersion is the current schema version for RigsConfig.
const CurrentRigsVersion = 1 const CurrentRigsVersion = 1