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.
Files changed (68) hide show
  1. ai_config_cli-0.1.0/.github/workflows/docs.yml +82 -0
  2. ai_config_cli-0.1.0/.github/workflows/publish.yml +25 -0
  3. ai_config_cli-0.1.0/.github/workflows/tests.yml +42 -0
  4. ai_config_cli-0.1.0/.gitignore +47 -0
  5. ai_config_cli-0.1.0/.pre-commit-config.yaml +27 -0
  6. ai_config_cli-0.1.0/AGENTS.md +107 -0
  7. ai_config_cli-0.1.0/CHANGELOG.md +27 -0
  8. ai_config_cli-0.1.0/CLAUDE.md +1 -0
  9. ai_config_cli-0.1.0/CONTRIBUTING.md +40 -0
  10. ai_config_cli-0.1.0/LICENSE +21 -0
  11. ai_config_cli-0.1.0/PKG-INFO +235 -0
  12. ai_config_cli-0.1.0/README.md +188 -0
  13. ai_config_cli-0.1.0/docs/commands.md +177 -0
  14. ai_config_cli-0.1.0/docs/config.md +135 -0
  15. ai_config_cli-0.1.0/docs/index.md +61 -0
  16. ai_config_cli-0.1.0/justfile +69 -0
  17. ai_config_cli-0.1.0/mkdocs.yml +74 -0
  18. ai_config_cli-0.1.0/pyproject.toml +116 -0
  19. ai_config_cli-0.1.0/src/AGENTS.md +69 -0
  20. ai_config_cli-0.1.0/src/CLAUDE.md +1 -0
  21. ai_config_cli-0.1.0/src/ai_config/__init__.py +3 -0
  22. ai_config_cli-0.1.0/src/ai_config/__main__.py +6 -0
  23. ai_config_cli-0.1.0/src/ai_config/adapters/__init__.py +1 -0
  24. ai_config_cli-0.1.0/src/ai_config/adapters/claude.py +353 -0
  25. ai_config_cli-0.1.0/src/ai_config/cli.py +729 -0
  26. ai_config_cli-0.1.0/src/ai_config/cli_render.py +525 -0
  27. ai_config_cli-0.1.0/src/ai_config/cli_theme.py +44 -0
  28. ai_config_cli-0.1.0/src/ai_config/config.py +260 -0
  29. ai_config_cli-0.1.0/src/ai_config/init.py +763 -0
  30. ai_config_cli-0.1.0/src/ai_config/operations.py +357 -0
  31. ai_config_cli-0.1.0/src/ai_config/scaffold.py +87 -0
  32. ai_config_cli-0.1.0/src/ai_config/settings.py +63 -0
  33. ai_config_cli-0.1.0/src/ai_config/types.py +143 -0
  34. ai_config_cli-0.1.0/src/ai_config/validators/__init__.py +149 -0
  35. ai_config_cli-0.1.0/src/ai_config/validators/base.py +48 -0
  36. ai_config_cli-0.1.0/src/ai_config/validators/component/__init__.py +1 -0
  37. ai_config_cli-0.1.0/src/ai_config/validators/component/hook.py +366 -0
  38. ai_config_cli-0.1.0/src/ai_config/validators/component/mcp.py +230 -0
  39. ai_config_cli-0.1.0/src/ai_config/validators/component/skill.py +411 -0
  40. ai_config_cli-0.1.0/src/ai_config/validators/context.py +69 -0
  41. ai_config_cli-0.1.0/src/ai_config/validators/marketplace/__init__.py +1 -0
  42. ai_config_cli-0.1.0/src/ai_config/validators/marketplace/validators.py +433 -0
  43. ai_config_cli-0.1.0/src/ai_config/validators/plugin/__init__.py +1 -0
  44. ai_config_cli-0.1.0/src/ai_config/validators/plugin/validators.py +336 -0
  45. ai_config_cli-0.1.0/src/ai_config/validators/target/__init__.py +1 -0
  46. ai_config_cli-0.1.0/src/ai_config/validators/target/claude.py +154 -0
  47. ai_config_cli-0.1.0/src/ai_config/watch.py +279 -0
  48. ai_config_cli-0.1.0/tests/__init__.py +0 -0
  49. ai_config_cli-0.1.0/tests/integration/__init__.py +1 -0
  50. ai_config_cli-0.1.0/tests/integration/test_watch_integration.py +282 -0
  51. ai_config_cli-0.1.0/tests/unit/__init__.py +1 -0
  52. ai_config_cli-0.1.0/tests/unit/test_adapters_claude.py +432 -0
  53. ai_config_cli-0.1.0/tests/unit/test_cli.py +220 -0
  54. ai_config_cli-0.1.0/tests/unit/test_cli_render.py +418 -0
  55. ai_config_cli-0.1.0/tests/unit/test_config.py +329 -0
  56. ai_config_cli-0.1.0/tests/unit/test_init.py +667 -0
  57. ai_config_cli-0.1.0/tests/unit/test_operations.py +534 -0
  58. ai_config_cli-0.1.0/tests/unit/test_scaffold.py +65 -0
  59. ai_config_cli-0.1.0/tests/unit/test_settings.py +143 -0
  60. ai_config_cli-0.1.0/tests/unit/test_types.py +239 -0
  61. ai_config_cli-0.1.0/tests/unit/test_validators_base.py +148 -0
  62. ai_config_cli-0.1.0/tests/unit/test_validators_hook.py +639 -0
  63. ai_config_cli-0.1.0/tests/unit/test_validators_marketplace.py +886 -0
  64. ai_config_cli-0.1.0/tests/unit/test_validators_mcp.py +509 -0
  65. ai_config_cli-0.1.0/tests/unit/test_validators_plugin.py +642 -0
  66. ai_config_cli-0.1.0/tests/unit/test_validators_skill.py +279 -0
  67. ai_config_cli-0.1.0/tests/unit/test_watch.py +399 -0
  68. 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