@unified-product-graph/mcp-server 0.9.1 → 0.9.2
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/dist/index.js +88 -8
- package/dist/index.js.map +1 -1
- package/dist/tools-manifest.json +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1303,8 +1303,24 @@ var UPG_EDGE_CATALOG = {
|
|
|
1303
1303
|
journey_step_realised_by_feature: { forward_verb: "realised_by", reverse_verb: "realises", classification: "cross-domain", source_type: "journey_step", target_type: "feature" },
|
|
1304
1304
|
opportunity_improves_user_journey: { forward_verb: "improves", reverse_verb: "improved_by", classification: "cross-domain", source_type: "opportunity", target_type: "user_journey" },
|
|
1305
1305
|
user_journey_passes_through_journey_phase: { forward_verb: "passes_through", reverse_verb: "is_phase_of", classification: "hierarchy", source_type: "user_journey", target_type: "journey_phase" },
|
|
1306
|
-
|
|
1306
|
+
// (since v0.9.2, UPG-663) A journey_phase is a temporal BAND over the
|
|
1307
|
+
// journey's single step timeline, not a container that owns steps. Steps
|
|
1308
|
+
// belong to the journey via `user_journey_contains_journey_step` (the stable
|
|
1309
|
+
// 0.1.0 spine); a phase merely SPANS a range of them. Mirrors the marketing
|
|
1310
|
+
// precedent `customer_journey_stage_spans_journey_step`. Renamed from the
|
|
1311
|
+
// owning `journey_phase_has_step` (hierarchy) so a step has exactly one
|
|
1312
|
+
// containment parent. See UPG_EDGE_MIGRATIONS['0.9.2'].
|
|
1313
|
+
journey_phase_spans_journey_step: { forward_verb: "spans", reverse_verb: "spanned_by", classification: "cross-domain", source_type: "journey_phase", target_type: "journey_step" },
|
|
1307
1314
|
journey_step_has_action: { forward_verb: "has_action", reverse_verb: "is_action_in", classification: "hierarchy", source_type: "journey_step", target_type: "journey_action" },
|
|
1315
|
+
// (since v0.9.2, UPG-663) journey_action outbound edges. Fixes the
|
|
1316
|
+
// discovery dead-end (D2). The finest blueprint layer carries pain_score /
|
|
1317
|
+
// opportunity_score "to drive opportunity discovery" but previously had zero
|
|
1318
|
+
// outbound edges. Opportunity discovery routes through `need` (mirroring
|
|
1319
|
+
// `journey_step_reveals_need`), which already reaches `opportunity` via the
|
|
1320
|
+
// user chain; the action does not link an opportunity directly. The feature
|
|
1321
|
+
// edge mirrors `journey_step_realised_by_feature` one level deeper.
|
|
1322
|
+
journey_action_surfaces_need: { forward_verb: "surfaces", reverse_verb: "surfaced_in", classification: "cross-domain", source_type: "journey_action", target_type: "need" },
|
|
1323
|
+
journey_action_realised_by_feature: { forward_verb: "realised_by", reverse_verb: "realises", classification: "cross-domain", source_type: "journey_action", target_type: "feature" },
|
|
1308
1324
|
// 2.5 UI System Domain
|
|
1309
1325
|
product_systematised_in_design_system: { forward_verb: "systematised_in", reverse_verb: "systematises", classification: "hierarchy", source_type: "product", target_type: "design_system" },
|
|
1310
1326
|
product_built_with_design_component: { forward_verb: "built_with", reverse_verb: "built_for", classification: "hierarchy", source_type: "product", target_type: "design_component" },
|
|
@@ -3029,8 +3045,13 @@ var UPG_VALID_CHILDREN = {
|
|
|
3029
3045
|
// parallel to `observation: ['quote']`. Research-synthesis canon.
|
|
3030
3046
|
// Pairs with `insight_evidenced_by_quote` in the edge catalog.
|
|
3031
3047
|
// ── Design hierarchy ────────────────────────────────────────────────────────
|
|
3048
|
+
// (UPG-663, v0.9.2) A user_journey owns its steps (the stable 0.1.0 spine)
|
|
3049
|
+
// and carries phases as a non-owning band overlay. A journey_phase is NO
|
|
3050
|
+
// LONGER a containment parent of journey_step: it SPANS steps via the
|
|
3051
|
+
// `journey_phase_spans_journey_step` edge (mirroring the marketing
|
|
3052
|
+
// `customer_journey_stage_spans_journey_step` precedent), so each step has
|
|
3053
|
+
// exactly one containment parent and the journey has one canonical step list.
|
|
3032
3054
|
user_journey: ["journey_step", "journey_phase"],
|
|
3033
|
-
journey_phase: ["journey_step"],
|
|
3034
3055
|
journey_step: ["journey_action"],
|
|
3035
3056
|
// v0.5.8 (UPG-528 Part 2d): insights own their evidencing quotes;
|
|
3036
3057
|
// parallel to `observation: ['quote']`. Research-synthesis canon
|
|
@@ -7127,6 +7148,20 @@ var UPG_SPLIT_MIGRATIONS = {
|
|
|
7127
7148
|
]
|
|
7128
7149
|
};
|
|
7129
7150
|
var UPG_EDGE_MIGRATIONS = {
|
|
7151
|
+
"0.9.2": [
|
|
7152
|
+
// (since v0.9.2, UPG-663) Journey-model disambiguation. A journey_phase
|
|
7153
|
+
// is a temporal BAND over the journey's single step timeline, not a
|
|
7154
|
+
// container that owns steps. The owning hierarchy edge
|
|
7155
|
+
// `journey_phase_has_step` is renamed to the non-owning
|
|
7156
|
+
// `journey_phase_spans_journey_step` (mirroring the marketing precedent
|
|
7157
|
+
// `customer_journey_stage_spans_journey_step`). Steps stay owned by the
|
|
7158
|
+
// journey via `user_journey_contains_journey_step` (the stable 0.1.0
|
|
7159
|
+
// spine), so each step keeps a single containment parent and the journey
|
|
7160
|
+
// renders one canonical step list. Endpoints are unchanged
|
|
7161
|
+
// (journey_phase → journey_step); only the edge key and its grammar
|
|
7162
|
+
// (verb has_step → spans, classification hierarchy → cross-domain) change.
|
|
7163
|
+
{ kind: "rename", from: "journey_phase_has_step", to: "journey_phase_spans_journey_step", requires_source_type: "journey_phase", requires_target_type: "journey_step", reason: "Journey-model disambiguation (UPG-663): a phase spans steps, it does not own them. The phase to step edge becomes non-owning (verb has_step to spans), so the step keeps a single containment parent (the journey) and the journey has one canonical step list." }
|
|
7164
|
+
],
|
|
7130
7165
|
"0.9.0": [
|
|
7131
7166
|
// (since v0.9.0, UPG-660) theme → roadmap_theme. The four canonical edges that
|
|
7132
7167
|
// touch the roadmap theme are renamed to the roadmap_theme form. Endpoint guards
|
|
@@ -9545,6 +9580,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9545
9580
|
},
|
|
9546
9581
|
// JourneyActionProperties: Discrete action at a journey step, classified by service layer.
|
|
9547
9582
|
journey_action: {
|
|
9583
|
+
action_order: { type: "number", description: "Display order of this action within its step (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_step.step_order` (UPG-663). Orders the service-blueprint rows within a single moment." },
|
|
9548
9584
|
layer: { type: "string", enum: ["user", "frontstage", "backstage", "support"], description: "Service layer" },
|
|
9549
9585
|
action_description: { type: "string", description: "Plain-language description. Primary content of the action." },
|
|
9550
9586
|
channel: { type: "string", enum: ["in-app", "email", "web", "mobile", "phone", "in-person", "sms", "social", "other"], description: "Channel or surface. Keeps service-blueprint columns consistent across the journey." },
|
|
@@ -9576,7 +9612,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9576
9612
|
system: { type: "string", description: "Performing system or service" },
|
|
9577
9613
|
notes: { type: "string", description: "Free-text notes, observations, or follow-up questions" }
|
|
9578
9614
|
},
|
|
9579
|
-
// JourneyPhaseProperties: Phase within a user journey.
|
|
9615
|
+
// JourneyPhaseProperties: Phase within a user journey. A temporal BAND over the journey's step
|
|
9580
9616
|
journey_phase: {
|
|
9581
9617
|
phase_order: { type: "number", description: "Display order within the journey (0-indexed)" },
|
|
9582
9618
|
label: { type: "string", description: 'Short human-readable name. @example "Discovery", "Onboarding", "Activation"' },
|
|
@@ -9587,8 +9623,9 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
9587
9623
|
key_questions: { type: "string[]", description: "Open questions the user asks themselves. Fuel for design and content priorities." },
|
|
9588
9624
|
timeframe: { type: "string", description: 'Typical time window. @example "first 30 seconds", "days 1\u20137", "onboarding week"' }
|
|
9589
9625
|
},
|
|
9590
|
-
// JourneyStepProperties: Single step within a user journey.
|
|
9626
|
+
// JourneyStepProperties: Single step within a user journey. A user-moment on the journey's single
|
|
9591
9627
|
journey_step: {
|
|
9628
|
+
step_order: { type: "number", description: "Display order within the journey's step timeline (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_action.action_order` (UPG-663). For branching journeys, the explicit `journey_step_precedes_journey_step` edge captures the chain." },
|
|
9592
9629
|
touchpoint: { type: "string", description: "Interaction touchpoint" },
|
|
9593
9630
|
channel: { type: "string", description: 'Channel (e.g. "web", "email", "in-store")' },
|
|
9594
9631
|
emotion_score: {
|
|
@@ -17073,8 +17110,13 @@ var STANDARD_LABELS = {
|
|
|
17073
17110
|
interview_guide: { alt_labels: ["discussion guide", "interview script", "moderator guide"] },
|
|
17074
17111
|
survey_response: { alt_labels: ["survey answer", "questionnaire response"] },
|
|
17075
17112
|
// Design layer
|
|
17076
|
-
|
|
17077
|
-
|
|
17113
|
+
// (UPG-663) alt_labels must not collide with other entity types' canonical
|
|
17114
|
+
// names or alt_labels, or the string->type resolver is ambiguous.
|
|
17115
|
+
// Dropped 'customer journey' (collides with customer_journey_stage),
|
|
17116
|
+
// 'touchpoint' and 'journey phase' (both distinct entity surfaces: a
|
|
17117
|
+
// touchpoint is the journey_step.touchpoint property, a phase is journey_phase).
|
|
17118
|
+
user_journey: { alt_labels: ["journey map", "experience map", "journey"] },
|
|
17119
|
+
journey_step: { alt_labels: ["journey moment", "journey stage"] },
|
|
17078
17120
|
design_component: { alt_labels: ["component", "ui component", "design element"] },
|
|
17079
17121
|
design_token: { alt_labels: ["token", "style token", "css variable"] },
|
|
17080
17122
|
wireframe: { alt_labels: ["wireflow", "lo-fi mockup", "skeleton"] },
|
|
@@ -19086,7 +19128,11 @@ var PRODUCT_SPEC_GUIDE = {
|
|
|
19086
19128
|
var UX_DESIGN_GUIDE = {
|
|
19087
19129
|
domain_id: "ux_design",
|
|
19088
19130
|
anchor_entity: "user_journey",
|
|
19089
|
-
|
|
19131
|
+
// (UPG-663) creation order follows containment: a journey_action is a child
|
|
19132
|
+
// of a journey_step, so the step must precede the action. The journey is the
|
|
19133
|
+
// anchor; phases are the band overlay; steps are the timeline; actions
|
|
19134
|
+
// decompose a step into service-blueprint rows.
|
|
19135
|
+
creation_sequence: ["user_journey", "journey_phase", "journey_step", "journey_action", "screen", "screen_state", "user_flow", "wireframe", "prototype", "design_question", "design_concept"],
|
|
19090
19136
|
patterns: [
|
|
19091
19137
|
{
|
|
19092
19138
|
name: "Journey to Screen Flow",
|
|
@@ -22358,6 +22404,40 @@ var UPG_ANTI_PATTERNS = [
|
|
|
22358
22404
|
stages: ["concept", "validation", "build", "beta", "launch", "growth", "mature"],
|
|
22359
22405
|
severity: "medium",
|
|
22360
22406
|
source: { kind: "fundamental" }
|
|
22407
|
+
},
|
|
22408
|
+
// ── Experience-design layer ─────────────────────────────────────────────
|
|
22409
|
+
{
|
|
22410
|
+
id: "journey-phases-without-canonical-steps",
|
|
22411
|
+
name: "Journey phases without a step spine",
|
|
22412
|
+
description: 'The graph has journey phases spanning steps (`journey_phase_spans_journey_step`), but no journey owns its steps via `user_journey_contains_journey_step`. A phase is a band over a step timeline, not a container. When the timeline itself is missing there is no canonical answer to "what are the steps of this journey?". The phase overlay points at steps the journey does not own.',
|
|
22413
|
+
structured_condition: {
|
|
22414
|
+
operator: "and",
|
|
22415
|
+
checks: [
|
|
22416
|
+
{
|
|
22417
|
+
check: {
|
|
22418
|
+
type: "relationship",
|
|
22419
|
+
source_type: "journey_phase",
|
|
22420
|
+
edge_type: "journey_phase_spans_journey_step",
|
|
22421
|
+
target_type: "journey_step",
|
|
22422
|
+
comparison: "exists"
|
|
22423
|
+
}
|
|
22424
|
+
},
|
|
22425
|
+
{
|
|
22426
|
+
check: {
|
|
22427
|
+
type: "relationship",
|
|
22428
|
+
source_type: "user_journey",
|
|
22429
|
+
edge_type: "user_journey_contains_journey_step",
|
|
22430
|
+
target_type: "journey_step",
|
|
22431
|
+
comparison: "not_exists"
|
|
22432
|
+
}
|
|
22433
|
+
}
|
|
22434
|
+
]
|
|
22435
|
+
},
|
|
22436
|
+
why_it_matters: "Steps owned by no journey render a different step list per consumer: the phase overlay sees them, a journey-direct walk does not. The journey has no deterministic step spine to traverse, score, or map to screens.",
|
|
22437
|
+
remediation: "Own every step under its journey with `user_journey_contains_journey_step`, then let phases span ranges of that single timeline via `journey_phase_spans_journey_step`. The phase is a non-owning band overlay, not the step container.",
|
|
22438
|
+
stages: ["concept", "validation", "build", "beta", "launch", "growth"],
|
|
22439
|
+
severity: "high",
|
|
22440
|
+
source: { kind: "fundamental" }
|
|
22361
22441
|
}
|
|
22362
22442
|
];
|
|
22363
22443
|
var SEVERITY_ORDER = {
|
|
@@ -24647,7 +24727,7 @@ function serializePortfolioWithHeader(doc, opts) {
|
|
|
24647
24727
|
header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) };
|
|
24648
24728
|
return JSON.stringify({ $upg: header, ...body }, null, 2) + "\n";
|
|
24649
24729
|
}
|
|
24650
|
-
var UPG_VERSION = "0.9.
|
|
24730
|
+
var UPG_VERSION = "0.9.2";
|
|
24651
24731
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
24652
24732
|
var UPG_TYPES = getTypes();
|
|
24653
24733
|
var UPG_TYPES_SET = new Set(UPG_TYPES);
|