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
--forceto 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21e50938ab3b7b26da6425b58c0625be393093d32b4beaca65c9a3d32692d65e
|
|
| MD5 |
948bc443359f2aa476fc9098b2fc9b01
|
|
| BLAKE2b-256 |
96e0111e2cc1e64cc4ff9b6e2ac93f0170d8cb9c23a16e3683c70b3e10f82f03
|
File details
Details for the file emt_skill_sync-0.1.0-py3-none-any.whl.
File metadata
- Download URL: emt_skill_sync-0.1.0-py3-none-any.whl
- Upload date:
- Size: 18.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0b18b223c6136437507acef46c76033f2d2dff298ae53cd2ef56a89ad840cf1
|
|
| MD5 |
d6f523bfc2a6746f5945af8906a58894
|
|
| BLAKE2b-256 |
746c6d817070ad6c88eeb0b96e337721407c7ae05b63409b3291804c013f3ef1
|