Agent skill

Golang

by speakeasy-api in speakeasy-api/gram

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…

AGPL-3.0Auto-check passed

Install Golang

skills CLI
$ npx skills add speakeasy-api/gram --skill golang -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install speakeasy-api/gram golang --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
golang
GitHub stars
272
Token cost
~6.3k tokens
SKILL.md length
2,658 words
Files
1
Skills in repo
39
Repo updated
First seen
Licence
AGPL-3.0

At a glance

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…

  • Works in 4 steps: The vendor package's stub or fake when… → A suitable fake or capture already in… → A small local fake or capture of an… → …
  • Reviewing Go (Golang) code in this repo
  • SKILL.md covers Tooling, Which skill, Packages and Comments, plus 7 more sections
  • Calls mise and go; reaches pkg.go.dev

What it does

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.

When your agent uses it

  • Reviewing Go (Golang) code in this repo
  • Including tests
  • Temporal activities
  • CLI code under server/

Example prompts

  • “/golang”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. The vendor package's stub or fake when one exists; names vary (workos.NewStubClient, okta.NewFake, openrouter.NewDevelopment).
  2. A suitable fake or capture already in the current package.
  3. A small local fake or capture of an interface we own (for example a recording loops.Client). Consolidate one next to its interface only…
  4. github.com/stretchr/testify/mock for vendor SDK clients without a stub, against a narrow interface declared where it is consumed when the…

What it can do on your machine

Read from SKILL.md and the folder at commit ad78247. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • mise
    • go

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • pkg.go.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~48
When it runs · the whole SKILL.md, loaded when a task matches
~6.3k

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.

Safety

Auto-check passed

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.

SKILL.md

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.

Download SKILL.mdSave it as .claude/skills/golang/SKILL.md (or your agent's skills folder).
name
golang
description
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/.
metadata.relevant_files
server/**/*.go, functions/**/*.go, cli/**/*.go

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.

  • Prefer the standard library and the dependencies already in go.mod over adding a new one.
  • Do not edit files that start with a "DO NOT EDIT" comment; change their source and regenerate.
  • If you are unsure about a convention or implementation detail, say so instead of guessing.

Tooling

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.

Which skill

When a change touches one of these areas, activate the matching skill as well:

TaskSkill
ClickHouse schemas, migrations, queries, or insertsclickhouse
Gating a feature behind a product feature or PostHog flagfeature-flag
New or changed lint rules (glint analyzers) or their fixturesglint
Recording or exposing audit eventsgram-audit-logging
Features that surface data in the dashboard (demo and local seed data)gram-demo-seed
Gram Functions runner (functions/) or server/internal/functionsgram-functions
Goa management endpoints under /rpc/<service>.<method>gram-management-api
Pub/Sub topics, publishers, or stream handlersgram-pubsub
Scopes, grants, roles, or authz.Engine.Require checksgram-rbac
New group-by or filter dimensions in telemetry.querygram-telemetry-query-dimensions
Temporal workflows, activities, schedules, signals, or per-row, timer, and fan-out background workgram-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 onemaintaining-platform-mcp
Postgres schema, migrations, queries.sql, or sqlcpostgresql
Transactional email templates, sending, layout, or copytransactional-email

Packages

Reuse existing packages

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:

NeedUse
Auth and request contextcontextvalues.GetAuthContext, contextvalues.GetRequestContext
Cachingcache.NewTypedObjectCache, with cache.NoopCache where caching is off
Conversions: pointers, defaults, pgtype, UUIDs, slugs, integersconv (ToPGText, PtrToPGText, FromPGText, PtrValOr, Default, SafeInt32, ...)
Encrypting stored secretsencryption
Invariant checksinv.Check, inv.Require
OAuth wire parameters and error codesoauthwire, oautherr (oautherr.ParseTokenError for error bodies)
Outbound HTTP and retriesguardian.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 concurrencyratelimit.New for budgets; errgroup.SetLimit to bound concurrent work instead of a channel semaphore
Resource identifiersurn types, never hand-built URN strings
Test doublesSee Testing
Test infrastructure and cross-package fixturestestenv
Transactional events and customer webhooksoutbox.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 handlersoops.E with the oops.Code* constants
Package boundaries

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

Comments describe current intent and behavior.

  • Do not narrate the edit you just made ("previously this returned X, now it returns Y", "renamed from Foo"); that belongs in the commit message or PR body. Build tags, //go: directives, and TODO(TICKET-123) notes are not narration.
  • Mark a deprecated symbol with a trailing Deprecated: use X instead paragraph (the form gopls and pkg.go.dev surface), and keep the rest of its doc in the present tense.
  • Do not write "see X" comments that send the reader elsewhere ("see 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.
  • Document each struct field with its own comment, at least on exported types. 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.
go
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
}

Constants and types

  • 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.

    go
    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.

Functions

  • Take 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.
  • Pass time-dependent logic a 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.
  • Extract a function only when it adds reuse, names non-trivial logic, adapts a type to a required interface, or provides a seam that tests need. A function that only forwards to another call does none of these, in production code or tests (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.
go
// 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.

Show full SKILL.md (1,095 more words)Show less

Errors

  • 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:

    go
    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.

Logging and observability

  • Build attributes with the tree's attribute helpers, not raw keys: 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)).
  • Create child loggers with logger.With(...) to carry context into later calls (logger.With(attr.SlogProjectID(projectID))).
  • Log errors where they are handled and keep info-level logs rare.
  • In 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).

Services

Goa services

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:

  • the Service struct and a NewService constructor
  • a var _ gen.Service = (*Service)(nil) assertion, plus var _ gen.Auther = (*Service)(nil) when the service uses API key security
  • an Attach(mux, service) function that mounts the endpoints with middleware.MapErrors() and middleware.TraceMethods(service.tracer)
  • for API key security, an APIKeyAuth method delegating to s.auth.Authorize

Attach new services in server/cmd/gram/start.go.

Dependency injection

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).

go
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
}
Auth context

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.

Third-party clients
  • Make constructors return a usable client (the stub when unconfigured), so callers never check for nil. Missing configuration for an optional integration selects the stub; it is not a constructor error.
  • When adding a vendor wrapper, add a stub alongside it for local development and tests, and choose real or stub in server/cmd/gram/deps.go based on c.String("environment").
  • Keep vendor request and response types inside the wrapper. Define our own types at the boundary (type Client interface { Send(ctx context.Context, message Message) error }).

Testing

The Functions and Reuse existing packages rules apply to test code too. The setup_test.go, SQLc fixture, and testenv bullets describe server/.

  • Put setup that starts databases, caches, or workers in the package's 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.
  • Seed and inspect Postgres through SQLc, never raw SQL. Add a fixture query to the domain package's own 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.
  • Test doubles, in order of preference:
    1. The vendor package's stub or fake when one exists; names vary (workos.NewStubClient, okta.NewFake, openrouter.NewDevelopment).
    2. A suitable fake or capture already in the current package.
    3. A small local fake or capture of an interface we own (for example a recording 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.
    4. 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.
  • Use 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.
  • Use t.Context() instead of context.Background(), except inside t.Cleanup callbacks.
  • Assert with github.com/stretchr/testify/require. The one exception is assert.* on the *assert.CollectT inside require.EventuallyWithT.
  • Never 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.
  • Write a separate test function for each scenario that needs its own setup or assertions, so it can be read, run with -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.
  • Parallelize isolated tests and independent table cases: call 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.

Readability

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.

go
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

Files

Just SKILL.md in .agents/skills/golang of speakeasy-api/gram.

Open the folder on GitHubat commit ad78247

Compare with similar skills

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.

Golang compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Golang this skillspeakeasy-api/gram272—~6.3kAutomated safety check: PassAGPL-3.0
Add Redis Command to go-redisredis/go-redis22k—~1.4kAutomated safety check: PassBSD-2-Clause
Go Pedantrychromedp/chromedp13k—~3.7kAutomated safety check: PassMIT
Fory Releaseapache/fory4.6k—~2.9kAutomated safety check: PassApache-2.0
AO Desktop App LauncherOrchestratorInc/agent-orchestrator13k—~2.4kAutomated safety check: PassApache-2.0
Go-Redis Release Preparationredis/go-redis22k—~1.1kAutomated safety check: PassBSD-2-Clause

Similar skills

  • Official

    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.

    22k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Go Pedantry

    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)…

    13k GitHub stars~3.7k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Fory Release

    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.

    4.6k GitHub stars~2.9k tokensUpdated yesterday
    Auto-check passed
  • AO Desktop App Launcher

    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.

    13k GitHub stars~2.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Official

    Prepares a go-redis release locally: picks the next semver, gathers merged PRs, writes the RELEASE-NOTES entry and bumps versions, without publishing.

    22k GitHub stars~1.1k tokensUpdated today
    DevelopmentAuto-check passed
  • 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.

    15k GitHub stars~747 tokensUpdated today
    DevelopmentAuto-check passed

More from speakeasy-api/gram

All 39 skills in this repo
  • Gram Playwright CLI

    speakeasy-api/gram

    A skill your agent uses when automating the Gram dashboard in a browser, capturing screenshots, inspecting pages.

    272 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Transactional Email

    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…

    272 GitHub stars~4.7k tokensUpdated today
    Auto-check passed
  • Admin Shadcn

    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…

    272 GitHub stars~1k tokensUpdated today
    Auto-check passed
  • 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"…

    272 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Clickhouse

    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…

    272 GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • Feature Flag

    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…

    272 GitHub stars~2.6k tokensUpdated today
    Auto-check passed

Works with

Questions about Golang

What does Golang do?

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/.

When should I use Golang?

Golang fits situations like: reviewing Go (Golang) code in this repo; including tests; temporal activities; CLI code under server/.

How do I install Golang in Claude Code?

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.

How do I install Golang in Codex?

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.

Can I use Golang in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Golang need to run?

Going by SKILL.md and its folder, Golang needs the command-line tools its instructions call (mise and go).

Does Golang access the network?

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.

Is Golang safe to install?

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.

What licence does Golang use?

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.

How many tokens does Golang use?

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.

What are the alternatives to Golang?

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.

Who maintains Golang?

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.