agentleFS
colonyopscolonyops/hive/.agents/skills/go-enum/SKILL.md

go-enum

Skill41 starsChanged 7 days agoMITView on GitHub

Define and extend Go enums using the go-enum code generator. Use when adding new enum types, extending existing ones, or running generation after changes.

The file

We split this skill into the rules it gives an agent

10 rules. About 0 are common, 2 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    After any change to an // ENUM(...) comment or adding a new enum type:

    line 33
  2. Very specific:

    Add the value to the // ENUM(...) comment:

    line 42
  3. Very specific:

    Update any switch statements or OneOf validators that enumerate values.

    line 53
  4. Distinctive:

    Create the type with the ENUM comment in the appropriate source file:

    line 57
  5. Very specific:

    Run mise run generate:enums.

    line 66
  6. Distinctive:

    Never define the constants manually — the generator owns them.

    line 68
  7. Very specific:

    If a source file defines multiple enum types, all are generated into the same _enum.go file.

    line 76
  8. Very specific:

    When a column stores an enum, the generated go-enum type satisfies driver.Valuer/sql.Scanner via its MarshalText/UnmarshalText methods.

    line 80
  9. Very specific:

    Use criterio.OneOf(...) to validate enum fields, listing all valid constants explicitly:

    line 94
  10. Very specific:

    Do not call i.Type.IsValid() inside criterio — OneOf is more readable and produces better error messages.

    line 100

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

go-enum in Hive

Hive uses go-enum to generate enum methods from // ENUM(...) comments. Generated files are committed — never edit them manually.

How It Works

Define an enum type with a special comment:

// ItemType categorizes an HC item.
//
// ENUM(epic, task)
type ItemType string

go-enum reads the comment and generates item_enum.go (or the file named after the type's source file with _enum suffix) containing:

  • ParseItemType(s string) (ItemType, error)
  • (t ItemType) IsValid() bool
  • (t ItemType) String() string
  • (t ItemType) MarshalText() ([]byte, error) / UnmarshalText([]byte) error
  • ItemTypeValues() []ItemType
  • Constants: ItemTypeEpic, ItemTypeTask

Running Generation

After any change to an // ENUM(...) comment or adding a new enum type:

mise run generate:enums    # go-enum only
mise run generate          # all generators (go-enum + sqlc)

Adding a New Enum Value

  1. Add the value to the // ENUM(...) comment:
// ENUM(epic, task, milestone)
type ItemType string
  1. Run mise run generate:enums.
  2. The new constant ItemTypeMillestone and ParseItemType("milestone") are available.
  3. Update any switch statements or OneOf validators that enumerate values.

Adding a New Enum Type

  1. Create the type with the ENUM comment in the appropriate source file:
// Priority ranks the urgency of an item.
//
// ENUM(low, medium, high, critical)
type Priority string
  1. Run mise run generate:enums. A new *_enum.go file is generated next to the source.
  2. Never define the constants manually — the generator owns them.

Generated File Naming

go-enum creates files named <source_file_stem>_enum.go. Examples:

  • item.go → item_enum.go
  • activity.go → activity_enum.go

If a source file defines multiple enum types, all are generated into the same _enum.go file.

Integration with sqlc

When a column stores an enum, the generated go-enum type satisfies driver.Valuer/sql.Scanner via its MarshalText/UnmarshalText methods. Add an override to sqlc.yaml:

overrides:
  - column: "hc_items.type"
    go_type:
      import: "github.com/colonyops/hive/internal/domain/hc"
      type: "ItemType"

This lets sqlc use hc.ItemType directly in generated query params/returns — no string conversion needed in the store layer.

Integration with criterio Validation

Use criterio.OneOf(...) to validate enum fields, listing all valid constants explicitly:

criterio.Run("type", i.Type, criterio.OneOf(ItemTypeEpic, ItemTypeTask))

Do not call i.Type.IsValid() inside criterio — OneOf is more readable and produces better error messages.

Gotchas

  • Never edit *_enum.go files — they are overwritten on every generation run.
  • Zero value is not a valid enum. An unset ItemType("") will fail IsValid() and OneOf checks. Always initialize enum fields.
  • String values match the ENUM comment exactly (lowercase by default). ItemTypeEpic has string value "epic".
  • mise run generate:enums sources are listed in mise.toml under [tasks."generate:enums"]. If you add a new source file containing an ENUM, add it to the sources list so mise detects changes correctly.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.