# Python
__pycache__/
*.pyc
*.pyo

# Packaging
*.egg-info/
dist/
build/
*.egg

# OS
.DS_Store

# Secrets
.env
.env.local
*.token

# Claude Code local settings
.claude/settings.local.json
.claude/skills/seven-advisors/

# Superpowers brainstorm sessions (local dev artifacts)
.superpowers/

# Git worktrees (isolated feature workspaces)
.worktrees/

# Generated HTML visualizations
*pipeline-visual*.html
assessment-report*.html
assessment-report*.pdf

# Dev-only docs (design prompts, plans, parked items, reports, team templates, branch archives)
docs/prompts/
docs/superpowers/
docs/demo/
docs/references/
docs/later/
docs/plans/
docs/reports/
docs/team-prompts/
docs/archive/
docs/arch/
# Historical SDK object-model reference (kept locally, out of git and the shipped bundle)
docs/reference/archive/
docs/webex-api-feedback.html
docs/webex-api-feedback-for-cisco-collab-bu.md

# Tests (dev-only, except the actively-maintained migration/org-health suites
# and the artifact guards below)
tests/*
!tests/migration/
!tests/migration/**
!tests/org_health/
!tests/org_health/**
# Artifact guards: these assert on files that ship (settings.bundled.json,
# field_overrides.yaml, README.md, ci.yml). They caught real drift while CI
# could not see them, so they are tracked and run on every PR. They import only
# stdlib/pytest/yaml plus in-repo modules — no network, no live API, and no
# dependency on the untracked tests/conftest.py.
!tests/test_assemble.py
!tests/test_field_overrides.py
!tests/test_readme_distribution.py
!tests/test_release_integrity.py
!tests/test_drift_check_untracked.py
!tests/test_drift_check_columns.py
!tests/test_drift_check_naming.py
!tests/test_drift_check_inert.py
!tests/test_drift_check_paging.py
!tests/test_drift_check_doc_shape.py
# Checks 19/20. This one also carries the three real 2026-08-03 spec changes
# that reached the CLI while the gate said PASS — inlined from the spec diff,
# not read out of git, so a shallow CI checkout still proves the gate sees them.
!tests/test_drift_check_semantics.py
# Guards the gate's ability to report that it DID NOT RUN. Both halves of that
# (exit 2 in drift_check.py, and CI treating 2 as distinct + asserting the run
# reached the end) regressed silently once already and cost 11 days of a gate
# that verified nothing while looking like an ordinary red build.
!tests/test_drift_check_exit_codes.py
!tests/test_errors_actionability.py
!tests/test_suggest_and_paging.py
!tests/test_pagination_walkers.py
!tests/test_command_naming_residue.py
# Same contract: these assert on behaviour that ships (the --calling-data
# interlock on people.py, and --verify across 328 generated update commands).
# Both guard SCOPING — a check that reaches the wrong commands warns about
# flags they do not have — which only a tree-wide assertion can catch.
!tests/test_field_expansion.py
!tests/test_verify_flag.py
!tests/test_errors_id_kind.py
# Same contract again, and the sharpest case for it: this one guards the
# PreToolUse gate that stops the main session mutating a live org. The gate
# script ships tracked; its shell decision table ships tracked; but the
# tree-wide "no list-*/show-* command writes" invariant lived only here, where
# CI could not see it — and so nobody noticed it had been inspecting 86 of 1961
# commands. Stdlib + pytest only, no conftest, no network: verified green in a
# `git archive HEAD` checkout.
!tests/test_wxcli_gate.py
tests/migration/**/__pycache__/
tests/org_health/**/__pycache__/

# Live CUCM testbed scripts (contain lab host/credentials, never commit)
tests/migration/cucm/build-testbed.md
tests/migration/cucm/provision_testbed.py
tests/migration/cucm/provision_testbed_phase9.py
tests/migration/cucm/provision_testbed_phase10.py
tests/migration/cucm/teardown_testbed.py
tests/migration/cucm/testbed-manifest.json
tests/migration/cucm/validate_live_cucm.py

# CI (no value without tests) — except release.yml, which must be tracked to run
.github/*
!.github/workflows/
.github/workflows/*
!.github/workflows/release.yml
!.github/workflows/ci.yml

# Coverage
.coverage
.lab/
.lab.bak.*/
run.log

# Local folder (not part of repo)
Webex Calling/

# Local one-off tools (not part of the CLI)
tools/build_oncall_deck.py
tools/reassign_dids_to_cc.py

# README backup
README.md.bak
src/wxcli/_version.py

# Org-health scan output (contains live org data — person IDs, numbers, devices)
org-health-output/

# Remotion video production (local build artifact)
remotion-video/

# Flow Store CLI (dev-only, not production)
specs/webex-flow-store.json
src/wxcli/commands/fs_*.py

# General skills (not part of the Webex toolset)
.claude/skills/seven-advisors/
.claude/skills/researcher/

# Prototypes are local-only scratch work — demo shells and SDK spikes, not part
# of the CLI or the shipped playbook. napa-procall is the one exception: it is
# already tracked, so it is re-included after the blanket exclude (same shape as
# the tests/* rule above). This also covers the node_modules trees the untracked
# prototypes carry — pos-demo alone was 2,330 files one `git add .` from landing.
prototypes/*
!prototypes/napa-procall/
