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 stage 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.1.0.tar.gz (51.9 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.1.0-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: emt_skill_sync-0.1.0.tar.gz
  • Upload date:
  • Size: 51.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.9

File hashes

Hashes for emt_skill_sync-0.1.0.tar.gz
Algorithm Hash digest
SHA256 21e50938ab3b7b26da6425b58c0625be393093d32b4beaca65c9a3d32692d65e
MD5 948bc443359f2aa476fc9098b2fc9b01
BLAKE2b-256 96e0111e2cc1e64cc4ff9b6e2ac93f0170d8cb9c23a16e3683c70b3e10f82f03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for emt_skill_sync-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b0b18b223c6136437507acef46c76033f2d2dff298ae53cd2ef56a89ad840cf1
MD5 d6f523bfc2a6746f5945af8906a58894
BLAKE2b-256 746c6d817070ad6c88eeb0b96e337721407c7ae05b63409b3291804c013f3ef1

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