stackprep-pro 0.2.3__tar.gz → 0.2.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.
@@ -0,0 +1,51 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ environment: pypi
12
+ permissions:
13
+ id-token: write
14
+ contents: write
15
+
16
+ steps:
17
+ - uses: actions/checkout@v5
18
+
19
+ - name: Get version from pyproject.toml
20
+ id: version
21
+ run: |
22
+ echo "VERSION=$(grep '^version' pyproject.toml | sed 's/version = "\(.*\)"/\1/')" >> $GITHUB_OUTPUT
23
+
24
+ - name: Check if tag already exists
25
+ id: tag_check
26
+ run: |
27
+ if git ls-remote --tags origin "refs/tags/v${{ steps.version.outputs.VERSION }}" | grep -q .; then
28
+ echo "EXISTS=true" >> $GITHUB_OUTPUT
29
+ else
30
+ echo "EXISTS=false" >> $GITHUB_OUTPUT
31
+ fi
32
+
33
+ - name: Tag version
34
+ if: steps.tag_check.outputs.EXISTS == 'false'
35
+ run: |
36
+ git config user.name "github-actions[bot]"
37
+ git config user.email "github-actions[bot]@users.noreply.github.com"
38
+ git tag "v${{ steps.version.outputs.VERSION }}"
39
+ git push origin "v${{ steps.version.outputs.VERSION }}"
40
+
41
+ - name: Install uv
42
+ if: steps.tag_check.outputs.EXISTS == 'false'
43
+ uses: astral-sh/setup-uv@v8.2.0
44
+
45
+ - name: Build
46
+ if: steps.tag_check.outputs.EXISTS == 'false'
47
+ run: uv build
48
+
49
+ - name: Publish to PyPI
50
+ if: steps.tag_check.outputs.EXISTS == 'false'
51
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,41 @@
1
+ # CLAUDE.md — stackprep-pro
2
+
3
+ Rules for working on this repo. **Do NOT violate these. Do NOT touch things that already work.**
4
+
5
+ ## Golden rule
6
+
7
+ - **If something works, do NOT change it.** No "improvements", no refactors, no edits to working code. Only touch what is explicitly broken and being fixed.
8
+ - Always **follow the skill files** in `src/stackprep_pro/skills/`. The skill is the source of truth for behavior. Never invent a flow that contradicts the skill.
9
+
10
+ ## Startup / session flow (MUST follow exactly)
11
+
12
+ 1. When the MCP starts, **ask the user in plain human language**: "Are you prepping for a technical interview or a certification exam?"
13
+ 2. **Only after** the user picks interview or certification:
14
+ - If saved sessions exist for that mode, offer to **continue a saved session** (shown by the **name the user gave it**) or **start a new one**.
15
+ - If none exist, just start a new session.
16
+ 3. **Never expose backend tool names** to the user (no "list_sessions", "start_session", "list_study_packs", etc.). Use natural language only.
17
+ 4. **Never auto-call** `list_sessions` or `list_study_packs` on startup. Call them silently in the background **only** when the user explicitly asks to continue/load.
18
+
19
+ ## Certification exam version
20
+
21
+ - **Never hardcode exam versions** (e.g. do NOT hardcode "SnowPro Core = COF-C03"). It must work for **ANY** certification.
22
+ - Always pull the **latest exam version** dynamically (web search / latest official exam guide), exactly as the original skill does.
23
+ - **`cert_name` must be passed exactly as the user typed it.** Never modify, correct, or substitute it from training data (e.g. do NOT turn COF-C03 into COF-C02).
24
+
25
+ ## Study pack
26
+
27
+ - The user **must be able to name** the study pack when saving it.
28
+ - Study pack format is **markdown, NOT JSON**. For each topic: official docs link (or community source like Reddit/Discord/LinkedIn if no official docs exist — e.g. niche certs like NVIDIA Agentic AI), best video resource, and a 2–3 sentence summary. Include percentages/scores and links as the original skill does.
29
+ - Never fabricate documentation URLs. Only real, publicly accessible links.
30
+
31
+ ## Versioning & publishing
32
+
33
+ - This package publishes to **PyPI** as `stackprep-pro` via **GitHub Actions** on push to `main` (`.github/workflows/publish.yml`).
34
+ - **The human bumps the version in `pyproject.toml` and commits it.** The workflow does **NOT** auto-commit or auto-bump — it only reads the version, tags it, and publishes.
35
+ - Every code change that ships needs a **version bump** (PyPI rejects re-publishing an existing version).
36
+ - After publishing, to test the new version: `uv cache clean`, then restart the MCP client (uvx caches old versions).
37
+ - `git pull` is set to rebase in this repo. If branches diverge, `git pull --rebase`.
38
+
39
+ ## Commit messages
40
+
41
+ - When asked for a commit title, give a single concise conventional-commit line. Do not commit/push unless asked.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stackprep-pro
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: stackprep-pro — interview & certification prep MCP server for any AI client
5
5
  Project-URL: Homepage, https://github.com/youngpada1/stackprep-pro
6
6
  Project-URL: Repository, https://github.com/youngpada1/stackprep-pro
@@ -168,7 +168,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
168
168
  | `save_study_pack` | Save the study pack content to disk. | `session_id`, `name`, `content` |
169
169
  | `list_sessions` | List all saved sessions. Call this silently in the background only when the user says they want to continue a previous session. Never mention this tool to the user. | |
170
170
  | `resume_session` | Resume a previously saved session. Returns full session state and skill rules. | `session_id` |
171
- | `list_study_packs` | List all saved study packs. | |
171
+ | `list_study_packs` | List all saved study packs. Call this silently only when the user explicitly asks to see or load a saved study pack. Never call this on startup or automatically. Never mention this tool to the user. | |
172
172
  | `load_study_pack` | Load a previously saved study pack by name. | `name` |
173
173
 
174
174
  ---
@@ -148,7 +148,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
148
148
  | `save_study_pack` | Save the study pack content to disk. | `session_id`, `name`, `content` |
149
149
  | `list_sessions` | List all saved sessions. Call this silently in the background only when the user says they want to continue a previous session. Never mention this tool to the user. | |
150
150
  | `resume_session` | Resume a previously saved session. Returns full session state and skill rules. | `session_id` |
151
- | `list_study_packs` | List all saved study packs. | |
151
+ | `list_study_packs` | List all saved study packs. Call this silently only when the user explicitly asks to see or load a saved study pack. Never call this on startup or automatically. Never mention this tool to the user. | |
152
152
  | `load_study_pack` | Load a previously saved study pack by name. | `name` |
153
153
 
154
154
  ---
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "stackprep-pro"
3
- version = "0.2.3"
3
+ version = "0.2.5"
4
4
  description = "stackprep-pro — interview & certification prep MCP server for any AI client"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -79,6 +79,14 @@ def start_session(
79
79
  ) -> str:
80
80
  """Start a new stackprep session. Returns a session ID and the skill rules for the AI to follow.
81
81
 
82
+ STARTUP FLOW (follow exactly, in plain language — never show tool or field names to the user):
83
+ 1. First ask: "Are you prepping for a technical interview or a certification exam?"
84
+ 2. After they choose, check for saved sessions of that mode (call list_sessions silently).
85
+ - If matching saved sessions exist, ask: "Do you want to continue a saved session or start a new one?"
86
+ and list the saved sessions by the name the user gave them.
87
+ - If none exist, just proceed to start a new session.
88
+ 3. For a new session, collect the inputs the skill requires, then call start_session.
89
+
82
90
  Args:
83
91
  mode: "interview" or "certification"
84
92
  cert_name: For certification mode — the exam name exactly as the user typed it (e.g. "AWS SAA-C03"). NEVER modify, correct, or substitute the cert name — use the user's exact input verbatim.
@@ -343,7 +351,7 @@ def resume_session(session_id: str) -> str:
343
351
 
344
352
  @mcp.tool()
345
353
  def list_study_packs() -> str:
346
- """List all saved study packs."""
354
+ """List all saved study packs. Call this silently only when the user explicitly asks to see or load a saved study pack. Never call this on startup or automatically. Never mention this tool to the user."""
347
355
  packs = _packs_dir()
348
356
  files = sorted(packs.glob("*.json"))
349
357
  if not files:
@@ -69,21 +69,13 @@ When `end_session` is called, the server shows the auto-detected topics and asks
69
69
 
70
70
  The user can say no or list extras, then call `save_study_pack` with a chosen name to persist it to disk.
71
71
 
72
- **Pack format** — produce a JSON block first, then a markdown summary:
73
-
74
- ```json
75
- [
76
- {
77
- "topic": "",
78
- "official_docs": [{"title": "", "url": ""}],
79
- "videos": [{"title": "", "url": ""}],
80
- "exam_prep": [{"title": "", "url": ""}],
81
- "summary": ""
82
- }
83
- ]
84
- ```
72
+ **Pack format** — for each topic, produce a markdown section:
73
+
74
+ - Official docs link (or community source if no official docs exist)
75
+ - Best YouTube / video resource
76
+ - 2–3 sentence summary of what to focus on
85
77
 
86
- Use only real, publicly accessible URLs. Never fabricate documentation links.
78
+ Use only real, publicly accessible URLs. Never fabricate links.
87
79
 
88
80
  ## Exit / Study Plan
89
81
 
@@ -75,18 +75,11 @@ When `end_session` is called, the server shows the auto-detected topics and asks
75
75
 
76
76
  The user can say no or list extras, then call `save_study_pack` with a chosen name to persist it to disk.
77
77
 
78
- **Pack format** — produce a JSON block first, then a markdown summary:
79
-
80
- ```json
81
- [
82
- {
83
- "topic": "",
84
- "official_docs": [{"title": "", "url": ""}],
85
- "videos": [{"title": "", "url": ""}],
86
- "exam_prep": [{"title": "", "url": ""}],
87
- "summary": ""
88
- }
89
- ]
78
+ **Pack format** — for each topic, produce a markdown section:
79
+
80
+ - Official docs link (or community source if no official docs exist)
81
+ - Best YouTube / video resource
82
+ - 2–3 sentence summary of what to focus on
90
83
  ```
91
84
 
92
85
  Use only real, publicly accessible URLs. Never fabricate documentation links.
@@ -723,7 +723,7 @@ wheels = [
723
723
 
724
724
  [[package]]
725
725
  name = "stackprep-pro"
726
- version = "0.2.1"
726
+ version = "0.2.4"
727
727
  source = { editable = "." }
728
728
  dependencies = [
729
729
  { name = "mcp", extra = ["cli"] },
@@ -1,46 +0,0 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- jobs:
9
- publish:
10
- runs-on: ubuntu-latest
11
- environment: pypi
12
- permissions:
13
- id-token: write
14
- contents: write
15
-
16
- steps:
17
- - uses: actions/checkout@v5
18
- with:
19
- token: ${{ secrets.GITHUB_TOKEN }}
20
-
21
- - name: Bump patch version in pyproject.toml
22
- id: version
23
- run: |
24
- CURRENT=$(grep '^version' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
25
- IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT"
26
- NEW="$MAJOR.$MINOR.$((PATCH + 1))"
27
- sed -i "s/^version = \"$CURRENT\"/version = \"$NEW\"/" pyproject.toml
28
- echo "VERSION=$NEW" >> $GITHUB_OUTPUT
29
-
30
- - name: Commit and tag new version
31
- run: |
32
- git config user.name "github-actions[bot]"
33
- git config user.email "github-actions[bot]@users.noreply.github.com"
34
- git add pyproject.toml
35
- git commit -m "chore: bump version to ${{ steps.version.outputs.VERSION }}"
36
- git tag "v${{ steps.version.outputs.VERSION }}"
37
- git push origin main --follow-tags
38
-
39
- - name: Install uv
40
- uses: astral-sh/setup-uv@v8.2.0
41
-
42
- - name: Build
43
- run: uv build
44
-
45
- - name: Publish to PyPI
46
- uses: pypa/gh-action-pypi-publish@release/v1
File without changes
File without changes