stackprep-pro 0.2.21__tar.gz → 0.2.24__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.
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/.github/workflows/publish.yml +2 -0
- stackprep_pro-0.2.24/.mcp.json +8 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/PKG-INFO +2 -1
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/README.md +1 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/pyproject.toml +1 -1
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/src/stackprep_pro/server.py +35 -3
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/src/stackprep_pro/skills/certification.md +3 -2
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/src/stackprep_pro/skills/interview.md +3 -2
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/uv.lock +1 -1
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/.claude/settings.json +0 -0
- /stackprep_pro-0.2.21/.mcp.json → /stackprep_pro-0.2.24/.cursor/mcp.json +0 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/.githooks/pre-commit +0 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/.gitignore +0 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/CLAUDE.md +0 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/scripts/bump_version.sh +0 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/scripts/generate_readme.py +0 -0
- {stackprep_pro-0.2.21 → stackprep_pro-0.2.24}/src/stackprep_pro/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stackprep-pro
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.24
|
|
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
|
|
@@ -166,6 +166,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
|
|
|
166
166
|
| `submit_answer` | Record the result of an answered question. | `session_id`, `result`, `question` |
|
|
167
167
|
| `flag_for_study` | Manually flag the current question for the study pack. | `session_id`, `question` |
|
|
168
168
|
| `save_session` | Save an in-progress session so the user can continue it later. | `session_id`, `session_name` |
|
|
169
|
+
| `exit_session` | ALWAYS call this the moment the user wants to leave a session in progress — any of: "exit", "quit", | `session_id` |
|
|
169
170
|
| `discard_session` | Permanently delete a session. Call this when the user is exiting and answers NO to saving the | `session_id` |
|
|
170
171
|
| `end_session` | End the session. Returns the score and flagged topics so the AI can generate a study plan and study pack. | `session_id` |
|
|
171
172
|
| `save_study_pack` | Save the study pack content to disk. | `session_id`, `name`, `content` |
|
|
@@ -146,6 +146,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
|
|
|
146
146
|
| `submit_answer` | Record the result of an answered question. | `session_id`, `result`, `question` |
|
|
147
147
|
| `flag_for_study` | Manually flag the current question for the study pack. | `session_id`, `question` |
|
|
148
148
|
| `save_session` | Save an in-progress session so the user can continue it later. | `session_id`, `session_name` |
|
|
149
|
+
| `exit_session` | ALWAYS call this the moment the user wants to leave a session in progress — any of: "exit", "quit", | `session_id` |
|
|
149
150
|
| `discard_session` | Permanently delete a session. Call this when the user is exiting and answers NO to saving the | `session_id` |
|
|
150
151
|
| `end_session` | End the session. Returns the score and flagged topics so the AI can generate a study plan and study pack. | `session_id` |
|
|
151
152
|
| `save_study_pack` | Save the study pack content to disk. | `session_id`, `name`, `content` |
|
|
@@ -296,6 +296,33 @@ def save_session(session_id: str, session_name: str) -> str:
|
|
|
296
296
|
return f"Session saved as '{name}'. You can continue it later."
|
|
297
297
|
|
|
298
298
|
|
|
299
|
+
@mcp.tool()
|
|
300
|
+
def exit_session(session_id: str) -> str:
|
|
301
|
+
"""ALWAYS call this the moment the user wants to leave a session in progress — any of: "exit", "quit",
|
|
302
|
+
"stop", "leave", "X", "done for now", "bye", "that's enough". Do NOT end the conversation yourself on an
|
|
303
|
+
exit intent; call this first and relay its instructions. It returns the exact save prompt to show.
|
|
304
|
+
|
|
305
|
+
Args:
|
|
306
|
+
session_id: The session ID
|
|
307
|
+
"""
|
|
308
|
+
session = _sessions.get(session_id) or _restore_session(session_id)
|
|
309
|
+
if not session:
|
|
310
|
+
return f"ERROR: No session found with ID '{session_id}'."
|
|
311
|
+
|
|
312
|
+
score = session.get("score", {})
|
|
313
|
+
return "\n".join([
|
|
314
|
+
"=== EXIT REQUESTED — you MUST ask this before ending ===",
|
|
315
|
+
f"Progress so far: {score.get('correct','?')}/{score.get('total','?')}.",
|
|
316
|
+
"",
|
|
317
|
+
'Ask the user, exactly: "Do you want to save this session so you can continue later? (y/n)"',
|
|
318
|
+
" - If YES: ask \"What would you like to name this session?\" (the user MUST provide the name — never",
|
|
319
|
+
" auto-generate). Then call save_session(session_id='{}', session_name=<name>). It stays resumable.".format(session_id),
|
|
320
|
+
" - If NO: call discard_session(session_id='{}'). It is permanently deleted and won't appear later.".format(session_id),
|
|
321
|
+
"",
|
|
322
|
+
"Do NOT skip this question. Do NOT end the conversation until the user has answered y or n.",
|
|
323
|
+
])
|
|
324
|
+
|
|
325
|
+
|
|
299
326
|
@mcp.tool()
|
|
300
327
|
def discard_session(session_id: str) -> str:
|
|
301
328
|
"""Permanently delete a session. Call this when the user is exiting and answers NO to saving the
|
|
@@ -406,9 +433,14 @@ def list_sessions(mode: str = "") -> str:
|
|
|
406
433
|
continue
|
|
407
434
|
if mode and data.get("mode", "") != mode:
|
|
408
435
|
continue
|
|
409
|
-
#
|
|
410
|
-
#
|
|
411
|
-
|
|
436
|
+
# Show a session if EITHER it was explicitly saved (named via save_session)
|
|
437
|
+
# OR it is still in progress (not ended). An unnamed in-progress session on disk
|
|
438
|
+
# means the process ended without a clean exit (a crash / hard-close) — we surface
|
|
439
|
+
# it so progress isn't lost. Sessions the user explicitly discards on exit are
|
|
440
|
+
# deleted by discard_session, so they never reach here.
|
|
441
|
+
named = data.get("session_name", "").strip()
|
|
442
|
+
in_progress = not data.get("ended", False)
|
|
443
|
+
if not (named or in_progress):
|
|
412
444
|
continue
|
|
413
445
|
rows.append((f.stem, data))
|
|
414
446
|
|
|
@@ -10,7 +10,8 @@ Adaptive certification exam prep — one question at a time, with instant feedba
|
|
|
10
10
|
## ⛔ EXIT RULE (READ FIRST — NEVER SKIP)
|
|
11
11
|
|
|
12
12
|
The instant the user says ANYTHING meaning they want to stop — "exit", "quit", "stop", "leave", "X",
|
|
13
|
-
"done for now", "bye", "that's enough" — you MUST NOT just end the conversation. You MUST
|
|
13
|
+
"done for now", "bye", "that's enough" — you MUST NOT just end the conversation. You MUST FIRST call the
|
|
14
|
+
`exit_session(session_id)` tool and follow the instructions it returns. Those instructions are:
|
|
14
15
|
|
|
15
16
|
> "Do you want to save this session so you can continue later? (y/n)"
|
|
16
17
|
|
|
@@ -18,7 +19,7 @@ The instant the user says ANYTHING meaning they want to stop — "exit", "quit",
|
|
|
18
19
|
then call `save_session(session_id, session_name=<that name>)`. It stays resumable under that name.
|
|
19
20
|
- **No** → call `discard_session(session_id)` to permanently delete it, then end. It will NOT appear later.
|
|
20
21
|
|
|
21
|
-
This is mandatory EVERY time, no matter how few questions were answered.
|
|
22
|
+
This is mandatory EVERY time, no matter how few questions were answered. Never skip calling `exit_session`.
|
|
22
23
|
|
|
23
24
|
## Session setup
|
|
24
25
|
|
|
@@ -10,7 +10,8 @@ Adaptive technical interview prep — one question at a time, with instant feedb
|
|
|
10
10
|
## ⛔ EXIT RULE (READ FIRST — NEVER SKIP)
|
|
11
11
|
|
|
12
12
|
The instant the user says ANYTHING meaning they want to stop — "exit", "quit", "stop", "leave", "X",
|
|
13
|
-
"done for now", "bye", "that's enough" — you MUST NOT just end the conversation. You MUST
|
|
13
|
+
"done for now", "bye", "that's enough" — you MUST NOT just end the conversation. You MUST FIRST call the
|
|
14
|
+
`exit_session(session_id)` tool and follow the instructions it returns. Those instructions are:
|
|
14
15
|
|
|
15
16
|
> "Do you want to save this session so you can continue later? (y/n)"
|
|
16
17
|
|
|
@@ -18,7 +19,7 @@ The instant the user says ANYTHING meaning they want to stop — "exit", "quit",
|
|
|
18
19
|
then call `save_session(session_id, session_name=<that name>)`. It stays resumable under that name.
|
|
19
20
|
- **No** → call `discard_session(session_id)` to permanently delete it, then end. It will NOT appear later.
|
|
20
21
|
|
|
21
|
-
This is mandatory EVERY time, no matter how few questions were answered.
|
|
22
|
+
This is mandatory EVERY time, no matter how few questions were answered. Never skip calling `exit_session`.
|
|
22
23
|
|
|
23
24
|
## Session setup
|
|
24
25
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|