sad-mcp 2.2.2 → 2.2.4

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sad-mcp",
3
- "version": "2.2.2",
3
+ "version": "2.2.4",
4
4
  "description": "MCP server for Software Analysis and Design course materials at BGU",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,7 +31,7 @@ The shared files prepended to this prompt define the layout recipes, model shape
31
31
  8. **UC labels describe actions WITH the information system, not physical real-world actions.** See §3 for the full rule and verb list.
32
32
  9. **Every system-time / cron actor association MUST carry a timing label** (e.g., "פעם ביום", "כל 5 דקות"). See §2 and §8 for rendering.
33
33
  10. **No "send-only" use cases.** If a UC's entire behavior is sending a message / notification / alert / email / SMS, it is not a UC — it is a step inside the UC that *decided* to send it. See §3.
34
- 11. **All narrative UC documentation must be in Hebrew.** Description, preconditions, postconditions, every scenario flow-step text and extension text, user stories (role / want / so), assumptions, and open questions must all contain Hebrew. Identifier strings (`id`, `primaryActor: 'customer'`) stay ASCII. The validator (§12) rejects narrative fields that contain zero Hebrew characters.
34
+ 11. **All narrative UC documentation must be in Hebrew.** Description, preconditions, postconditions, every scenario flow-step text and extension text, user stories (`role` / `want` / `so` fields), assumptions, and open questions must all be written in Hebrew. User stories are rendered as "בתור [role], אני רוצה [want], כדי ש[so]" — write the field values in Hebrew accordingly. Identifier strings (`id`, `primaryActor: 'customer'`) stay ASCII. The validator (§12) rejects narrative fields that contain zero Hebrew characters.
35
35
 
36
36
  ---
37
37
 
@@ -162,20 +162,28 @@ UC documentation: [uc-id]
162
162
  - ___________________
163
163
 
164
164
  scenarios:
165
- - id: sc-happy, name: "מסלול מרכזי (Happy Path)"
165
+ - id: sc-happy, name: "מסלול מרכזי"
166
166
  flow:
167
167
  1. [actor:primaryActor] ___________________
168
168
  2. [system] ___________________
169
169
  3. [include:uc-xxx] ___________________ (only if §4.2 gate passed)
170
170
  4. [actor:secondary] ___________________
171
- extensions:
172
- 2a. if ___________ then ___________
173
- 4a. if ___________ then ___________
174
- - id: sc-alt-1, name: "מסלול חלופי: ___" (optional additional scenarios)
171
+ extensions: (error/exception handling — one per step where failure is realistic)
172
+ 2a. אם ___________ המערכת ___________ (e.g. wrong input, not found, timeout)
173
+ 4a. אם ___________ המערכת ___________
174
+
175
+ Additional scenarios — add one when the SAME GOAL is achieved via a meaningfully different PATH or TRIGGER.
176
+ Rule: same "what", different "how" or different starting condition → new scenario.
177
+ Examples: "רישום רגיל" vs "רישום מאוחר עם קנס"; "תשלום בכרטיס" vs "תשלום בקופון".
178
+ Do NOT add a scenario just for a different error outcome — that belongs in extensions of the main scenario.
179
+
180
+ - id: sc-alt-1, name: "מסלול חלופי: ___"
181
+ flow: ...
182
+ extensions: ...
175
183
 
176
184
  userStories: (as many as the UC warrants — one per distinct stakeholder need; not a fixed number)
177
- - As a [role], I want [want], so that [benefit].
178
- - As a [different role OR same role different goal], I want [...], so that [...].
185
+ - בתור [תפקיד], אני רוצה [מה], כדי ש[למה].
186
+ - בתור [תפקיד שונה או אותו תפקיד עם מטרה שונה], אני רוצה [...], כדי ש[...].
179
187
  - ... (keep adding until every user-facing goal tied to this UC is represented)
180
188
 
181
189
  wireframe?: (optional — only where the UC benefits from a UI mock; see §WF)
@@ -235,6 +243,35 @@ endpoint = { x: cx + rx * Math.cos(angle), y: cy + ry * Math.sin(angle) };
235
243
 
236
244
  **No legend.** Do not add a legend bar to the diagram.
237
245
 
246
+ ### «include» / «extend» arrow template
247
+
248
+ Define markers once in `<defs>` using `<polyline>` (NOT `<polygon>` — polygon closes the triangle, producing a double-headed appearance):
249
+
250
+ ```svg
251
+ <defs>
252
+ <marker id="arrow-include" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
253
+ <polyline points="0 0, 9 3.5, 0 7" fill="none" stroke="#7c3aed" stroke-width="1.2"/>
254
+ </marker>
255
+ <marker id="arrow-extend" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
256
+ <polyline points="0 0, 9 3.5, 0 7" fill="none" stroke="#7c3aed" stroke-width="1.2"/>
257
+ </marker>
258
+ </defs>
259
+ ```
260
+
261
+ For each «include»/«extend» line, add a `<text>` with `data-label-for="{from-id} {to-id}"` — `fixLayout` reads this and repositions the label to the line midpoint automatically:
262
+
263
+ ```svg
264
+ <line data-conn-from="uc-a" data-conn-to="uc-b"
265
+ x1="0" y1="0" x2="0" y2="0"
266
+ stroke="#7c3aed" stroke-width="1.6" stroke-dasharray="6 4"
267
+ marker-end="url(#arrow-include)"/>
268
+ <text data-label-for="uc-a uc-b" x="0" y="0"
269
+ text-anchor="middle" font-size="9.5" fill="#7c3aed"
270
+ font-family="'IBM Plex Mono',monospace">«include»</text>
271
+ ```
272
+
273
+ **Never write `«include target»` or any annotation inside a UC ellipse group.**
274
+
238
275
  ---
239
276
 
240
277
  ## 6. Layout
@@ -541,8 +578,8 @@ const useCaseDocs = {
541
578
  }
542
579
  ],
543
580
  userStories: [
544
- { role: 'לקוח', want: 'להזמין מוצר במהירות', so: 'שאקבל אותו תוך 48 שעות.' }
545
- ],
581
+ { role: 'לקוח', want: 'להזמין מוצר במהירות', so: 'שאקבל אותו תוך 48 שעות' }
582
+ ], // rendered as: "בתור לקוח, אני רוצה להזמין מוצר במהירות, כדי ששאקבל אותו תוך 48 שעות"
546
583
  wireframe: '' // optional per §WF
547
584
  }
548
585
  // ... one entry per UC