UNPKG

@launchdarkly/ldcli

Version:

The official command line interface for managing LaunchDarkly feature flags.

87 lines (58 loc) 3.14 kB
# AGENTS.md This file provides guidance to AI coding agents when working with code in this repository. ## Project Overview LaunchDarkly CLI (`ldcli`) — a Go CLI for managing LaunchDarkly feature flags. Built with Cobra/Viper, distributed via Homebrew, Docker, NPM, and GitHub Releases. ## Common Commands ```bash make build # Build binary as ./ldcli make test # Run all tests (go test ./...) go test ./path/to/pkg # Run tests for a specific package make generate # Regenerate code from OpenAPI spec (go generate ./...) make vendor # Tidy and vendor dependencies make install-hooks # Install git pre-commit hooks make openapi-spec-update # Download latest OpenAPI spec and regenerate code ``` ## Code Generation Resource commands are auto-generated from the LaunchDarkly OpenAPI spec (`ld-openapi.json`): - **Generator:** `cmd/resources/gen_resources.go` (build tag: `gen_resources`) - **Template:** `cmd/resources/resource_cmds.tmpl` - **Output:** `cmd/resources/resource_cmds.go` (~613KB, do not edit manually) - **Trigger:** `//go:generate` directive in `cmd/root.go` The dev server API is also generated: `internal/dev_server/api/server.gen.go` (via oapi-codegen). ## Architecture **Entry point:** `main.go``cmd.Execute(version)``cmd/root.go` (Cobra root command) **Command layer (`cmd/`):** - Each subcommand (flags, members, config, login, dev-server, sourcemaps, resources) has its own package - Resource commands are generated; custom commands are hand-written - Analytics tracking via `PersistentPreRun` hooks **Internal packages (`internal/`):** - Each domain package (flags, environments, members, projects, resources, dev_server) exposes a `Client` interface for dependency injection - `internal/dev_server/` — local dev server with SQLite storage, embedded React UI, and LaunchDarkly SDK integration - `internal/config/` — manages CLI configuration via `$XDG_CONFIG_HOME/ldcli/config.yml` - `internal/output/` — response formatting (JSON/plaintext) **Configuration precedence:** CLI flags → environment variables (prefix `LD_`) → config file ## Adding a New Command 1. Add command to root via `cmd.AddCommand` in `NewRootCommand()` in `cmd/root.go` 2. Update usage template in `getUsageTemplate()` in `cmd/root.go` 3. Add analytics instrumentation via `PersistentPreRun` calling `tracker.SendCommandRunEvent` ## Dev Server Frontend Located at `internal/dev_server/ui/` — React 18 + TypeScript + Vite, embedded into the Go binary. ```bash cd internal/dev_server/ui npm ci npm test # Vitest npm run lint # ESLint npm run build # Production build (checked into repo) ``` ## Testing - Go tests use `testify` for assertions and `go.uber.org/mock` for mocking - Mock generation via `mockgen` - Test data in `cmd/resources/test_data/` and `cmd/config/testdata/` ## Pre-commit Hooks Installed via `make install-hooks`. Checks: - `go fmt` formatting - `go.mod`/`go.sum` tidiness - Dev server UI tests and build (requires npm) ## Linting - Go: `golangci-lint` (v1.63.4) via pre-commit - Frontend: ESLint + Prettier