devcoach 0.3.6__tar.gz → 0.3.8__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.
- {devcoach-0.3.6 → devcoach-0.3.8}/.github/workflows/ci.yml +41 -13
- {devcoach-0.3.6 → devcoach-0.3.8}/.github/workflows/ruff-autofix.yml +1 -1
- {devcoach-0.3.6 → devcoach-0.3.8}/CLAUDE.md +4 -3
- {devcoach-0.3.6 → devcoach-0.3.8}/PKG-INFO +15 -13
- {devcoach-0.3.6 → devcoach-0.3.8}/README.md +13 -10
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/cli.md +38 -4
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/getting-started.md +14 -4
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/index.md +1 -1
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/mcp-server.md +9 -4
- {devcoach-0.3.6 → devcoach-0.3.8}/pyproject.toml +3 -4
- {devcoach-0.3.6 → devcoach-0.3.8}/sonar-project.properties +2 -2
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/SKILL.md +65 -68
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/cli/commands.py +174 -26
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/coach.py +2 -2
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/db.py +4 -4
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/git.py +11 -9
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/models.py +43 -2
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/mcp/server.py +79 -146
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/app.py +6 -2
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/templates/lesson_detail.html +1 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/templates/lessons.html +1 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_cli.py +30 -9
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_cli_commands.py +269 -29
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_mcp_server.py +77 -77
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_web.py +24 -8
- {devcoach-0.3.6 → devcoach-0.3.8}/uv.lock +3 -240
- {devcoach-0.3.6 → devcoach-0.3.8}/.github/dependabot.yml +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/.github/scripts/fixtures/devcoach-backup.zip +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/.github/scripts/take_screenshots.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/.github/workflows/update-screenshots.yml +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/.gitignore +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/LICENSE +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/NOTICE +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/SKILL.md +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/PLAN.md +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/configuration.md +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/favicon.svg +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/screenshots/knowledge-map-dark.png +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/screenshots/knowledge-map-light.png +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/screenshots/lessons-dark.png +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/screenshots/lessons-light.png +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/screenshots/settings-dark.png +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/screenshots/settings-light.png +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/docs/web-ui.md +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/mkdocs.yml +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/__init__.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/cli/__init__.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/__init__.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/detect.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/core/prompts.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/mcp/__init__.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/__init__.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/favicon.svg +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/relative-time.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/style.css +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/alpinejs.min.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/flatpickr-dark.min.css +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/flatpickr.min.css +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/flatpickr.min.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/highlight.min.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/hljs-dark.min.css +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/hljs-light.min.css +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/htmx.min.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/icons/bitbucket.svg +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/icons/github.svg +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/icons/gitlab.svg +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/icons/vscode.svg +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/marked.min.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/static/vendor/tailwind.js +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/templates/base.html +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/templates/profile.html +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/src/devcoach/web/templates/settings.html +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/__init__.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/conftest.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_coach.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_db_extra.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_detect.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_git.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_prompts.py +0 -0
- {devcoach-0.3.6 → devcoach-0.3.8}/tests/test_web_extra.py +0 -0
|
@@ -117,7 +117,7 @@ jobs:
|
|
|
117
117
|
strategy:
|
|
118
118
|
fail-fast: false
|
|
119
119
|
matrix:
|
|
120
|
-
python-version: ["3.
|
|
120
|
+
python-version: ["3.12", "3.13"]
|
|
121
121
|
steps:
|
|
122
122
|
- uses: actions/checkout@v6
|
|
123
123
|
with:
|
|
@@ -149,14 +149,47 @@ jobs:
|
|
|
149
149
|
path: dist/
|
|
150
150
|
retention-days: 7
|
|
151
151
|
|
|
152
|
+
# ── Coverage comment on PR ──────────────────────────────────────────────
|
|
153
|
+
# Posts (and updates) a coverage summary comment on every PR push.
|
|
154
|
+
# Reads the .coverage file generated by pytest-cov — no extra deps needed.
|
|
155
|
+
coverage:
|
|
156
|
+
name: Coverage comment
|
|
157
|
+
needs: [bump]
|
|
158
|
+
if: >
|
|
159
|
+
github.event_name == 'pull_request'
|
|
160
|
+
&& (needs.bump.result == 'success' || needs.bump.result == 'skipped')
|
|
161
|
+
runs-on: ubuntu-latest
|
|
162
|
+
permissions:
|
|
163
|
+
pull-requests: write
|
|
164
|
+
steps:
|
|
165
|
+
- uses: actions/checkout@v6
|
|
166
|
+
- uses: astral-sh/setup-uv@v7
|
|
167
|
+
with:
|
|
168
|
+
python-version: "3.12"
|
|
169
|
+
- run: uv sync --group dev
|
|
170
|
+
- name: Run tests with coverage
|
|
171
|
+
run: uv run pytest tests/ --cov=src/devcoach --cov-report=xml
|
|
172
|
+
- uses: py-cov-action/python-coverage-comment-action@v3
|
|
173
|
+
with:
|
|
174
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
175
|
+
MINIMUM_GREEN: 90
|
|
176
|
+
MINIMUM_ORANGE: 80
|
|
177
|
+
|
|
152
178
|
# ── SonarCloud scan + quality gate ─────────────────────────────────────
|
|
153
|
-
# CI-based analysis: feeds coverage.xml to SonarCloud
|
|
154
|
-
#
|
|
155
|
-
#
|
|
179
|
+
# CI-based analysis: feeds coverage.xml to SonarCloud.
|
|
180
|
+
# Skipped on pull_request events — SONAR_TOKEN is not available to PR
|
|
181
|
+
# workflows (GitHub restricts secret access). Runs on main / tags / dispatch
|
|
182
|
+
# where the token is available.
|
|
183
|
+
# Requires Automatic Analysis to be DISABLED on sonarcloud.io
|
|
184
|
+
# (Administration → Analysis Method).
|
|
156
185
|
sonar:
|
|
157
186
|
name: SonarCloud scan
|
|
158
187
|
needs: [bump, test]
|
|
159
|
-
if:
|
|
188
|
+
if: >
|
|
189
|
+
always()
|
|
190
|
+
&& github.event_name != 'pull_request'
|
|
191
|
+
&& (needs.bump.result == 'success' || needs.bump.result == 'skipped')
|
|
192
|
+
&& needs.test.result == 'success'
|
|
160
193
|
runs-on: ubuntu-latest
|
|
161
194
|
steps:
|
|
162
195
|
- uses: actions/checkout@v6
|
|
@@ -169,12 +202,7 @@ jobs:
|
|
|
169
202
|
- run: uv sync --group dev
|
|
170
203
|
- name: Run tests with coverage
|
|
171
204
|
run: uv run pytest tests/ -v --tb=short --cov=src/devcoach --cov-report=xml
|
|
172
|
-
- uses: sonarsource/sonarqube-scan-action@
|
|
173
|
-
env:
|
|
174
|
-
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
175
|
-
- uses: sonarsource/sonarqube-quality-gate-action@v1
|
|
176
|
-
if: github.event_name == 'pull_request'
|
|
177
|
-
timeout-minutes: 5
|
|
205
|
+
- uses: sonarsource/sonarqube-scan-action@v7
|
|
178
206
|
env:
|
|
179
207
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
180
208
|
|
|
@@ -198,12 +226,12 @@ jobs:
|
|
|
198
226
|
python-version: "3.12"
|
|
199
227
|
- run: uv sync --group docs
|
|
200
228
|
- run: uv run mkdocs build
|
|
201
|
-
- uses: actions/upload-pages-artifact@
|
|
229
|
+
- uses: actions/upload-pages-artifact@v5
|
|
202
230
|
with:
|
|
203
231
|
path: site/
|
|
204
232
|
- name: Deploy to GitHub Pages
|
|
205
233
|
id: deploy
|
|
206
|
-
uses: actions/deploy-pages@
|
|
234
|
+
uses: actions/deploy-pages@v5
|
|
207
235
|
|
|
208
236
|
# ── Publish ─────────────────────────────────────────────────────────────
|
|
209
237
|
# Runs when a tag is present: either created by the bump job (workflow_dispatch)
|
|
@@ -30,7 +30,7 @@ jobs:
|
|
|
30
30
|
run: uv run ruff format src/ tests/
|
|
31
31
|
|
|
32
32
|
- name: Open PR if there are changes
|
|
33
|
-
uses: peter-evans/create-pull-request@
|
|
33
|
+
uses: peter-evans/create-pull-request@v8
|
|
34
34
|
with:
|
|
35
35
|
commit-message: "style: apply ruff auto-fixes"
|
|
36
36
|
title: "style: ruff auto-fix"
|
|
@@ -9,7 +9,7 @@ based on the user's knowledge map, the rate limit, and what has already been tau
|
|
|
9
9
|
|
|
10
10
|
Repo: https://github.com/UltimaPhoenix/dev-coach
|
|
11
11
|
PyPI package name: `devcoach`
|
|
12
|
-
End-user command: `uvx devcoach`
|
|
12
|
+
End-user command: `uvx devcoach` (CLI) / `uvx devcoach mcp` (MCP server)
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
@@ -240,7 +240,7 @@ npx @modelcontextprotocol/inspector devcoach
|
|
|
240
240
|
"mcpServers": {
|
|
241
241
|
"devcoach": {
|
|
242
242
|
"command": "uvx",
|
|
243
|
-
"args": ["devcoach"]
|
|
243
|
+
"args": ["devcoach", "mcp"]
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
}
|
|
@@ -252,7 +252,8 @@ npx @modelcontextprotocol/inspector devcoach
|
|
|
252
252
|
|
|
253
253
|
- Follow **Uncle Bob's Clean Code** principles
|
|
254
254
|
- Follow **PEP** standards
|
|
255
|
-
- Linting and formatting enforced by **ruff** — run `uv run ruff check src/ tests/` and `uv run ruff format src/ tests/` before committing
|
|
255
|
+
- Linting and formatting enforced by **ruff** — run `uv run ruff check src/ tests/` and `uv run ruff format src/ tests/` before committing. **All ruff checks must pass before committing.**
|
|
256
|
+
- Test coverage must stay **at or above 80%** — run `uv run pytest --cov=src/devcoach --cov-fail-under=80` to verify. Do not merge code that drops total coverage below this threshold.
|
|
256
257
|
- No external dependencies beyond `fastmcp` and `pydantic`
|
|
257
258
|
- `db.py` exposes only pure functions — no business logic
|
|
258
259
|
- `coach.py` never imports from `server.py` (one-way dependency)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devcoach
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.8
|
|
4
4
|
Summary: A local MCP server that acts as a progressive technical coach for Claude Code and Claude Desktop
|
|
5
5
|
Project-URL: Homepage, https://github.com/UltimaPhoenix/dev-coach
|
|
6
6
|
Project-URL: Repository, https://github.com/UltimaPhoenix/dev-coach
|
|
@@ -216,12 +216,11 @@ Classifier: Intended Audience :: Developers
|
|
|
216
216
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
217
217
|
Classifier: Operating System :: OS Independent
|
|
218
218
|
Classifier: Programming Language :: Python :: 3
|
|
219
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
220
219
|
Classifier: Programming Language :: Python :: 3.12
|
|
221
220
|
Classifier: Programming Language :: Python :: 3.13
|
|
222
221
|
Classifier: Topic :: Education
|
|
223
222
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
224
|
-
Requires-Python: >=3.
|
|
223
|
+
Requires-Python: >=3.12
|
|
225
224
|
Requires-Dist: fastapi>=0.110
|
|
226
225
|
Requires-Dist: fastmcp>=2.0
|
|
227
226
|
Requires-Dist: jinja2>=3.1
|
|
@@ -233,7 +232,7 @@ Description-Content-Type: text/markdown
|
|
|
233
232
|
# devcoach
|
|
234
233
|
|
|
235
234
|
[](https://pypi.org/project/devcoach/)
|
|
236
|
-
[](https://pypi.org/project/devcoach/)
|
|
237
236
|
[](https://github.com/UltimaPhoenix/dev-coach/actions/workflows/ci.yml)
|
|
238
237
|
[](https://sonarcloud.io/summary/new_code?id=UltimaPhoenix_dev-coach)
|
|
239
238
|
[](https://sonarcloud.io/summary/new_code?id=UltimaPhoenix_dev-coach)
|
|
@@ -259,9 +258,9 @@ Everything runs **locally**. No data leaves your machine. One SQLite file at `~/
|
|
|
259
258
|
|
|
260
259
|
## Screenshots
|
|
261
260
|
|
|
262
|
-
|
|
|
263
|
-
|
|
264
|
-
|  |  |  |
|
|
265
264
|
|
|
266
265
|
---
|
|
267
266
|
|
|
@@ -270,7 +269,7 @@ Everything runs **locally**. No data leaves your machine. One SQLite file at `~/
|
|
|
270
269
|
### Recommended — no permanent install needed
|
|
271
270
|
|
|
272
271
|
```bash
|
|
273
|
-
uvx devcoach
|
|
272
|
+
uvx devcoach mcp # starts the MCP server directly
|
|
274
273
|
```
|
|
275
274
|
|
|
276
275
|
### Permanent install
|
|
@@ -287,7 +286,7 @@ devcoach install
|
|
|
287
286
|
|
|
288
287
|
Restart Claude Code or Claude Desktop after installing.
|
|
289
288
|
|
|
290
|
-
> **Requirements:** [uv](https://docs.astral.sh/uv/) · Python 3.
|
|
289
|
+
> **Requirements:** [uv](https://docs.astral.sh/uv/) · Python 3.12+ · Claude Code or Claude Desktop
|
|
291
290
|
|
|
292
291
|
---
|
|
293
292
|
|
|
@@ -322,7 +321,7 @@ Claude: [does the work]
|
|
|
322
321
|
|
|
323
322
|
**Structured concurrency with asyncio.TaskGroup**
|
|
324
323
|
|
|
325
|
-
TaskGroup (Python 3.
|
|
324
|
+
TaskGroup (Python 3.12+) is the modern replacement for bare gather() calls.
|
|
326
325
|
Unlike gather(), it cancels sibling tasks automatically when one raises...
|
|
327
326
|
```
|
|
328
327
|
|
|
@@ -341,13 +340,16 @@ devcoach feedback lesson-python-taskgroup-001 dont_know # need to revisit —
|
|
|
341
340
|
|
|
342
341
|
| Command | Description |
|
|
343
342
|
|---------|-------------|
|
|
343
|
+
| `devcoach` | Show all available commands |
|
|
344
|
+
| `devcoach mcp` | Start the MCP server (stdio) for Claude Code / Claude Desktop |
|
|
344
345
|
| `devcoach setup` | Run the onboarding wizard in the terminal |
|
|
345
346
|
| `devcoach install` | Register with Claude Code / Claude Desktop |
|
|
346
347
|
| `devcoach profile` | Show your knowledge map with confidence bars |
|
|
347
348
|
| `devcoach stats` | Overview: lesson counts, weakest/strongest topics |
|
|
348
349
|
| `devcoach lessons` | Browse lesson history with filters |
|
|
349
350
|
| `devcoach lesson <id>` | Show a single lesson in full |
|
|
350
|
-
| `devcoach star <id>` |
|
|
351
|
+
| `devcoach star <id>` | Mark a lesson as starred (favourite) |
|
|
352
|
+
| `devcoach unstar <id>` | Remove the starred mark from a lesson |
|
|
351
353
|
| `devcoach feedback <id> <know\|dont_know\|clear>` | Record comprehension |
|
|
352
354
|
| `devcoach set max_per_day <n>` | Max lessons in a 24-hour window (default 2) |
|
|
353
355
|
| `devcoach set min_gap_minutes <n>` | Minimum minutes between lessons (default 240) |
|
|
@@ -387,7 +389,7 @@ devcoach implements the [MCP 2025-11-25 spec](https://modelcontextprotocol.io/sp
|
|
|
387
389
|
"devcoach": {
|
|
388
390
|
"type": "stdio",
|
|
389
391
|
"command": "uvx",
|
|
390
|
-
"args": ["devcoach"]
|
|
392
|
+
"args": ["devcoach", "mcp"]
|
|
391
393
|
}
|
|
392
394
|
}
|
|
393
395
|
}
|
|
@@ -429,7 +431,7 @@ git tag v1.2.3
|
|
|
429
431
|
git push origin v1.2.3
|
|
430
432
|
```
|
|
431
433
|
|
|
432
|
-
The pipeline will lint, test across Python 3.
|
|
434
|
+
The pipeline will lint, test across Python 3.12–3.13, build, publish to PyPI via OIDC Trusted Publishing, and create a GitHub Release automatically.
|
|
433
435
|
|
|
434
436
|
> **First-time PyPI setup:** configure a Trusted Publisher on PyPI for `UltimaPhoenix/dev-coach` (environment: `pypi`, workflow: `ci.yml`). No API token required after that.
|
|
435
437
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# devcoach
|
|
2
2
|
|
|
3
3
|
[](https://pypi.org/project/devcoach/)
|
|
4
|
-
[](https://pypi.org/project/devcoach/)
|
|
5
5
|
[](https://github.com/UltimaPhoenix/dev-coach/actions/workflows/ci.yml)
|
|
6
6
|
[](https://sonarcloud.io/summary/new_code?id=UltimaPhoenix_dev-coach)
|
|
7
7
|
[](https://sonarcloud.io/summary/new_code?id=UltimaPhoenix_dev-coach)
|
|
@@ -27,9 +27,9 @@ Everything runs **locally**. No data leaves your machine. One SQLite file at `~/
|
|
|
27
27
|
|
|
28
28
|
## Screenshots
|
|
29
29
|
|
|
30
|
-
|
|
|
31
|
-
|
|
32
|
-
|  |  |  |
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -38,7 +38,7 @@ Everything runs **locally**. No data leaves your machine. One SQLite file at `~/
|
|
|
38
38
|
### Recommended — no permanent install needed
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
uvx devcoach
|
|
41
|
+
uvx devcoach mcp # starts the MCP server directly
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
### Permanent install
|
|
@@ -55,7 +55,7 @@ devcoach install
|
|
|
55
55
|
|
|
56
56
|
Restart Claude Code or Claude Desktop after installing.
|
|
57
57
|
|
|
58
|
-
> **Requirements:** [uv](https://docs.astral.sh/uv/) · Python 3.
|
|
58
|
+
> **Requirements:** [uv](https://docs.astral.sh/uv/) · Python 3.12+ · Claude Code or Claude Desktop
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
@@ -90,7 +90,7 @@ Claude: [does the work]
|
|
|
90
90
|
|
|
91
91
|
**Structured concurrency with asyncio.TaskGroup**
|
|
92
92
|
|
|
93
|
-
TaskGroup (Python 3.
|
|
93
|
+
TaskGroup (Python 3.12+) is the modern replacement for bare gather() calls.
|
|
94
94
|
Unlike gather(), it cancels sibling tasks automatically when one raises...
|
|
95
95
|
```
|
|
96
96
|
|
|
@@ -109,13 +109,16 @@ devcoach feedback lesson-python-taskgroup-001 dont_know # need to revisit —
|
|
|
109
109
|
|
|
110
110
|
| Command | Description |
|
|
111
111
|
|---------|-------------|
|
|
112
|
+
| `devcoach` | Show all available commands |
|
|
113
|
+
| `devcoach mcp` | Start the MCP server (stdio) for Claude Code / Claude Desktop |
|
|
112
114
|
| `devcoach setup` | Run the onboarding wizard in the terminal |
|
|
113
115
|
| `devcoach install` | Register with Claude Code / Claude Desktop |
|
|
114
116
|
| `devcoach profile` | Show your knowledge map with confidence bars |
|
|
115
117
|
| `devcoach stats` | Overview: lesson counts, weakest/strongest topics |
|
|
116
118
|
| `devcoach lessons` | Browse lesson history with filters |
|
|
117
119
|
| `devcoach lesson <id>` | Show a single lesson in full |
|
|
118
|
-
| `devcoach star <id>` |
|
|
120
|
+
| `devcoach star <id>` | Mark a lesson as starred (favourite) |
|
|
121
|
+
| `devcoach unstar <id>` | Remove the starred mark from a lesson |
|
|
119
122
|
| `devcoach feedback <id> <know\|dont_know\|clear>` | Record comprehension |
|
|
120
123
|
| `devcoach set max_per_day <n>` | Max lessons in a 24-hour window (default 2) |
|
|
121
124
|
| `devcoach set min_gap_minutes <n>` | Minimum minutes between lessons (default 240) |
|
|
@@ -155,7 +158,7 @@ devcoach implements the [MCP 2025-11-25 spec](https://modelcontextprotocol.io/sp
|
|
|
155
158
|
"devcoach": {
|
|
156
159
|
"type": "stdio",
|
|
157
160
|
"command": "uvx",
|
|
158
|
-
"args": ["devcoach"]
|
|
161
|
+
"args": ["devcoach", "mcp"]
|
|
159
162
|
}
|
|
160
163
|
}
|
|
161
164
|
}
|
|
@@ -197,7 +200,7 @@ git tag v1.2.3
|
|
|
197
200
|
git push origin v1.2.3
|
|
198
201
|
```
|
|
199
202
|
|
|
200
|
-
The pipeline will lint, test across Python 3.
|
|
203
|
+
The pipeline will lint, test across Python 3.12–3.13, build, publish to PyPI via OIDC Trusted Publishing, and create a GitHub Release automatically.
|
|
201
204
|
|
|
202
205
|
> **First-time PyPI setup:** configure a Trusted Publisher on PyPI for `UltimaPhoenix/dev-coach` (environment: `pypi`, workflow: `ci.yml`). No API token required after that.
|
|
203
206
|
|
|
@@ -1,15 +1,38 @@
|
|
|
1
1
|
# CLI reference
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Running `devcoach` with no arguments prints a help panel listing every available command:
|
|
4
6
|
|
|
5
7
|
```
|
|
6
|
-
devcoach
|
|
8
|
+
devcoach
|
|
7
9
|
```
|
|
8
10
|
|
|
9
11
|
All commands operate on `~/.devcoach/coaching.db`. No network access required.
|
|
10
12
|
|
|
11
13
|
---
|
|
12
14
|
|
|
15
|
+
## MCP server
|
|
16
|
+
|
|
17
|
+
### `devcoach mcp`
|
|
18
|
+
|
|
19
|
+
Start the stdio MCP server for Claude Code or Claude Desktop. This is what you put in your MCP config:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"devcoach": {
|
|
25
|
+
"command": "uvx",
|
|
26
|
+
"args": ["devcoach", "mcp"]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
13
36
|
## Knowledge map
|
|
14
37
|
|
|
15
38
|
### `devcoach profile`
|
|
@@ -117,13 +140,24 @@ devcoach lesson lesson-python-generators-001
|
|
|
117
140
|
|
|
118
141
|
### `devcoach star <id>`
|
|
119
142
|
|
|
120
|
-
|
|
143
|
+
Mark a lesson as starred (favourite).
|
|
121
144
|
|
|
122
145
|
```bash
|
|
123
146
|
devcoach star lesson-python-generators-001
|
|
124
147
|
# → Lesson lesson-python-generators-001 → ★ starred
|
|
125
148
|
```
|
|
126
149
|
|
|
150
|
+
### `devcoach unstar <id>`
|
|
151
|
+
|
|
152
|
+
Remove the starred mark from a lesson.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
devcoach unstar lesson-python-generators-001
|
|
156
|
+
# → Lesson lesson-python-generators-001 → ☆ unstarred
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Both commands are idempotent — calling them when the lesson is already in the target state is safe.
|
|
160
|
+
|
|
127
161
|
### `devcoach feedback <id> <value>`
|
|
128
162
|
|
|
129
163
|
Record whether you understood a lesson. Adjusts knowledge confidence.
|
|
@@ -191,7 +225,7 @@ Followed by optional group assignment and rate-limit settings.
|
|
|
191
225
|
|
|
192
226
|
### `devcoach install`
|
|
193
227
|
|
|
194
|
-
Register the devcoach MCP server in Claude's config files.
|
|
228
|
+
Register the devcoach MCP server (`devcoach mcp`) in Claude's config files.
|
|
195
229
|
|
|
196
230
|
```bash
|
|
197
231
|
devcoach install # both Claude Code + Claude Desktop
|
|
@@ -3,25 +3,35 @@
|
|
|
3
3
|
## Prerequisites
|
|
4
4
|
|
|
5
5
|
- [uv](https://docs.astral.sh/uv/) (recommended) or pip
|
|
6
|
-
- Python 3.
|
|
6
|
+
- Python 3.12+
|
|
7
7
|
- Claude Code or Claude Desktop
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## 1. Install
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
devcoach is published on [PyPI](https://pypi.org/project/devcoach/) and can be installed with any Python package manager.
|
|
14
|
+
|
|
15
|
+
### One-time run — no install needed
|
|
14
16
|
|
|
15
17
|
```bash
|
|
16
|
-
uvx devcoach
|
|
18
|
+
uvx devcoach mcp
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
`uvx` fetches the latest release from PyPI and runs it in an isolated environment. Nothing is left behind.
|
|
22
|
+
|
|
23
|
+
### Permanent install with uv (recommended)
|
|
20
24
|
|
|
21
25
|
```bash
|
|
22
26
|
uv tool install devcoach
|
|
23
27
|
```
|
|
24
28
|
|
|
29
|
+
### Permanent install with pip
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pip install devcoach
|
|
33
|
+
```
|
|
34
|
+
|
|
25
35
|
---
|
|
26
36
|
|
|
27
37
|
## 2. Register with Claude
|
|
@@ -41,7 +41,7 @@ Everything runs **locally**. No data leaves your machine. One SQLite file at `~/
|
|
|
41
41
|

|
|
42
42
|
|
|
43
43
|
=== "Light"
|
|
44
|
-

|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|
|
@@ -14,12 +14,15 @@ The server exposes **tools** (mutations), **resources** (read-only data), and a
|
|
|
14
14
|
"devcoach": {
|
|
15
15
|
"type": "stdio",
|
|
16
16
|
"command": "uvx",
|
|
17
|
-
"args": ["devcoach"]
|
|
17
|
+
"args": ["devcoach", "mcp"]
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
!!! note
|
|
24
|
+
The `mcp` subcommand is required. Running `devcoach` without it launches the CLI instead of the MCP server.
|
|
25
|
+
|
|
23
26
|
---
|
|
24
27
|
|
|
25
28
|
## Tools (mutations)
|
|
@@ -52,7 +55,7 @@ Save a delivered lesson to the coaching log. Git metadata is auto-detected from
|
|
|
52
55
|
| `folder` | string | Absolute path to cwd |
|
|
53
56
|
| `repository_platform` | `"github" \| "gitlab" \| "bitbucket" \| "local"` | VCS platform |
|
|
54
57
|
|
|
55
|
-
Returns `
|
|
58
|
+
Returns the saved `Lesson` object with all resolved fields (including any auto-filled git context).
|
|
56
59
|
|
|
57
60
|
---
|
|
58
61
|
|
|
@@ -112,12 +115,14 @@ All parameters are optional and combinable. Returns `Lesson[]`.
|
|
|
112
115
|
|
|
113
116
|
### `star_lesson`
|
|
114
117
|
|
|
115
|
-
|
|
118
|
+
Set the starred (favourite) flag to an explicit value. Idempotent — calling with the same value twice is safe.
|
|
116
119
|
|
|
117
120
|
```json
|
|
118
|
-
{ "lesson_id": "lesson-python-generators-001" }
|
|
121
|
+
{ "lesson_id": "lesson-python-generators-001", "starred": true }
|
|
119
122
|
```
|
|
120
123
|
|
|
124
|
+
Returns the new `starred` state as a boolean.
|
|
125
|
+
|
|
121
126
|
---
|
|
122
127
|
|
|
123
128
|
### `submit_feedback`
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "devcoach"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.8"
|
|
4
4
|
description = "A local MCP server that acts as a progressive technical coach for Claude Code and Claude Desktop"
|
|
5
5
|
readme = "README.md"
|
|
6
|
-
requires-python = ">=3.
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
7
|
license = { file = "LICENSE" }
|
|
8
8
|
authors = [
|
|
9
9
|
{ name = "UltimaPhoenix", email = "2079222+UltimaPhoenix@users.noreply.github.com" },
|
|
@@ -15,7 +15,6 @@ classifiers = [
|
|
|
15
15
|
"License :: OSI Approved :: Apache Software License",
|
|
16
16
|
"Operating System :: OS Independent",
|
|
17
17
|
"Programming Language :: Python :: 3",
|
|
18
|
-
"Programming Language :: Python :: 3.11",
|
|
19
18
|
"Programming Language :: Python :: 3.12",
|
|
20
19
|
"Programming Language :: Python :: 3.13",
|
|
21
20
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
@@ -60,7 +59,7 @@ docs = [
|
|
|
60
59
|
|
|
61
60
|
[tool.ruff]
|
|
62
61
|
line-length = 100
|
|
63
|
-
target-version = "
|
|
62
|
+
target-version = "py312"
|
|
64
63
|
|
|
65
64
|
[tool.ruff.lint]
|
|
66
65
|
select = ["E", "F", "I", "UP"]
|
|
@@ -2,10 +2,10 @@ sonar.projectKey=UltimaPhoenix_dev-coach
|
|
|
2
2
|
sonar.organization=ultimaphoenix
|
|
3
3
|
|
|
4
4
|
sonar.projectName=devcoach
|
|
5
|
-
sonar.projectVersion=0.3.
|
|
5
|
+
sonar.projectVersion=0.3.8
|
|
6
6
|
|
|
7
7
|
sonar.sources=src
|
|
8
8
|
sonar.tests=tests
|
|
9
|
-
sonar.python.version=3.
|
|
9
|
+
sonar.python.version=3.12
|
|
10
10
|
|
|
11
11
|
sonar.python.coverage.reportPaths=coverage.xml
|