Skip to main content

Sync skills from a private Azure DevOps Git repository into Claude Code or GitHub Copilot

Project description

emt-skill-sync

CLI tool to sync AI skills from a private Azure DevOps repository into Claude Code or GitHub Copilot.

Requirements

  • Python 3.10+
  • Git
  • Access to the Azure DevOps skills repository
  • Azure account (for authentication)

Installation

pip install emt-skill-sync

Quick Start

emt-skill-sync sync

First run will launch an interactive setup wizard:

Azure DevOps repository URL [https://dev.azure.com/azurefsoft139/emt/_git/flezi-emt-skills]:
Branch [main]:
Auto-detected provider: claude
Scope (global, project) [global]:

Press Enter to accept defaults, then the CLI authenticates via Azure and syncs all skills.

Commands

emt-skill-sync sync

Sync skills from the remote repository to your local machine.

emt-skill-sync sync

Options:

Flag Description
--provider Target provider: claude or copilot
--scope Install scope: global or project
--dry-run Preview what would change without writing any files
--force Overwrite locally modified managed files (creates backups)
--project-path <path> Project root when using --scope project (defaults to current directory)
--only skill:<name> Sync a single skill, e.g. --only skill:emt-skill-help
--profile <bundle-id> Sync a bundle, e.g. --profile emt-stage-assessment
--filter-tags <tags> CSV tag filter (OR semantics), e.g. --filter-tags baseline,xray
--yes / -y Non-interactive mode: accept all defaults (for CI)

Examples:

# Preview changes without writing
emt-skill-sync sync --dry-run

# Sync only for the current project
emt-skill-sync sync --scope project

# Sync only one skill
emt-skill-sync sync --only skill:emt-skill-help

# Sync all skills for the Assessment stage
emt-skill-sync sync --profile emt-stage-assessment

# Sync skills tagged "baseline" or "xray"
emt-skill-sync sync --filter-tags baseline,xray

# Combine: skills in bundle AND have matching tag
emt-skill-sync sync --profile emt-stage-assessment --filter-tags baseline

# Force overwrite modified files (a backup is saved automatically)
emt-skill-sync sync --force

Sync actions shown in output:

Action Meaning
ADD New skill, will be installed
UPDATE Skill has a newer version in the repo
SKIP Already up to date
CONFLICT Local file was manually modified — use --force to overwrite

emt-skill-sync status

Show current configuration and sync state.

emt-skill-sync status

Output includes repo URL, branch, provider, scope, last sync time, managed file count, and whether any files have been modified locally (drift).


emt-skill-sync doctor

Run environment diagnostics to verify everything is configured correctly.

emt-skill-sync doctor

Checks:

  • Python version ≥ 3.10
  • Git installed
  • Config file exists and is complete
  • Azure authentication works
  • Repository is accessible
  • Destination path is writable
  • State file is valid

emt-skill-sync reset

Delete config and state files. Already-synced skill files are not removed.

emt-skill-sync reset

Where Skills Are Installed

Global scope (default)

Provider Path
claude ~/.claude/skills/
copilot ~/.github/copilot/skills/

Project scope

Provider Path
claude <project>/.claude/skills/
copilot <project>/.github/instructions/

Authentication

emt-skill-sync uses azure-identity. On first run it will prompt device-code login if the Azure CLI credential is not available. Subsequent runs reuse the cached credential.

You can also authenticate in advance using the Azure CLI:

az login

Per-Project Config (.flezi-emt/config.yaml)

Place a .flezi-emt/config.yaml at your project root to configure emt-skill-sync per project without touching global settings:

# .flezi-emt/config.yaml
profile: emt-stage-assessment    # sync only assessment-stage skills
filter_tags: [baseline, xray]    # further filter by tags
scope: project                   # always use project scope for this repo

The CLI auto-detects this file by walking up from your current directory. Precedence: CLI flags > .flezi-emt/config.yaml > global config.

Note: Agents sync is not yet supported in this release (planned for a future sprint).

Config & State Files

File Location Notes
Global config ~/.config/emt-skill-sync/config.json Persists repo URL, branch, provider, scope
Project config <project>/.flezi-emt/config.yaml Read-only; per-project profile/filter overrides
State platform user data dir Managed files, last sync time
Repo cache platform user cache dir Cloned remote repo

To view the active config path, run emt-skill-sync doctor.

Conflict Handling

If a managed skill file was edited locally after the last sync, it will show as CONFLICT. The CLI will stop and ask you to either:

  • Inspect and revert the file manually, then re-run sync
  • Or run with --force to overwrite — a backup copy is saved automatically before overwriting

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

emt_skill_sync-0.5.0.tar.gz (61.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

emt_skill_sync-0.5.0-py3-none-any.whl (25.5 kB view details)

Uploaded Python 3

File details

Details for the file emt_skill_sync-0.5.0.tar.gz.

File metadata

  • Download URL: emt_skill_sync-0.5.0.tar.gz
  • Upload date:
  • Size: 61.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for emt_skill_sync-0.5.0.tar.gz
Algorithm Hash digest
SHA256 a279b6a646605fc2e238c5c03efe5ee6601238ca2464f3abca4cd2f9b10810b7
MD5 caefe0b3e8dc3d5cd20182b7eb640207
BLAKE2b-256 2b99cdf1855278868bd6739cf40f6080d9f2d852bed22302c697d5d34b797220

See more details on using hashes here.

File details

Details for the file emt_skill_sync-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: emt_skill_sync-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 25.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for emt_skill_sync-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e769460a1cb5a2d399d9d0cc8a92078f2c70b4d6544bd712c2d927c7042cb953
MD5 149be9b77491e54efc96a932af60473d
BLAKE2b-256 d2a44712e494248efb4d24f06d526b4512d9d3b3b47c6e84beeb10baaf7a5924

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page