stackprep-pro 0.2.9__tar.gz → 0.2.11__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.
@@ -4,5 +4,12 @@
4
4
  "command": "uvx",
5
5
  "args": ["stackprep-pro"]
6
6
  }
7
+ },
8
+ "permissions": {
9
+ "allow": [
10
+ "mcp__stackprep",
11
+ "WebFetch",
12
+ "WebSearch"
13
+ ]
7
14
  }
8
15
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stackprep-pro
3
- Version: 0.2.9
3
+ Version: 0.2.11
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
@@ -161,6 +161,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
161
161
 
162
162
  | Tool | Description | Args |
163
163
  |---|---|---|
164
+ | `begin` | Call this at the very start of every conversation. Returns the opening question already formatted | |
164
165
  | `start_session` | Start a new stackprep session. Returns a session ID and the skill rules for the AI to follow. | `mode`, `cert_name`, `cv`, `jd`, `extra_topics` |
165
166
  | `submit_answer` | Record the result of an answered question. | `session_id`, `result`, `question` |
166
167
  | `flag_for_study` | Manually flag the current question for the study pack. | `session_id`, `question` |
@@ -141,6 +141,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
141
141
 
142
142
  | Tool | Description | Args |
143
143
  |---|---|---|
144
+ | `begin` | Call this at the very start of every conversation. Returns the opening question already formatted | |
144
145
  | `start_session` | Start a new stackprep session. Returns a session ID and the skill rules for the AI to follow. | `mode`, `cert_name`, `cv`, `jd`, `extra_topics` |
145
146
  | `submit_answer` | Record the result of an answered question. | `session_id`, `result`, `question` |
146
147
  | `flag_for_study` | Manually flag the current question for the study pack. | `session_id`, `question` |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "stackprep-pro"
3
- version = "0.2.9"
3
+ version = "0.2.11"
4
4
  description = "stackprep-pro — interview & certification prep MCP server for any AI client"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -12,18 +12,26 @@ from mcp.server.fastmcp import FastMCP
12
12
  SERVER_INSTRUCTIONS = """\
13
13
  stackprep-pro — adaptive interview & certification prep.
14
14
 
15
- PRESENTATION (applies to EVERY message from the very first one, before and after a session starts):
16
- Always respond as elegant, RENDERED markdown blocks use bold headers, dividers, and clean lists or
17
- tables so each step renders as a polished UI block. NEVER output flat plain text.
15
+ At the very start of every conversation, call the `begin` tool and show its returned markdown to the
16
+ user VERBATIM (it is already formatted as an elegant block do not rephrase or reformat it).
18
17
 
19
- STARTUP FLOW (in plain human language never show tool or field names to the user):
20
- 1. Ask what they want to prep for (interview or certification), as a clean block.
21
- 2. After they choose, silently check for saved sessions of that mode. If any exist, ask whether they
22
- want to continue a saved session (list them by the name the user gave them) or start a new one.
23
- If none exist, just start a new one.
24
- 3. Collect the inputs the skill requires, then call start_session.
18
+ PRESENTATION (every message): always respond as elegant RENDERED markdown blocks bold headers,
19
+ dividers, clean tables/lists. NEVER output flat plain text.
25
20
 
26
- Follow the skill rules returned by start_session exactly. The skill is the source of truth for behavior."""
21
+ After the user picks a mode, silently check for saved sessions of that mode; if any exist offer to
22
+ continue one (by the name the user gave it) or start new. Then collect inputs and call start_session.
23
+ Follow the skill rules returned by start_session exactly — the skill is the source of truth."""
24
+
25
+ # Hardcoded so the very first block is guaranteed, not AI-guessed.
26
+ BEGIN_BLOCK = """\
27
+ **What would you like to prep for?**
28
+
29
+ | # | Mode |
30
+ |---|------|
31
+ | 1 | 🎯 Technical Interview |
32
+ | 2 | 📜 Certification Exam |
33
+
34
+ _Reply with 1 or 2._"""
27
35
 
28
36
  mcp = FastMCP("stackprep-pro", instructions=SERVER_INSTRUCTIONS)
29
37
 
@@ -85,6 +93,12 @@ def _load_skill(mode: str) -> str:
85
93
 
86
94
  # ── Tools ──────────────────────────────────────────────────────────────────────
87
95
 
96
+ @mcp.tool()
97
+ def begin() -> str:
98
+ """Call this at the very start of every conversation. Returns the opening question already formatted
99
+ as an elegant markdown block. Show the returned text to the user VERBATIM — do not rephrase or reformat it."""
100
+ return BEGIN_BLOCK
101
+
88
102
  @mcp.tool()
89
103
  def start_session(
90
104
  mode: str,
@@ -265,7 +279,8 @@ def end_session(session_id: str) -> str:
265
279
  all_flagged = list(dict.fromkeys(session["auto_flagged"] + session["flagged"]))
266
280
  session["ended"] = True
267
281
  session["all_flagged"] = all_flagged
268
- _persist_session(session_id)
282
+ # Do NOT auto-save the session here. It is only saved if the user explicitly
283
+ # chooses to, via save_session (with a name they provide).
269
284
 
270
285
  score = session["score"]
271
286
  topics_list = "\n".join(f" • {t}" for t in all_flagged) if all_flagged else " (none — full score!)"
@@ -279,13 +294,13 @@ def end_session(session_id: str) -> str:
279
294
  topics_list,
280
295
  "",
281
296
  "Now (this flow is identical for interview and certification mode):",
282
- ' 1. Ask the user: "Do you want to save a study pack from this session? (y/n)"',
283
- " 2. If NO: stop here. Nothing is saved.",
297
+ ' 1. Ask the user: "Do you want to save this session? (y/n)"',
298
+ " 2. If NO: stop here. Do NOT save anything — nothing is persisted.",
284
299
  " 3. If YES:",
285
- ' a. Ask: "Want to add any extra topics to your study pack before I save it?"',
286
- ' b. Ask: "What would you like to name this study pack? (e.g. snowpro-core-week1)"',
287
- " c. Generate the Study Plan and study pack (see skill rules).",
288
- " d. Call save_study_pack(session_id='{}', name=<pack name the user chose>, content=<generated pack>)".format(session_id),
300
+ ' a. Ask: "What would you like to name this session?" the user MUST provide a name; never auto-generate one.',
301
+ " b. Call save_session(session_id='{}', session_name=<name the user chose>)".format(session_id),
302
+ ' c. Then ask: "Do you want a study pack from this session too? (y/n)" — if yes, generate it and call'
303
+ " save_study_pack(session_id='{}', name=<pack name the user chose>, content=<generated pack>).".format(session_id),
289
304
  ])
290
305
 
291
306
 
@@ -723,7 +723,7 @@ wheels = [
723
723
 
724
724
  [[package]]
725
725
  name = "stackprep-pro"
726
- version = "0.2.9"
726
+ version = "0.2.11"
727
727
  source = { editable = "." }
728
728
  dependencies = [
729
729
  { name = "mcp", extra = ["cli"] },
File without changes
File without changes
File without changes