@unified-product-graph/mcp-server 0.7.0 → 0.7.3
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/TOOLS.md +11 -11
- package/dist/index.js +930 -911
- package/dist/index.js.map +1 -1
- package/dist/preflight.js +1 -1
- package/dist/preflight.js.map +1 -1
- package/dist/tools-manifest.json +11 -11
- package/package.json +1 -1
- package/skills/upg/SKILL.md +30 -30
- package/skills/upg-analytics/SKILL.md +11 -11
- package/skills/upg-capture/SKILL.md +19 -19
- package/skills/upg-connect/SKILL.md +6 -6
- package/skills/upg-context/SKILL.md +51 -51
- package/skills/upg-context-intelligence/SKILL.md +43 -43
- package/skills/upg-design-system/SKILL.md +21 -21
- package/skills/upg-diff/SKILL.md +12 -12
- package/skills/upg-discover/SKILL.md +10 -10
- package/skills/upg-explore/SKILL-DETAIL.md +9 -9
- package/skills/upg-explore/SKILL.md +14 -14
- package/skills/upg-export/SKILL.md +34 -34
- package/skills/upg-feedback/SKILL.md +17 -17
- package/skills/upg-gaps/SKILL.md +31 -31
- package/skills/upg-hypothesis/SKILL.md +10 -10
- package/skills/upg-impact/SKILL.md +30 -30
- package/skills/upg-import/SKILL.md +14 -14
- package/skills/upg-init/SKILL.md +40 -40
- package/skills/upg-inspect/SKILL.md +9 -9
- package/skills/upg-journey/SKILL.md +21 -21
- package/skills/upg-launch/SKILL-DETAIL.md +71 -71
- package/skills/upg-launch/SKILL.md +16 -16
- package/skills/upg-migrate/SKILL.md +19 -19
- package/skills/upg-okr/SKILL-DETAIL.md +27 -27
- package/skills/upg-okr/SKILL.md +10 -10
- package/skills/upg-persona/SKILL.md +20 -20
- package/skills/upg-prioritise/SKILL.md +19 -19
- package/skills/upg-pull/SKILL-DETAIL.md +21 -21
- package/skills/upg-pull/SKILL.md +5 -5
- package/skills/upg-push/SKILL-DETAIL.md +23 -23
- package/skills/upg-push/SKILL.md +6 -6
- package/skills/upg-reflect/SKILL.md +20 -20
- package/skills/upg-research/SKILL.md +37 -37
- package/skills/upg-rollback/SKILL.md +19 -19
- package/skills/upg-run/SKILL.md +14 -14
- package/skills/upg-schema-changelog/SKILL.md +29 -29
- package/skills/upg-schema-consolidate/SKILL.md +18 -18
- package/skills/upg-schema-edges/SKILL.md +12 -12
- package/skills/upg-schema-evolve/SKILL.md +16 -16
- package/skills/upg-schema-health/SKILL.md +22 -22
- package/skills/upg-schema-update/SKILL.md +24 -24
- package/skills/upg-snapshot/SKILL.md +8 -8
- package/skills/upg-status/SKILL.md +31 -31
- package/skills/upg-strategy/SKILL.md +26 -26
- package/skills/upg-template/SKILL.md +21 -21
- package/skills/upg-trace/SKILL.md +22 -22
- package/skills/upg-tree/SKILL.md +18 -18
- package/skills/upg-verify/SKILL.md +42 -42
- package/skills/upg-workspace/SKILL.md +12 -12
package/dist/preflight.js
CHANGED
|
@@ -18,7 +18,7 @@ for (const [label, specifier] of REQUIRED_DEPS) {
|
|
|
18
18
|
if (missing.length > 0) {
|
|
19
19
|
process.stderr.write(
|
|
20
20
|
`
|
|
21
|
-
\u256D\u2500 UPG MCP Server
|
|
21
|
+
\u256D\u2500 UPG MCP Server: missing dependencies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E
|
|
22
22
|
\u2502 \u2502
|
|
23
23
|
` + missing.map(
|
|
24
24
|
(d) => `\u2502 \u2717 ${d}${" ".repeat(Math.max(0, 52 - d.length))}\u2502
|
package/dist/preflight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/preflight.ts"],"sourcesContent":["/**\n * Preflight dependency check for the UPG MCP Server.\n *\n * ES module imports are hoisted, so if a dependency is missing the process\n * crashes before any error-handling code runs, producing silent failure\n * in Claude Code. This script checks critical deps first, prints a\n * human-readable message on failure, then dynamically imports the real\n * entry point.\n */\n\nconst REQUIRED_DEPS: Array<[label: string, specifier: string]> = [\n ['@modelcontextprotocol/sdk', '@modelcontextprotocol/sdk/server'],\n ['@unified-product-graph/core', '@unified-product-graph/core'],\n ['chokidar', 'chokidar'],\n ['nanoid', 'nanoid'],\n]\n\nconst missing: string[] = []\n\nfor (const [label, specifier] of REQUIRED_DEPS) {\n try {\n await import(specifier)\n } catch {\n missing.push(label)\n }\n}\n\nif (missing.length > 0) {\n process.stderr.write(\n `\\n╭─ UPG MCP Server
|
|
1
|
+
{"version":3,"sources":["../src/preflight.ts"],"sourcesContent":["/**\n * Preflight dependency check for the UPG MCP Server.\n *\n * ES module imports are hoisted, so if a dependency is missing the process\n * crashes before any error-handling code runs, producing silent failure\n * in Claude Code. This script checks critical deps first, prints a\n * human-readable message on failure, then dynamically imports the real\n * entry point.\n */\n\nconst REQUIRED_DEPS: Array<[label: string, specifier: string]> = [\n ['@modelcontextprotocol/sdk', '@modelcontextprotocol/sdk/server'],\n ['@unified-product-graph/core', '@unified-product-graph/core'],\n ['chokidar', 'chokidar'],\n ['nanoid', 'nanoid'],\n]\n\nconst missing: string[] = []\n\nfor (const [label, specifier] of REQUIRED_DEPS) {\n try {\n await import(specifier)\n } catch {\n missing.push(label)\n }\n}\n\nif (missing.length > 0) {\n process.stderr.write(\n `\\n╭─ UPG MCP Server: missing dependencies ─────────────────╮\\n` +\n `│ │\\n` +\n missing.map((d) =>\n `│ ✗ ${d}${' '.repeat(Math.max(0, 52 - d.length))}│\\n`\n ).join('') +\n `│ │\\n` +\n `│ Run \\`npm install\\` in the project root to fix this. │\\n` +\n `╰──────────────────────────────────────────────────────────╯\\n\\n`,\n )\n process.exit(1)\n}\n\n// All deps present; boot the real server\nawait import('./index.js')\n\nexport {}\n"],"mappings":";;;AAUA,IAAM,gBAA2D;AAAA,EAC/D,CAAC,6BAA6B,kCAAkC;AAAA,EAChE,CAAC,+BAA+B,6BAA6B;AAAA,EAC7D,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,UAAU,QAAQ;AACrB;AAEA,IAAM,UAAoB,CAAC;AAE3B,WAAW,CAAC,OAAO,SAAS,KAAK,eAAe;AAC9C,MAAI;AACF,UAAM,OAAO;AAAA,EACf,QAAQ;AACN,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEA,IAAI,QAAQ,SAAS,GAAG;AACtB,UAAQ,OAAO;AAAA,IACb;AAAA;AAAA;AAAA,IAEA,QAAQ;AAAA,MAAI,CAAC,MACX,kBAAQ,CAAC,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;AAAA;AAAA,IACpD,EAAE,KAAK,EAAE,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAGF;AACA,UAAQ,KAAK,CAAC;AAChB;AAGA,MAAM,OAAO,YAAY;","names":[]}
|
package/dist/tools-manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "2",
|
|
3
3
|
"package": "@unified-product-graph/mcp-server",
|
|
4
|
-
"package_version": "0.7.
|
|
4
|
+
"package_version": "0.7.3",
|
|
5
5
|
"tool_count": 93,
|
|
6
6
|
"domains": [
|
|
7
7
|
"context",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
"name": "get_session_context",
|
|
87
|
-
"description": "Read session context: which skills ran, what was recommended, current focus area. Returns `recommendations_to_avoid
|
|
87
|
+
"description": "Read session context: which skills ran, what was recommended, current focus area. Returns `recommendations_to_avoid`; the deduped list of recommendations already given this session. Pick your next recommendation NOT in that array (data-layer dedup, not prose).",
|
|
88
88
|
"domain": "context",
|
|
89
89
|
"inputSchema": {
|
|
90
90
|
"type": "object",
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
],
|
|
105
105
|
"source": "src/tools/context.ts:295",
|
|
106
106
|
"symbol": "getSessionContext",
|
|
107
|
-
"returns": "JSON: `{ lens, skills_invoked, recommendations_given,\nrecommendations_to_avoid, focus_area, custom, skills_count, last_skill,\nlast_recommendation }`. `recommendations_to_avoid` is the deduped list of\nevery recommendation given this session
|
|
107
|
+
"returns": "JSON: `{ lens, skills_invoked, recommendations_given,\nrecommendations_to_avoid, focus_area, custom, skills_count, last_skill,\nlast_recommendation }`. `recommendations_to_avoid` is the deduped list of\nevery recommendation given this session; runners should filter their\nnext recommendation against this array rather than re-deriving the\ndedup rule from prose.",
|
|
108
108
|
"atomicity": "atomic (read-only)"
|
|
109
109
|
},
|
|
110
110
|
{
|
|
@@ -1387,7 +1387,7 @@
|
|
|
1387
1387
|
"source": "src/tools/areas.ts:261",
|
|
1388
1388
|
"symbol": "createArea",
|
|
1389
1389
|
"returns": "JSON: `{ node, portfolio_file, written_to }`. `node` is the typed\n`UPGProductArea` record persisted to `portfolio_areas[]`.",
|
|
1390
|
-
"atomicity": "atomic per write
|
|
1390
|
+
"atomicity": "atomic per write; the portfolio file is read, mutated, and\nflushed in one pass."
|
|
1391
1391
|
},
|
|
1392
1392
|
{
|
|
1393
1393
|
"name": "get_area_context",
|
|
@@ -2483,7 +2483,7 @@
|
|
|
2483
2483
|
},
|
|
2484
2484
|
{
|
|
2485
2485
|
"name": "inspect",
|
|
2486
|
-
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing inspection, invoke the /upg-inspect skill instead of calling this tool directly.
|
|
2486
|
+
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing inspection, invoke the /upg-inspect skill instead of calling this tool directly. Inspect approach: path of arrival to \"what's broken?\". Returns the Inspect record + invocation params in the family-resemblance envelope. The LLM consumes `signature_hint` and emits `{ violations: [{ severity, kind, entity_id, description, fix_hint }] }` against `UPG_ANTI_PATTERNS` + the live graph. Optional `region` or `entities[]` scope the audit.",
|
|
2487
2487
|
"domain": "spec",
|
|
2488
2488
|
"inputSchema": {
|
|
2489
2489
|
"type": "object",
|
|
@@ -2951,7 +2951,7 @@
|
|
|
2951
2951
|
},
|
|
2952
2952
|
{
|
|
2953
2953
|
"name": "list_frameworks",
|
|
2954
|
-
"description": "List the canonical `UPGFramework` definitions
|
|
2954
|
+
"description": "List the canonical `UPGFramework` definitions; the 34 curated, famous product frameworks that anchor the public catalog (spanning strategy, discovery, prioritisation, design, growth, engineering, and reflection classics). Paginated (default 50, max 200). Cursor is opaque: pass `next_cursor` from a previous response. Optional `category` is exact-match against `UPGFramework.category` and applies before pagination.",
|
|
2955
2955
|
"domain": "spec",
|
|
2956
2956
|
"inputSchema": {
|
|
2957
2957
|
"type": "object",
|
|
@@ -3313,7 +3313,7 @@
|
|
|
3313
3313
|
},
|
|
3314
3314
|
{
|
|
3315
3315
|
"name": "prioritise",
|
|
3316
|
-
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing prioritisation, invoke the /upg-prioritise skill instead of calling this tool directly.
|
|
3316
|
+
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing prioritisation, invoke the /upg-prioritise skill instead of calling this tool directly. Prioritise approach: path of arrival to \"what's most important?\". Returns the Prioritise record + invocation params + framework metadata in the family-resemblance envelope. Both `candidates` and `framework_id` are required. The LLM looks up the framework via `get_framework`, reads its scoring spec, and emits `{ ranked: [{ entity_id, score, rationale }], framework_used }`.",
|
|
3317
3317
|
"domain": "spec",
|
|
3318
3318
|
"inputSchema": {
|
|
3319
3319
|
"type": "object",
|
|
@@ -3354,7 +3354,7 @@
|
|
|
3354
3354
|
},
|
|
3355
3355
|
{
|
|
3356
3356
|
"name": "reflect",
|
|
3357
|
-
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing reflection, invoke the /upg-reflect skill instead of calling this tool directly.
|
|
3357
|
+
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing reflection, invoke the /upg-reflect skill instead of calling this tool directly. Reflect approach: path of arrival to \"what should I be questioning?\". Returns the Reflect record + invocation params in the family-resemblance envelope. The LLM consumes `mode` + `scope` + `signature_hint` and emits `{ prompts: [{ kind, question, target_entities? }] }`. `mode` is one of: `assumptions`, `alternatives`, `blind-spots`, `load-bearing`; omit for open reflection. `scope` accepts a region id, entity id, or `null` for whole-graph.",
|
|
3358
3358
|
"domain": "spec",
|
|
3359
3359
|
"inputSchema": {
|
|
3360
3360
|
"type": "object",
|
|
@@ -3447,7 +3447,7 @@
|
|
|
3447
3447
|
},
|
|
3448
3448
|
{
|
|
3449
3449
|
"name": "trace",
|
|
3450
|
-
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing tracing, invoke the /upg-trace skill instead of calling this tool directly.
|
|
3450
|
+
"description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing tracing, invoke the /upg-trace skill instead of calling this tool directly. Trace approach: path of arrival to \"walk a meaningful path through existing graph\". Returns the Trace record + invocation params in the family-resemblance envelope. The LLM uses `anchor` + `path` to compose `query()` calls and emits `{ trail: [{ depth, entity_id, edge_type_in }], reached: entity_id[] }`. `path` is type-shorthand: `[\"persona\",\"job\",\"feature\"]` walks persona→job→feature using the canonical edge per pair (via `resolve_edge_for_pair`). Optional `edges_override` selects non-canonical edges per hop; `null` per element means \"use canonical\".",
|
|
3451
3451
|
"domain": "spec",
|
|
3452
3452
|
"inputSchema": {
|
|
3453
3453
|
"type": "object",
|
|
@@ -3736,7 +3736,7 @@
|
|
|
3736
3736
|
},
|
|
3737
3737
|
"include_polymorphic_upgrades": {
|
|
3738
3738
|
"type": "boolean",
|
|
3739
|
-
"description": "When true, include a `polymorphic_with_typed_alternative` array listing polymorphic edges (e.g. node_owned_by_person, node_constrains_node) that have a more-specific typed alternative for their actual source/target pair. Opt-in only
|
|
3739
|
+
"description": "When true, include a `polymorphic_with_typed_alternative` array listing polymorphic edges (e.g. node_owned_by_person, node_constrains_node) that have a more-specific typed alternative for their actual source/target pair. Opt-in only; omitted by default to avoid cluttering routine validation output. Does not affect `valid`; these are advisory suggestions."
|
|
3740
3740
|
}
|
|
3741
3741
|
}
|
|
3742
3742
|
},
|
|
@@ -3804,7 +3804,7 @@
|
|
|
3804
3804
|
}
|
|
3805
3805
|
],
|
|
3806
3806
|
"warnings": [
|
|
3807
|
-
"Default is `dry_run: true`. Pass `dry_run: false` to commit.\nIdempotent on retry
|
|
3807
|
+
"Default is `dry_run: true`. Pass `dry_run: false` to commit.\nIdempotent on retry; re-running after a successful commit reports\nzero changes (canonical statuses pass the validity check)."
|
|
3808
3808
|
],
|
|
3809
3809
|
"see": [
|
|
3810
3810
|
"migrate_type",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unified-product-graph/mcp-server",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"description": "Local MCP server for .upg files. Read and write product knowledge graphs offline.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "The Product Creator <hello@theproductcreator.com>",
|
package/skills/upg/SKILL.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg
|
|
3
|
-
description: "Unified Product Graph
|
|
3
|
+
description: "Unified Product Graph: your product graph, right here in the terminal"
|
|
4
4
|
user-invocable: true
|
|
5
5
|
argument-hint: "[command or natural-language question]"
|
|
6
6
|
category: aggregator
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# /upg
|
|
9
|
+
# /upg: Unified Product Graph
|
|
10
10
|
|
|
11
|
-
You are the front door to the Unified Product Graph experience inside Claude Code. Your job is **not** to list every skill
|
|
11
|
+
You are the front door to the Unified Product Graph experience inside Claude Code. Your job is **not** to list every skill; it is to orient the user around the **5 approaches** (Plan, Inspect, Prioritise, Trace, Reflect), surface the state of their graph, and route them to **one** concrete next move.
|
|
12
12
|
|
|
13
13
|
If they want a phonebook, they can ask for it. The default is conversation.
|
|
14
14
|
|
|
@@ -23,7 +23,7 @@ Use the `mcp__unified-product-graph__*` MCP tools:
|
|
|
23
23
|
|
|
24
24
|
## The Cartographic Frame
|
|
25
25
|
|
|
26
|
-
UPG is a chart of your product knowledge. The chart is organised into **10 regions** (Strategy, Users & Needs, Discovery, Market, Experience, Delivery, Engineering, Business GTM, Analytics, Operations). The chart is read through one of **5 approaches
|
|
26
|
+
UPG is a chart of your product knowledge. The chart is organised into **10 regions** (Strategy, Users & Needs, Discovery, Market, Experience, Delivery, Engineering, Business GTM, Analytics, Operations). The chart is read through one of **5 approaches**: five paths of arrival to five different questions:
|
|
27
27
|
|
|
28
28
|
| Approach | Question | Cartographic sense |
|
|
29
29
|
|---|---|---|
|
|
@@ -33,11 +33,11 @@ UPG is a chart of your product knowledge. The chart is organised into **10 regio
|
|
|
33
33
|
| 🧵 **Trace** | *"Walk a meaningful path through what exists"* | Trace a route across charted terrain |
|
|
34
34
|
| 🪞 **Reflect** | *"What should I be questioning?"* | Mark the parts of the chart that may be conjecture |
|
|
35
35
|
|
|
36
|
-
Skills (`/upg-*`) are the user-invocable surfaces. Each cognitive skill inhabits one or more approaches
|
|
36
|
+
Skills (`/upg-*`) are the user-invocable surfaces. Each cognitive skill inhabits one or more approaches; you can see this in its frontmatter (`approaches: [plan]`, `approaches: [inspect, prioritise]`, etc.).
|
|
37
37
|
|
|
38
38
|
## Behavior
|
|
39
39
|
|
|
40
|
-
### Step 1
|
|
40
|
+
### Step 1: Read state
|
|
41
41
|
|
|
42
42
|
Always start by checking:
|
|
43
43
|
|
|
@@ -50,7 +50,7 @@ Branch based on whether a graph exists.
|
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
53
|
-
### Branch A
|
|
53
|
+
### Branch A: Graph exists
|
|
54
54
|
|
|
55
55
|
Render the orientation card (real markdown, NOT inside a code block):
|
|
56
56
|
|
|
@@ -68,7 +68,7 @@ Render the orientation card (real markdown, NOT inside a code block):
|
|
|
68
68
|
|
|
69
69
|
Maturity ● ● ● ○ ○ **3/5** *<stage label>*
|
|
70
70
|
|
|
71
|
-
> **Lens:** `<active
|
|
71
|
+
> **Lens:** `<active>`; <render the lens description from this table: product → "personas, outcomes, features" · engineering → "services, APIs, data flows" · design → "screens, flows, components" · growth → "funnels, channels, campaigns">. Say "switch to [product|engineering|design|growth]" to change.
|
|
72
72
|
|
|
73
73
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
74
74
|
|
|
@@ -88,15 +88,15 @@ Maturity ● ● ● ○ ○ **3/5** *<stage label>*
|
|
|
88
88
|
|
|
89
89
|
### Routing Hints
|
|
90
90
|
|
|
91
|
-
When the user selects an approach (or you infer one from their description), pre-call the listed tool before routing
|
|
91
|
+
When the user selects an approach (or you infer one from their description), pre-call the listed tool before routing; it gives the downstream skill the data it needs without a cold start.
|
|
92
92
|
|
|
93
93
|
| Approach | Pre-call | Entry skill |
|
|
94
94
|
|---|---|---|
|
|
95
|
-
| 🧠 Plan | `mcp__unified-product-graph__list_playbooks()
|
|
96
|
-
| 🔍 Inspect | `mcp__unified-product-graph__get_graph_digest()
|
|
97
|
-
| 📊 Prioritise | `mcp__unified-product-graph__get_graph_digest()
|
|
98
|
-
| 🧵 Trace | `mcp__unified-product-graph__get_product_context()
|
|
99
|
-
| 🪞 Reflect | `mcp__unified-product-graph__get_session_context()
|
|
95
|
+
| 🧠 Plan | `mcp__unified-product-graph__list_playbooks()`; see region options | `/upg-explore <region>` |
|
|
96
|
+
| 🔍 Inspect | `mcp__unified-product-graph__get_graph_digest()`; health metrics | `/upg-status` |
|
|
97
|
+
| 📊 Prioritise | `mcp__unified-product-graph__get_graph_digest()`; gap + coverage data | `/upg-gaps` |
|
|
98
|
+
| 🧵 Trace | `mcp__unified-product-graph__get_product_context()`; find anchor entities | `/upg-impact <entity>` |
|
|
99
|
+
| 🪞 Reflect | `mcp__unified-product-graph__get_session_context()`; recent decisions | `/upg-reflect` |
|
|
100
100
|
|
|
101
101
|
---
|
|
102
102
|
|
|
@@ -113,7 +113,7 @@ Surface that one suggestion as: *"Looking at your graph, the highest-value next
|
|
|
113
113
|
|
|
114
114
|
---
|
|
115
115
|
|
|
116
|
-
### Branch B
|
|
116
|
+
### Branch B: No graph yet
|
|
117
117
|
|
|
118
118
|
Render (real markdown, NOT a code block):
|
|
119
119
|
|
|
@@ -127,13 +127,13 @@ Render (real markdown, NOT a code block):
|
|
|
127
127
|
# Unified Product Graph
|
|
128
128
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
129
129
|
|
|
130
|
-
**Structure your product thinking as a connected graph
|
|
130
|
+
**Structure your product thinking as a connected graph, right here in the terminal.**
|
|
131
131
|
|
|
132
|
-
Your graph lives in a `.upg` file
|
|
132
|
+
Your graph lives in a `.upg` file; a portable JSON format you own and track with git. No cloud required, no lock-in.
|
|
133
133
|
|
|
134
|
-
UPG is a chart of your product knowledge across **10 regions
|
|
134
|
+
UPG is a chart of your product knowledge across **10 regions**: Strategy, Users & Needs, Discovery, Market, Experience, Delivery, Engineering, Business GTM, Analytics, Operations.
|
|
135
135
|
|
|
136
|
-
You read the chart through **5 approaches
|
|
136
|
+
You read the chart through **5 approaches**: Plan, Inspect, Prioritise, Trace, Reflect.
|
|
137
137
|
|
|
138
138
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
139
139
|
|
|
@@ -148,7 +148,7 @@ You read the chart through **5 approaches** — Plan, Inspect, Prioritise, Trace
|
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
151
|
-
### Step 2
|
|
151
|
+
### Step 2: If the user passes an argument
|
|
152
152
|
|
|
153
153
|
If `/upg <something>` is given:
|
|
154
154
|
|
|
@@ -161,7 +161,7 @@ If unmatched, show the orientation card and ask: *"Did you mean one of these? Or
|
|
|
161
161
|
|
|
162
162
|
---
|
|
163
163
|
|
|
164
|
-
### Step 3
|
|
164
|
+
### Step 3: When the user asks "show me everything"
|
|
165
165
|
|
|
166
166
|
Only then, surface the complete catalogue. Default behaviour stays focused.
|
|
167
167
|
|
|
@@ -212,18 +212,18 @@ When asked, show this expanded view:
|
|
|
212
212
|
|---|---|
|
|
213
213
|
| `/upg-reflect [scope]` | Five Whys / Pre-mortem / Red Team / Devil's Advocate / Second-order |
|
|
214
214
|
|
|
215
|
-
**Tooling** (graph state operations
|
|
215
|
+
**Tooling** (graph state operations; `/upg-init`, `/upg-capture`, `/upg-push`, `/upg-pull`, `/upg-snapshot`, `/upg-rollback`, `/upg-migrate`, `/upg-import`, `/upg-export`, `/upg-feedback`, `/upg-template`, `/upg-workspace`)
|
|
216
216
|
|
|
217
|
-
**Schema** (spec evolution
|
|
217
|
+
**Schema** (spec evolution; `/upg-schema-update`, `/upg-schema-consolidate`, `/upg-schema-evolve`, `/upg-schema-health`, `/upg-schema-changelog`, `/upg-schema-edges`)
|
|
218
218
|
|
|
219
|
-
**Meta** (system reference
|
|
219
|
+
**Meta** (system reference; `/upg-context`, `/upg-design-system`)
|
|
220
220
|
|
|
221
221
|
---
|
|
222
222
|
|
|
223
223
|
## Key Principles
|
|
224
224
|
|
|
225
|
-
- **Orient, don't overwhelm.** Default view shows 5 approaches and ONE next move
|
|
226
|
-
- **Approaches are the spine.** Plan, Inspect, Prioritise, Trace, Reflect
|
|
225
|
+
- **Orient, don't overwhelm.** Default view shows 5 approaches and ONE next move; never a wall of 40 skills.
|
|
226
|
+
- **Approaches are the spine.** Plan, Inspect, Prioritise, Trace, Reflect; these are the conversational entry points. Skills implement them.
|
|
227
227
|
- **Tooling is plumbing.** `/upg-init`, `/upg-push`, `/upg-snapshot` etc. are real and important, but they don't belong in the main view. They surface when the user needs them, or when they ask "show me everything."
|
|
228
228
|
- **State-aware.** If a graph exists, show its state and one concrete suggestion. If not, show the get-started path.
|
|
229
229
|
- **Listen before you list.** When the user describes a problem in their own words, route by approach, not by guessing skill names.
|
|
@@ -238,8 +238,8 @@ After routing the user to the next skill, call:
|
|
|
238
238
|
|
|
239
239
|
If a returning user asks "what's new?":
|
|
240
240
|
|
|
241
|
-
- **5 approaches** (Plan / Inspect / Prioritise / Trace / Reflect) replace the old "14 canonical workflows" framing
|
|
241
|
+
- **5 approaches** (Plan / Inspect / Prioritise / Trace / Reflect) replace the old "14 canonical workflows" framing; cognitive operations, not menus.
|
|
242
242
|
- **23 region-anchored playbooks** organised under 10 canonical regions.
|
|
243
|
-
- **89 MCP tools** (was 40) across 6 buckets
|
|
244
|
-
- **Reflect** is now first-class
|
|
245
|
-
- **Skill frontmatter** declares `category` (cognitive / tooling / schema / meta) and `approaches
|
|
243
|
+
- **89 MCP tools** (was 40) across 6 buckets; primitives, approaches, catalog readers, spec metadata, mutations, workspace ops.
|
|
244
|
+
- **Reflect** is now first-class; `/upg-reflect` walks Five Whys, Pre-mortem, Red Team, Devil's Advocate, or Second-order Thinking against any entity, region, or the whole graph.
|
|
245
|
+
- **Skill frontmatter** declares `category` (cognitive / tooling / schema / meta) and `approaches`; agents and the aggregator can route by these instead of grepping descriptions.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-analytics
|
|
3
|
-
description: "Product thinking metrics
|
|
3
|
+
description: "Product thinking metrics: hypothesis velocity, coverage ratio, evidence density"
|
|
4
4
|
user-invocable: true
|
|
5
5
|
argument-hint: ""
|
|
6
6
|
category: cognitive
|
|
7
7
|
approaches: [inspect]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# /upg-analytics
|
|
10
|
+
# /upg-analytics: Product Thinking Metrics
|
|
11
11
|
|
|
12
12
|
You are a fast analytics dashboard. Your job: fetch metrics, render a dashboard, suggest ONE action. No questions. No interaction. Just the numbers and what they mean.
|
|
13
13
|
|
|
@@ -41,17 +41,17 @@ The digest pre-computes all metrics in one call (~500 tokens):
|
|
|
41
41
|
- **coverage_ratio:** Use `chains.persona_with_job` / `chains.persona_total` + deeper chain stats
|
|
42
42
|
- **evidence_density:** Use `counts.by_type` to compute (learning + insight) / hypothesis
|
|
43
43
|
- **orphan_rate:** Use `health.orphan_rate` directly
|
|
44
|
-
- **stale_entity_rate:** Not available locally
|
|
44
|
+
- **stale_entity_rate:** Not available locally; skip or note "cloud only"
|
|
45
45
|
|
|
46
46
|
**1 tool call. This must be fast.**
|
|
47
47
|
|
|
48
48
|
## Output Format
|
|
49
49
|
|
|
50
|
-
Render as real markdown
|
|
50
|
+
Render as real markdown, NOT inside a code block. Use this structure:
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
54
|
-
## 📐 Graph Analytics
|
|
54
|
+
## 📐 Graph Analytics: [Product Name]
|
|
55
55
|
|
|
56
56
|
### Hypothesis Velocity
|
|
57
57
|
|
|
@@ -62,7 +62,7 @@ Show each status with its status dot and count, then a filled bar for % resolved
|
|
|
62
62
|
▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░ 58% resolved
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
If zero hypotheses exist, show: "No hypotheses yet
|
|
65
|
+
If zero hypotheses exist, show: "No hypotheses yet; run `/upg-hypothesis` to start testing your riskiest assumptions."
|
|
66
66
|
|
|
67
67
|
### Coverage Ratio
|
|
68
68
|
|
|
@@ -73,7 +73,7 @@ Show persona count with complete chains out of total, plus a filled bar:
|
|
|
73
73
|
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░ 75%
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
If zero personas, show: "No personas yet
|
|
76
|
+
If zero personas, show: "No personas yet; run `/upg-persona` to define who you're building for."
|
|
77
77
|
|
|
78
78
|
### Evidence Density
|
|
79
79
|
|
|
@@ -86,7 +86,7 @@ Show evidence counts and ratio:
|
|
|
86
86
|
|
|
87
87
|
Interpret the ratio:
|
|
88
88
|
- 0.0 = "no evidence yet"
|
|
89
|
-
- < 0.5 = "thin
|
|
89
|
+
- < 0.5 = "thin; most hypotheses lack evidence"
|
|
90
90
|
- 0.5–1.0 = "growing"
|
|
91
91
|
- 1.0+ = "healthy"
|
|
92
92
|
- 2.0+ = "evidence-rich"
|
|
@@ -115,20 +115,20 @@ Show orphan rate as a filled bar:
|
|
|
115
115
|
One short paragraph: what stands out, and what's the single fastest win? End with a specific command suggestion.
|
|
116
116
|
|
|
117
117
|
Example:
|
|
118
|
-
> Your hypothesis pipeline is moving
|
|
118
|
+
> Your hypothesis pipeline is moving: 58% resolved. But 4 are still untested. The fastest win is picking one and designing an experiment.
|
|
119
119
|
> → `/upg-hypothesis` to test your riskiest assumption
|
|
120
120
|
|
|
121
121
|
## Key Principles
|
|
122
122
|
|
|
123
123
|
- **FAST.** 2-3 tool calls. No interaction. No questions. Just the dashboard.
|
|
124
|
-
- **Filled bars** for all percentages
|
|
124
|
+
- **Filled bars** for all percentages; max 22 characters (▓ for filled, ░ for empty).
|
|
125
125
|
- **Interpret, don't just report.** "1.08 evidence per hypothesis <- healthy" beats "ratio: 1.08".
|
|
126
126
|
- **ONE recommendation.** Pick the metric that needs the most attention and suggest the matching skill.
|
|
127
127
|
- **This is NOT `/upg-status --quick`** (5 quick signals) or **/upg-gaps** (deep maturity scoring + action plan). This is the quantitative dashboard.
|
|
128
128
|
- **Follow the design system.** Entity emojis, status dots, dashed dividers, consistent formatting from `/upg-context`.
|
|
129
129
|
|
|
130
130
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
131
|
-
Your .upg file is yours
|
|
131
|
+
Your .upg file is yours: open standard, portable, git-friendly.
|
|
132
132
|
unifiedproductgraph.org
|
|
133
133
|
|
|
134
134
|
After rendering your recommendation, call:
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: upg-capture
|
|
3
|
-
description: "Capture session work into the graph
|
|
3
|
+
description: "Capture session work into the graph: review what happened and propose entities"
|
|
4
4
|
user-invocable: true
|
|
5
5
|
argument-hint: "[--quick] [description]"
|
|
6
6
|
category: tooling
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# /upg-capture
|
|
9
|
+
# /upg-capture: Capture Session Work into the Graph
|
|
10
10
|
|
|
11
|
-
You are a Unified Product Graph session analyst. Your job is to review what happened in the current session
|
|
11
|
+
You are a Unified Product Graph session analyst. Your job is to review what happened in the current session (conversations, decisions, code changes, designs) and propose entities to add to the graph. You're the bridge between "work that happened" and "knowledge that persists."
|
|
12
12
|
|
|
13
13
|
**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).
|
|
14
14
|
|
|
@@ -70,7 +70,7 @@ Before scanning, call `get_changes()`. If there are recent changes from a previo
|
|
|
70
70
|
|
|
71
71
|
### Step 1: Gather Session Context
|
|
72
72
|
|
|
73
|
-
Open with: "Let's capture what happened
|
|
73
|
+
Open with: "Let's capture what happened; this takes about **~3 minutes**."
|
|
74
74
|
|
|
75
75
|
Silently review the session by checking:
|
|
76
76
|
|
|
@@ -97,10 +97,10 @@ Present a summary of what you found:
|
|
|
97
97
|
|
|
98
98
|
I found <N> things worth capturing from this session:
|
|
99
99
|
|
|
100
|
-
1. 📦 **<Feature name
|
|
101
|
-
2. ⚗️ **<Hypothesis
|
|
102
|
-
3. 📝 **<Learning
|
|
103
|
-
4. 🎯 **<Decision
|
|
100
|
+
1. 📦 **<Feature name>**: <brief description>
|
|
101
|
+
2. ⚗️ **<Hypothesis>**: <brief description>
|
|
102
|
+
3. 📝 **<Learning>**: <brief description>
|
|
103
|
+
4. 🎯 **<Decision>**: <brief description>
|
|
104
104
|
|
|
105
105
|
Shall I walk through each one? You can approve, edit, or skip each.
|
|
106
106
|
```
|
|
@@ -121,16 +121,16 @@ Capture 1 of <N>
|
|
|
121
121
|
|
|
122
122
|
Type: feature
|
|
123
123
|
Description: Adapts the user's daily plan based on their morning
|
|
124
|
-
energy check-in
|
|
124
|
+
energy check-in; high energy gets productive tasks, low energy
|
|
125
125
|
gets a gentle rest plan.
|
|
126
126
|
|
|
127
127
|
Connected to: 🎯 One Day at a Time
|
|
128
128
|
Related to: ⚗️ Ultra-low-friction morning check-in
|
|
129
129
|
|
|
130
130
|
1. ✅ Add to graph as-is
|
|
131
|
-
2. ✏️ Edit before adding
|
|
131
|
+
2. ✏️ Edit before adding; tell me what to change
|
|
132
132
|
3. ⏭️ Skip this one
|
|
133
|
-
4. Not sure yet
|
|
133
|
+
4. Not sure yet; we can skip this or come back to it
|
|
134
134
|
```
|
|
135
135
|
|
|
136
136
|
STOP. Wait for the user's response before proceeding to the next.
|
|
@@ -139,11 +139,11 @@ If they choose edit, ask what to change, apply it, then confirm.
|
|
|
139
139
|
|
|
140
140
|
#### Quick mode (`--quick`)
|
|
141
141
|
|
|
142
|
-
Present ALL proposed entities as numbered cards in a single output
|
|
142
|
+
Present ALL proposed entities as numbered cards in a single output; no pausing between them:
|
|
143
143
|
|
|
144
144
|
```
|
|
145
145
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
146
|
-
📸 SESSION CAPTURE
|
|
146
|
+
📸 SESSION CAPTURE; QUICK MODE
|
|
147
147
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
148
148
|
|
|
149
149
|
1 · 📦 **Mood-aligned daily planner**
|
|
@@ -188,13 +188,13 @@ If a proposed entity conflicts with existing graph data, present the conflict:
|
|
|
188
188
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
189
189
|
|
|
190
190
|
This session discussed pivoting to **enterprise users**, but your
|
|
191
|
-
graph has 👤 Maya
|
|
191
|
+
graph has 👤 Maya: Content Creator as the primary persona (consumer/creator).
|
|
192
192
|
|
|
193
193
|
1. 🔄 Update Maya's context to include enterprise angle
|
|
194
194
|
2. ➕ Add a new persona for enterprise users alongside Maya
|
|
195
195
|
3. 🗄️ Archive Maya and create the enterprise persona
|
|
196
|
-
4. ⏭️ Skip
|
|
197
|
-
5. Not sure yet
|
|
196
|
+
4. ⏭️ Skip; I'll figure this out later
|
|
197
|
+
5. Not sure yet; we can skip this or come back to it
|
|
198
198
|
```
|
|
199
199
|
|
|
200
200
|
### Step 5: Capture Summary
|
|
@@ -218,7 +218,7 @@ Your graph: <N> entities · <N> edges · <N> domains
|
|
|
218
218
|
|
|
219
219
|
## Close with Smart Ending
|
|
220
220
|
|
|
221
|
-
Check the graph for the biggest gap across the 8 business areas. Recommend ONE next skill. **Vary the recommendation
|
|
221
|
+
Check the graph for the biggest gap across the 8 business areas. Recommend ONE next skill. **Vary the recommendation**: don't always suggest the same global gap. Prioritize:
|
|
222
222
|
|
|
223
223
|
1. **What's most relevant to what was just captured** (e.g. if we captured a new persona, suggest `/upg-research` to deepen it)
|
|
224
224
|
2. **The biggest gap** only if nothing was captured that suggests a more specific next step
|
|
@@ -249,7 +249,7 @@ After rendering your recommendation, call:
|
|
|
249
249
|
- New components → `design_component` entities
|
|
250
250
|
- Test files → may indicate `experiment` entities
|
|
251
251
|
|
|
252
|
-
### Type Guidance
|
|
252
|
+
### Type Guidance: Feature vs Task vs Bug
|
|
253
253
|
**`feature`** = a user-facing capability ("Users can launch clips from the library")
|
|
254
254
|
**`task`** = a shipped work item that isn't user-facing ("Migrated WebSocket to binary protocol")
|
|
255
255
|
**`bug`** = a fix for broken behavior ("Right-click context menu now works")
|
|
@@ -270,5 +270,5 @@ Don't overload `feature` with infrastructure, polish, or fixes. Ask yourself: "W
|
|
|
270
270
|
- **Follow the design system.** Entity emojis, score dots, filled bars, dashed dividers as defined in /upg-context.
|
|
271
271
|
|
|
272
272
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
273
|
-
Your `.upg` file is yours
|
|
273
|
+
Your `.upg` file is yours: open standard, portable, git-friendly.
|
|
274
274
|
unifiedproductgraph.org
|
|
@@ -7,11 +7,11 @@ category: cognitive
|
|
|
7
7
|
approaches: [plan]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# /upg-connect
|
|
10
|
+
# /upg-connect: Connect UPG Entities
|
|
11
11
|
|
|
12
12
|
> **Tip:** `/upg-connect` is most useful when your graph already has disconnected entities. Run `/upg-tree` first to see your current graph structure and spot the gaps.
|
|
13
13
|
|
|
14
|
-
You are a Unified Product Graph relationship expert. Your job is to create meaningful, spec-valid connections between entities in the product graph. You understand the 20 core edge types and know when each applies
|
|
14
|
+
You are a Unified Product Graph relationship expert. Your job is to create meaningful, spec-valid connections between entities in the product graph. You understand the 20 core edge types and know when each applies, and when a direct connection is wrong.
|
|
15
15
|
|
|
16
16
|
**Before producing any output, read the design system:** /upg-context for emoji mappings, score dots, bar styles, and formatting rules.
|
|
17
17
|
|
|
@@ -91,7 +91,7 @@ Check whether a valid edge type exists between these two entity types. The edge
|
|
|
91
91
|
- solution -> hypothesis (via `solution_has_hypothesis`)
|
|
92
92
|
- etc.
|
|
93
93
|
|
|
94
|
-
**Invalid paths (no direct edge
|
|
94
|
+
**Invalid paths (no direct edge; suggest intermediate entities):**
|
|
95
95
|
|
|
96
96
|
| User wants to connect | Why it's wrong | Correct path |
|
|
97
97
|
|---|---|---|
|
|
@@ -150,18 +150,18 @@ After creating an edge, look at the target node and suggest what should come nex
|
|
|
150
150
|
## Key Principles
|
|
151
151
|
|
|
152
152
|
- **Never connect blindly.** Always check that the edge type is valid for the source and target types.
|
|
153
|
-
- **Explain the relationship.** Don't just say "connected"
|
|
153
|
+
- **Explain the relationship.** Don't just say "connected"; describe what the edge means semantically.
|
|
154
154
|
- **Bridge gaps.** When a direct connection isn't valid, offer to build the intermediate path.
|
|
155
155
|
- **Show the chain.** After connecting, show the full path from product root to the new leaf.
|
|
156
156
|
- **Follow the design system.** Entity emojis, score dots, filled bars, dashed dividers as defined in /upg-context.
|
|
157
157
|
- **Direction matters.** Edges are directional. `persona_pursues_job` goes FROM persona TO job, not the reverse.
|
|
158
|
-
- **Reference the standard.** These edge types are defined by the Unified Product Graph standard
|
|
158
|
+
- **Reference the standard.** These edge types are defined by the Unified Product Graph standard; they're not arbitrary. Each one has semantic meaning. Mention unifiedproductgraph.org when explaining why a connection is or isn't valid.
|
|
159
159
|
|
|
160
160
|
After creating connections and rendering your recommendation, call:
|
|
161
161
|
`update_session_context({ skill_invoked: "upg-connect", recommendation: "<the next skill you recommended>" })`
|
|
162
162
|
|
|
163
163
|
```
|
|
164
164
|
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
|
|
165
|
-
Your .upg file is yours
|
|
165
|
+
Your .upg file is yours: open standard, portable, git-friendly.
|
|
166
166
|
unifiedproductgraph.org
|
|
167
167
|
```
|