{
  "markdown": "# airstrings\n\nCommand-line interface for [AirStrings](https://airstrings.com) — manage strings, locales, bundles, and publishing from the terminal.\n\n## Install\n\n### npm (any platform)\n\n```bash\nnpm install -g @airstrings/cli\nairstrings <command>\n```\n\nRequires Node 18+. Installs `airstrings` and `airstrings-mcp`.\n\n### Homebrew (macOS / Linux)\n\n```bash\nbrew install symbionix-sl/airstrings/airstrings\n```\n\n### From source\n\n```bash\ngo install github.com/symbionix-sl/airstrings-cli/cmd/airstrings@latest\n```\n\n### Build locally\n\n```bash\ngit clone git@github.com:symbionix-sl/airstrings-cli.git\ncd airstrings-cli\ngo build -o airstrings ./cmd/airstrings\n```\n\n## Setup\n\nInitialize a workspace in your project directory:\n\n```bash\ncd my-project\nairstrings init ask_live_xxxxxxxxxxxx\n```\n\nThis validates the key, auto-detects your project and environments, and stores everything in `.airstrings/config.json`. Each project has its own workspace — no shared global config.\n\n### Environments\n\n```bash\nairstrings env                      # list environments (✓ = active)\nairstrings env use staging          # switch to staging\nairstrings env add <api-key>        # add credentials for another environment\nairstrings env rm staging           # remove environment credentials\nairstrings -e -u staging            # shorthand for env use\nairstrings status                   # show current project, env, and key\n```\n\n## Usage\n\n```\nairstrings <command> [options]\n```\n\n### Project & Environments\n\n```bash\nairstrings project                  # Show project info\nairstrings env                      # List environments\nairstrings env use staging          # Switch active environment\nairstrings env create staging       # Create a new environment\nairstrings locales                  # List locales with string counts\n```\n\n### Strings\n\n`strings set` and `strings rm` are local-first: they edit the workspace CSVs and never call the API unless `--push` is given.\n\n```bash\nairstrings strings list                          # List all strings (remote)\nairstrings strings list --locale en --limit 50   # Filter by locale\nairstrings strings ls --local                    # List local workspace strings (offline, no credentials)\nairstrings strings ls --local --section onboarding   # List one section, offline\nairstrings strings get welcome.title             # Get a single string (remote)\nairstrings strings set welcome.title en=\"Hello\" es=\"Hola\" --format text   # Write to local CSVs\nairstrings strings set app.name en=\"My App\" --format text --push     # Also upsert to the API\nairstrings strings rm old.unused.key             # Remove from local CSVs\nairstrings strings rm old.unused.key --push      # Also delete from the API\nairstrings strings rm welcome.title --locale es --push   # Remove one locale, locally and remotely\n```\n\n### Sections\n\n```bash\nairstrings sections list\nairstrings sections create onboarding --description \"Onboarding flow strings\"\nairstrings sections delete sec_xxxxx\n```\n\n### Bundles & Publishing\n\n```bash\nairstrings bundles                  # List published bundles\nairstrings publish                  # Publish all locales\nairstrings publish en es            # Publish specific locales\n```\n\n### Offline-safe builds\n\nShip published bundles inside your app so SDKs can serve strings with no network — cold offline starts, SSG/SSR builds, CI:\n\n```bash\nairstrings bundles pull\n```\n\nThis downloads the published, signed bundles for the active environment into `airstrings/bundles/` at the workspace root (plus a `manifest.json` provenance record), verifying every Ed25519 signature before writing. Commit the folder:\n\n```bash\ngit add airstrings/bundles\ngit commit -m \"chore: update bundled fallback strings\"\n```\n\nSDKs detect the folder automatically and seed from it on startup, re-verifying every bundle before use. Run the pull in CI or as a pre-release step to keep the committed snapshot fresh.\n\n```bash\nairstrings bundles pull dist/seed         # custom output dir (persisted to workspace config)\nairstrings bundles pull --locale en-US    # restrict to one locale\n```\n\nNot the same as `airstrings pull`: `pull` fetches **draft** workspace strings as editable CSVs for the editing workflow, while `bundles pull` fetches **published, signed** bundles — immutable delivery artifacts for shipping. The two never share an output location.\n\n### Import\n\n```bash\nairstrings import csv strings.csv   # Import strings from CSV\nairstrings import status imp_xxxxx  # Check import progress\n```\n\n### Workspace\n\nThe workspace workflow lets you manage strings locally and sync with the API. This is the recommended workflow for AI-assisted string management.\n\n```bash\n# Initialize workspace\nairstrings init ask_live_xxxxxxxxxxxx\n\n# Add strings locally (no API calls)\nairstrings strings set onboarding.welcome en=\"Welcome!\" it=\"Benvenuto!\" --format text --section onboarding\nairstrings strings set onboarding.welcome de=\"Willkommen!\" es=\"¡Bienvenido!\" fr=\"Bienvenue!\" --format text --section onboarding\nairstrings strings set app.tagline en=\"The best app\" it=\"La migliore app\" --format text\n\n# List local strings (offline, no credentials)\nairstrings strings ls --local\nairstrings strings ls --local --section onboarding\n\n# Edit and remove\nairstrings strings set onboarding.welcome en=\"Welcome to the app!\" --format text --section onboarding\nairstrings strings rm old.key --section onboarding\n\n# Sync a single key immediately while editing\nairstrings strings set app.tagline en=\"The best app\" --format text --push\n\n# Push everything to AirStrings\nairstrings push\nairstrings push --section onboarding   # push single section\n\n# Pull remote strings to local\nairstrings pull\n```\n\nThe `airstrings init` command creates a `.airstrings/` folder in your project root:\n\n```\n.airstrings/\n  config.json              # workspace config (credentials, project, active env)\n  strings.csv              # unsectioned strings\n  onboarding/onboarding.csv  # section strings\n  settings/settings.csv\n```\n\nEach section gets its own subdirectory with a CSV file. Unsectioned strings live in the root `strings.csv`. All files are plain CSV and can be committed to version control.\n\n### MCP Server\n\nAirStrings provides an MCP server so AI assistants like Claude can manage strings directly through structured tool calls.\n\n```bash\nairstrings mcp install                  # for Claude Code\nairstrings mcp install --claude-desktop # for Claude Desktop\nairstrings mcp status                   # check installation\n```\n\nThat's it. Restart Claude and the tools are available.\n\n#### Example: AI-assisted localization\n\n```\nYou: \"Translate my app's onboarding screen into Italian, German, Spanish, and French\"\n\nClaude uses airstrings_strings_set:\n  key: \"onboarding.welcome\"\n  values: {\"it\": \"Benvenuto!\", \"de\": \"Willkommen!\", \"es\": \"¡Bienvenido!\", \"fr\": \"Bienvenue!\"}\n  section: \"onboarding\"\n\nClaude uses airstrings_strings_set:\n  key: \"onboarding.subtitle\"\n  values: {\"it\": \"Inizia il tuo viaggio\", \"de\": \"Beginne deine Reise\", \"es\": \"Comienza tu viaje\", \"fr\": \"Commencez votre voyage\"}\n  section: \"onboarding\"\n\nClaude uses airstrings_push:\n  section: \"onboarding\"\n\n-> Pushed 2 strings (0 errors)\n   Sections: onboarding\n```\n\nInstead of generating CSV files, the AI calls structured MCP tools -- one call per string. This saves tokens and eliminates CSV formatting errors.\n\n#### Available MCP tools\n\n| Tool | Description |\n|------|-------------|\n| `airstrings_init` | Initialize workspace |\n| `airstrings_strings_set` | Add/update string in local CSV (optional `push` to sync the key to the API immediately) |\n| `airstrings_strings_rm` | Remove string from local CSV (optional `push` to mirror the removal to the API immediately) |\n| `airstrings_strings_ls` | List local strings |\n| `airstrings_push` | Push local strings to API |\n| `airstrings_pull` | Pull remote strings to local |\n| `airstrings_publish` | Publish bundles to CDN |\n\n### JSON Output\n\nAdd `--json` to any command for machine-readable output:\n\n```bash\nairstrings strings list --json\nairstrings project --json | jq '.name'\n```\n\n## Configuration\n\nConfig is stored per-project in `.airstrings/config.json` (like `.git/config`). No global config — each workspace is self-contained with its own credentials and active environment.\n\n```bash\nairstrings init <api-key> [--url <base-url>]      # create workspace and authenticate\nairstrings env add <api-key> [--url <base-url>]   # add environment credentials\nairstrings env rm <name>                          # remove environment credentials\nairstrings env use <name>                         # switch environment\nairstrings status                                 # show active context\n```\n\nThe workspace is found by walking up the directory tree, so commands work from any subdirectory.\n\n## Requirements\n\n- Go 1.26.1+\n- An AirStrings account with an API key\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n",
  "bytes": 8860,
  "sha": "4db23b21304e079cdb197a16988123f925be0fa93fddd1c2d66ac51f9c1c6cb1",
  "repo_slug": "symbionix-sl/airstrings-cli",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_symbionix_sl_airstrings_cli_d92aca80/readme"
}