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.3.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.3.0-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: emt_skill_sync-0.3.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.3.0.tar.gz
Algorithm Hash digest
SHA256 71791a29c132915c4d1f276758cff36429a5133e6cf3ee62fbe37a004a6d9442
MD5 74086f3f984f9a84a97f9585ef7d4420
BLAKE2b-256 a9d70adfb379acd2d63b55fa9ca76db226cae7072e39991c3f0ce76c3f57cb1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for emt_skill_sync-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e0b9419a9fa07be961b08d03fd7d58cf4db40bfaeef1a1454f3ade2567dba6fd
MD5 afcc4397e6743832c71b881caff8137d
BLAKE2b-256 424e2b798467267c379576eb5fecb09b6394fa091cfec1ff6a5c9fcbd4f945e2

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