Skip to content

Claude Code

Claude Code is Anthropic's official CLI for AI-assisted development. It helps with code generation, debugging, refactoring, and general software engineering tasks.

Installation

brew install --cask claude-code

Configuration

Global CLAUDE.md

Create a global configuration file at ~/.claude/CLAUDE.md to set personal preferences that apply across all projects.

Download the team's standard configuration: CLAUDE.md

mkdir -p ~/.claude
gh api -H "Accept: application/vnd.github.raw" repos/majority-dev/dt-docs/contents/docs/assets/claude/CLAUDE.md > ~/.claude/CLAUDE.md

Project-level AGENTS.md

Each repository keeps its agent instructions in AGENTS.md at the project root, so every coding agent reads the same file; CLAUDE.md contains only @AGENTS.md. These instructions override or extend global settings.

my-project/
├── AGENTS.md          # Project-specific instructions
├── CLAUDE.md          # @AGENTS.md
├── src/
└── ...

Tessl

Tessl is a package manager for AI coding-agent skills. It lets the team share versioned, discoverable skills via plugins — think dbt packages, but for Claude Code prompts. A plugin bundles one or more skills (each a SKILL.md) and is published to the Tessl registry under the majority-dt/ workspace.

Installing plugins

update-docs and readme are declared in each dt-* (Majority) and data-team-* (Rebtel) repo's tessl.json; run tessl install in the repo after cloning.

Install the cross-repo plugins globally (-g / --global):

tessl install -g majority-dt/update-deps
tessl install -g majority-dt/merge-dependency-prs
tessl install -g majority-dt/watch-pr

To check for updates:

tessl outdated
tessl update

Available plugins

update-docs

Drafts documentation updates for dt-docs when infrastructure, pipelines, dbt models, or architecture changes are detected. Changes in dt-* repos go to the Majority section, changes in data-team-* repos to the Rebtel section. Claude will also proactively suggest running this skill when it detects relevant changes, and pauses the first gh pr create for each commit to ask whether to run update-docs, readme, or skip.

tessl install majority-dt/update-docs

Usage: /update-docs <description of what changed>

update-deps

Updates project dependencies to their latest versions (uv, poetry, npm, yarn, or pnpm), verifies the project still builds, and optionally creates a Linear issue and PR.

tessl install -g majority-dt/update-deps

Usage: /update-deps [--auto-pr]

merge-dependency-prs

Finds every open dependency-bot PR (Renovate, Dependabot) across the dt-* repos (excluding dt-ai-agents), lists them with their URLs, and — after you confirm — approves and enables auto-merge (squash) so each merges once CI is green. Reports a per-repo summary with the URL and outcome of every PR.

tessl install -g majority-dt/merge-dependency-prs

Usage: /merge-dependency-prs

add-ingestion-source

Walks onboarding a new file feed end-to-end — pulling files from SFTP, Azure Blob, or another source into GCS, loading them into BigQuery, and scheduling the download in Airflow. Also covers adding a new report/table to a source that already exists. Spans dt-file-ingestion, dt-gcp-infrastructure, dt-gcp-bq-ingestion-cloud-function, and dt-airflow-dags.

tessl install -g majority-dt/add-ingestion-source

Usage: /add-ingestion-source

watch-pr

Watches an open PR until GitHub Copilot finishes reviewing (plus any other review bot that has commented — it never waits on one), fixes the legitimate findings and pushes, then replies to and resolves each bot comment thread on GitHub — dismissals get a visible reason, fixes get a Fixed in <sha> note. It loops until the bots go quiet, then pings #data_team_prs_ready_for_review so humans don't review before the bot/fix rounds have settled. Runs as a self-paced poll loop, so you can keep working while it waits.

tessl install -g majority-dt/watch-pr

Usage: /watch-pr [PR# or PR-url] (defaults to the current branch's PR)

readme

Writes or updates a README in dt-* (Majority) and data-team-* (Rebtel) repos: fixed sections (Purpose, Owner, How to run, Deployment, Links), terse bullets, and pointers to Makefile targets or scripts instead of copied code. Triggers automatically when a README is created or edited.

tessl install majority-dt/readme

Usage: /readme

Creating a plugin

See the Tessl Intro presentation for background. The current workflow:

  1. Scaffold a skill: tessl skill new --name majority-dt/<name> — or, if you already have a SKILL.md, run tessl skill import <path> to generate its manifest (.tessl-plugin/plugin.json).
  2. Write the SKILL.md: YAML frontmatter (name, description) followed by the steps and shell commands.
  3. Lint: tessl skill lint <path>
  4. Publish: tessl skill publish <path> — requires tessl login.
  5. Install it to use it: tessl install -g majority-dt/<name>

To ship a change to an existing plugin, bump version in its .tessl-plugin/plugin.json, run tessl skill publish <path> again, then tessl update.

Note

Plugins live only in the tessl registry (majority-dt workspace). To change one, edit an installed copy in .tessl/plugins/majority-dt/<name>/ and publish it as above. The legacy tile.json manifest is still read but deprecated; .tessl-plugin/plugin.json is authoritative.

Skills

Skills are reusable prompts that can be invoked with /<skill-name>. They help standardize common tasks across the team.

Tip

Prefer installing skills via Tessl plugins (see above) for team-wide distribution.

Skill Locations

Skills can be stored in three locations:

Location Scope Path
Tessl plugin Team-wide (recommended) Installed via tessl install
Personal Your machine only ~/.claude/skills/
Project Single repository .agents/skills/, symlinked from .claude/skills/

Creating a Skill

A skill is a directory containing a SKILL.md with YAML frontmatter:

mkdir -p ~/.claude/skills/test-generator

Example skill (~/.claude/skills/test-generator/SKILL.md):

---
name: test-generator
description: Use when generating pytest unit tests for Python code
---

Generate pytest unit tests for the specified Python code.

Requirements:
- Use pytest fixtures where appropriate
- Include edge cases and error scenarios
- Use descriptive test names following pattern: test_<function>_<scenario>_<expected>
- Mock external dependencies

Using Skills

Invoke a skill by typing its name prefixed with /:

/test-generator

Project Skills

Some repositories include project-specific skills in .claude/skills/. These are available automatically when working inside that repo.

republish-events (dt-bq2pubsub-publisher)

Guides the full workflow for republishing BigQuery events to Pub/Sub: clearing the event-specific *_previous_run table, running the event's *_delta dbt model, publishing events, and updating the event-specific *_previous_run table.

Usage: /republish-events <event-type> (e.g., /republish-events crde)

Looker MCP

Connect Claude Code to Looker to list models and explores, run queries and validate LookML from the CLI. Each Looker instance is a separate MCP server; add one per instance with a distinct name.

Instance Server name URL
Majority looker https://looker.majority.com/mcp
Rebtel looker-rebtel https://rebtel.eu.looker.com/mcp
claude mcp add -s user --transport http --client-id claude-code-majority --callback-port 8080 looker https://looker.majority.com/mcp
claude mcp add -s user --transport http looker-rebtel https://rebtel.eu.looker.com/mcp

Then run /mcp in Claude Code, select each server and authenticate in the browser. Check the connection with claude mcp list; both servers should show ✔ Connected.

Note

Queries run with your own Looker permissions. Tools are prefixed with the server name (mcp__looker__*, mcp__looker-rebtel__*), so always pick the instance the explore lives in.

Best Practices

  • Keep AGENTS.md instructions concise and specific
  • Update project AGENTS.md when team conventions change
  • Share useful skills with the team via the shared skills repository
  • Use skills for repetitive tasks to ensure consistency