Add Redis Command to go-redis
redis/go-redis
Walks through adding a new Redis or Redis module command to the go-redis client, from fetching the spec and docs to the type, interface wiring, parsing and tests.
A skill your agent uses when writing, editing, or reviewing Go (Golang) code in this repo, including tests, Goa services, sqlc callers, Temporal activities, and CLI code under server/, cli/, or…
$ npx skills add speakeasy-api/gram --skill golang -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install speakeasy-api/gram golang --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/golang .claude/skills/golang && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "golang" agent skill from https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golang into .claude/skills/golang/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "golang", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golangType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add speakeasy-api/gram --skill golang -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install speakeasy-api/gram golang --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/golang .agents/skills/golang && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "golang" agent skill from https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golang into .agents/skills/golang/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "golang", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add speakeasy-api/gram --skill golang -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install speakeasy-api/gram golang --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/golang .cursor/skills/golang && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "golang" agent skill from https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golang into .cursor/skills/golang/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "golang", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/speakeasy-api/gram.git --path .agents/skills/golang--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add speakeasy-api/gram --skill golang -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install speakeasy-api/gram golang --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/golang .gemini/skills/golang && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "golang" agent skill from https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golang into .gemini/skills/golang/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "golang", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install speakeasy-api/gram golangInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add speakeasy-api/gram --skill golang -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/golang .github/skills/golang && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "golang" agent skill from https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golang into .github/skills/golang/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "golang", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add speakeasy-api/gram --skill golang -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install speakeasy-api/gram golang --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/golang .opencode/skills/golang && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "golang" agent skill from https://github.com/speakeasy-api/gram/tree/main/.agents/skills/golang into .opencode/skills/golang/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "golang", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
golangA skill your agent uses when writing, editing, or reviewing Go (Golang) code in this repo, including tests, Goa services, sqlc callers, Temporal activities, and CLI code under server/, cli/, or…
Golang is an agent skill from speakeasy-api/gram. Use when writing, editing, or reviewing Go (Golang) code in this repo, including tests, Goa services, sqlc callers, Temporal activities, and CLI code under server/, cli/, or functions/.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with Go. The repository describes itself as: Securely scale AI usage across your organization. A single stack to Connect, Secure, Observe and Distribute agents, MCPs, and Skills within your company. The licence is AGPL-3.0.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit ad78247. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
misegoFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
pkg.go.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Golang loads about 6.3k tokens when it runs. Until then it costs about 48 tokens; SKILL.md has 2,658 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from speakeasy-api/gram at commit ad78247, republished under its AGPL-3.0 licence (© speakeasy-api). 2,658 words, ~6,334 tokens.
.claude/skills/golang/SKILL.md (or your agent's skills folder).These are the conventions for Go code in this repo, which targets the Go version in the root go.mod. Some existing code breaks these conventions; do not copy it.
Scope. The language conventions (comments, constants and types, functions, errors, logging style, testing style) apply to all Go in the repo. The package map, service wiring, and testenv guidance describe server/; its internal packages cannot be imported from cli/ or functions/. In those trees, use the accessible local equivalent (Functions logging attributes live in functions/internal/attr) and search the target tree before introducing a helper or dependency. Do not export server internals or add a shared package just to follow this skill.
go.mod over adding a new one.Never invoke go bare. Use a mise task when one exists: for server tests, mise run test:server runs from server/ and accepts the same arguments as go test (mise run test:server ./internal/oops/). Otherwise prefix the command with mise exec -- (mise exec -- go test ./server/internal/oops/). A bare go may resolve to a system toolchain that differs from the mise pin, which fails every stdlib compile with a version … does not match go tool version error. The same applies to the other pinned tools (golangci-lint, gotestsum, sqlc, gomigrate) and to goa, which is a go.mod tool directive and inherits whichever toolchain invoked it.
Run mise lint:server before finishing server changes and fix what it reports. cli/ and functions/ do not run the glint analyzers, so follow this skill there by hand. Fix the code or use an existing compliant helper instead of adding nolint directives. Suppression is a last resort: use it only when complying with the rule would defeat the intended behavior or test, and explain why a compliant alternative cannot work.
If a suppression is necessary, scope it to the reported line and name the specific linter and reason using //nolint:<linter> // <reason>; for glint, use //nolint:glint // <analyzer>: <reason>. Put it on the reported line (the func line for a whole test), or directly above a multi-line statement inside a function or trailing its first line. Never suppress an entire file; glint directives may not sit above the package clause or a top-level declaration.
When a change touches one of these areas, activate the matching skill as well:
| Task | Skill |
|---|---|
| ClickHouse schemas, migrations, queries, or inserts | clickhouse |
| Gating a feature behind a product feature or PostHog flag | feature-flag |
New or changed lint rules (glint analyzers) or their fixtures | glint |
| Recording or exposing audit events | gram-audit-logging |
| Features that surface data in the dashboard (demo and local seed data) | gram-demo-seed |
Gram Functions runner (functions/) or server/internal/functions | gram-functions |
Goa management endpoints under /rpc/<service>.<method> | gram-management-api |
| Pub/Sub topics, publishers, or stream handlers | gram-pubsub |
Scopes, grants, roles, or authz.Engine.Require checks | gram-rbac |
New group-by or filter dimensions in telemetry.query | gram-telemetry-query-dimensions |
| Temporal workflows, activities, schedules, signals, or per-row, timer, and fan-out background work | gram-temporal |
Admin dashboard workflows, backend admin APIs, or staff permissions (server/internal/admin, server/internal/adminmcp) | maintaining-admin-mcp |
| Platform MCP tools, or backend changes that may need one | maintaining-platform-mcp |
Postgres schema, migrations, queries.sql, or sqlc | postgresql |
| Transactional email templates, sending, layout, or copy | transactional-email |
Before writing a helper, fake, or client, search the current package (including its setup_test.go) and the target tree for one that already does the job; grep for the concept (an RFC number, a vendor name). Extend what you find rather than adding a near-duplicate beside it, and when the owning package lacks a variant you need, add it there.
Reusable packages in server/internal:
| Need | Use |
|---|---|
| Auth and request context | contextvalues.GetAuthContext, contextvalues.GetRequestContext |
| Caching | cache.NewTypedObjectCache, with cache.NoopCache where caching is off |
| Conversions: pointers, defaults, pgtype, UUIDs, slugs, integers | conv (ToPGText, PtrToPGText, FromPGText, PtrValOr, Default, SafeInt32, ...) |
| Encrypting stored secrets | encryption |
| Invariant checks | inv.Check, inv.Require |
| OAuth wire parameters and error codes | oauthwire, oautherr (oautherr.ParseTokenError for error bodies) |
| Outbound HTTP and retries | guardian.Policy.Client(...) or PooledClient(...), with guardian.WithRetryConfig instead of hand-written retry loops. Inside a Temporal activity, add no HTTP retries; Temporal retries it. |
| Rate limits and bounded concurrency | ratelimit.New for budgets; errgroup.SetLimit to bound concurrent work instead of a channel semaphore |
| Resource identifiers | urn types, never hand-built URN strings |
| Test doubles | See Testing |
| Test infrastructure and cross-package fixtures | testenv |
| Transactional events and customer webhooks | outbox.Publish, outbox.PublishWebhookEvent, published in the transaction that records the state change behind the event; define new webhook events with outbox.NewEventDef in outbox/events |
| User-facing errors in handlers | oops.E with the oops.Code* constants |
Give a cohesive domain its own subpackage (e.g. dpop, remotesessions/delegation) instead of growing a large parent package. Domain types live in the domain package, not in the metrics, view, or handler package that happened to need them first.
Comments describe current intent and behavior.
//go: directives, and TODO(TICKET-123) notes are not narration.Deprecated: use X instead paragraph (the form gopls and pkg.go.dev surface), and keep the rest of its doc in the present tense.Registry for locking rules"); the target moves and the pointer goes stale. State the fact where the reader needs it ("callers must hold Registry.mu"). Referencing a symbol, ticket, or spec that the comment is about is fine. When the full explanation is too long to restate, document it on the type or package that owns the invariant and give each use site the one-line consequence.gofmt does not catch the mistakes here: a comment above only the first field of a group documents just that field, so go doc and editor hovers show nothing for the rest, and a blank line between a comment and its field silently detaches it. Put a blank line before each field's comment after the first. Grouped const/var blocks and interface methods follow the same rule, and a comment above const ( documents the block, not its specs.type Config struct {
// ReadTimeout bounds how long the client waits for response headers.
// Retries each get a fresh budget, so a request can exceed this in total.
ReadTimeout time.Duration
// WriteTimeout bounds how long the client spends sending the request body.
WriteTimeout time.Duration
}Name the actual state or behavior. Avoid relative labels such as legacy and modern in identifiers, comments, and messages. Use the condition or mechanism they represent (for example, agentIdentityIsNotConfigured or creatorAttributedExecution). Choose the name from the actual condition. Preserve externally contracted values, including metric labels used by queries or alerts, unless the change includes a compatibility plan.
Name and explain numeric values. Limits, sizes, budgets, timeouts, retry counts, and thresholds are named constants, each with a comment saying what the value represents and why it was chosen. Write bitwise and multiplied sizes with the human-readable value alongside. Obvious literals (0, 1, 2 for halving or pairs, base 10 in strconv) need no name.
const (
// maxManifestBytes bounds a plugin manifest upload. Real manifests are
// under 64 KiB; 1 MiB leaves headroom without letting one request
// hold a large buffer.
maxManifestBytes = 1 << 20 // 1 MiB
// syncRetryTTL is how long a failed sync waits before retrying. The
// upstream API rate limits per hour, so retrying sooner cannot succeed.
syncRetryTTL = time.Hour
)Fully initialize struct literals that exhaustruct covers. Its excluded types and paths (test files among them) are listed in server/.golangci.yaml. When adding a field, update every covered literal, including zero values (MyStruct{} becomes MyStruct{NewField: nil}).
Use new(expr) for a pointer to a value (Go 1.26+, e.g. new("secret")) instead of a local ptr helper.
Use string enums. Declare type fooOutcome string with string constants so values go straight into logs and metric dimensions. If the zero value means "unknown", declare that constant explicitly rather than relying on "".
Use struct types for context keys. Declare a distinct unexported type per key (type domainKey struct{}) so keys from different packages cannot collide.
Do not alias constants or variables. If another package or an external test needs one, export it where it is declared (including instead of an export_test.go alias). Keep a separate name only when it deliberately decouples from its source: it selects a policy that must stay a one-line change (const DefaultInEffect = Version20250326), or it names a separate concept that shares the value today but may diverge. Say in its doc comment why the name must stay separate.
Use protocol constants, not string literals. If a string's meaning comes from an RFC or spec (OAuth parameters and error codes, HTTP statuses and methods), use the constant from its owning package (see Reuse existing packages, and net/http for HTTP), and add one there if it is missing.
Type contractual JSON. A JSON object whose shape is defined by a standard or an external contract gets a named struct type with a comment on each field, not a map[string]any.
context.Context as the first argument of any function that does I/O, runs queries, or waits. To wait, use a time.Timer or time.After in a select on ctx.Done(), a Temporal timer, or ratelimit. In Temporal workflow code, use workflow.Now(ctx) for the current time.now time.Time argument, or give its struct a now func() time.Time field, instead of calling time.Now() inside, so tests control the clock.func newFoo(t) *Foo { return NewFoo(deps) }, func seedX(...) { repo.New(db).InsertX(...) }). When a signature changes, update the callers instead of adding a wrapper that keeps the old signature.// Bad: the wrapper adds no abstraction and has one caller.
func (s *Service) listWidgets(ctx context.Context) error {
return s.repo.ListWidgets(ctx)
}
func (s *Service) List(ctx context.Context) error {
return s.listWidgets(ctx)
}Call s.repo.ListWidgets(ctx) directly from List.
In low-level functions, wrap with fmt.Errorf and a short context unique to the call site: fmt.Errorf("save user: %w", err). Skip "failed to" and generic context such as "run database query".
In server/ handlers and other high-level functions, use oops to pair the internal error with a user-facing message. Log client faults (4xx codes) with LogWarn or LogInfo and server faults (e.g. oops.CodeUnexpected) with LogError, so client mistakes do not mark the trace span as errored:
return nil, oops.E(oops.CodeBadRequest, err, "invalid cursor").LogWarn(ctx, s.logger)When callers need to branch on an error, export a sentinel (var ErrNotFound = errors.New("...")) or an error type, and have callers match it with errors.Is or errors.As.
server/internal/attr/conventions.go in server/, functions/internal/attr in functions/. Add a helper there when none fits. Always include the error: logger.ErrorContext(ctx, "write to database", attr.SlogError(err)).logger.With(...) to carry context into later calls (logger.With(attr.SlogProjectID(projectID))).server/, run deferred cleanup through o11y rather than a bare defer x.Close() or defer func() { _ = x.Close() }(); the linter does not catch this:defer o11y.LogDefer(ctx, logger, "close export file", func() error { return file.Close() }) when a failure matters (file I/O, critical resources). The message names the operation and resource.defer o11y.NoLogDefer(func() error { return dbtx.Rollback(ctx) }) when a failure is expected or harmless (rollback after commit, closing a response body).Goa designs live in server/design (DSL reference: https://pkg.go.dev/goa.design/goa/v3/dsl). After editing a design, run mise run gen:goa-server and use git to see what changed under server/gen.
Each service lives in its own package with an impl.go (server/internal/<service>/impl.go). Copy an existing service's impl.go as the template; it contains:
Service struct and a NewService constructorvar _ gen.Service = (*Service)(nil) assertion, plus var _ gen.Auther = (*Service)(nil) when the service uses API key securityAttach(mux, service) function that mounts the endpoints with middleware.MapErrors() and middleware.TraceMethods(service.tracer)APIKeyAuth method delegating to s.auth.AuthorizeAttach new services in server/cmd/gram/start.go.
Inject dependencies through the service constructor and store them on the struct, not on the sessions manager or other shared state. For database access, inject the pool and build query helpers where they are used; do not add repo.Queries fields to a service struct (not lint-enforced).
type Service struct {
db *pgxpool.Pool
}
func (s *Service) Handler(ctx context.Context) error {
if err := repo.New(s.db).DoThing(ctx); err != nil {
return fmt.Errorf("do thing: %w", err)
}
return nil
}In organization-scoped handlers, assume ActiveOrganizationID is present. The auth middleware handles the brief org-less login boundary by installing zero RBAC grants, so handlers do not need defensive empty-org checks unless a concrete code path proves otherwise.
nil. Missing configuration for an optional integration selects the stub; it is not a constructor error.server/cmd/gram/deps.go based on c.String("environment").type Client interface { Send(ctx context.Context, message Message) error }).The Functions and Reuse existing packages rules apply to test code too. The setup_test.go, SQLc fixture, and testenv bullets describe server/.
setup_test.go: a TestMain calls testenv.Launch(ctx, testenv.LaunchOptions{Postgres: true, ...}) into a package-level infra, and each test gets an isolated database from infra.CloneTestDatabase(t, "testdb"). Copy an existing setup_test.go (e.g. server/internal/access) and reuse its helpers.queries.sql (a toolsets fixture goes in server/internal/toolsets/queries.sql). To seed rows owned by another domain, call that domain's generated repo (e.g. orgrepo.CreateOrganizationMetadata). Use server/internal/testenv/queries.sql and testenv/testrepo only for fixtures reused across packages. For constraint tests, first try a SQLc fixture; only consider a line-level notestingrawsql suppression if SQLc cannot express the required statement, and explain that limitation. testenv provides helpers for locks and other common testing needs; check for an existing helper before adding your own.workos.NewStubClient, okta.NewFake, openrouter.NewDevelopment).loops.Client). Consolidate one next to its interface only when another package actually needs it; do not relocate unrelated fixtures as part of a narrow change.github.com/stretchr/testify/mock for vendor SDK clients without a stub, against a narrow interface declared where it is consumed when the vendor interface is large.httptest servers are fine for protocol-level HTTP tests. guardian.NewDefaultPolicy blocks loopback, so build the client from guardian.NewUnsafePolicy(tp, nil) in those tests.testenv.NewLogger(t), testenv.NewTracerProvider(t), and testenv.NewMeterProvider(t) instead of inline loggers or noop providers. testenv.NewLogger(t) discards in normal runs and pretty-prints under go test -v. Tests that assert on log output use a capturing handler over a bytes.Buffer instead.t.Context() instead of context.Background(), except inside t.Cleanup callbacks.github.com/stretchr/testify/require. The one exception is assert.* on the *assert.CollectT inside require.EventuallyWithT.time.Sleep to wait for async state. When the test owns the goroutine, wait on a channel or sync.WaitGroup it signals. Otherwise poll with require.EventuallyWithT. Use require.Never only for in-process state, never to prove a database operation is blocked. Use testing/synctest (synctest.Test and synctest.Wait) for in-process timer and debounce logic; time.Sleep inside the synctest bubble is allowed because it advances the fake clock.-run, and fail on its own. Use a table-driven test only when cases differ just in inputs and expected outputs (a value or an error), running each case with t.Run(tc.name, ...) so a failure is named and can be rerun with -run.t.Parallel() first in the test and in each t.Run closure (paralleltest and tparallel report missing calls). Keep a test and its ancestors sequential when it mutates process-global state (t.Setenv and t.Chdir panic under t.Parallel()) or must share a mutable fixture. Prefer isolated fixtures; when sequential execution is necessary, explain the constraint in a narrowly scoped suppression as described under Tooling.Separate logical blocks with a blank line. Keep a call and its error check together; for resource acquisition, keep the cleanup defer immediately after the check in that same block (o11y.NoLogDefer, or o11y.LogDefer when cleanup errors matter). Put a blank line before and after these blocks when adjacent statements exist. Keep related straight-line statements together; do not add blank lines just inside braces.
key = strings.TrimSpace(key)
val, err := action(ctx, key)
if err != nil {
return err
}
resource, err := newResource(ctx, val)
if err != nil {
return err
}
defer o11y.NoLogDefer(func() error { return resource.Close() })
return use(ctx, resource)© speakeasy-api, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/golang of speakeasy-api/gram.
Open the folder on GitHubat commit ad78247
Golang next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Golang this skillspeakeasy-api/gram | 272 | — | ~6.3k | Automated safety check: Pass | AGPL-3.0 | |
| Add Redis Command to go-redisredis/go-redis | 22k | — | ~1.4k | Automated safety check: Pass | BSD-2-Clause | |
| Go Pedantrychromedp/chromedp | 13k | — | ~3.7k | Automated safety check: Pass | MIT | |
| Fory Releaseapache/fory | 4.6k | — | ~2.9k | Automated safety check: Pass | Apache-2.0 | |
| AO Desktop App LauncherOrchestratorInc/agent-orchestrator | 13k | — | ~2.4k | Automated safety check: Pass | Apache-2.0 | |
| Go-Redis Release Preparationredis/go-redis | 22k | — | ~1.1k | Automated safety check: Pass | BSD-2-Clause |
redis/go-redis
Walks through adding a new Redis or Redis module command to the go-redis client, from fetching the spec and docs to the type, interface wiring, parsing and tests.
chromedp/chromedp
This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…
apache/fory
Prepare an Apache Fory release candidate from a clean release branch, including the version bump, RC tag, JVM staging, ASF source artifacts, SVN upload, and vote email.
OrchestratorInc/agent-orchestrator
Launches, restarts and troubleshoots the real AO Electron desktop app from a checkout, with isolated or real local data and checks for stale processes.
redis/go-redis
Prepares a go-redis release locally: picks the next semver, gathers merged PRs, writes the RELEASE-NOTES entry and bumps versions, without publishing.
amir20/dozzle
Starts a Dozzle dev server on a port derived from the current worktree so you can test by hand in a browser, without disturbing instances started elsewhere.
speakeasy-api/gram
A skill your agent uses when automating the Gram dashboard in a browser, capturing screenshots, inspecting pages.
speakeasy-api/gram
A skill your agent uses when adding, changing, restyling, reviewing, validating, or previewing a Gram/Speakeasy transactional email, in Go or in LMX/MJML — a template<name.go, a TemplateKey…
speakeasy-api/gram
A skill your agent uses when adding, changing, or styling UI in client/admin (the Gram admin dashboard) that touches shadcn/ui — a button, dialog, table, sidebar, badge, select, tabs, tooltip, card…
speakeasy-api/gram
A skill your agent uses when adding, editing, reviewing, testing, or locating a reviewed skill distributed with the Platform MCP plugin; triggers include "Platform MCP skill", "platformmcpskills"…
speakeasy-api/gram
A skill your agent uses when changing or reviewing Gram ClickHouse schemas, migrations, queries, inserts, access principals, bootstrap SQL, Cloud compatibility, partial migration failures, or…
speakeasy-api/gram
A skill your agent uses when gating a feature behind a flag, dogfooding or gradually rolling out a change, choosing between productfeatures and PostHog feature flags, adding or checking a product…
Works with
A skill your agent uses when writing, editing, or reviewing Go (Golang) code in this repo, including tests, Goa services, sqlc callers, Temporal activities, and CLI code under server/, cli/, or…. Golang is an agent skill from speakeasy-api/gram. Use when writing, editing, or reviewing Go (Golang) code in this repo, including tests, Goa services, sqlc callers, Temporal activities, and CLI code under server/, cli/, or functions/.
Golang fits situations like: reviewing Go (Golang) code in this repo; including tests; temporal activities; CLI code under server/.
Run `npx skills add speakeasy-api/gram --skill golang -a claude-code`. Or copy the skill folder (.agents/skills/golang in speakeasy-api/gram) into .claude/skills/golang in your project. Claude Code loads it when a task matches its description.
Run `npx skills add speakeasy-api/gram --skill golang -a codex`. Or copy the skill folder (.agents/skills/golang in speakeasy-api/gram) into .agents/skills/golang in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add speakeasy-api/gram --skill golang -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/golang, .gemini/skills/golang, .github/skills/golang and .opencode/skills/golang in your project.
Going by SKILL.md and its folder, Golang needs the command-line tools its instructions call (mise and go).
SKILL.md names 1 domain. In commands or code: pkg.go.dev; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Golang is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Golang: Add Redis Command to go-redis (redis/go-redis, 22k stars), Go Pedantry (chromedp/chromedp, 13k stars), Fory Release (apache/fory, 4.6k stars) and AO Desktop App Launcher (OrchestratorInc/agent-orchestrator, 13k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
speakeasy-api (a GitHub organization) maintains it in speakeasy-api/gram, which has 272 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 8, 2026.
Source: speakeasy-api/gram on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.