ai-config-cli 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ai_config_cli-0.1.0/.github/workflows/docs.yml +82 -0
- ai_config_cli-0.1.0/.github/workflows/publish.yml +25 -0
- ai_config_cli-0.1.0/.github/workflows/tests.yml +42 -0
- ai_config_cli-0.1.0/.gitignore +47 -0
- ai_config_cli-0.1.0/.pre-commit-config.yaml +27 -0
- ai_config_cli-0.1.0/AGENTS.md +107 -0
- ai_config_cli-0.1.0/CHANGELOG.md +27 -0
- ai_config_cli-0.1.0/CLAUDE.md +1 -0
- ai_config_cli-0.1.0/CONTRIBUTING.md +40 -0
- ai_config_cli-0.1.0/LICENSE +21 -0
- ai_config_cli-0.1.0/PKG-INFO +235 -0
- ai_config_cli-0.1.0/README.md +188 -0
- ai_config_cli-0.1.0/docs/commands.md +177 -0
- ai_config_cli-0.1.0/docs/config.md +135 -0
- ai_config_cli-0.1.0/docs/index.md +61 -0
- ai_config_cli-0.1.0/justfile +69 -0
- ai_config_cli-0.1.0/mkdocs.yml +74 -0
- ai_config_cli-0.1.0/pyproject.toml +116 -0
- ai_config_cli-0.1.0/src/AGENTS.md +69 -0
- ai_config_cli-0.1.0/src/CLAUDE.md +1 -0
- ai_config_cli-0.1.0/src/ai_config/__init__.py +3 -0
- ai_config_cli-0.1.0/src/ai_config/__main__.py +6 -0
- ai_config_cli-0.1.0/src/ai_config/adapters/__init__.py +1 -0
- ai_config_cli-0.1.0/src/ai_config/adapters/claude.py +353 -0
- ai_config_cli-0.1.0/src/ai_config/cli.py +729 -0
- ai_config_cli-0.1.0/src/ai_config/cli_render.py +525 -0
- ai_config_cli-0.1.0/src/ai_config/cli_theme.py +44 -0
- ai_config_cli-0.1.0/src/ai_config/config.py +260 -0
- ai_config_cli-0.1.0/src/ai_config/init.py +763 -0
- ai_config_cli-0.1.0/src/ai_config/operations.py +357 -0
- ai_config_cli-0.1.0/src/ai_config/scaffold.py +87 -0
- ai_config_cli-0.1.0/src/ai_config/settings.py +63 -0
- ai_config_cli-0.1.0/src/ai_config/types.py +143 -0
- ai_config_cli-0.1.0/src/ai_config/validators/__init__.py +149 -0
- ai_config_cli-0.1.0/src/ai_config/validators/base.py +48 -0
- ai_config_cli-0.1.0/src/ai_config/validators/component/__init__.py +1 -0
- ai_config_cli-0.1.0/src/ai_config/validators/component/hook.py +366 -0
- ai_config_cli-0.1.0/src/ai_config/validators/component/mcp.py +230 -0
- ai_config_cli-0.1.0/src/ai_config/validators/component/skill.py +411 -0
- ai_config_cli-0.1.0/src/ai_config/validators/context.py +69 -0
- ai_config_cli-0.1.0/src/ai_config/validators/marketplace/__init__.py +1 -0
- ai_config_cli-0.1.0/src/ai_config/validators/marketplace/validators.py +433 -0
- ai_config_cli-0.1.0/src/ai_config/validators/plugin/__init__.py +1 -0
- ai_config_cli-0.1.0/src/ai_config/validators/plugin/validators.py +336 -0
- ai_config_cli-0.1.0/src/ai_config/validators/target/__init__.py +1 -0
- ai_config_cli-0.1.0/src/ai_config/validators/target/claude.py +154 -0
- ai_config_cli-0.1.0/src/ai_config/watch.py +279 -0
- ai_config_cli-0.1.0/tests/__init__.py +0 -0
- ai_config_cli-0.1.0/tests/integration/__init__.py +1 -0
- ai_config_cli-0.1.0/tests/integration/test_watch_integration.py +282 -0
- ai_config_cli-0.1.0/tests/unit/__init__.py +1 -0
- ai_config_cli-0.1.0/tests/unit/test_adapters_claude.py +432 -0
- ai_config_cli-0.1.0/tests/unit/test_cli.py +220 -0
- ai_config_cli-0.1.0/tests/unit/test_cli_render.py +418 -0
- ai_config_cli-0.1.0/tests/unit/test_config.py +329 -0
- ai_config_cli-0.1.0/tests/unit/test_init.py +667 -0
- ai_config_cli-0.1.0/tests/unit/test_operations.py +534 -0
- ai_config_cli-0.1.0/tests/unit/test_scaffold.py +65 -0
- ai_config_cli-0.1.0/tests/unit/test_settings.py +143 -0
- ai_config_cli-0.1.0/tests/unit/test_types.py +239 -0
- ai_config_cli-0.1.0/tests/unit/test_validators_base.py +148 -0
- ai_config_cli-0.1.0/tests/unit/test_validators_hook.py +639 -0
- ai_config_cli-0.1.0/tests/unit/test_validators_marketplace.py +886 -0
- ai_config_cli-0.1.0/tests/unit/test_validators_mcp.py +509 -0
- ai_config_cli-0.1.0/tests/unit/test_validators_plugin.py +642 -0
- ai_config_cli-0.1.0/tests/unit/test_validators_skill.py +279 -0
- ai_config_cli-0.1.0/tests/unit/test_watch.py +399 -0
- ai_config_cli-0.1.0/uv.lock +1608 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
name: Deploy Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
paths:
|
|
8
|
+
- 'docs/**'
|
|
9
|
+
- 'mkdocs.yml'
|
|
10
|
+
- '.github/workflows/docs.yml'
|
|
11
|
+
pull_request:
|
|
12
|
+
branches:
|
|
13
|
+
- main
|
|
14
|
+
paths:
|
|
15
|
+
- 'docs/**'
|
|
16
|
+
- 'mkdocs.yml'
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: write
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
deploy:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
if: github.event_name == 'push'
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
fetch-depth: 0
|
|
30
|
+
|
|
31
|
+
- name: Configure Git Credentials
|
|
32
|
+
run: |
|
|
33
|
+
git config user.name github-actions[bot]
|
|
34
|
+
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
35
|
+
|
|
36
|
+
- uses: actions/setup-python@v5
|
|
37
|
+
with:
|
|
38
|
+
python-version: '3.11'
|
|
39
|
+
|
|
40
|
+
- name: Install uv
|
|
41
|
+
uses: astral-sh/setup-uv@v4
|
|
42
|
+
|
|
43
|
+
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
|
44
|
+
|
|
45
|
+
- uses: actions/cache@v4
|
|
46
|
+
with:
|
|
47
|
+
key: mkdocs-material-${{ env.cache_id }}
|
|
48
|
+
path: .cache
|
|
49
|
+
restore-keys: |
|
|
50
|
+
mkdocs-material-
|
|
51
|
+
|
|
52
|
+
- name: Install dependencies
|
|
53
|
+
run: uv sync --extra docs
|
|
54
|
+
|
|
55
|
+
- name: Deploy documentation
|
|
56
|
+
run: uv run mkdocs gh-deploy --force
|
|
57
|
+
|
|
58
|
+
build-check:
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
if: github.event_name == 'pull_request'
|
|
61
|
+
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
|
|
65
|
+
- uses: actions/setup-python@v5
|
|
66
|
+
with:
|
|
67
|
+
python-version: '3.11'
|
|
68
|
+
|
|
69
|
+
- name: Install uv
|
|
70
|
+
uses: astral-sh/setup-uv@v4
|
|
71
|
+
|
|
72
|
+
- name: Install dependencies
|
|
73
|
+
run: uv sync --extra docs
|
|
74
|
+
|
|
75
|
+
- name: Build documentation
|
|
76
|
+
run: uv run mkdocs build --strict
|
|
77
|
+
|
|
78
|
+
- name: Check build output
|
|
79
|
+
run: |
|
|
80
|
+
echo "Documentation builds successfully"
|
|
81
|
+
echo "Site size: $(du -sh site/ | cut -f1)"
|
|
82
|
+
echo "Pages built: $(find site/ -name "*.html" | wc -l)"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
publish:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
environment: pypi
|
|
11
|
+
permissions:
|
|
12
|
+
id-token: write # Required for trusted publishing
|
|
13
|
+
contents: read # Required for checkout
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Set up uv
|
|
18
|
+
uses: astral-sh/setup-uv@v5
|
|
19
|
+
|
|
20
|
+
- name: Build package
|
|
21
|
+
run: uv build
|
|
22
|
+
|
|
23
|
+
- name: Publish to PyPI
|
|
24
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
25
|
+
# No token needed with trusted publishing
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Code Quality Checks
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
checks:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Set up Python
|
|
15
|
+
uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: '3.11'
|
|
18
|
+
|
|
19
|
+
- name: Install uv
|
|
20
|
+
uses: astral-sh/setup-uv@v4
|
|
21
|
+
|
|
22
|
+
- name: Install dependencies
|
|
23
|
+
run: uv sync --all-extras
|
|
24
|
+
|
|
25
|
+
- name: Run Linter
|
|
26
|
+
run: uv run ruff check src/
|
|
27
|
+
|
|
28
|
+
- name: Run Formatter Check
|
|
29
|
+
run: uv run ruff format --check src/
|
|
30
|
+
|
|
31
|
+
- name: Run Type Checker
|
|
32
|
+
run: uv run ty check src/
|
|
33
|
+
|
|
34
|
+
- name: Run Tests
|
|
35
|
+
run: uv run pytest tests/ --cov=src/ai_config --cov-report=term-missing --cov-report=xml
|
|
36
|
+
|
|
37
|
+
- name: Upload coverage to Codecov
|
|
38
|
+
uses: codecov/codecov-action@v4
|
|
39
|
+
continue-on-error: true
|
|
40
|
+
with:
|
|
41
|
+
files: coverage.xml
|
|
42
|
+
fail_ci_if_error: false
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
eggs/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
*.egg
|
|
12
|
+
|
|
13
|
+
# Virtual environments
|
|
14
|
+
.venv/
|
|
15
|
+
venv/
|
|
16
|
+
ENV/
|
|
17
|
+
|
|
18
|
+
# Testing
|
|
19
|
+
.coverage
|
|
20
|
+
.pytest_cache/
|
|
21
|
+
htmlcov/
|
|
22
|
+
.tox/
|
|
23
|
+
|
|
24
|
+
# Type checking
|
|
25
|
+
.mypy_cache/
|
|
26
|
+
.ty_cache/
|
|
27
|
+
|
|
28
|
+
# Linting
|
|
29
|
+
.ruff_cache/
|
|
30
|
+
|
|
31
|
+
# Documentation
|
|
32
|
+
site/
|
|
33
|
+
.cache/
|
|
34
|
+
|
|
35
|
+
# IDE
|
|
36
|
+
.idea/
|
|
37
|
+
.vs_code/
|
|
38
|
+
*.swp
|
|
39
|
+
*.swo
|
|
40
|
+
*~
|
|
41
|
+
|
|
42
|
+
# OS
|
|
43
|
+
.DS_Store
|
|
44
|
+
|
|
45
|
+
# Packaging
|
|
46
|
+
*.lock
|
|
47
|
+
!uv.lock
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: local
|
|
3
|
+
hooks:
|
|
4
|
+
- id: lint
|
|
5
|
+
name: Run Linter
|
|
6
|
+
entry: uv run ruff check src/
|
|
7
|
+
language: system
|
|
8
|
+
always_run: true
|
|
9
|
+
pass_filenames: false
|
|
10
|
+
- id: format
|
|
11
|
+
name: Run Formatter
|
|
12
|
+
entry: uv run ruff format --check src/
|
|
13
|
+
language: system
|
|
14
|
+
always_run: true
|
|
15
|
+
pass_filenames: false
|
|
16
|
+
- id: ty
|
|
17
|
+
name: Run Type Checker
|
|
18
|
+
entry: uv run ty check src/
|
|
19
|
+
language: system
|
|
20
|
+
always_run: true
|
|
21
|
+
pass_filenames: false
|
|
22
|
+
- id: test
|
|
23
|
+
name: Run Tests
|
|
24
|
+
entry: uv run pytest tests/ -q
|
|
25
|
+
language: system
|
|
26
|
+
always_run: true
|
|
27
|
+
pass_filenames: false
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# ai-config
|
|
2
|
+
|
|
3
|
+
Declarative plugin manager for Claude Code.
|
|
4
|
+
|
|
5
|
+
## Why This Exists
|
|
6
|
+
|
|
7
|
+
Claude Code plugins let you extend Claude with custom skills, hooks, and MCP servers. Managing them manually (`claude plugin install`, `claude plugin marketplace add`) doesn't scale across machines or teams.
|
|
8
|
+
|
|
9
|
+
ai-config provides a YAML config file for declarative plugin management. Define what you want, run `ai-config sync`, done.
|
|
10
|
+
|
|
11
|
+
## Repo Map
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
src/ai_config/
|
|
15
|
+
├── cli.py # Click CLI entry point
|
|
16
|
+
├── config.py # Config file parsing
|
|
17
|
+
├── operations.py # sync, update, status logic
|
|
18
|
+
├── init.py # Interactive setup wizard
|
|
19
|
+
├── watch.py # File watcher for dev mode
|
|
20
|
+
├── adapters/ # Tool-specific adapters (claude.py)
|
|
21
|
+
└── validators/ # Validation (plugins, skills, hooks, MCP)
|
|
22
|
+
tests/
|
|
23
|
+
├── unit/ # Fast unit tests
|
|
24
|
+
└── integration/ # Integration tests (marked)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## How to Work Here
|
|
28
|
+
|
|
29
|
+
1. **Setup**: `uv sync --all-extras`
|
|
30
|
+
2. **Make changes**
|
|
31
|
+
3. **Validate**: `uv run ruff check src/ && uv run ty check src/ && uv run pytest tests/unit/ -v`
|
|
32
|
+
4. **Commit** when all checks pass
|
|
33
|
+
|
|
34
|
+
## Commands
|
|
35
|
+
|
|
36
|
+
All commands use `uv run` (or `just` if installed).
|
|
37
|
+
|
|
38
|
+
| Task | Command |
|
|
39
|
+
|------|---------|
|
|
40
|
+
| Install deps | `uv sync --all-extras` |
|
|
41
|
+
| Lint | `uv run ruff check src/` |
|
|
42
|
+
| Format | `uv run ruff format src/` |
|
|
43
|
+
| Fix lint | `uv run ruff check src/ --fix` |
|
|
44
|
+
| Type check | `uv run ty check src/` |
|
|
45
|
+
| All checks | `uv run ruff check src/ && uv run ty check src/ && uv run pytest tests/ -v` |
|
|
46
|
+
| Unit tests | `uv run pytest tests/unit/ -v` |
|
|
47
|
+
| Single test | `uv run pytest tests/unit/test_foo.py -v` |
|
|
48
|
+
| Coverage | `uv run pytest tests/ -v --cov=src/ai_config --cov-report=term-missing` |
|
|
49
|
+
| Docs serve | `uv run mkdocs serve` |
|
|
50
|
+
|
|
51
|
+
If `just` is available, use `just check` (runs lint + ty + test).
|
|
52
|
+
|
|
53
|
+
## Code Style
|
|
54
|
+
|
|
55
|
+
Enforced by tooling—don't memorize rules, run the tools:
|
|
56
|
+
|
|
57
|
+
- **Formatting**: `ruff format` (line-length 100)
|
|
58
|
+
- **Linting**: `ruff check` with autofix
|
|
59
|
+
- **Types**: `ty check` with strict mode
|
|
60
|
+
|
|
61
|
+
Conventions:
|
|
62
|
+
- Python 3.9+ syntax
|
|
63
|
+
- Type annotations required
|
|
64
|
+
- Imports: stdlib → third-party → local (enforced by ruff isort)
|
|
65
|
+
|
|
66
|
+
## Testing
|
|
67
|
+
|
|
68
|
+
- Unit tests in `tests/unit/` - fast, no external deps
|
|
69
|
+
- Integration tests marked with `@pytest.mark.integration`
|
|
70
|
+
- Run single test: `uv run pytest tests/unit/test_config.py::test_name -v`
|
|
71
|
+
|
|
72
|
+
## Releases
|
|
73
|
+
|
|
74
|
+
**Before merging a PR with user-facing changes:**
|
|
75
|
+
1. Update `CHANGELOG.md` under `[Unreleased]` section
|
|
76
|
+
2. Use Keep a Changelog format: Added, Changed, Deprecated, Removed, Fixed, Security
|
|
77
|
+
|
|
78
|
+
**To release a new version:**
|
|
79
|
+
1. Move `[Unreleased]` entries to new version section with date
|
|
80
|
+
2. Update version in `pyproject.toml`
|
|
81
|
+
3. Update comparison links at bottom of CHANGELOG.md
|
|
82
|
+
4. Create PR, merge to main
|
|
83
|
+
5. Create GitHub release with tag `vX.Y.Z` (this auto-publishes to PyPI)
|
|
84
|
+
|
|
85
|
+
Version is in `pyproject.toml` (currently `0.1.0`). Tags use `v` prefix (e.g., `v0.1.0`).
|
|
86
|
+
|
|
87
|
+
### PyPI Publishing
|
|
88
|
+
|
|
89
|
+
Publishing is automated via GitHub Actions (`.github/workflows/publish.yml`):
|
|
90
|
+
- Triggered when a GitHub Release is published
|
|
91
|
+
- Uses trusted publishing (no API tokens needed)
|
|
92
|
+
- Requires PyPI environment configured in repo settings
|
|
93
|
+
|
|
94
|
+
**One-time setup (repo admin):**
|
|
95
|
+
1. Go to PyPI → Account settings → Publishing
|
|
96
|
+
2. Add trusted publisher: GitHub, `safurrier/ai-config`, workflow `publish.yml`, environment `pypi`
|
|
97
|
+
3. Go to GitHub repo → Settings → Environments → Create `pypi` environment
|
|
98
|
+
|
|
99
|
+
## Nested Docs
|
|
100
|
+
|
|
101
|
+
- `src/AGENTS.md` - Code patterns, validator/CLI extension guides
|
|
102
|
+
|
|
103
|
+
## Gotchas
|
|
104
|
+
|
|
105
|
+
- **Claude Code reloads plugins at session start** - after `ai-config sync`, restart Claude Code (use `claude --resume` to continue)
|
|
106
|
+
- **Config locations**: `.ai-config/config.yaml` (project) or `~/.ai-config/config.yaml` (global)
|
|
107
|
+
- **Scopes**: `user` scope installs to `~/.claude/plugins/`, `project` scope to `.claude/plugins/`
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0] - 2025-02-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Initial release
|
|
15
|
+
- `init` command - interactive config generator
|
|
16
|
+
- `sync` command - install/uninstall plugins to match config
|
|
17
|
+
- `status` command - show current plugin state
|
|
18
|
+
- `watch` command - auto-sync on file changes
|
|
19
|
+
- `update` command - update plugins to latest versions
|
|
20
|
+
- `doctor` command - validate setup with fix hints
|
|
21
|
+
- `plugin create` command - scaffold new plugins
|
|
22
|
+
- `cache clear` command - clear plugin cache
|
|
23
|
+
- Support for GitHub and local marketplaces
|
|
24
|
+
- User and project scope plugin installation
|
|
25
|
+
|
|
26
|
+
[Unreleased]: https://github.com/safurrier/ai-config/compare/v0.1.0...HEAD
|
|
27
|
+
[0.1.0]: https://github.com/safurrier/ai-config/releases/tag/v0.1.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AGENTS.md
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Contributing to ai-config
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing!
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
1. Fork the repository
|
|
8
|
+
2. Clone your fork: `git clone git@github.com:your-username/ai-config.git`
|
|
9
|
+
3. Create a new branch: `git checkout -b feature-name`
|
|
10
|
+
4. Make your changes
|
|
11
|
+
5. Run quality checks: `just check`
|
|
12
|
+
6. Commit your changes: `git commit -m "Description of changes"`
|
|
13
|
+
7. Push to your fork: `git push origin feature-name`
|
|
14
|
+
8. Open a Pull Request
|
|
15
|
+
|
|
16
|
+
## Development Setup
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Install dependencies
|
|
20
|
+
just setup
|
|
21
|
+
|
|
22
|
+
# Run all quality checks (lint, type check, test)
|
|
23
|
+
just check
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Code Quality Standards
|
|
27
|
+
|
|
28
|
+
- All code must be typed with proper type hints
|
|
29
|
+
- Tests must be included for new features
|
|
30
|
+
- All quality checks must pass (`just check`)
|
|
31
|
+
|
|
32
|
+
## Pull Request Process
|
|
33
|
+
|
|
34
|
+
1. Update the README.md with details of significant changes
|
|
35
|
+
2. Update the CHANGELOG.md following the existing format
|
|
36
|
+
3. The PR will be merged once you have the sign-off of a maintainer
|
|
37
|
+
|
|
38
|
+
## Questions?
|
|
39
|
+
|
|
40
|
+
Feel free to open an issue for any questions or concerns.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Alex Furrier
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ai-config-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Declarative plugin manager for Claude Code
|
|
5
|
+
Project-URL: Homepage, https://github.com/safurrier/ai-config
|
|
6
|
+
Project-URL: Documentation, https://safurrier.github.io/ai-config/
|
|
7
|
+
Project-URL: Repository, https://github.com/safurrier/ai-config
|
|
8
|
+
Project-URL: Issues, https://github.com/safurrier/ai-config/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/safurrier/ai-config/blob/main/CHANGELOG.md
|
|
10
|
+
Author-email: Alex Furrier <afurrier@gmail.com>
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: ai,claude,claude-code,configuration,plugin
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Classifier: Typing :: Typed
|
|
27
|
+
Requires-Python: >=3.9
|
|
28
|
+
Requires-Dist: click>=8.0
|
|
29
|
+
Requires-Dist: pyyaml>=6.0
|
|
30
|
+
Requires-Dist: questionary>=2.0
|
|
31
|
+
Requires-Dist: requests>=2.28
|
|
32
|
+
Requires-Dist: rich>=13.0
|
|
33
|
+
Requires-Dist: watchdog>=3.0
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: pre-commit>=3.6.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest>=8.1.1; extra == 'dev'
|
|
39
|
+
Requires-Dist: ruff>=0.3.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: ty>=0.0.2; extra == 'dev'
|
|
41
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: types-requests>=2.28; extra == 'dev'
|
|
43
|
+
Provides-Extra: docs
|
|
44
|
+
Requires-Dist: mkdocs-material>=9.6.14; extra == 'docs'
|
|
45
|
+
Requires-Dist: mkdocstrings[python]>=0.26.1; extra == 'docs'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# ai-config
|
|
49
|
+
|
|
50
|
+
Declarative plugin manager for Claude Code.
|
|
51
|
+
|
|
52
|
+
(Future: Codex CLI and OpenCode support planned once plugins become more standardized for sharing ai-context)
|
|
53
|
+
|
|
54
|
+
## Why this exists
|
|
55
|
+
|
|
56
|
+
Claude Code plugins are useful. They let you extend Claude with custom skills, hooks, and MCP servers. The problem is managing them.
|
|
57
|
+
|
|
58
|
+
Without ai-config, you're running `claude plugin install` and `claude plugin marketplace add` commands by hand across machines. There's no config file. No way to version control your setup. No way to share it.
|
|
59
|
+
|
|
60
|
+
ai-config fixes that. You write a YAML file describing what plugins you want, and it handles the rest.
|
|
61
|
+
|
|
62
|
+
Or more simply, run `ai-config init` and it writes the config for you.
|
|
63
|
+
|
|
64
|
+
## What this isn't
|
|
65
|
+
|
|
66
|
+
This README does not have:
|
|
67
|
+
|
|
68
|
+
- 14 shields.io badges declaring build status, coverage, npm downloads, discord members, twitter followers, and mass-to-charge ratio
|
|
69
|
+
- A mass of emojis to make it look "friendly" and "approachable"
|
|
70
|
+
- Claims about revolutionizing your development workflow
|
|
71
|
+
- Integration with 47 different tools (we integrate with one)
|
|
72
|
+
- A "Quick Start" that's actually 73 steps
|
|
73
|
+
- Screenshots of a dashboard that doesn't exist
|
|
74
|
+
- A "Powered by AI" badge despite just being a for-loop
|
|
75
|
+
|
|
76
|
+
It's a config file and some commands. That's it.
|
|
77
|
+
|
|
78
|
+
## Installation
|
|
79
|
+
|
|
80
|
+
> **Alpha software**: This project is in active development. APIs and config formats may change between versions.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
pip install ai-config-cli
|
|
84
|
+
# or
|
|
85
|
+
uv tool install ai-config-cli
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
This installs `ai-config` globally. Run `ai-config --help` to verify.
|
|
89
|
+
|
|
90
|
+
### From source (latest)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
uv tool install git+https://github.com/safurrier/ai-config
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### For development
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/safurrier/ai-config.git
|
|
100
|
+
cd ai-config
|
|
101
|
+
just setup # Install dependencies
|
|
102
|
+
just check # Run lint, type check, tests
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Quick Start
|
|
106
|
+
|
|
107
|
+
**1. Create your config**
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
ai-config init
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Interactive wizard walks you through adding marketplaces and plugins. Creates `.ai-config/config.yaml`.
|
|
114
|
+
|
|
115
|
+
**2. Sync to install plugins**
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
ai-config sync
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Installs/uninstalls plugins to match your config. Run this after editing `config.yaml`.
|
|
122
|
+
|
|
123
|
+
If plugins seem stale or out of date:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
ai-config sync --fresh
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**3. Iterate with watch (plugin development)**
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
ai-config watch
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Auto-syncs when you edit config or plugin files. Press Ctrl+C to stop.
|
|
136
|
+
|
|
137
|
+
**Note:** Claude Code loads plugins at session start. After changes sync, restart Claude Code to apply them. Use `claude --resume` to continue your previous session.
|
|
138
|
+
|
|
139
|
+
**4. Troubleshoot with doctor**
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
ai-config doctor
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Validates marketplaces, plugins, skills, hooks, and MCP servers. Shows fix hints for any issues.
|
|
146
|
+
|
|
147
|
+
## What it does
|
|
148
|
+
|
|
149
|
+
**Declarative config** - Define your plugins in `.ai-config/config.yaml`:
|
|
150
|
+
|
|
151
|
+
```yaml
|
|
152
|
+
version: 1
|
|
153
|
+
targets:
|
|
154
|
+
- type: claude
|
|
155
|
+
config:
|
|
156
|
+
marketplaces:
|
|
157
|
+
claude-code-tutorial:
|
|
158
|
+
source: github
|
|
159
|
+
repo: safurrier/claude-code-tutorial
|
|
160
|
+
plugins:
|
|
161
|
+
- id: claude-code-tutorial@claude-code-tutorial
|
|
162
|
+
scope: user
|
|
163
|
+
enabled: true
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Interactive setup** - Don't want to write YAML? Run the wizard:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
ai-config init
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
It walks you through adding marketplaces and plugins with arrow-key navigation.
|
|
173
|
+
|
|
174
|
+
**Sync** - Make reality match your config:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
ai-config sync
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Validation** - Find problems before they bite you:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
ai-config doctor
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Checks that marketplaces exist, plugins are installed, skills are valid, hooks work.
|
|
187
|
+
|
|
188
|
+
## Commands
|
|
189
|
+
|
|
190
|
+
| Command | What it does |
|
|
191
|
+
|---------|--------------|
|
|
192
|
+
| `init` | Interactive config generator |
|
|
193
|
+
| `sync` | Install/uninstall plugins to match config |
|
|
194
|
+
| `status` | Show what's currently installed |
|
|
195
|
+
| `watch` | Auto-sync on file changes (plugin development) |
|
|
196
|
+
| `update` | Update plugins to latest versions |
|
|
197
|
+
| `doctor` | Validate setup and show fix hints |
|
|
198
|
+
| `plugin create` | Scaffold a new plugin |
|
|
199
|
+
| `cache clear` | Clear the plugin cache |
|
|
200
|
+
|
|
201
|
+
## Config file locations
|
|
202
|
+
|
|
203
|
+
ai-config looks for config in this order:
|
|
204
|
+
|
|
205
|
+
1. `.ai-config/config.yaml` (project-local)
|
|
206
|
+
2. `~/.ai-config/config.yaml` (global)
|
|
207
|
+
|
|
208
|
+
You can also pass `-c /path/to/config.yaml` to any command.
|
|
209
|
+
|
|
210
|
+
## Scopes
|
|
211
|
+
|
|
212
|
+
Plugins can be installed in different scopes:
|
|
213
|
+
|
|
214
|
+
- **user** - Available everywhere (`~/.claude/plugins/`)
|
|
215
|
+
- **project** - Only in the current project (`.claude/plugins/`)
|
|
216
|
+
|
|
217
|
+
## Troubleshooting
|
|
218
|
+
|
|
219
|
+
**Plugin installed but not showing up in / commands**
|
|
220
|
+
|
|
221
|
+
Clear cache and re-sync:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
ai-config sync --fresh
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Something's broken and Claude Code won't help**
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
ai-config doctor --verbose
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## License
|
|
234
|
+
|
|
235
|
+
MIT
|