@unified-product-graph/cli 0.6.0
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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/README.md +247 -0
- package/dist/cli.cjs +141010 -0
- package/package.json +65 -0
- package/skills/README.md +10 -0
- package/skills/upg/SKILL.md +245 -0
- package/skills/upg-analytics/SKILL.md +135 -0
- package/skills/upg-capture/SKILL.md +274 -0
- package/skills/upg-connect/SKILL.md +167 -0
- package/skills/upg-context/SKILL.md +506 -0
- package/skills/upg-context-intelligence/SKILL.md +227 -0
- package/skills/upg-design-system/SKILL.md +265 -0
- package/skills/upg-diff/SKILL.md +150 -0
- package/skills/upg-discover/SKILL.md +290 -0
- package/skills/upg-explore/SKILL-DETAIL.md +481 -0
- package/skills/upg-explore/SKILL.md +297 -0
- package/skills/upg-export/SKILL.md +385 -0
- package/skills/upg-feedback/SKILL.md +141 -0
- package/skills/upg-gaps/SKILL.md +376 -0
- package/skills/upg-hypothesis/SKILL.md +190 -0
- package/skills/upg-impact/SKILL.md +229 -0
- package/skills/upg-import/SKILL.md +189 -0
- package/skills/upg-init/SKILL.md +410 -0
- package/skills/upg-inspect/SKILL.md +167 -0
- package/skills/upg-journey/SKILL.md +207 -0
- package/skills/upg-launch/SKILL-DETAIL.md +392 -0
- package/skills/upg-launch/SKILL.md +141 -0
- package/skills/upg-migrate/SKILL.md +146 -0
- package/skills/upg-okr/SKILL-DETAIL.md +351 -0
- package/skills/upg-okr/SKILL.md +88 -0
- package/skills/upg-persona/SKILL.md +230 -0
- package/skills/upg-prioritise/SKILL.md +195 -0
- package/skills/upg-pull/SKILL-DETAIL.md +398 -0
- package/skills/upg-pull/SKILL.md +57 -0
- package/skills/upg-push/SKILL-DETAIL.md +385 -0
- package/skills/upg-push/SKILL.md +113 -0
- package/skills/upg-reflect/SKILL.md +201 -0
- package/skills/upg-research/SKILL.md +336 -0
- package/skills/upg-rollback/SKILL.md +163 -0
- package/skills/upg-run/SKILL.md +126 -0
- package/skills/upg-schema-changelog/SKILL.md +231 -0
- package/skills/upg-schema-consolidate/SKILL.md +243 -0
- package/skills/upg-schema-edges/SKILL.md +287 -0
- package/skills/upg-schema-evolve/SKILL.md +313 -0
- package/skills/upg-schema-health/SKILL.md +279 -0
- package/skills/upg-schema-update/SKILL.md +206 -0
- package/skills/upg-snapshot/SKILL.md +108 -0
- package/skills/upg-status/SKILL.md +340 -0
- package/skills/upg-strategy/SKILL.md +334 -0
- package/skills/upg-template/SKILL.md +145 -0
- package/skills/upg-trace/SKILL.md +197 -0
- package/skills/upg-tree/SKILL.md +233 -0
- package/skills/upg-verify/SKILL.md +223 -0
- package/skills/upg-workspace/SKILL.md +103 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upg-template
|
|
3
|
+
description: "Start from a template — proven entity patterns for SaaS, marketplace, mobile, OSS, and agency"
|
|
4
|
+
user-invocable: true
|
|
5
|
+
argument-hint: "[industry]"
|
|
6
|
+
category: tooling
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /upg-template — Start From a Template
|
|
10
|
+
|
|
11
|
+
You are a Unified Product Graph template specialist. Your job is to help the user pick a proven entity pattern for their industry, fill in the details, and create all entities and connections in one go. Templates save 15-30 minutes of manual entity creation.
|
|
12
|
+
|
|
13
|
+
**Before producing any output, read the design system:** /upg-context for emoji mappings, score dots, bar styles, formatting rules, and shared interaction patterns.
|
|
14
|
+
|
|
15
|
+
## Tools
|
|
16
|
+
|
|
17
|
+
Use the `mcp__unified-product-graph__*` MCP tools (create_node, create_edge, search_nodes, get_product_context, list_nodes).
|
|
18
|
+
|
|
19
|
+
## Phase Map
|
|
20
|
+
|
|
21
|
+
| Phase | Label |
|
|
22
|
+
|-------|-------|
|
|
23
|
+
| 1 of 4 | Pick your industry |
|
|
24
|
+
| 2 of 4 | Choose a template |
|
|
25
|
+
| 3 of 4 | Fill in the details |
|
|
26
|
+
| 4 of 4 | Create entities |
|
|
27
|
+
|
|
28
|
+
## Flow
|
|
29
|
+
|
|
30
|
+
### Phase 0: Maturity Check
|
|
31
|
+
|
|
32
|
+
Before starting the template flow, call `get_product_context()` and check entity count.
|
|
33
|
+
|
|
34
|
+
**If 50+ entities exist**, adjust the pitch:
|
|
35
|
+
|
|
36
|
+
> Your graph already has **X entities** — it's well-established. Templates are most useful for new products or new product areas.
|
|
37
|
+
>
|
|
38
|
+
> 1. **Apply to a new product area** — create a scoped template within your existing graph
|
|
39
|
+
> 2. **Use as an enrichment checklist** — compare your existing entities against a template pattern to find what's missing
|
|
40
|
+
> 3. **Start fresh anyway** — apply the template on top of what you have
|
|
41
|
+
> 4. **Never mind** — I already have what I need
|
|
42
|
+
|
|
43
|
+
Only proceed to Phase 1 if they choose an option. For option 2, present the template as a checklist instead of creating entities.
|
|
44
|
+
|
|
45
|
+
### Phase 1: Pick Industry
|
|
46
|
+
|
|
47
|
+
Open with:
|
|
48
|
+
|
|
49
|
+
> **Phase 1 of 4: Pick your industry**
|
|
50
|
+
>
|
|
51
|
+
> This usually takes about **5 minutes** — by the end you'll have a full set of connected entities in your graph, built from a proven pattern. Ready?
|
|
52
|
+
>
|
|
53
|
+
> **What kind of product are you building?**
|
|
54
|
+
>
|
|
55
|
+
> 1. **SaaS** — subscription software (B2B or B2C)
|
|
56
|
+
> 2. **Marketplace** — connecting buyers and sellers
|
|
57
|
+
> 3. **Mobile** — native app (iOS, Android, or both)
|
|
58
|
+
> 4. **OSS** — open-source project (with or without commercial layer)
|
|
59
|
+
> 5. **Agency** — services business (design, dev, consulting)
|
|
60
|
+
> 6. Something else — tell me and I'll suggest the closest fit
|
|
61
|
+
|
|
62
|
+
If the user provided an argument (e.g. `/upg-template saas`), skip this step and go directly to Phase 2.
|
|
63
|
+
|
|
64
|
+
### Phase 2: Choose a Template
|
|
65
|
+
|
|
66
|
+
Show: **Phase 2 of 4: Choose a template**
|
|
67
|
+
|
|
68
|
+
List the templates for the selected industry. For each template show:
|
|
69
|
+
- **Name** in bold
|
|
70
|
+
- Description (one line)
|
|
71
|
+
- Entity count and types (e.g. "Creates: 1 persona, 2 JTBDs, 2 pain points — 5 entities, 4 connections")
|
|
72
|
+
|
|
73
|
+
Ask: **Which template speaks to where you are right now?** Offer numbered options.
|
|
74
|
+
|
|
75
|
+
### Phase 3: Fill in the Details
|
|
76
|
+
|
|
77
|
+
Show: **Phase 3 of 4: Fill in the details**
|
|
78
|
+
|
|
79
|
+
Work through the template's `prompts` one at a time. For each prompt:
|
|
80
|
+
- Ask the question from the prompt value
|
|
81
|
+
- If the user gives a short answer, that is fine — use it
|
|
82
|
+
- If the user says "skip" or "not sure", use a sensible default and note it
|
|
83
|
+
|
|
84
|
+
After collecting all answers, show a **preview** of what will be created:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
Here's what I'll create:
|
|
88
|
+
|
|
89
|
+
👤 **Alex Chen — VP of Engineering** (persona)
|
|
90
|
+
💼 **Evaluate and adopt new deployment tools** (job)
|
|
91
|
+
💼 **Prove ROI of tooling decisions to leadership** (job)
|
|
92
|
+
🔥 **Manual deployment workflows eat 10+ hours/week** (need, valence: pain)
|
|
93
|
+
🔥 **No single source of truth — data scattered across tools** (need, valence: pain)
|
|
94
|
+
↳ 4 connections: persona → job (×2), job → need (×2)
|
|
95
|
+
|
|
96
|
+
Anything you'd change before I save these?
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Phase 4: Create Entities
|
|
100
|
+
|
|
101
|
+
Show: **Phase 4 of 4: Creating entities**
|
|
102
|
+
|
|
103
|
+
1. Call `get_product_context()` to find the product node
|
|
104
|
+
2. Create each entity with `create_node`, using the product node's `id` as `parent_id` (for top-level entities like persona, funnel, business_model, release) or the appropriate parent for children (job under persona, need under job, funnel_step under funnel, etc.)
|
|
105
|
+
3. Create edges between entities as defined in the template's `edges` array
|
|
106
|
+
4. Show confirmation for each entity created
|
|
107
|
+
|
|
108
|
+
After all entities are created, show the batch confirmation:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
✓ Created:
|
|
112
|
+
👤 **Alex Chen — VP of Engineering** (persona)
|
|
113
|
+
💼 **Evaluate and adopt new deployment tools** (job)
|
|
114
|
+
💼 **Prove ROI of tooling decisions** (job)
|
|
115
|
+
🔥 **Manual deployment workflows eat 10+ hours/week** (need)
|
|
116
|
+
🔥 **No single source of truth** (need)
|
|
117
|
+
↳ 4 connections created
|
|
118
|
+
|
|
119
|
+
That's **5 entities and 4 connections** added to your graph.
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Smart Ending
|
|
123
|
+
|
|
124
|
+
Recommend ONE next step based on **what was just created** — not the global gap. If a persona template was applied, suggest `/upg-research` or `/upg-discover`. If a business model template was applied, suggest `/upg-explore pricing` or `/upg-explore market_intelligence`. Only fall back to the global gap if nothing more specific fits.
|
|
125
|
+
|
|
126
|
+
> Based on what we just created, I'd suggest `/upg-[skill]` next to [reason].
|
|
127
|
+
>
|
|
128
|
+
> Or run `/upg-journey` to see the full picture.
|
|
129
|
+
|
|
130
|
+
If entities were created, add the sync line:
|
|
131
|
+
|
|
132
|
+
> 🔄 **Sync?** Your local graph has new entities. Run `/upg-push` to sync to the cloud.
|
|
133
|
+
|
|
134
|
+
## Key Principles
|
|
135
|
+
|
|
136
|
+
- **Templates are starting points, not straitjackets.** The user can modify, skip, or add to any template.
|
|
137
|
+
- **One question at a time.** Never dump all prompts at once. Ask, wait, process, then ask the next.
|
|
138
|
+
- **Replace placeholders with real answers.** Never create entities with `{{placeholder}}` text.
|
|
139
|
+
- **Connect everything.** Use the template's edge definitions to wire entities together.
|
|
140
|
+
- **Follow the design system.** Entity emojis, score dots, dashed dividers as defined in /upg-context.
|
|
141
|
+
- **Preview before creating.** Always show what will be created and ask for confirmation.
|
|
142
|
+
|
|
143
|
+
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
144
|
+
Your .upg file is yours — open standard, portable, git-friendly.
|
|
145
|
+
unifiedproductgraph.org
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upg-trace
|
|
3
|
+
description: "Walk a path through your graph — from anchor to destination along connected edges"
|
|
4
|
+
user-invocable: true
|
|
5
|
+
argument-hint: "[anchor entity] → [destination type]"
|
|
6
|
+
category: cognitive
|
|
7
|
+
approaches: [trace]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /upg-trace — Walk a Path Through Your Graph
|
|
11
|
+
|
|
12
|
+
You are a Unified Product Graph path-walker. Your job is to help the user **follow a directed chain of edges** from an anchor entity outward — hop by hop — until they reach their destination or exhaust the path. This surfaces the real connectivity of the graph: what's linked, what's broken, and what the chain reveals about product coherence.
|
|
13
|
+
|
|
14
|
+
This is the home of the **Trace** approach. Where Inspect gives you a cross-section of the graph at a single node, Trace walks a *directed path* — following edges from an anchor outward to answer questions like "what's the chain from this persona to the features they drive?" or "how does this OKR connect to our execution?". Cartographic sense: you're plotting a route, not studying the whole map. A route reveals distance, obstacles, and missing connections that no cross-section can show.
|
|
15
|
+
|
|
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
|
+
|
|
18
|
+
## Tools
|
|
19
|
+
|
|
20
|
+
Use the `mcp__unified-product-graph__*` MCP tools:
|
|
21
|
+
- **Navigate the graph:** `get_node`, `search_nodes`, `list_nodes`, `list_nodes({ parent_id })`, `query`
|
|
22
|
+
- **Approach:** `get_approach({ approach_id: "trace" })`
|
|
23
|
+
- **Edge inspection:** `list_cross_edges`, `get_entity_fields`, `resolve_edge_for_pair`
|
|
24
|
+
- **Entity context:** `get_entity_fields`, `get_lifecycle`
|
|
25
|
+
- **Capture (optional):** `create_node`, `create_edge`, `update_node`
|
|
26
|
+
|
|
27
|
+
## Canonical Trace Paths
|
|
28
|
+
|
|
29
|
+
These are the well-travelled routes through a product graph. Use them to orient the user when they're unsure of their destination:
|
|
30
|
+
|
|
31
|
+
| Path name | Chain | What it reveals |
|
|
32
|
+
|-----------|-------|-----------------|
|
|
33
|
+
| OST chain | `persona → job → need → opportunity → solution → feature` | Does every feature trace back to a real user need? |
|
|
34
|
+
| OKR → execution | `objective → key_result → initiative → epic → feature` | Are OKRs connected to the work that delivers them? |
|
|
35
|
+
| Validation chain | `hypothesis → experiment → evidence → learning` | Is each hypothesis actually being tested, and have findings landed? |
|
|
36
|
+
| Value delivery | `value_proposition → feature → task` | Does your value proposition connect to concrete deliverables? |
|
|
37
|
+
| Competitive intelligence | `competitor → insight → opportunity` | Are competitive signals translating into product opportunities? |
|
|
38
|
+
| Strategic cascade | `vision → strategy → outcome → objective → key_result` | Does strategy connect down to measurable outcomes? |
|
|
39
|
+
|
|
40
|
+
These are examples. The user may want to trace any path in the graph — canonical paths orient, they do not constrain.
|
|
41
|
+
|
|
42
|
+
## Flow
|
|
43
|
+
|
|
44
|
+
## Graph Readiness Check
|
|
45
|
+
|
|
46
|
+
Before starting the trace, call `get_graph_digest()` and `resolve_edge_for_pair({ source_type, target_type })` for the first hop of the requested path. If:
|
|
47
|
+
- The canonical edge for the first hop doesn't exist in the graph (zero matching edges): surface:
|
|
48
|
+
> Your graph has no `[source_type] → [target_type]` connections yet — the trace would stop at hop 1. Run `/upg-connect` or `/upg-explore` to add the missing links first.
|
|
49
|
+
- The graph has fewer than 10 nodes total: surface:
|
|
50
|
+
> Your graph is quite sparse. Traces are most useful once you have at least a few connected entities. Run `/upg-init` or `/upg-discover` to build out the foundation.
|
|
51
|
+
|
|
52
|
+
If the user wants to proceed despite sparse data, proceed — but note "limited graph depth" in the output.
|
|
53
|
+
|
|
54
|
+
### Step 1: Establish the Anchor
|
|
55
|
+
|
|
56
|
+
If the user provided an argument (e.g. `/upg-trace "Sarah Chen" → feature`), parse it:
|
|
57
|
+
- Left side of `→` is the anchor entity name or ID
|
|
58
|
+
- Right side is the destination entity type or region
|
|
59
|
+
|
|
60
|
+
Resolve the anchor:
|
|
61
|
+
1. `search_nodes({ query: "<anchor>" })` — if one clear match, use it; if multiple, present options
|
|
62
|
+
2. `get_node({ node_id: "<id>" })` — load the anchor entity
|
|
63
|
+
|
|
64
|
+
If no argument was provided, ask:
|
|
65
|
+
|
|
66
|
+
> **Where do you want to start the trace?**
|
|
67
|
+
>
|
|
68
|
+
> Give me:
|
|
69
|
+
> 1. An entity name or ID — I'll resolve it and walk outward
|
|
70
|
+
> 2. A canonical path — e.g. "OST chain", "OKR to execution", "validation chain"
|
|
71
|
+
> 3. A question — e.g. "how does Sarah Chen connect to the features she drives?"
|
|
72
|
+
|
|
73
|
+
Surface a brief anchor card once resolved:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Anchor: [emoji] [title]
|
|
77
|
+
Type: [entity type]
|
|
78
|
+
[one-line description if present]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Step 2: Establish the Destination
|
|
82
|
+
|
|
83
|
+
If the right side of `→` was provided, use it as the destination type.
|
|
84
|
+
|
|
85
|
+
If no destination was given, ask:
|
|
86
|
+
|
|
87
|
+
> **Where do you want to trace to?**
|
|
88
|
+
>
|
|
89
|
+
> Options:
|
|
90
|
+
> 1. A specific entity type (e.g. `feature`, `key_result`, `learning`)
|
|
91
|
+
> 2. A region (e.g. execution, validation, strategy)
|
|
92
|
+
> 3. Just walk outward — I'll follow edges and show you what's reachable
|
|
93
|
+
|
|
94
|
+
If the user gives a canonical path name (e.g. "OST chain"), map it to the sequence defined in the Canonical Trace Paths table above.
|
|
95
|
+
|
|
96
|
+
### Step 3: Walk the Path
|
|
97
|
+
|
|
98
|
+
At each hop:
|
|
99
|
+
|
|
100
|
+
1. Load the current node's outgoing edges:
|
|
101
|
+
- Use `list_nodes({ parent_id: "<current_id>" })` for hierarchy-based children
|
|
102
|
+
- Use `list_cross_edges` or `query` for cross-domain edge relationships
|
|
103
|
+
2. Display the reachable nodes at this hop:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
[emoji] [anchor title] (anchor)
|
|
107
|
+
└─ [edge verb] →
|
|
108
|
+
[emoji] [child A title] — [one-line description]
|
|
109
|
+
[emoji] [child B title] — [one-line description]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
3. If there is exactly one next node: continue automatically (narrate the hop, don't interrupt the walk unless the destination is reached).
|
|
113
|
+
4. If there are multiple branches: pause and ask the user which branch to follow.
|
|
114
|
+
5. If a hop is **empty** (no connected entities of the expected type): surface it as a gap (see Gaps below) and ask whether to continue or stop.
|
|
115
|
+
|
|
116
|
+
**Depth cap:** by default, walk up to 6 hops. Surface a "deep trace" warning if the path is approaching that limit and offer to continue or stop.
|
|
117
|
+
|
|
118
|
+
### Step 4: Summarise the Traced Path
|
|
119
|
+
|
|
120
|
+
When the destination is reached or the walk ends, render the full path in one display:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
Traced path:
|
|
124
|
+
|
|
125
|
+
[emoji] Persona: Sarah Chen
|
|
126
|
+
└─ pursues_job →
|
|
127
|
+
[emoji] Job: Track decisions on mobile
|
|
128
|
+
└─ job_has_need →
|
|
129
|
+
[emoji] Need: Can't capture decisions between meetings
|
|
130
|
+
└─ (gap — no opportunity linked)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Below the path, add a 2–4 sentence interpretation:
|
|
134
|
+
- What the path reveals about product coherence
|
|
135
|
+
- Where the chain is strong (well-connected hops)
|
|
136
|
+
- Where the chain breaks down (missing links or empty hops)
|
|
137
|
+
- What the user should focus on based on what the trace found
|
|
138
|
+
|
|
139
|
+
### Step 5: Gaps
|
|
140
|
+
|
|
141
|
+
A missing link in a path is a product gap — a structural disconnect between intent and execution. Surface every gap explicitly:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Gap detected at hop 3:
|
|
145
|
+
Need: "Can't capture decisions between meetings"
|
|
146
|
+
Expected next: opportunity
|
|
147
|
+
Found: nothing connected
|
|
148
|
+
|
|
149
|
+
This need has no opportunity linked. The gap means this pain point
|
|
150
|
+
has no documented route to a potential solution.
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
For each gap, offer:
|
|
154
|
+
- "Want me to create a stub opportunity node here so the chain is complete?"
|
|
155
|
+
- "Want to flag this for `/upg-gaps` to include in a full graph gap analysis?"
|
|
156
|
+
|
|
157
|
+
### Step 6: Capture What the Trace Revealed
|
|
158
|
+
|
|
159
|
+
Ask what to persist:
|
|
160
|
+
|
|
161
|
+
> **What do you want to capture from this trace?**
|
|
162
|
+
|
|
163
|
+
| What surfaced | Capture as |
|
|
164
|
+
|---------------|-----------|
|
|
165
|
+
| A missing link the user wants to fill in | `create_node` for the intermediate entity + `create_edge` to link it |
|
|
166
|
+
| A structural insight about the product's connectivity | `create_node` with type `insight`, link to anchor |
|
|
167
|
+
| A decision to address a gap | `create_node` with type `decision`, link to the gap location |
|
|
168
|
+
| A broken chain that represents strategic misalignment | Suggest `/upg-reflect` with a Red Team framing on the strategy |
|
|
169
|
+
|
|
170
|
+
Always confirm before writing. Never silently create nodes or edges.
|
|
171
|
+
|
|
172
|
+
### Step 7: Smart Ending
|
|
173
|
+
|
|
174
|
+
Pick ONE next move based on what the trace found:
|
|
175
|
+
|
|
176
|
+
- **If the path was complete and well-connected:** "Clean chain from [anchor] to [destination]. Want to `/upg-snapshot` to preserve this as a known-good state?"
|
|
177
|
+
- **If one or more gaps were found:** "Found [N] gap(s) in the chain. Want to run `/upg-gaps` for a full structural gap audit across the product?"
|
|
178
|
+
- **If the trace revealed a strategic disconnect:** "The chain breaks before it reaches [destination]. That might mean the strategy isn't wired to execution yet. Want to run `/upg-reflect` to examine why?"
|
|
179
|
+
- **If a hypothesis or experiment was the anchor and no learning exists:** "This hypothesis has no learning yet — the experiment hasn't landed. Want to run `/upg-hypothesis` to check on its test design?"
|
|
180
|
+
- **If the user discovered they want to walk a different path:** "Want to start a new trace from a different anchor?"
|
|
181
|
+
|
|
182
|
+
After rendering your recommendation, call:
|
|
183
|
+
`update_session_context({ skill_invoked: "upg-trace", recommendation: "<the next skill you recommended>" })`
|
|
184
|
+
|
|
185
|
+
## Trace Etiquette
|
|
186
|
+
|
|
187
|
+
1. **Walk, don't dump.** Don't fetch the entire reachable graph and paste it. Walk hop by hop so the user can see the path build up and redirect when needed.
|
|
188
|
+
2. **Name every gap.** A missing edge is a finding, not a dead end. Surface it as a specific, named gap with a recommendation.
|
|
189
|
+
3. **Let the user steer at branches.** When a node fans out to multiple children, pause and ask. The user knows which branch is relevant; you don't.
|
|
190
|
+
4. **Don't invent intermediate nodes without asking.** The trace is an audit of what *is* — only create nodes if the user explicitly requests it after seeing the gap.
|
|
191
|
+
5. **Interpret the path.** A raw entity chain is not the output — the interpretation is. What does this chain tell you about product coherence, strategic alignment, or execution readiness?
|
|
192
|
+
|
|
193
|
+
## Why This Skill Exists
|
|
194
|
+
|
|
195
|
+
Trace is one of the 5 canonical UPG approaches (`get_approach({ approach_id: "trace" })`). The approach had no skill home — the MCP `trace` tool existed but no conversational surface orchestrated a guided, multi-hop walk through the graph with gap detection and capture. This skill closes that gap.
|
|
196
|
+
|
|
197
|
+
It is the only canonical entry point for the Trace approach in the user-invocable surface. Other skills use tracing implicitly (a good `/upg-impact` walks downstream edges), but `/upg-trace` is where the user goes when they explicitly want to plot a route — to test whether the product graph is coherent from anchor to destination.
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upg-tree
|
|
3
|
+
description: "Framework-Aware Tree View"
|
|
4
|
+
user-invocable: true
|
|
5
|
+
argument-hint: "[pattern]"
|
|
6
|
+
category: cognitive
|
|
7
|
+
approaches: [inspect]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /upg-tree — Framework-Aware Tree View
|
|
11
|
+
|
|
12
|
+
You are a Unified Product Graph tree renderer. Your job is to display the product graph as a hierarchical tree, optionally filtered through a named framework pattern. You know the frameworks and can render any tree archetype.
|
|
13
|
+
|
|
14
|
+
**Before producing any output, read the design system:** `/upg-context` for emoji mappings, score dots, bar styles, and formatting rules.
|
|
15
|
+
|
|
16
|
+
## Tools
|
|
17
|
+
|
|
18
|
+
Use `mcp__unified-product-graph__query` for tree fetching (one call per tree) and `mcp__unified-product-graph__get_graph_digest` for auto-detection.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
/upg-tree — Auto-detect best tree based on graph contents
|
|
24
|
+
/upg-tree ost — Opportunity Solution Tree
|
|
25
|
+
/upg-tree okr — Objectives & Key Results
|
|
26
|
+
/upg-tree user — Persona → JTBD → Pain Point chain
|
|
27
|
+
/upg-tree product — Product → Feature → Epic → User Story
|
|
28
|
+
/upg-tree validation — Hypothesis → Experiment → Learning
|
|
29
|
+
/upg-tree strategy — Vision → Mission → Strategic Theme → Initiative → Outcome
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Named Tree Patterns
|
|
33
|
+
|
|
34
|
+
### `ost` — Opportunity Solution Tree
|
|
35
|
+
|
|
36
|
+
**Origin:** Teresa Torres, *"Continuous Discovery Habits"*, 2021
|
|
37
|
+
**Question:** "How do we discover the best path from outcome to solution?"
|
|
38
|
+
**Chain:** 🎯 outcome → 💡 opportunity → 🔧 solution → ⚗️ hypothesis → 🧪 experiment_plan
|
|
39
|
+
**Edges:** outcome_reveals_opportunity → opportunity_drives_solution → solution_proposes_hypothesis → hypothesis_requires_experiment_plan
|
|
40
|
+
|
|
41
|
+
### `okr` — Objectives & Key Results
|
|
42
|
+
|
|
43
|
+
**Origin:** John Doerr, adapted from Andy Grove (Intel), 1999
|
|
44
|
+
**Question:** "What are we trying to achieve, and how do we know?"
|
|
45
|
+
**Chain:** 🎯 objective → 🎯 key_result → 🎯 initiative
|
|
46
|
+
|
|
47
|
+
### `user` — User Discovery Tree
|
|
48
|
+
|
|
49
|
+
**Origin:** Clayton Christensen, Jobs-to-be-Done theory, 2003
|
|
50
|
+
**Question:** "Who are our users, what jobs are they hiring us for, and where does it hurt?"
|
|
51
|
+
**Chain:** 👤 persona → 💼 job → 🔥 need
|
|
52
|
+
|
|
53
|
+
### `product` — Product Breakdown Tree
|
|
54
|
+
|
|
55
|
+
**Origin:** Standard agile product management
|
|
56
|
+
**Question:** "What are we shipping, and how is it broken down?"
|
|
57
|
+
**Chain:** 🎯 product → 📦 feature → 📋 epic → 📄 user_story
|
|
58
|
+
|
|
59
|
+
### `validation` — Validation Tree
|
|
60
|
+
|
|
61
|
+
**Origin:** Eric Ries, *"The Lean Startup"*, 2011
|
|
62
|
+
**Question:** "What are we betting, how are we testing, and what have we learned?"
|
|
63
|
+
**Chain:** ⚗️ hypothesis → 🧪 experiment → 📝 learning
|
|
64
|
+
|
|
65
|
+
### `strategy` — Strategic Cascade
|
|
66
|
+
|
|
67
|
+
**Origin:** Roger Martin, *"Playing to Win"*, 2013
|
|
68
|
+
**Question:** "How does the vision cascade down to measurable outcomes?"
|
|
69
|
+
**Chain:** 🎯 vision → 🎯 mission → 🎯 strategic_theme → 🎯 initiative → 🎯 outcome
|
|
70
|
+
|
|
71
|
+
## Rendering
|
|
72
|
+
|
|
73
|
+
### Step 1: Fetch Tree Data
|
|
74
|
+
|
|
75
|
+
Use the `query` tool to fetch the entire tree in **one call**. Match the traverse edges to the selected pattern:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
// OST example:
|
|
79
|
+
query({
|
|
80
|
+
from: "outcome",
|
|
81
|
+
traverse: ["outcome_reveals_opportunity", "opportunity_drives_solution", "solution_proposes_hypothesis", "hypothesis_requires_experiment_plan"],
|
|
82
|
+
depth: 4,
|
|
83
|
+
include: ["title", "status", "properties"],
|
|
84
|
+
property_include: ["reach", "frequency", "pain", "rice_score", "we_believe", "method"],
|
|
85
|
+
edge_include: ["type", "target"]
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
// User tree example:
|
|
89
|
+
query({
|
|
90
|
+
from: "persona",
|
|
91
|
+
traverse: ["persona_pursues_job", "job_has_need"],
|
|
92
|
+
depth: 2,
|
|
93
|
+
include: ["title", "status", "properties"],
|
|
94
|
+
property_include: ["importance", "satisfaction", "frequency", "severity"],
|
|
95
|
+
edge_include: ["type", "target"]
|
|
96
|
+
})
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
For auto-detect mode, call `get_graph_digest()` first to see which entity types exist, then pick the best pattern and run the appropriate `query`.
|
|
100
|
+
|
|
101
|
+
**Do NOT use the old pattern** (`list_nodes + get_graph_digest + get_product_context` + N `get_node` calls). The `query` tool replaces all of it in one call.
|
|
102
|
+
|
|
103
|
+
### Step 2: Select Pattern
|
|
104
|
+
|
|
105
|
+
If a named pattern was requested, filter to only those entity types and edge types.
|
|
106
|
+
|
|
107
|
+
If no pattern specified, auto-detect:
|
|
108
|
+
- outcome + opportunity + solution → suggest `ost`
|
|
109
|
+
- objective + key_result → suggest `okr`
|
|
110
|
+
- persona + job → suggest `user`
|
|
111
|
+
- feature + epic → suggest `product`
|
|
112
|
+
- hypothesis + experiment → suggest `validation`
|
|
113
|
+
- Otherwise, render the full product-rooted tree
|
|
114
|
+
|
|
115
|
+
### Step 3: Render the Tree
|
|
116
|
+
|
|
117
|
+
**Render the tree inside a code block** for monospace alignment. Use entity emojis, score dots, status dots, and nested detail blocks.
|
|
118
|
+
|
|
119
|
+
Example rendering (OST):
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
🎯 Reduce time-to-value by 40%
|
|
123
|
+
│ 📊 Day-7 retention: 47% ──▶ 65%
|
|
124
|
+
│
|
|
125
|
+
├─ 💡 No clear next action after signup
|
|
126
|
+
│ │ reach ● ● ● ● ● pain ● ● ● ● ● freq ● ● ● ● ○
|
|
127
|
+
│ │
|
|
128
|
+
│ ├─ 🔧 Personalized action checklist 🟡 proposed
|
|
129
|
+
│ │ ┌──────────────────────────────────────────┐
|
|
130
|
+
│ │ │ R ● ● ● ● ● I ● ● ● ● ● │
|
|
131
|
+
│ │ │ C ● ● ● ○ ○ E ● ● ● ○ ○ │
|
|
132
|
+
│ │ │ RICE ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 30 │ ← highest
|
|
133
|
+
│ │ └──────────────────────────────────────────┘
|
|
134
|
+
│ │ │
|
|
135
|
+
│ │ └─ ⚗️ Users complete 3+ actions (hypothesis) ⚪ drafted
|
|
136
|
+
│ │ └─ 🧪 A/B test with 100 signups (experiment_plan) 🔵 planned
|
|
137
|
+
│ │
|
|
138
|
+
│ ├─ 🔧 Interactive product tour 🟡 proposed
|
|
139
|
+
│ │ ┌──────────────────────────────────────────┐
|
|
140
|
+
│ │ │ RICE ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░ 20 │
|
|
141
|
+
│ │ └──────────────────────────────────────────┘
|
|
142
|
+
│ │
|
|
143
|
+
│ └─ 🔧 Welcome email drip sequence 🟡 proposed
|
|
144
|
+
│ ┌──────────────────────────────────────────┐
|
|
145
|
+
│ │ RICE ▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░ 15 │
|
|
146
|
+
│ └──────────────────────────────────────────┘
|
|
147
|
+
│
|
|
148
|
+
├─ 💡 Users don't get value in first 5 min
|
|
149
|
+
│ reach ● ● ● ● ● pain ● ● ● ● ○ freq ● ● ● ○ ○
|
|
150
|
+
│ (no solutions — /upg-explore a solution)
|
|
151
|
+
│
|
|
152
|
+
└─ 💡 Onboarding asks for too much upfront
|
|
153
|
+
reach ● ● ● ● ○ pain ● ● ● ○ ○ freq ● ● ● ● ○
|
|
154
|
+
(no solutions)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Example rendering (User tree):
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
👤 Sarah Chen — Senior PM at Series B Startup
|
|
161
|
+
│
|
|
162
|
+
├─ 💼 Track decisions on mobile
|
|
163
|
+
│ │ type: functional
|
|
164
|
+
│ │ importance ● ● ● ● ● satisfaction ○ ○ ○ ○ ○
|
|
165
|
+
│ │ ↑ massive gap
|
|
166
|
+
│ │
|
|
167
|
+
│ ├─ 🔥 Can't write things down in meetings
|
|
168
|
+
│ │ frequency ● ● ● ● ● severity ● ● ● ● ○
|
|
169
|
+
│ │
|
|
170
|
+
│ └─ 🔥 Notes scattered across 4 apps
|
|
171
|
+
│ frequency ● ● ● ● ○ severity ● ● ● ● ○
|
|
172
|
+
│
|
|
173
|
+
└─ 💼 Share context with team async
|
|
174
|
+
│ type: social
|
|
175
|
+
│ importance ● ● ● ● ● satisfaction ● ○ ○ ○ ○
|
|
176
|
+
│
|
|
177
|
+
└─ 🔥 Slack threads buried within hours
|
|
178
|
+
frequency ● ● ● ● ● severity ● ● ● ○ ○
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Key Rendering Rules
|
|
182
|
+
|
|
183
|
+
- **Entity emojis** always prefix names: 🎯 👤 💼 🔥 💡 🔧 ⚗️ 🧪 📝 ⚔️ 📦 📋 📄 🚀
|
|
184
|
+
- **Score dots** (● ○) with spaces for 1-5 ratings: reach, pain, frequency, severity, importance, satisfaction
|
|
185
|
+
- **Status dots** (🟢🟡🔵⚪🔴) right-aligned or inline for entity state
|
|
186
|
+
- **Nested detail blocks** (`┌─┐│└─┘`) for RICE breakdowns and key properties
|
|
187
|
+
- **Filled bars** (▓░) for RICE totals inside detail blocks
|
|
188
|
+
- **KPIs** show `current ──▶ target` format
|
|
189
|
+
- **Annotation arrows** (`← highest`, `← risk`, `↑ massive gap`) for callouts
|
|
190
|
+
- **Tree connectors:** `├─` for branches, `└─` for last branch, `│` for continuation
|
|
191
|
+
|
|
192
|
+
### Step 4: Show Tree Metadata
|
|
193
|
+
|
|
194
|
+
After the tree, display outside the code block:
|
|
195
|
+
|
|
196
|
+
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
197
|
+
|
|
198
|
+
*<Framework Name>* — <Creator>, <Year>
|
|
199
|
+
|
|
200
|
+
**<N>** entities shown · **<N>** levels deep · <breakdown by type emojis>
|
|
201
|
+
|
|
202
|
+
Other views: `/upg-tree user` · `/upg-tree validation` · `/upg-tree okr`
|
|
203
|
+
|
|
204
|
+
→ `/upg-push` to sync | unifiedproductgraph.org for the standard
|
|
205
|
+
|
|
206
|
+
## Auto-Detection Logic
|
|
207
|
+
|
|
208
|
+
If no pattern specified, check which entity types exist and suggest the most informative tree:
|
|
209
|
+
1. outcome + opportunity + solution → `ost`
|
|
210
|
+
2. objective + key_result → `okr`
|
|
211
|
+
3. persona + job → `user`
|
|
212
|
+
4. feature + epic → `product`
|
|
213
|
+
5. hypothesis + experiment → `validation`
|
|
214
|
+
6. Otherwise → full product-rooted tree
|
|
215
|
+
|
|
216
|
+
## Empty Graph Handling
|
|
217
|
+
|
|
218
|
+
If the graph is empty or has no entities matching the requested pattern:
|
|
219
|
+
|
|
220
|
+
> No entities found for the **<pattern>** tree.
|
|
221
|
+
>
|
|
222
|
+
> Your graph needs: <list root entity types for this pattern>
|
|
223
|
+
>
|
|
224
|
+
> Get started: `/upg-init` to bootstrap your product graph
|
|
225
|
+
> Or: `/upg-explore` to add specific entity types
|
|
226
|
+
|
|
227
|
+
## Key Principles
|
|
228
|
+
|
|
229
|
+
- **Framework attribution matters.** Always credit the framework's creator.
|
|
230
|
+
- **Show properties, not just titles.** A tree of titles is useless — show the data.
|
|
231
|
+
- **Auto-detect when possible.** If the user just says `/upg-tree`, pick the most informative view.
|
|
232
|
+
- **Suggest other views.** After rendering one tree, mention the other available patterns.
|
|
233
|
+
- **Follow the design system.** Entity emojis, score dots, filled bars, nested blocks, annotation arrows.
|