ansible-automation-eng…
Ansible automation: playbooks, roles, collections, Molecule testing, Vault security.
Flag exported struct types that should be unexported because only their interface is public.
$ npx -y skills add notque/vexjoy-agent --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Flag exported struct types that should be unexported because only their interface is public.
Flag exported struct types that should be unexported because only their interface is public.
**Check**: "Is this type only used through an interface? If yes, unexport it."
// FLAGGED: exported type only used through interface
type FileBackingStore struct { ... }
func NewFileBackingStore(...) BackingStore { return &FileBackingStore{...} }
// CORRECT: unexported concrete, exported interface
type fileBackingStore struct { ... }
func NewFileBackingStore(...) BackingStore { return &fileBackingStore{...} }**Severity**: HIGH — leaks implementation details, expands public API unnecessarily.
Flag functions wrapping a single stdlib/library call without adding value.
**Checks**:
// FLAGGED:
func mustGetUser(t *testing.T, db *DB, id string) User {
u, err := db.GetUser(id)
if err != nil { t.Fatal(err) }
return u
}
// Convention: use must.ReturnT
user := must.ReturnT(db.GetUser(id))(t)**must vs assert**:
**Severity**: MEDIUM
Flag `Option[T]` persisting beyond parse/config into runtime structs.
// FLAGGED: Option in runtime struct
type fileBackingStore struct {
MaxFileSize Option[int64] // checked on every write
}
// CORRECT: resolve at parse time
store := fileBackingStore{
MaxFileSize: cfg.MaxFileSize.UnwrapOr(10 << 20),
}**Severity**: HIGH — forces every method to handle None when decision was made at init.
Flag separate pools when shared should be passed. Flag heavy imports when go-bits alternatives exist.
**Checks**:
**Severity**: HIGH for transitive dep pollution, MEDIUM for resource management.
Flag abstractions adding complexity without value.
**Checks**:
**Severity**: MEDIUM general, HIGH when creating maintenance burden.
Flag names blocking future siblings.
**Checks**:
**Severity**: MEDIUM — compounds as siblings added.
Flag manual implementations of patterns go-bits provides.
| Manual Pattern | go-bits Replacement | Package | |----------------|---------------------|---------| | `rows.Next()` + `rows.Scan()` | `sqlext.ForeachRow()` | sqlext | | `if err != nil { t.Fatal(err) }` | `must.SucceedT(t, err)` | must | | Manual DB test setup | `easypg.WithTestDB()` | easypg | | Manual error collection | `errext.ErrorSet` | errext | | `log.Printf` | `logg.Info()` | logg | | `json.Marshal` + `w.Write` | `respondwith.JSON()` | respondwith | | `os.Getenv` without validation | `osext.MustGetenv()` | osext | | Manual factory maps | `pluggable.Registry[T]` | pluggable | | Manual HTTP server lifecycle | `httpext.ListenAndServeContext()` | httpext |
// FLAGGED: manual row iteration
rows, err := db.Query(query, args...)
defer rows.Close()
for rows.Next() { ... }
// Convention: use sqlext.ForeachRow
err := sqlext.ForeachRow(db, query, args, func(rows *sql.Rows) error {
return rows.Scan(&item.ID, &item.Name)
})**Severity**: MEDIUM, HIGH when manual version has bugs go-bits avoids.
**Checks**:
// Convention: testWithEachTypeOf
func testWithEachBackingStore(t *testing.T, action func(*testing.T, BackingStore)) {
t.Run("with file store", func(t *testing.T) { action(t, newTestFileBackingStore(t)) })
t.Run("with SQL store", func(t *testing.T) {
easypg.WithTestDB(t, func(t *testing.T, db *sql.DB) { action(t, newTestSQLBackingStore(t, db)) })
})
}**Severity**: HIGH for missing multi-implementation coverage, MEDIUM for structural issues.
Constants, error sentinels, validation functions must live with their owning interface.
**Checks**:
**Test**: If you can name which interface owns it, it lives in that interface's file.
**Acceptable in util.go**: Cross-cutting utilities serving multiple unrelated types.
**Severity**: MEDIUM for new violations (move during this PR). LOW for pre-existing in untouched code.
**Cross-repo**: Appears in 4+ sapcc repos — NON-NEGOTIABLE per Tier 1.
Essays and writing behind this toolkit live at vexjoy.com. VexJoy Agent connects plain-English requests to specialist agents, skills, and workflows. /do selects the knowledge and tools needed for your task.
Repo: notque/vexjoy-agent
Ansible automation: playbooks, roles, collections, Molecule testing, Vault security.
**Scope**: Module selection patterns, builtin vs command/shell decisions, collection modules, and version-specific module changes **Version range**:…
**Scope**: Molecule test scenarios, ansible-lint rules, idempotency validation, and check-mode patterns **Version range**: Molecule 6.0+ / ansible-lint 6.0+ /…
Universal rules injected by /do at dispatch. Each agent's .md file supplies domain rules.
**Scope**: Failure modes in agent output style — over-reporting, self-congratulation, verbose narration, and hedging. Covers what to detect and how to fix…
Zero-dependency combat visual upgrades: CSS particle replacement, Framer Motion combat juice, CSS 3D card transforms.