PluginBench
Skill
Pass
Audit score 90

golang-project-layout

samber/cc-skills-golang

Guide for structuring Go projects: CLI tools, libraries, services, and monorepos with best-practice directory layouts.

What is golang-project-layout?

Provides architectural guidance and directory structure templates for Go projects. Use when starting a new Go project, organizing an existing codebase, setting up monorepos, or deciding between cmd/internal/pkg conventions. Emphasizes right-sizing structure to project scope and asking developers about their preferred architecture and dependency injection approach.

  • Recommends project structure based on type (CLI, library, service, monorepo, workspace)
  • Enforces module naming conventions (lowercase, hyphens, matching repository URL)
  • Guides directory organization with cmd/, internal/, pkg/, and test placement
  • Provides initialization checklist for new Go projects
  • References templates for Makefile, .gitignore, and golangci.yml configuration
  • Explains go.work setup for monorepos and multi-module development

How to install golang-project-layout

npx skills add https://github.com/samber/cc-skills-golang --skill golang-project-layout
Prerequisites
  • Go installed (go version command available)
  • Basic familiarity with Go modules and directory structure
Claude Code
Cursor
Windsurf
Cline

How to use golang-project-layout

  1. 1.Ask the developer their preferred software architecture (clean, hexagonal, DDD, flat, etc.)
  2. 2.Ask the developer their preferred dependency injection approach
  3. 3.Determine the project type: CLI tool, library, service, monorepo, or workspace
  4. 4.Right-size the structure to match project scope and complexity
  5. 5.Choose a module name matching your repository URL in lowercase with hyphens
  6. 6.Run go mod init with the chosen module name
  7. 7.Create cmd/{name}/main.go for entry points and internal/ for private code
  8. 8.Create pkg/ only if you have code meant for external consumers

Use cases

Good for
  • Starting a new Go CLI tool or service with proper directory structure
  • Reorganizing an existing codebase to follow Go conventions
  • Setting up a monorepo with multiple related packages and modules
  • Deciding whether to use cmd/, internal/, or pkg/ directories for your code
  • Configuring module naming and package structure for a library
Who it's for
  • Go developers starting new projects
  • Teams standardizing project structure across multiple codebases
  • Developers migrating or refactoring existing Go projects
  • Architects designing monorepos or multi-service systems

golang-project-layout FAQ

When should I use cmd/ vs pkg/ directories?

Use cmd/ for all main packages (entry points). Use internal/ for private packages not meant for external use. Use pkg/ only when you have code that external consumers should import—typically for libraries.

What module name should I use in go.mod?

Your module path must match your repository URL (e.g., github.com/username/project-name), use lowercase only, use hyphens for multi-word names, and be semantic. Never use MyProject or underscores.

Do I need a complex structure for a small project?

No. Right-size structure to the problem. A 100-line CLI tool does not need layers of abstraction or dependency injection. Ask the developer first about their architecture preference.

How do I organize a monorepo with multiple packages?

Use go.work at the root, create separate modules for each package, and use replace directives if needed. See the workspaces reference for detailed setup and commands.

Where should I put tests and test data?

Co-locate _test.go files with the code they test. Use testdata/ directory for fixtures and test data files.

Full instructions (SKILL.md)

Source of truth, from samber/cc-skills-golang.


name: golang-project-layout description: "Provides a guide for setting up Golang project layouts and workspaces. Use when starting a new Go project, organizing an existing codebase, setting up a monorepo with multiple packages, creating CLI tools with multiple main packages, deciding between cmd/internal/pkg directory conventions, or discussing package restructuring, package splits, or module splits." user-invocable: true license: MIT compatibility: Designed for Claude Code or similar AI coding agents, and for projects using Golang. metadata: author: samber version: "1.2.0" openclaw: emoji: "📁" homepage: https://github.com/samber/cc-skills-golang requires: bins: - go install: [] allowed-tools: Read Edit Write Glob Grep Bash(go:) Bash(golangci-lint:) Bash(git:*) Agent AskUserQuestion

Persona: You are a Go project architect. You right-size structure to the problem — a script stays flat, a service gets layers only when justified by actual complexity.

Go Project Layout

Architecture Decision: Ask First

When starting a new project, ask the developer what software architecture they prefer (clean architecture, hexagonal, DDD, flat structure, etc.). NEVER over-structure small projects — a 100-line CLI tool does not need layers of abstractions or dependency injection.

→ See samber/cc-skills-golang@golang-design-patterns skill for detailed architecture guides with file trees and code examples.

Dependency Injection: Ask Next

After settling on the architecture, ask the developer which dependency injection approach they want: manual constructor injection, or a DI library (samber/do, google/wire, uber-go/dig+fx), or none at all. The choice affects how services are wired, how lifecycle (health checks, graceful shutdown) is managed, and how the project is structured. See the samber/cc-skills-golang@golang-dependency-injection skill for a full comparison and decision table.

12-Factor App

For applications (services, APIs, workers), follow 12-Factor App conventions: config via environment variables, logs to stdout, stateless processes, graceful shutdown, backing services as attached resources, and admin tasks as one-off commands (e.g., cmd/migrate/).

Quick Start: Choose Your Project Type

Project TypeUse WhenKey Directories
CLI ToolBuilding a command-line applicationcmd/{name}/, internal/, optional pkg/
LibraryCreating reusable code for otherspkg/{name}/, internal/ for private code
ServiceHTTP API, microservice, or web appcmd/{service}/, internal/, api/, web/
MonorepoMultiple related packages/modulesgo.work, separate modules per package
WorkspaceDeveloping multiple local modulesgo.work, replace directives

Module Naming Conventions

Module Name (go.mod)

Your module path in go.mod should:

  • MUST match your repository URL: github.com/username/project-name
  • Use lowercase only: github.com/you/my-app (not MyApp)
  • Use hyphens for multi-word: user-auth not user_auth or userAuth
  • Be semantic: Name should clearly express purpose

Examples:

// ✅ Good
module github.com/jdoe/payment-processor
module github.com/company/cli-tool

// ❌ Bad
module myproject
module github.com/jdoe/MyProject
module utils

Package Naming

Packages MUST be lowercase, singular, and match their directory name. → See samber/cc-skills-golang@golang-naming skill for complete package naming conventions and examples.

Directory Layout

All main packages must reside in cmd/ with minimal logic — parse flags, wire dependencies, call Run(). Business logic belongs in internal/ or pkg/. Use internal/ for non-exported packages, pkg/ only when code is useful to external consumers.

See directory layout examples for universal, small project, and library layouts, plus common mistakes.

Essential Configuration Files

Every Go project should include at the root:

  • Makefile — build automation. See Makefile template
  • .gitignore — git ignore patterns. See .gitignore template
  • .golangci.yml — linter config. See the samber/cc-skills-golang@golang-lint skill for the recommended configuration

For application configuration with Cobra + Viper, see config reference.

Tests, Benchmarks, and Examples

Co-locate _test.go files with the code they test. Use testdata/ for fixtures. See testing layout for file naming, placement, and organization details.

Go Workspaces

Use go.work when developing multiple related modules in a monorepo. See workspaces for setup, structure, and commands.

Initialization Checklist

When starting a new Go project:

  • Ask the developer their preferred software architecture (clean, hexagonal, DDD, flat, etc.)
  • Ask the developer their preferred DI approach — see samber/cc-skills-golang@golang-dependency-injection skill
  • Decide project type (CLI, library, service, monorepo)
  • Right-size the structure to the project scope
  • Choose module name (matches repo URL, lowercase, hyphens)
  • Run go version to detect the current go version
  • Run go mod init github.com/user/project-name
  • Create cmd/{name}/main.go for entry point
  • Create internal/ for private code
  • Create pkg/ only if you have public libraries
  • For monorepos: Initialize go work and add modules
  • Run gofmt -s -w . to ensure formatting
  • Add .gitignore with /vendor/ and binary patterns

Related Skills

→ See samber/cc-skills-golang@golang-cli skill for CLI tool structure and Cobra/Viper patterns. → See samber/cc-skills-golang@golang-dependency-injection skill for DI approach comparison and wiring. → See samber/cc-skills-golang@golang-lint skill for golangci-lint configuration. → See samber/cc-skills-golang@golang-continuous-integration skill for CI/CD pipeline setup. → See samber/cc-skills-golang@golang-design-patterns skill for architectural patterns.