generate command
keel generate [type] [name]Alias:
keel g [type] [name]Project requirements
Section titled “Project requirements”generate only works inside a project with:
go.modcmd/main.gointernal/folder
If not met, it returns:
keel generate must be executed inside a Keel projectname format
Section titled “name format”Two formats are supported:
- standalone:
users - module/component:
users/create
Rules validated by the CLI:
- only letters, numbers,
-,_ - at most one
/ - not empty
module only accepts standalone format (users), not users/x.
Supported types
Section titled “Supported types”| Type | Standalone | module/component | Main location |
|---|---|---|---|
module | Yes | No | internal/modules/<module>/ |
service | Yes | Yes | internal/services/ or internal/modules/<module>/ |
controller | Yes | Yes | internal/controllers/ or internal/modules/<module>/ |
repository | No | Yes | internal/modules/<module>/ |
middleware | Yes | No | internal/middleware/ |
guard | Yes | No | internal/guards/ |
scheduler | Yes | No | internal/scheduler/ |
event | Yes | No | internal/events/ |
checker | Yes | No | internal/checkers/ |
hook | Yes | No | internal/hooks/ |
Type aliases
Section titled “Type aliases”| Alias | Real type |
|---|---|
m, mod | module |
s, svc | service |
c, ctrl | controller |
r, repo | repository |
mw | middleware |
gd | guard |
sch | scheduler |
ev | event |
chk | checker |
hk | hook |
| Flag | Applies to | Effect |
|---|---|---|
--transactional | module | Generates module without controller |
--gorm | module, repository | Generates a GORM-backed repository; installs ss-keel-gorm if absent |
--mongo | module, repository | Generates a Mongo-backed repository; installs ss-keel-mongo if absent |
--in-main | standalone controller | Inserts inline route in cmd/main.go without a controller file |
Invalid combinations return an explicit error, for example:
--transactionaloutside ofmodule--gormor--mongooutside ofmoduleorrepository--gormand--mongoused together--in-mainoutside of standalonecontroller
Automatic wiring in cmd/main.go
Section titled “Automatic wiring in cmd/main.go”Depending on the generated type, the CLI may:
- add missing imports
- initialize
appLoggerif it doesn’t exist - register modules:
app.Use(...) - register controllers:
app.RegisterController(...) - register scheduler/checker/hook
- create inline controller with
contracts.ControllerFunc(--in-main) - run
go mod tidyaftermodulegeneration finishes wiring the project
module scaffold output
Section titled “module scaffold output”keel generate module users creates the base module scaffold under internal/modules/users/:
users_module.gousers_module_test.gousers_dto.gousers_entity.gousers_service.gousers_service_test.gousers_controller.gousers_controller_test.go
It also updates cmd/main.go with app.Use(users.NewModule(appLogger)).
If you use --gorm or --mongo, the CLI also generates:
users_repository.gousers_repository_test.go
And cmd/main.go is wired with the matching dependency:
app.Use(users.NewModule(appLogger, db))for--gormapp.Use(users.NewModule(appLogger, mongoClient))for--mongo
If you use --transactional, controller files are omitted and the generated module is wired without HTTP handlers.
Behavior with existing files
Section titled “Behavior with existing files”- For
module: if a file already exists, it is not overwritten; it continues with the rest. - For most non-module types: if the target file exists, it fails with
file already exists: ....
Examples
Section titled “Examples”Full module:
keel g module usersTransactional module (no controller):
keel g module payments --transactionalModule with GORM repository:
keel g module payments --gormService inside a module:
keel g service users/validate-emailStandalone controller inlined in main:
keel g controller ops-ping --in-mainScheduler/checker/hook:
keel g scheduler nightly-jobskeel g checker rediskeel g hook shutdownCommon errors
Section titled “Common errors”unsupported generator type: ...invalid name: ...module name must not contain '/'file already exists: ...module package mismatch: expected 'x', found 'y' in <file>
Recommendations
Section titled “Recommendations”- Use
modulefor business domains (users,orders,payments). - Use standalone for cross-cutting pieces (
middleware,scheduler,hooks). - Always review the
cmd/main.godiff after each generation.