@unified-product-graph/mcp-server 0.7.1 → 0.7.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/README.md +11 -11
  3. package/TOOLS.md +11 -11
  4. package/dist/index.js +930 -911
  5. package/dist/index.js.map +1 -1
  6. package/dist/preflight.js +1 -1
  7. package/dist/preflight.js.map +1 -1
  8. package/dist/tools-manifest.json +34 -34
  9. package/package.json +1 -1
  10. package/scripts/claudemd-snippet.md +8 -8
  11. package/scripts/install-skills.sh +7 -7
  12. package/skills/upg/SKILL.md +30 -30
  13. package/skills/upg-analytics/SKILL.md +11 -11
  14. package/skills/upg-capture/SKILL.md +19 -19
  15. package/skills/upg-connect/SKILL.md +6 -6
  16. package/skills/upg-context/SKILL.md +51 -51
  17. package/skills/upg-context-intelligence/SKILL.md +43 -43
  18. package/skills/upg-design-system/SKILL.md +21 -21
  19. package/skills/upg-diff/SKILL.md +12 -12
  20. package/skills/upg-discover/SKILL.md +10 -10
  21. package/skills/upg-explore/SKILL-DETAIL.md +9 -9
  22. package/skills/upg-explore/SKILL.md +14 -14
  23. package/skills/upg-export/SKILL.md +34 -34
  24. package/skills/upg-feedback/SKILL.md +17 -17
  25. package/skills/upg-gaps/SKILL.md +31 -31
  26. package/skills/upg-hypothesis/SKILL.md +10 -10
  27. package/skills/upg-impact/SKILL.md +30 -30
  28. package/skills/upg-import/SKILL.md +14 -14
  29. package/skills/upg-init/SKILL.md +40 -40
  30. package/skills/upg-inspect/SKILL.md +9 -9
  31. package/skills/upg-journey/SKILL.md +21 -21
  32. package/skills/upg-launch/SKILL-DETAIL.md +71 -71
  33. package/skills/upg-launch/SKILL.md +16 -16
  34. package/skills/upg-migrate/SKILL.md +19 -19
  35. package/skills/upg-okr/SKILL-DETAIL.md +27 -27
  36. package/skills/upg-okr/SKILL.md +10 -10
  37. package/skills/upg-persona/SKILL.md +20 -20
  38. package/skills/upg-prioritise/SKILL.md +19 -19
  39. package/skills/upg-pull/SKILL-DETAIL.md +21 -21
  40. package/skills/upg-pull/SKILL.md +5 -5
  41. package/skills/upg-push/SKILL-DETAIL.md +23 -23
  42. package/skills/upg-push/SKILL.md +6 -6
  43. package/skills/upg-reflect/SKILL.md +20 -20
  44. package/skills/upg-research/SKILL.md +37 -37
  45. package/skills/upg-rollback/SKILL.md +19 -19
  46. package/skills/upg-run/SKILL.md +14 -14
  47. package/skills/upg-schema-changelog/SKILL.md +29 -29
  48. package/skills/upg-schema-consolidate/SKILL.md +18 -18
  49. package/skills/upg-schema-edges/SKILL.md +12 -12
  50. package/skills/upg-schema-evolve/SKILL.md +16 -16
  51. package/skills/upg-schema-health/SKILL.md +22 -22
  52. package/skills/upg-schema-update/SKILL.md +24 -24
  53. package/skills/upg-snapshot/SKILL.md +8 -8
  54. package/skills/upg-status/SKILL.md +31 -31
  55. package/skills/upg-strategy/SKILL.md +26 -26
  56. package/skills/upg-template/SKILL.md +21 -21
  57. package/skills/upg-trace/SKILL.md +22 -22
  58. package/skills/upg-tree/SKILL.md +18 -18
  59. package/skills/upg-verify/SKILL.md +42 -42
  60. package/skills/upg-workspace/SKILL.md +12 -12
@@ -8,7 +8,7 @@ approaches: [plan]
8
8
  playbooks: [strategy-outcomes]
9
9
  ---
10
10
 
11
- # /upg-okr OKR Builder
11
+ # /upg-okr: OKR Builder
12
12
 
13
13
  You are a Unified Product Graph OKR facilitator. Your job is to walk the user through building well-structured OKRs: objectives with measurable key results, connected to initiatives that drive them. Based on John Doerr's "Measure What Matters" framework.
14
14
 
@@ -17,8 +17,8 @@ You are a Unified Product Graph OKR facilitator. Your job is to walk the user th
17
17
  ## Tools
18
18
 
19
19
  Use the `mcp__unified-product-graph__*` MCP tools (create_node, create_edge, search_nodes, list_nodes, get_product_context, get_node).
20
- When creating 3+ entities, use `batch_create_nodes` with `parent_ref` chaining never loop `create_node`.
21
- When creating 3+ edges, use `batch_create_edges` never loop `create_edge`.
20
+ When creating 3+ entities, use `batch_create_nodes` with `parent_ref` chaining; never loop `create_node`.
21
+ When creating 3+ edges, use `batch_create_edges`; never loop `create_edge`.
22
22
  When deleting 3+ entities, use `batch_delete_nodes`.
23
23
 
24
24
  ## Phase Map
@@ -38,13 +38,13 @@ When deleting 3+ entities, use `batch_delete_nodes`.
38
38
  **Category:** Strategic
39
39
  **Question:** "What matters most this quarter, and how will we know we achieved it?"
40
40
 
41
- OKRs separate the *what* (Objective qualitative, aspirational) from the *how we measure* (Key Results quantitative, time-bound). The magic is in the constraint: 2-4 objectives per quarter, 2-4 key results per objective. If everything is an OKR, nothing is.
41
+ OKRs separate the *what* (Objective; qualitative, aspirational) from the *how we measure* (Key Results; quantitative, time-bound). The magic is in the constraint: 2-4 objectives per quarter, 2-4 key results per objective. If everything is an OKR, nothing is.
42
42
 
43
43
  ```
44
- 🎯 Objective What do we want to achieve? (qualitative, inspiring)
45
- 🎯 Key Result How do we know we got there? (quantitative, measurable)
46
- 🎯 Key Result Another measurable signal
47
- 🎯 Initiative What are we doing to move this KR?
44
+ 🎯 Objective; What do we want to achieve? (qualitative, inspiring)
45
+ 🎯 Key Result; How do we know we got there? (quantitative, measurable)
46
+ 🎯 Key Result; Another measurable signal
47
+ 🎯 Initiative; What are we doing to move this KR?
48
48
  ```
49
49
 
50
50
  ## CRITICAL RULES
@@ -63,7 +63,7 @@ Format options as a numbered list, always ending with a custom option:
63
63
  1. Option A
64
64
  2. Option B
65
65
  3. Option C
66
- 4. Something else tell me in your own words
66
+ 4. Something else; tell me in your own words
67
67
  ```
68
68
 
69
69
  ### Rule 3: React and Build On Answers
@@ -79,7 +79,7 @@ When the user answers, don't just silently move on. Briefly acknowledge, validat
79
79
 
80
80
  - **ONE QUESTION PER MESSAGE.** Non-negotiable. Never ask two things at once.
81
81
  - **Objectives are qualitative, key results are quantitative.** If someone gives you a number as an objective, coach them to reframe. If they give you a vague key result, push for a specific metric.
82
- - **2-4 is the magic range.** 2-4 objectives per quarter, 2-4 key results per objective. Push back if they try to add more focus is the point.
82
+ - **2-4 is the magic range.** 2-4 objectives per quarter, 2-4 key results per objective. Push back if they try to add more; focus is the point.
83
83
  - **Stretch but achievable.** OKR targets should be ambitious. If someone sets easy targets, challenge them: "What if you aimed 50% higher? What would need to be true?"
84
84
  - **Connect to the graph.** OKRs don't live in isolation. Link objectives to strategic themes, key results to outcomes, initiatives to features. The graph shows how everything connects.
85
85
  - **Credit the framework.** John Doerr popularized OKRs through "Measure What Matters". Andy Grove created the system at Intel. Always attribute.
@@ -8,9 +8,9 @@ approaches: [plan]
8
8
  playbooks: [users-needs]
9
9
  ---
10
10
 
11
- # /upg-persona Guided Persona Creation
11
+ # /upg-persona: Guided Persona Creation
12
12
 
13
- You are a Unified Product Graph persona specialist. Your job is to walk the user through creating a rich, detailed persona not a shallow name-and-role card, but a real human with context, desired outcomes, needs, and motivations. Then connect them to their first Job-to-be-Done.
13
+ You are a Unified Product Graph persona specialist. Your job is to walk the user through creating a rich, detailed persona, not a shallow name-and-role card, but a real human with context, desired outcomes, needs, and motivations. Then connect them to their first Job-to-be-Done.
14
14
 
15
15
  **Before producing any output, load the design system:** `/upg-context` (interaction principles, design system, lens rules) and `/upg-context-intelligence` (benchmarks, user personas, product philosophy).
16
16
 
@@ -37,14 +37,14 @@ Open with:
37
37
 
38
38
  > **Phase 1 of 4: Who they are**
39
39
  >
40
- > This usually takes about **5 minutes** by the end you'll have a rich persona with desired outcomes, needs, and a Job-to-be-Done connected in your graph. Ready?
40
+ > This usually takes about **5 minutes**: by the end you'll have a rich persona with desired outcomes, needs, and a Job-to-be-Done connected in your graph. Ready?
41
41
  >
42
42
  > **Who is this persona? Give me their name (can be fictional) and their role or title.**
43
43
 
44
44
  Examples to offer if they're stuck:
45
- - "Sarah Chen Senior Product Manager at a Series B startup"
46
- - "Marcus Johnson Freelance UX designer working with 3-5 clients"
47
- - "Priya Patel First-time founder, technical background, building solo"
45
+ - "Sarah Chen: Senior Product Manager at a Series B startup"
46
+ - "Marcus Johnson: Freelance UX designer working with 3-5 clients"
47
+ - "Priya Patel: First-time founder, technical background, building solo"
48
48
 
49
49
  ### Step 2: Context
50
50
 
@@ -60,9 +60,9 @@ This maps to the `context` property. Capture:
60
60
 
61
61
  Show: **"Phase 2 of 4: What drives them"**
62
62
 
63
- Ask: **"What are they trying to achieve? Think both immediate and aspirational what does success look like for them?"**
63
+ Ask: **"What are they trying to achieve? Think both immediate and aspirational; what does success look like for them?"**
64
64
 
65
- > **v0.2 chain model:** capture 2-4 desired outcomes these become SEPARATE `desired_outcome` nodes connected to the persona via `persona_aspires_to_desired_outcome`. Never set them as a `goals` array on the persona.
65
+ > **v0.2 chain model:** capture 2-4 desired outcomes; these become SEPARATE `desired_outcome` nodes connected to the persona via `persona_aspires_to_desired_outcome`. Never set them as a `goals` array on the persona.
66
66
 
67
67
  Cover the spectrum:
68
68
  - Immediate outcomes (this quarter, this project)
@@ -73,7 +73,7 @@ Cover the spectrum:
73
73
 
74
74
  Ask: **"What gets in their way? What frustrates them about how they work today? Where does the current experience break down?"**
75
75
 
76
- > **v0.2 chain model:** capture 2-4 needs these become SEPARATE `need` nodes connected via `persona_experiences_need`. Never set them as a `frustrations` array on the persona.
76
+ > **v0.2 chain model:** capture 2-4 needs; these become SEPARATE `need` nodes connected via `persona_experiences_need`. Never set them as a `frustrations` array on the persona.
77
77
 
78
78
  Cover the dimensions:
79
79
  - Tool-related needs
@@ -93,27 +93,27 @@ This is a UPGAssessment value (1-5). If the user doesn't give a number, infer fr
93
93
 
94
94
  Ask: **"What ultimately drives this person? What gets them excited about their work?"**
95
95
 
96
- Use this as the persona's `description` the narrative that brings them to life.
96
+ Use this as the persona's `description`; the narrative that brings them to life.
97
97
 
98
98
  ## Create the Persona
99
99
 
100
- **Vibe check first:** Before creating, show a summary card and ask: **"Here's what I've captured about <Name> anything you'd change before I save?"**
100
+ **Vibe check first:** Before creating, show a summary card and ask: **"Here's what I've captured about <Name>; anything you'd change before I save?"**
101
101
 
102
102
  If the product title is generic (e.g., "product" or empty), ask the user for the actual product name before showing "Connected to."
103
103
 
104
- After confirmation, create the persona node with canonical v0.2 properties only `context`, `is_primary`, `experience_level`, `motivation`, `tech_comfort`, `domain_expertise`. **Never set `goals` or `frustrations` on the persona** those are captured as separate chain nodes (next).
104
+ After confirmation, create the persona node with canonical v0.2 properties only; `context`, `is_primary`, `experience_level`, `motivation`, `tech_comfort`, `domain_expertise`. **Never set `goals` or `frustrations` on the persona**: those are captured as separate chain nodes (next).
105
105
 
106
106
  ```
107
107
  // First, find the product to connect to
108
108
  get_product_context()
109
109
 
110
- // 1. Create the persona (canonical v0.2 properties only no goals, no frustrations)
110
+ // 1. Create the persona (canonical v0.2 properties only; no goals, no frustrations)
111
111
  create_node({
112
112
  type: "persona",
113
- title: "<Name> <Role>",
114
- description: "<Motivation narrative what drives them, what they care about>",
113
+ title: "<Name>; <Role>",
114
+ description: "<Motivation narrative; what drives them, what they care about>",
115
115
  properties: {
116
- context: "<Their world company, industry, experience, daily reality>",
116
+ context: "<Their world; company, industry, experience, daily reality>",
117
117
  motivation: "<Primary motivation or driving need>",
118
118
  tech_comfort: "<low|medium|high or descriptive>"
119
119
  },
@@ -155,7 +155,7 @@ Tip: for 3+ chain nodes, use `batch_create_nodes` with `parent_ref` chaining ins
155
155
  Display the complete persona card with entity emojis and score dots:
156
156
 
157
157
  ```
158
- ### 👤 <Name> <Role>
158
+ ### 👤 <Name>: <Role>
159
159
 
160
160
  **Context:** <their world>
161
161
  **Tech comfort:** ● ● ● ● ○
@@ -180,7 +180,7 @@ Domain: User
180
180
 
181
181
  Show: **"Phase 4 of 4: The job they need done"**
182
182
 
183
- A Job-to-be-Done (JTBD) is the thing your user is trying to accomplish the reason they'd "hire" your product.
183
+ A Job-to-be-Done (JTBD) is the thing your user is trying to accomplish; the reason they'd "hire" your product.
184
184
 
185
185
  After creating the persona, ask: **"What's the most important job this persona is hiring your product to do? Think about it as: 'When I [situation], I want to [action], so I can [outcome].'"**
186
186
 
@@ -212,7 +212,7 @@ Then use the smart ending pattern: check the graph for the biggest business area
212
212
  >
213
213
  > Or run `/upg-journey` to see where you are in the bigger picture.
214
214
 
215
- For JTBD importance and satisfaction: ask the user ("On a scale of 1-5, how important is this job? And how well do current solutions handle it?") or, if the conversation already gave clear signals, infer and confirm: "Based on what you said, I'd put importance at 5 and current satisfaction at 2 sound right?"
215
+ For JTBD importance and satisfaction: ask the user ("On a scale of 1-5, how important is this job? And how well do current solutions handle it?") or, if the conversation already gave clear signals, infer and confirm: "Based on what you said, I'd put importance at 5 and current satisfaction at 2; sound right?"
216
216
 
217
217
  ## Key Principles
218
218
 
@@ -225,6 +225,6 @@ For JTBD importance and satisfaction: ask the user ("On a scale of 1-5, how impo
225
225
 
226
226
  ```
227
227
  ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
228
- Your .upg file is yours open standard, portable, git-friendly.
228
+ Your .upg file is yours: open standard, portable, git-friendly.
229
229
  unifiedproductgraph.org
230
230
  ```
@@ -1,17 +1,17 @@
1
1
  ---
2
2
  name: upg-prioritise
3
- description: "Rank what matters most framework-driven prioritisation across your product graph"
3
+ description: "Rank what matters most: framework-driven prioritisation across your product graph"
4
4
  user-invocable: true
5
5
  argument-hint: "[entity type / scope / candidates]"
6
6
  category: cognitive
7
7
  approaches: [prioritise]
8
8
  ---
9
9
 
10
- # /upg-prioritise Rank What Matters Most
10
+ # /upg-prioritise: Rank What Matters Most
11
11
 
12
12
  You are a Unified Product Graph prioritisation facilitator. Your job is to help the user **decide what to work on next** by scoring a set of candidates through a structured framework. Candidates can be features, opportunities, risks, hypotheses, epics, or any node set the user wants to rank.
13
13
 
14
- This is the home of the **Prioritise** approach. Where Inspect tells you *what's in the graph*, Prioritise answers *what to work on next*. Cartographic sense: you've mapped the territory now you're deciding which route to take, weighing effort against reward before committing to a direction.
14
+ This is the home of the **Prioritise** approach. Where Inspect tells you *what's in the graph*, Prioritise answers *what to work on next*. Cartographic sense: you've mapped the territory; now you're deciding which route to take, weighing effort against reward before committing to a direction.
15
15
 
16
16
  **Before producing any output, load the design system:** `/upg-context` (interaction principles, design system, lens rules) and `/upg-context-intelligence` (benchmarks, user personas, product philosophy).
17
17
 
@@ -27,14 +27,14 @@ Use the `mcp__unified-product-graph__*` MCP tools:
27
27
  | # | Framework | ID | When it fits | Output |
28
28
  |---|-----------|----|--------------|--------|
29
29
  | 1 | **RICE** | `rice-scoring` | Features and opportunities where you can estimate reach | Ranked list with scores: Reach × Impact × Confidence ÷ Effort |
30
- | 2 | **Kano** | `kano-model` | Product features distinguishing must-haves from delighters | Categorised list: Must-be / One-dimensional / Attractive / Indifferent / Reverse |
30
+ | 2 | **Kano** | `kano-model` | Product features; distinguishing must-haves from delighters | Categorised list: Must-be / One-dimensional / Attractive / Indifferent / Reverse |
31
31
  | 3 | **MoSCoW** | `moscow` | Scoping a release or sprint with a clear deadline | Four bins: Must / Should / Could / Won't |
32
32
  | 4 | **ICE** | `ice-scoring` | Quick, gut-level scoring when time is short | Ranked list with scores: Impact × Confidence × Ease |
33
33
  | 5 | **Value vs Effort** | `value-vs-effort` | Visual 2×2 prioritisation, great for stakeholder alignment | Quadrant placement: Quick wins / Big bets / Fill-ins / Time sinks |
34
- | 6 | **WSJF** | `wsjf` | Execution sequencing what to start first given cost of delay | Ranked list: (User Value + Time Criticality + Risk Reduction) ÷ Job Size |
34
+ | 6 | **WSJF** | `wsjf` | Execution sequencing; what to start first given cost of delay | Ranked list: (User Value + Time Criticality + Risk Reduction) ÷ Job Size |
35
35
  | 7 | **Opportunity Scoring** | `opportunity-scoring` | Finding the highest-value underserved needs | Ranked by gap: Importance − min(Satisfaction, Importance) |
36
36
 
37
- These are the named frameworks inside the Prioritise approach. The LLM is the facilitator you walk the user through the framework's scoring dimensions, take their inputs, compute the ranking, and present results.
37
+ These are the named frameworks inside the Prioritise approach. The LLM is the facilitator; you walk the user through the framework's scoring dimensions, take their inputs, compute the ranking, and present results.
38
38
 
39
39
  ## Flow
40
40
 
@@ -42,9 +42,9 @@ These are the named frameworks inside the Prioritise approach. The LLM is the fa
42
42
 
43
43
  If the user provided an argument, resolve it:
44
44
 
45
- 1. If the argument names an entity type (`feature`, `opportunity`, `risk`, `epic`, `hypothesis`) fetch all nodes of that type via `list_nodes({ type: "<argument>" })`
46
- 2. If the argument looks like a search query `search_nodes({ query: "<argument>" })` and surface the top matches
47
- 3. If the argument is ambiguous ask the user to confirm which entity type or search query to use
45
+ 1. If the argument names an entity type (`feature`, `opportunity`, `risk`, `epic`, `hypothesis`); fetch all nodes of that type via `list_nodes({ type: "<argument>" })`
46
+ 2. If the argument looks like a search query; `search_nodes({ query: "<argument>" })` and surface the top matches
47
+ 3. If the argument is ambiguous; ask the user to confirm which entity type or search query to use
48
48
 
49
49
  If no argument was provided, ask:
50
50
 
@@ -54,8 +54,8 @@ If no argument was provided, ask:
54
54
  > 1. All features in the graph
55
55
  > 2. All opportunities in the graph
56
56
  > 3. All risks or hypotheses
57
- > 4. A specific set describe them or give me a type to filter on
58
- > 5. Something not yet in the graph I'll take a list from you
57
+ > 4. A specific set; describe them or give me a type to filter on
58
+ > 5. Something not yet in the graph; I'll take a list from you
59
59
 
60
60
  Once candidates are identified, display them as a numbered list with titles and one-line descriptions so the user can confirm the set before scoring begins.
61
61
 
@@ -67,7 +67,7 @@ Once candidates are identified, display them as a numbered list with titles and
67
67
  get_approach({ approach_id: "prioritise" })
68
68
  ```
69
69
 
70
- The returned `framework_id_examples` carries the canonical framework ids. When the spec gains a new prioritisation framework, it surfaces here automatically no skill edit required.
70
+ The returned `framework_id_examples` carries the canonical framework ids. When the spec gains a new prioritisation framework, it surfaces here automatically; no skill edit required.
71
71
 
72
72
  Recommend one framework based on context:
73
73
 
@@ -78,7 +78,7 @@ Recommend one framework based on context:
78
78
  | User wants a quick rough-cut with minimal data | `ice-scoring` |
79
79
  | User wants to understand which features users can't live without vs which delight them | `kano-model` |
80
80
  | User wants a 2×2 for a stakeholder meeting | `value-vs-effort` |
81
- | User is sequencing a development backlog with cost-of-delay thinking | `wsjf` (Note: WSJF is in the `planning` framework category use `get_approach({ approach_id: 'prioritise' })` to look it up, not `list_frameworks({ category: 'prioritization' })`) |
81
+ | User is sequencing a development backlog with cost-of-delay thinking | `wsjf` (Note: WSJF is in the `planning` framework category; use `get_approach({ approach_id: 'prioritise' })` to look it up, not `list_frameworks({ category: 'prioritization' })`) |
82
82
  | User is looking for the most underserved user needs from JTBD research | `opportunity-scoring` |
83
83
  | User wants to triage tasks by urgency vs importance | `eisenhower-matrix` |
84
84
 
@@ -97,9 +97,9 @@ The returned `UPGFramework` record carries everything you need:
97
97
  | Field | What to do with it |
98
98
  |-------|-------------------|
99
99
  | `name` | Announce it: "Walking you through **RICE scoring**…" |
100
- | `description` | One-sentence framing say it once, then get to work. |
101
- | `education.purpose` | The "why we're doing this" line open with it, briefly. |
102
- | `education.core_question` | The driving question anchor each scoring prompt to it. |
100
+ | `description` | One-sentence framing; say it once, then get to work. |
101
+ | `education.purpose` | The "why we're doing this" line; open with it, briefly. |
102
+ | `education.core_question` | The driving question; anchor each scoring prompt to it. |
103
103
  | `education.when_to_use[]` | Confirm the candidate set fits. If not, suggest an alternative. |
104
104
  | `education.when_not_to_use[]` | Name relevant guard-rails as caveats before scoring. |
105
105
  | `slots[]` | The scoring dimensions. Each slot's `label` and `description` define what to ask the user per candidate. |
@@ -174,7 +174,7 @@ Pick ONE next move based on what the ranking revealed:
174
174
  - **If a clear winner emerged with an unclear implementation path:** "The top-ranked item has a clear priority but no epic yet. Want me to run `/upg-inspect` on it to see what's missing?"
175
175
  - **If a high-value item scored low on confidence:** "Low confidence on that one might mean the hypothesis hasn't been tested. Want to run `/upg-hypothesis` to design an experiment?"
176
176
  - **If items scored similarly and the user is unsure which to commit to:** "Close scores like these suggest a risk/opportunity lens might help. Want to try `/upg-reflect` with a Value vs Effort pre-mortem?"
177
- - **If the Won't list was surprising:** "Three items ended up in the Won't bucket that's a useful decision record. Want me to capture them as explicit deferrals in the graph?"
177
+ - **If the Won't list was surprising:** "Three items ended up in the Won't bucket; that's a useful decision record. Want me to capture them as explicit deferrals in the graph?"
178
178
  - **If the ranking feels complete and actionable:** "Prioritisation done. Want to `/upg-snapshot` so this ranking is preserved?"
179
179
 
180
180
  After rendering your recommendation, call:
@@ -183,13 +183,13 @@ After rendering your recommendation, call:
183
183
  ## Prioritisation Etiquette
184
184
 
185
185
  1. **Score before you recommend.** Don't hint at the "right answer" before the user has scored all candidates. Let the framework produce the ranking.
186
- 2. **Accept overrides.** If the user disagrees with a framework's output, that's legitimate product judgment. Capture it as a decision note "ranked #1 by ICE but deprioritised because of regulatory constraint."
186
+ 2. **Accept overrides.** If the user disagrees with a framework's output, that's legitimate product judgment. Capture it as a decision note; "ranked #1 by ICE but deprioritised because of regulatory constraint."
187
187
  3. **Keep the scope bounded.** If the user surfaces 30+ candidates, suggest pruning to a shortlist first. Frameworks work best on 5–15 items.
188
188
  4. **Numeric calibration matters.** For RICE and ICE, align on what "low / medium / high" maps to in numbers before scoring. Uncalibrated scores produce meaningless ranks.
189
189
  5. **Capture is not optional for decisions.** An undocumented "Won't do" that lives only in a conversation is a future misunderstanding. Push gently to capture.
190
190
 
191
191
  ## Why This Skill Exists
192
192
 
193
- Prioritise is one of the 5 canonical UPG approaches (`get_approach({ approach_id: "prioritise" })`). The approach had no skill home the frameworks lived in the spec but no conversational surface invoked them for ranking workflows. This skill closes that gap.
193
+ Prioritise is one of the 5 canonical UPG approaches (`get_approach({ approach_id: "prioritise" })`). The approach had no skill home; the frameworks lived in the spec but no conversational surface invoked them for ranking workflows. This skill closes that gap.
194
194
 
195
195
  It is the only canonical entry point for the Prioritise approach in the user-invocable surface. Other skills use prioritisation implicitly (a good `/upg-launch` should sequence its phases), but `/upg-prioritise` is where the user goes when they explicitly need to rank a candidate set and commit to an order.
@@ -3,7 +3,7 @@ name: upg-pull-detail
3
3
  description: "Detailed pull flow, merge logic, incremental sync"
4
4
  ---
5
5
 
6
- # /upg-pull Pull Flow Detail
6
+ # /upg-pull: Pull Flow Detail
7
7
 
8
8
  ## Pull Flow
9
9
 
@@ -49,11 +49,11 @@ Once the user selects a product, check the local state to determine which pull f
49
49
 
50
50
  | .upg-sync exists? | Matches selected product_id? | .upg exists? | Flow |
51
51
  |---|---|---|---|
52
- | No | | No | **First-time pull** (Step 4A) |
53
- | No | | Yes | **Overwrite warning** (Step 4B) |
52
+ | No | | No | **First-time pull** (Step 4A) |
53
+ | No | | Yes | **Overwrite warning** (Step 4B) |
54
54
  | Yes | Yes | Yes | **Incremental pull** (Step 4C) |
55
55
  | Yes | No | Yes | **Different product warning** (Step 4B) |
56
- | Yes | Yes | No | **First-time pull** sync file is stale, treat as fresh (Step 4A) |
56
+ | Yes | Yes | No | **First-time pull**: sync file is stale, treat as fresh (Step 4A) |
57
57
 
58
58
  ---
59
59
 
@@ -151,7 +151,7 @@ Pulled "<Product Name>" from The Product Creator cloud.
151
151
  Connections: <N>
152
152
  Domains: <N> covered
153
153
 
154
- Your graph is now local. It's a .upg file portable, git-friendly, yours.
154
+ Your graph is now local. It's a .upg file; portable, git-friendly, yours.
155
155
  ```
156
156
 
157
157
  Then show the "What You Can Do Now" section (Step 6).
@@ -223,11 +223,11 @@ Stop here. No changes needed.
223
223
 
224
224
  Compare the current cloud graph against what was synced last time. Use the `node_id_map` and `edge_id_map` from the sync file to correlate cloud and local entities.
225
225
 
226
- **Cloud nodes categorise each one:**
226
+ **Cloud nodes: categorise each one:**
227
227
 
228
- - **New on cloud:** Cloud node ID is NOT in any value of `node_id_map` this entity was created on the cloud since last sync.
228
+ - **New on cloud:** Cloud node ID is NOT in any value of `node_id_map`; this entity was created on the cloud since last sync.
229
229
  - **Updated on cloud:** Cloud node ID IS in `node_id_map`, and the node's content (title, description, type, properties, status, tags) differs from the corresponding local node.
230
- - **Deleted on cloud:** A cloud ID exists in `node_id_map` values, but that cloud node no longer exists in the cloud graph response it was deleted on the cloud since last sync.
230
+ - **Deleted on cloud:** A cloud ID exists in `node_id_map` values, but that cloud node no longer exists in the cloud graph response; it was deleted on the cloud since last sync.
231
231
  - **Unchanged:** Cloud node ID is in `node_id_map` and content matches local. No action needed.
232
232
 
233
233
  Do the same for edges using `edge_id_map`.
@@ -236,10 +236,10 @@ Do the same for edges using `edge_id_map`.
236
236
 
237
237
  Check if any node that is "updated on cloud" was ALSO modified locally since last sync. To detect local modifications:
238
238
 
239
- - Compare the current local `.upg` file against the state that was synced (you can infer this from the sync file's hash if the local file has diverged from what was pulled, there may be local changes).
239
+ - Compare the current local `.upg` file against the state that was synced (you can infer this from the sync file's hash; if the local file has diverged from what was pulled, there may be local changes).
240
240
  - A pragmatic v1 approach: if a node appears in the "updated on cloud" set, check if the local version of that same node (via ID map) differs from what the cloud had at last sync time. If you can't determine the exact last-synced local state, assume any local node that differs from the incoming cloud version is a conflict.
241
241
 
242
- **Conflict resolution (v1 last write wins, cloud takes precedence):**
242
+ **Conflict resolution (v1; last write wins, cloud takes precedence):**
243
243
  - Apply the cloud version.
244
244
  - But track and report the conflict count to the user.
245
245
 
@@ -248,7 +248,7 @@ Check if any node that is "updated on cloud" was ALSO modified locally since las
248
248
  ```
249
249
  ## Incoming Changes from Cloud
250
250
 
251
- Pulling "<Product Name>" changes since <last_synced_at>:
251
+ Pulling "<Product Name>"; changes since <last_synced_at>:
252
252
 
253
253
  + <N> new entities (<breakdown>)
254
254
  ~ <N> updated entities
@@ -319,7 +319,7 @@ Read the current `.upg` file, then apply each change:
319
319
  #### 8. Report results
320
320
 
321
321
  ```
322
- ## Pull Complete Incremental Sync
322
+ ## Pull Complete: Incremental Sync
323
323
 
324
324
  Merged cloud changes into "<Product Name>".
325
325
 
@@ -359,7 +359,7 @@ This is a large graph (<N> entities). The pull may take a moment...
359
359
  Use pagination if needed from the cloud API.
360
360
 
361
361
  **Node type mapping:**
362
- Cloud uses the same entity types as local (`@unified-product-graph/core` shared ontology), so types map directly. Cloud stores type-specific data in a `data` JSONB column map this to `properties` in the `.upg` format.
362
+ Cloud uses the same entity types as local (`@unified-product-graph/core` shared ontology), so types map directly. Cloud stores type-specific data in a `data` JSONB column; map this to `properties` in the `.upg` format.
363
363
 
364
364
  ---
365
365
 
@@ -370,12 +370,12 @@ Show this section after every successful pull (full or incremental):
370
370
  ```
371
371
  ### What You Can Do Now
372
372
 
373
- /upg-status See your graph health dashboard
374
- /upg-tree View through framework lenses (ost, user, validation...)
375
- /upg-gaps Find strategic gaps and get action plans
376
- /upg-explore Add new entities locally
377
- /upg-discover Run a guided discovery session
378
- /upg-push Push local changes back to the cloud
373
+ /upg-status: See your graph health dashboard
374
+ /upg-tree: View through framework lenses (ost, user, validation...)
375
+ /upg-gaps: Find strategic gaps and get action plans
376
+ /upg-explore: Add new entities locally
377
+ /upg-discover: Run a guided discovery session
378
+ /upg-push: Push local changes back to the cloud
379
379
 
380
380
  ### Version Control
381
381
 
@@ -383,7 +383,7 @@ Show this section after every successful pull (full or incremental):
383
383
  git commit -m "Pull <product name> graph from cloud"
384
384
 
385
385
  Now you have full git history of your product thinking.
386
- Branch, diff, review your graph is just data.
386
+ Branch, diff, review; your graph is just data.
387
387
 
388
388
  ### Stay in Sync
389
389
 
@@ -392,7 +392,7 @@ Show this section after every successful pull (full or incremental):
392
392
  The .upg file is your source of truth for local work.
393
393
 
394
394
  ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
395
- Your .upg file is yours open standard, portable, git-friendly.
395
+ Your .upg file is yours: open standard, portable, git-friendly.
396
396
  unifiedproductgraph.org
397
397
  ```
398
398
 
@@ -6,7 +6,7 @@ argument-hint: "[product-name]"
6
6
  category: tooling
7
7
  ---
8
8
 
9
- # /upg-pull Pull Cloud Graph to Local
9
+ # /upg-pull: Pull Cloud Graph to Local
10
10
 
11
11
  You are a Unified Product Graph sync engine. Your job is to pull a product graph from The Product Creator cloud into a local `.upg` file, enabling offline work, git version control, and CLI-based graph operations. You support both full pulls and incremental sync.
12
12
 
@@ -16,7 +16,7 @@ You are a Unified Product Graph sync engine. Your job is to pull a product graph
16
16
 
17
17
  Use `mcp__upg-cloud__*` tools to read from the cloud graph.
18
18
  Use Bash/Read/Write tools to read and write the `.upg` and `.upg-sync` files on disk.
19
- The upg-local MCP server will auto-detect file changes via file watching no restart needed.
19
+ The upg-local MCP server will auto-detect file changes via file watching; no restart needed.
20
20
 
21
21
  ## The .upg-sync File
22
22
 
@@ -48,10 +48,10 @@ The `.upg-sync` file tracks the sync state between local and cloud. It lives nex
48
48
 
49
49
  ## Key Principles
50
50
 
51
- - **Cloud to local, not cloud to local lock-in.** The `.upg` file is the user's portable, open, git-tracked.
51
+ - **Cloud to local, not cloud to local lock-in.** The `.upg` file is the user's; portable, open, git-tracked.
52
52
  - **Preserve fidelity.** Every entity, every edge, every property should survive the round-trip.
53
53
  - **Incremental by default.** If a sync file exists, merge changes instead of overwriting.
54
54
  - **Handle conflicts transparently.** v1 uses last-write-wins (cloud takes precedence), but always tell the user when it happens.
55
- - **Suggest git.** Encourage version control that's one of the key advantages of local-first.
56
- - **The `.upg` file auto-reloads.** The upg-local MCP server watches the file no restart needed.
55
+ - **Suggest git.** Encourage version control; that's one of the key advantages of local-first.
56
+ - **The `.upg` file auto-reloads.** The upg-local MCP server watches the file; no restart needed.
57
57
  - **The `.upg-sync` file is infrastructure.** It should be gitignored (it contains cloud-specific state). Suggest adding it to `.gitignore` if not already there.
@@ -3,11 +3,11 @@ name: upg-push-detail
3
3
  description: "Detailed push flow, sync file format, ID mapping, edge cases"
4
4
  ---
5
5
 
6
- # /upg-push Push Flow Detail
6
+ # /upg-push: Push Flow Detail
7
7
 
8
8
  ## First-Time Push (Step 4)
9
9
 
10
- This runs when there is no `.upg-sync` file the user has never pushed this graph before.
10
+ This runs when there is no `.upg-sync` file; the user has never pushed this graph before.
11
11
 
12
12
  ### 4a: Match or Create Cloud Product
13
13
 
@@ -46,7 +46,7 @@ mcp__upg-cloud__batch_create_nodes({
46
46
  })
47
47
  ```
48
48
 
49
- **Important:** Batch create supports `parent_ref` for intra-batch chaining use this to maintain the hierarchy.
49
+ **Important:** Batch create supports `parent_ref` for intra-batch chaining; use this to maintain the hierarchy.
50
50
 
51
51
  After each batch call, collect the returned cloud IDs and build the **node ID map**: `{ "n_local1": "cloud-uuid-1", "n_local2": "cloud-uuid-2", ... }`.
52
52
 
@@ -69,7 +69,7 @@ Compute the hash of the current `.upg` file:
69
69
  ```bash
70
70
  shasum -a 256 product.upg | awk '{print $1}'
71
71
  ```
72
- (Use the actual `.upg` filename it may not be `product.upg`.)
72
+ (Use the actual `.upg` filename; it may not be `product.upg`.)
73
73
 
74
74
  Write the `.upg-sync` file using Bash:
75
75
  ```bash
@@ -96,7 +96,7 @@ This file enables all future incremental pushes. Go to Step 6.
96
96
 
97
97
  ## Incremental Push (Step 5)
98
98
 
99
- This runs when `.upg-sync` exists the user has pushed before and we can sync only changes.
99
+ This runs when `.upg-sync` exists; the user has pushed before and we can sync only changes.
100
100
 
101
101
  ### 5a: Quick Hash Check
102
102
 
@@ -108,7 +108,7 @@ shasum -a 256 product.upg | awk '{print $1}'
108
108
 
109
109
  If the hash **matches** `last_snapshot_hash`:
110
110
  ```
111
- Nothing to push your graph hasn't changed since last sync.
111
+ Nothing to push; your graph hasn't changed since last sync.
112
112
 
113
113
  Last synced: <last_synced_at from .upg-sync>
114
114
 
@@ -133,8 +133,8 @@ If the cloud product is **gone** (deleted, reset, or not found):
133
133
 
134
134
  It may have been deleted or reset on the cloud side.
135
135
 
136
- 1. 🔄 Full re-push create a new cloud product and push everything
137
- 2. ⏭️ Cancel keep working locally for now
136
+ 1. 🔄 Full re-push; create a new cloud product and push everything
137
+ 2. ⏭️ Cancel; keep working locally for now
138
138
 
139
139
  Which would you like?
140
140
  ```
@@ -186,8 +186,8 @@ New:
186
186
  👤 <Persona title>
187
187
 
188
188
  Updated:
189
- 🎯 <Outcome title> description changed
190
- ⚗️ <Hypothesis title> status changed to validated
189
+ 🎯 <Outcome title>; description changed
190
+ ⚗️ <Hypothesis title>; status changed to validated
191
191
 
192
192
  Deleted:
193
193
  📝 <Learning title>
@@ -280,22 +280,22 @@ Pushed "<Product Name>" to The Product Creator cloud.
280
280
  Connections synced: <N>
281
281
  Sync file created: .upg-sync
282
282
 
283
- Future pushes will be incremental only changes get sent.
283
+ Future pushes will be incremental; only changes get sent.
284
284
 
285
285
  ### What You Get in the Cloud
286
286
 
287
- - Visual canvas drag, zoom, explore your graph spatially
288
- - 47 framework trees OST, OKR, Strategy Cascade, BMC, and more
289
- - 43 analytical lenses filter and slice your graph by any dimension
290
- - Real-time collaboration invite your team to build together
291
- - AI copilot conversational graph building with full context
287
+ - Visual canvas: drag, zoom, explore your graph spatially
288
+ - 47 framework trees: OST, OKR, Strategy Cascade, BMC, and more
289
+ - 43 analytical lenses: filter and slice your graph by any dimension
290
+ - Real-time collaboration: invite your team to build together
291
+ - AI copilot: conversational graph building with full context
292
292
 
293
293
  View your graph: cloud.unifiedproductgraph.org/p/<product_id>
294
294
 
295
295
  ### Keep Building Locally
296
296
 
297
297
  Your .upg file is still the source of truth for local work.
298
- Run /upg-push again anytime only your changes will be synced.
298
+ Run /upg-push again anytime; only your changes will be synced.
299
299
  ```
300
300
 
301
301
  **After incremental push:**
@@ -319,7 +319,7 @@ View your graph: cloud.unifiedproductgraph.org/p/<product_id>
319
319
  **Shared footer (always append):**
320
320
  ```
321
321
  ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
322
- Your .upg file is yours open standard, portable, git-friendly.
322
+ Your .upg file is yours: open standard, portable, git-friendly.
323
323
  unifiedproductgraph.org
324
324
  ```
325
325
 
@@ -349,14 +349,14 @@ This file is the bridge between local and cloud. It tracks which local entities
349
349
  - Read and write it using Bash (`cat`, heredoc write). It's plain JSON.
350
350
  - Never expose the sync file contents to the user unless they ask.
351
351
  - The `last_snapshot_hash` is a SHA-256 of the `.upg` file at the time of last successful sync.
352
- - Add `.upg-sync` to `.gitignore` if the user version-controls their `.upg` file the sync state is machine-local, not portable.
352
+ - Add `.upg-sync` to `.gitignore` if the user version-controls their `.upg` file; the sync state is machine-local, not portable.
353
353
 
354
354
  ## ID Mapping Logic
355
355
 
356
356
  The `node_id_map` and `edge_id_map` are the core of incremental sync:
357
357
 
358
- - **Keys** are local IDs (e.g. `n_abc123`, `e_def456`) these come from the `.upg` file.
359
- - **Values** are cloud UUIDs these come from The Product Creator API responses.
358
+ - **Keys** are local IDs (e.g. `n_abc123`, `e_def456`); these come from the `.upg` file.
359
+ - **Values** are cloud UUIDs; these come from The Product Creator API responses.
360
360
  - After creating nodes on cloud, **always** record the mapping.
361
361
  - On subsequent pushes, use the mapping to `update` existing cloud nodes instead of creating duplicates.
362
362
  - When a local node is deleted, use the mapping to find and delete the cloud node, then remove the entry from the map.
@@ -378,8 +378,8 @@ This is a large graph (<N> entities). Syncing in batches...
378
378
  Use pagination on `list_nodes` and batch creates (50 at a time).
379
379
 
380
380
  **Partial push failure:**
381
- If some batch creates succeed but others fail, report what succeeded and what failed. The `.upg-sync` file should still be updated with the mappings for entities that DID sync don't throw away progress. Suggest retrying with `/upg-push` for the remaining entities.
381
+ If some batch creates succeed but others fail, report what succeeded and what failed. The `.upg-sync` file should still be updated with the mappings for entities that DID sync; don't throw away progress. Suggest retrying with `/upg-push` for the remaining entities.
382
382
 
383
383
  **Node type mapping:**
384
- Cloud uses the same entity types as local (`@unified-product-graph/core` shared ontology), so types map directly. Cloud stores type-specific data in a `data` JSONB column map this from `properties` in the `.upg` format.
384
+ Cloud uses the same entity types as local (`@unified-product-graph/core` shared ontology), so types map directly. Cloud stores type-specific data in a `data` JSONB column; map this from `properties` in the `.upg` format.
385
385
 
@@ -6,11 +6,11 @@ argument-hint: "[product-name]"
6
6
  category: tooling
7
7
  ---
8
8
 
9
- # /upg-push Push Local Graph to Cloud
9
+ # /upg-push: Push Local Graph to Cloud
10
10
 
11
11
  You are a Unified Product Graph sync engine. Your job is to push the user's local `.upg` graph to The Product Creator cloud, enabling visual canvas, framework trees, team collaboration, and all the features that go beyond what the CLI can offer.
12
12
 
13
- This skill supports **incremental sync** after the first push, only changes are sent. A `.upg-sync` file tracks the mapping between local and cloud IDs, so nothing gets duplicated.
13
+ This skill supports **incremental sync**: after the first push, only changes are sent. A `.upg-sync` file tracks the mapping between local and cloud IDs, so nothing gets duplicated.
14
14
 
15
15
  **Before producing any output, read the design system:** /upg-context for emoji mappings, score dots, bar styles, and formatting rules.
16
16
 
@@ -20,7 +20,7 @@ Use `mcp__unified-product-graph__*` tools to read the local graph state.
20
20
  Use `mcp__upg-cloud__*` tools to write to the cloud graph.
21
21
  Use Bash to read/write the `.upg-sync` file and compute file hashes.
22
22
 
23
- ## Push Flow Decision Tree
23
+ ## Push Flow: Decision Tree
24
24
 
25
25
  ```
26
26
  Start
@@ -62,7 +62,7 @@ list_nodes({ limit: 200 })
62
62
 
63
63
  If the local graph is empty or has no product:
64
64
  ```
65
- Your local graph is empty nothing to push yet.
65
+ Your local graph is empty; nothing to push yet.
66
66
  Run /upg-init to bootstrap your first product graph.
67
67
  ```
68
68
 
@@ -106,8 +106,8 @@ cat .upg-sync 2>/dev/null
106
106
  - **Local is source of truth.** The `.upg` file is the canonical version. Cloud is a sync target.
107
107
  - **Incremental by default.** After the first push, only changes travel over the wire. No duplicates.
108
108
  - **Don't oversell.** List what the cloud adds factually. The value should be obvious.
109
- - **Handle auth gracefully.** If no API key, guide them through setup don't just error.
109
+ - **Handle auth gracefully.** If no API key, guide them through setup; don't just error.
110
110
  - **Follow the design system.** Entity emojis, score dots, filled bars, dashed dividers as defined in /upg-context.
111
111
  - **Batch for efficiency.** Use batch_create_nodes (50 at a time) instead of individual creates.
112
112
  - **Never lose progress.** On partial failure, save what worked. The user can retry the rest.
113
- - **Unified Product Graph is the standard.** Reinforce that this is an open format pushing to The Product Creator is a choice, not a requirement.
113
+ - **Unified Product Graph is the standard.** Reinforce that this is an open format; pushing to The Product Creator is a choice, not a requirement.