devcoach 0.1.0__tar.gz → 0.3.5__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 (60) hide show
  1. devcoach-0.3.5/.github/workflows/ci.yml +185 -0
  2. {devcoach-0.1.0 → devcoach-0.3.5}/.github/workflows/ruff-autofix.yml +2 -2
  3. {devcoach-0.1.0 → devcoach-0.3.5}/CLAUDE.md +3 -1
  4. {devcoach-0.1.0 → devcoach-0.3.5}/PKG-INFO +3 -3
  5. {devcoach-0.1.0 → devcoach-0.3.5}/README.md +2 -2
  6. {devcoach-0.1.0 → devcoach-0.3.5}/pyproject.toml +1 -1
  7. devcoach-0.1.0/.github/workflows/ci.yml +0 -110
  8. {devcoach-0.1.0 → devcoach-0.3.5}/.github/dependabot.yml +0 -0
  9. {devcoach-0.1.0 → devcoach-0.3.5}/.gitignore +0 -0
  10. {devcoach-0.1.0 → devcoach-0.3.5}/LICENSE +0 -0
  11. {devcoach-0.1.0 → devcoach-0.3.5}/NOTICE +0 -0
  12. {devcoach-0.1.0 → devcoach-0.3.5}/SKILL.md +0 -0
  13. {devcoach-0.1.0 → devcoach-0.3.5}/docs/PLAN.md +0 -0
  14. {devcoach-0.1.0 → devcoach-0.3.5}/docs/cli.md +0 -0
  15. {devcoach-0.1.0 → devcoach-0.3.5}/docs/configuration.md +0 -0
  16. {devcoach-0.1.0 → devcoach-0.3.5}/docs/getting-started.md +0 -0
  17. {devcoach-0.1.0 → devcoach-0.3.5}/docs/mcp-server.md +0 -0
  18. {devcoach-0.1.0 → devcoach-0.3.5}/docs/web-ui.md +0 -0
  19. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/SKILL.md +0 -0
  20. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/__init__.py +0 -0
  21. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/cli/__init__.py +0 -0
  22. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/cli/commands.py +0 -0
  23. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/__init__.py +0 -0
  24. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/coach.py +0 -0
  25. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/db.py +0 -0
  26. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/detect.py +0 -0
  27. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/git.py +0 -0
  28. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/models.py +0 -0
  29. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/core/prompts.py +0 -0
  30. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/mcp/__init__.py +0 -0
  31. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/mcp/server.py +0 -0
  32. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/__init__.py +0 -0
  33. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/app.py +0 -0
  34. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/favicon.svg +0 -0
  35. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/relative-time.js +0 -0
  36. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/style.css +0 -0
  37. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/alpinejs.min.js +0 -0
  38. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/flatpickr-dark.min.css +0 -0
  39. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/flatpickr.min.css +0 -0
  40. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/flatpickr.min.js +0 -0
  41. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/highlight.min.js +0 -0
  42. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/hljs-dark.min.css +0 -0
  43. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/hljs-light.min.css +0 -0
  44. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/htmx.min.js +0 -0
  45. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/icons/bitbucket.svg +0 -0
  46. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/icons/github.svg +0 -0
  47. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/icons/gitlab.svg +0 -0
  48. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/icons/vscode.svg +0 -0
  49. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/marked.min.js +0 -0
  50. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/static/vendor/tailwind.js +0 -0
  51. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/templates/base.html +0 -0
  52. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/templates/lesson_detail.html +0 -0
  53. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/templates/lessons.html +0 -0
  54. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/templates/profile.html +0 -0
  55. {devcoach-0.1.0 → devcoach-0.3.5}/src/devcoach/web/templates/settings.html +0 -0
  56. {devcoach-0.1.0 → devcoach-0.3.5}/tests/__init__.py +0 -0
  57. {devcoach-0.1.0 → devcoach-0.3.5}/tests/conftest.py +0 -0
  58. {devcoach-0.1.0 → devcoach-0.3.5}/tests/test_cli.py +0 -0
  59. {devcoach-0.1.0 → devcoach-0.3.5}/tests/test_web.py +0 -0
  60. {devcoach-0.1.0 → devcoach-0.3.5}/uv.lock +0 -0
@@ -0,0 +1,185 @@
1
+ name: CI
2
+
3
+ # Covers three scenarios:
4
+ #
5
+ # 1. Push to main / pull request → lint + test + build
6
+ # 2. Tag push (v*) → lint + test + build + publish + GitHub Release
7
+ # 3. workflow_dispatch (Release) → bump version → tag → lint + test + build + publish + GitHub Release
8
+ #
9
+ # The bump job only runs on workflow_dispatch. Lint/test/build always run.
10
+ # Publish and GitHub Release run whenever a tag is present.
11
+
12
+ on:
13
+ push:
14
+ branches: [main]
15
+ tags: ["v*"]
16
+ pull_request:
17
+ workflow_dispatch:
18
+ inputs:
19
+ bump:
20
+ description: "Version bump type"
21
+ required: false
22
+ default: patch
23
+ type: choice
24
+ options: [patch, minor, major]
25
+ version:
26
+ description: "Exact version (overrides bump, e.g. 1.0.0)"
27
+ required: false
28
+ default: ""
29
+
30
+ concurrency:
31
+ group: ${{ github.workflow }}-${{ github.ref }}
32
+ cancel-in-progress: true
33
+
34
+ jobs:
35
+ # ── Bump ────────────────────────────────────────────────────────────────
36
+ # Only runs on workflow_dispatch. Bumps pyproject.toml, commits, tags, pushes.
37
+ bump:
38
+ name: Bump version and tag
39
+ if: github.event_name == 'workflow_dispatch'
40
+ runs-on: ubuntu-latest
41
+ permissions:
42
+ contents: write
43
+ outputs:
44
+ version: ${{ steps.ver.outputs.version }}
45
+ tag: ${{ steps.ver.outputs.tag }}
46
+ steps:
47
+ - uses: actions/checkout@v6
48
+ with:
49
+ fetch-depth: 0
50
+
51
+ - name: Configure git
52
+ run: |
53
+ git config user.name "github-actions[bot]"
54
+ git config user.email "github-actions[bot]@users.noreply.github.com"
55
+
56
+ - name: Compute next version
57
+ id: ver
58
+ run: |
59
+ if [ -n "${{ inputs.version }}" ]; then
60
+ NEXT="${{ inputs.version }}"
61
+ else
62
+ CURRENT=$(grep '^version' pyproject.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
63
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT"
64
+ case "${{ inputs.bump }}" in
65
+ major) NEXT="$((MAJOR+1)).0.0" ;;
66
+ minor) NEXT="${MAJOR}.$((MINOR+1)).0" ;;
67
+ patch) NEXT="${MAJOR}.${MINOR}.$((PATCH+1))" ;;
68
+ esac
69
+ fi
70
+ echo "version=$NEXT" >> "$GITHUB_OUTPUT"
71
+ echo "tag=v$NEXT" >> "$GITHUB_OUTPUT"
72
+
73
+ - name: Bump version in pyproject.toml
74
+ run: sed -i 's/^version = ".*"/version = "${{ steps.ver.outputs.version }}"/' pyproject.toml
75
+
76
+ - name: Commit and tag
77
+ run: |
78
+ git add pyproject.toml
79
+ git commit -m "chore: bump version to ${{ steps.ver.outputs.version }}"
80
+ git tag "${{ steps.ver.outputs.tag }}"
81
+ git push --atomic origin main "${{ steps.ver.outputs.tag }}"
82
+
83
+ # ── Lint ────────────────────────────────────────────────────────────────
84
+ lint:
85
+ name: Lint (ruff)
86
+ needs: [bump]
87
+ if: always() && (needs.bump.result == 'success' || needs.bump.result == 'skipped')
88
+ runs-on: ubuntu-latest
89
+ steps:
90
+ - uses: actions/checkout@v6
91
+ with:
92
+ ref: ${{ needs.bump.outputs.tag || github.ref }}
93
+ - uses: astral-sh/setup-uv@v7
94
+ with:
95
+ python-version: "3.12"
96
+ - run: uv sync --group dev
97
+ - run: uv run ruff check src/ tests/
98
+ - run: uv run ruff format --check src/ tests/
99
+
100
+ # ── Tests ───────────────────────────────────────────────────────────────
101
+ test:
102
+ name: Test (Python ${{ matrix.python-version }})
103
+ needs: [bump]
104
+ if: always() && (needs.bump.result == 'success' || needs.bump.result == 'skipped')
105
+ runs-on: ubuntu-latest
106
+ strategy:
107
+ fail-fast: false
108
+ matrix:
109
+ python-version: ["3.11", "3.12", "3.13"]
110
+ steps:
111
+ - uses: actions/checkout@v6
112
+ with:
113
+ ref: ${{ needs.bump.outputs.tag || github.ref }}
114
+ - uses: astral-sh/setup-uv@v7
115
+ with:
116
+ python-version: ${{ matrix.python-version }}
117
+ - run: uv sync --group dev
118
+ - run: uv run pytest tests/ -v --tb=short
119
+
120
+ # ── Build ───────────────────────────────────────────────────────────────
121
+ build:
122
+ name: Build distribution
123
+ needs: [bump, lint, test]
124
+ if: always() && (needs.bump.result == 'success' || needs.bump.result == 'skipped') && needs.lint.result == 'success' && needs.test.result == 'success'
125
+ runs-on: ubuntu-latest
126
+ steps:
127
+ - uses: actions/checkout@v6
128
+ with:
129
+ ref: ${{ needs.bump.outputs.tag || github.ref }}
130
+ - uses: astral-sh/setup-uv@v7
131
+ with:
132
+ python-version: "3.12"
133
+ - run: uv build
134
+ - uses: actions/upload-artifact@v7
135
+ with:
136
+ name: dist
137
+ path: dist/
138
+ retention-days: 7
139
+
140
+ # ── Publish ─────────────────────────────────────────────────────────────
141
+ # Runs when a tag is present: either created by the bump job (workflow_dispatch)
142
+ # or pushed directly (git push origin v1.2.3).
143
+ # Uses PyPI Trusted Publishing (OIDC) — no API tokens needed.
144
+ #
145
+ # One-time setup on PyPI: project=devcoach, owner=UltimaPhoenix,
146
+ # repo=dev-coach, workflow=ci.yml, environment=pypi
147
+ publish:
148
+ name: Publish to PyPI
149
+ needs: [bump, build]
150
+ if: always() && needs.build.result == 'success' && (needs.bump.result == 'success' || startsWith(github.ref, 'refs/tags/v'))
151
+ runs-on: ubuntu-latest
152
+ environment:
153
+ name: pypi
154
+ url: https://pypi.org/p/devcoach
155
+ permissions:
156
+ id-token: write
157
+ steps:
158
+ - uses: actions/download-artifact@v8
159
+ with:
160
+ name: dist
161
+ path: dist/
162
+ - uses: pypa/gh-action-pypi-publish@release/v1
163
+
164
+ # ── GitHub Release ──────────────────────────────────────────────────────
165
+ github-release:
166
+ name: Create GitHub Release
167
+ needs: [bump, publish]
168
+ if: always() && needs.publish.result == 'success' && (needs.bump.result == 'success' || startsWith(github.ref, 'refs/tags/v'))
169
+ runs-on: ubuntu-latest
170
+ permissions:
171
+ contents: write
172
+ steps:
173
+ - uses: actions/checkout@v6
174
+ with:
175
+ ref: ${{ needs.bump.outputs.tag || github.ref }}
176
+ - uses: actions/download-artifact@v8
177
+ with:
178
+ name: dist
179
+ path: dist/
180
+ - uses: softprops/action-gh-release@v3
181
+ with:
182
+ tag_name: ${{ needs.bump.outputs.tag || github.ref_name }}
183
+ files: dist/*
184
+ generate_release_notes: true
185
+ fail_on_unmatched_files: true
@@ -14,9 +14,9 @@ jobs:
14
14
  name: ruff check --fix + ruff format
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
- - uses: actions/checkout@v4
17
+ - uses: actions/checkout@v6
18
18
 
19
- - uses: astral-sh/setup-uv@v5
19
+ - uses: astral-sh/setup-uv@v7
20
20
  with:
21
21
  python-version: "3.12"
22
22
 
@@ -250,7 +250,9 @@ npx @modelcontextprotocol/inspector devcoach
250
250
 
251
251
  ## Development conventions
252
252
 
253
- - All code is **type-annotated** (mypy-compatible)
253
+ - Follow **Uncle Bob's Clean Code** principles
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
254
256
  - No external dependencies beyond `fastmcp` and `pydantic`
255
257
  - `db.py` exposes only pure functions — no business logic
256
258
  - `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.1.0
3
+ Version: 0.3.5
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
@@ -232,8 +232,8 @@ Description-Content-Type: text/markdown
232
232
 
233
233
  # devcoach
234
234
 
235
- [![PyPI](https://img.shields.io/pypi/v/devcoach)](https://pypi.org/project/devcoach/)
236
- [![Python](https://img.shields.io/pypi/pyversions/devcoach)](https://pypi.org/project/devcoach/)
235
+ [![PyPI](https://img.shields.io/github/v/release/UltimaPhoenix/dev-coach?label=PyPI)](https://pypi.org/project/devcoach/)
236
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://pypi.org/project/devcoach/)
237
237
  [![CI](https://github.com/UltimaPhoenix/dev-coach/actions/workflows/ci.yml/badge.svg)](https://github.com/UltimaPhoenix/dev-coach/actions/workflows/ci.yml)
238
238
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE)
239
239
 
@@ -1,7 +1,7 @@
1
1
  # devcoach
2
2
 
3
- [![PyPI](https://img.shields.io/pypi/v/devcoach)](https://pypi.org/project/devcoach/)
4
- [![Python](https://img.shields.io/pypi/pyversions/devcoach)](https://pypi.org/project/devcoach/)
3
+ [![PyPI](https://img.shields.io/github/v/release/UltimaPhoenix/dev-coach?label=PyPI)](https://pypi.org/project/devcoach/)
4
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://pypi.org/project/devcoach/)
5
5
  [![CI](https://github.com/UltimaPhoenix/dev-coach/actions/workflows/ci.yml/badge.svg)](https://github.com/UltimaPhoenix/dev-coach/actions/workflows/ci.yml)
6
6
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE)
7
7
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devcoach"
3
- version = "0.1.0"
3
+ version = "0.3.5"
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
6
  requires-python = ">=3.11"
@@ -1,110 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- tags: ["v*"]
7
- pull_request:
8
-
9
- concurrency:
10
- group: ${{ github.workflow }}-${{ github.ref }}
11
- cancel-in-progress: true
12
-
13
- jobs:
14
- # ── Lint ────────────────────────────────────────────────────────────────
15
- lint:
16
- name: Lint (ruff)
17
- runs-on: ubuntu-latest
18
- steps:
19
- - uses: actions/checkout@v6
20
- - uses: astral-sh/setup-uv@v7
21
- with:
22
- python-version: "3.12"
23
- - run: uv sync --group dev
24
- - run: uv run ruff check src/ tests/
25
- - run: uv run ruff format --check src/ tests/
26
-
27
- # ── Tests ───────────────────────────────────────────────────────────────
28
- test:
29
- name: Test (Python ${{ matrix.python-version }})
30
- runs-on: ubuntu-latest
31
- strategy:
32
- fail-fast: false
33
- matrix:
34
- python-version: ["3.11", "3.12", "3.13"]
35
- steps:
36
- - uses: actions/checkout@v6
37
- - uses: astral-sh/setup-uv@v7
38
- with:
39
- python-version: ${{ matrix.python-version }}
40
- - run: uv sync --group dev
41
- - run: uv run pytest tests/ -v --tb=short
42
-
43
- # ── Build ───────────────────────────────────────────────────────────────
44
- build:
45
- name: Build distribution
46
- needs: [lint, test]
47
- runs-on: ubuntu-latest
48
- steps:
49
- - uses: actions/checkout@v6
50
- - uses: astral-sh/setup-uv@v7
51
- with:
52
- python-version: "3.12"
53
- - run: uv build
54
- - uses: actions/upload-artifact@v7
55
- with:
56
- name: dist
57
- path: dist/
58
- retention-days: 7
59
-
60
- # ── Publish ─────────────────────────────────────────────────────────────
61
- # Runs only on v* tags (e.g. v0.2.0). Uses PyPI Trusted Publishing (OIDC)
62
- # — no API tokens stored in repository secrets.
63
- #
64
- # One-time setup required on PyPI:
65
- # 1. Go to https://pypi.org/manage/account/publishing/
66
- # 2. Add a new publisher:
67
- # PyPI project name : devcoach
68
- # Owner : UltimaPhoenix
69
- # Repository name : dev-coach
70
- # Workflow filename : ci.yml
71
- # Environment name : pypi
72
- publish:
73
- name: Publish to PyPI
74
- if: startsWith(github.ref, 'refs/tags/v')
75
- needs: build
76
- runs-on: ubuntu-latest
77
- environment:
78
- name: pypi
79
- url: https://pypi.org/p/devcoach
80
- permissions:
81
- id-token: write # required for OIDC trusted publishing
82
- steps:
83
- - uses: actions/download-artifact@v8
84
- with:
85
- name: dist
86
- path: dist/
87
- - name: Publish to PyPI
88
- uses: pypa/gh-action-pypi-publish@release/v1
89
-
90
- # ── GitHub Release ──────────────────────────────────────────────────────
91
- # Creates a GitHub Release with the built distribution attached.
92
- release:
93
- name: Create GitHub Release
94
- if: startsWith(github.ref, 'refs/tags/v')
95
- needs: publish
96
- runs-on: ubuntu-latest
97
- permissions:
98
- contents: write
99
- steps:
100
- - uses: actions/checkout@v6
101
- - uses: actions/download-artifact@v8
102
- with:
103
- name: dist
104
- path: dist/
105
- - name: Create release
106
- uses: softprops/action-gh-release@v3
107
- with:
108
- files: dist/*
109
- generate_release_notes: true
110
- fail_on_unmatched_files: true
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes