@unified-product-graph/core 0.17.8 → 0.18.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/dist/index.cjs CHANGED
@@ -103,6 +103,7 @@ __export(index_exports, {
103
103
  UPG_PLAYBOOKS: () => UPG_PLAYBOOKS,
104
104
  UPG_POLYMORPHIC_EDGE_KEYS: () => UPG_POLYMORPHIC_EDGE_KEYS,
105
105
  UPG_PORTFOLIO_KINDS: () => UPG_PORTFOLIO_KINDS,
106
+ UPG_PORTFOLIO_SHARED_TYPES: () => UPG_PORTFOLIO_SHARED_TYPES,
106
107
  UPG_PRODUCT_STAGES: () => UPG_PRODUCT_STAGES,
107
108
  UPG_PRODUCT_STAGE_COERCION_MAP: () => UPG_PRODUCT_STAGE_COERCION_MAP,
108
109
  UPG_PROPERTY_MIGRATIONS: () => UPG_PROPERTY_MIGRATIONS,
@@ -141,6 +142,7 @@ __export(index_exports, {
141
142
  concernEvaluatedFor: () => concernEvaluatedFor,
142
143
  concernFor: () => concernFor,
143
144
  concernGatesFor: () => concernGatesFor,
145
+ crossProductScope: () => crossProductScope,
144
146
  describeTreePattern: () => describeTreePattern,
145
147
  edgeCarriesProperties: () => edgeCarriesProperties,
146
148
  evaluateAntiPatterns: () => evaluateAntiPatterns,
@@ -202,7 +204,9 @@ __export(index_exports, {
202
204
  isCanonical: () => isCanonical,
203
205
  isCanonicalProductStage: () => isCanonicalProductStage,
204
206
  isContainmentFreeType: () => isContainmentFreeType,
207
+ isCrossCapable: () => isCrossCapable,
205
208
  isCrossProductEligible: () => isCrossProductEligible,
209
+ isCuratedCrossEligible: () => isCuratedCrossEligible,
206
210
  isDeliberateOnlyEdge: () => isDeliberateOnlyEdge,
207
211
  isDeprecatedType: () => isDeprecatedType,
208
212
  isDomainGuideStep: () => isDomainGuideStep,
@@ -213,6 +217,7 @@ __export(index_exports, {
213
217
  isLifecyclePlannedType: () => isLifecyclePlannedType,
214
218
  isPolymorphicEdge: () => isPolymorphicEdge,
215
219
  isPortfolio: () => isPortfolio,
220
+ isPortfolioSharedType: () => isPortfolioSharedType,
216
221
  isRecordEntity: () => isRecordEntity,
217
222
  isRegisteredPolymorphicEdge: () => isRegisteredPolymorphicEdge,
218
223
  isRuntimeStateShapedProperty: () => isRuntimeStateShapedProperty,
@@ -766,27 +771,27 @@ function getDomainIdForType(entityType) {
766
771
  // src/registry/entity-meta.ts
767
772
  var UPG_ENTITY_META = [
768
773
  // Foundations (0.9.12): shared specifications + the primitives they define.
769
- { name: "specification", type_id: "ent_352", maturity: "proposed", since: "0.9.12" },
770
- { name: "primitive", type_id: "ent_353", maturity: "proposed", since: "0.9.12" },
771
- { name: "operating_lifecycle", type_id: "ent_355", maturity: "proposed", since: "0.11.6" },
772
- { name: "operating_stage", type_id: "ent_356", maturity: "proposed", since: "0.11.6" },
774
+ { name: "specification", type_id: "ent_352", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
775
+ { name: "primitive", type_id: "ent_353", maturity: "proposed", since: "0.9.12", portfolio_shared: true },
776
+ { name: "operating_lifecycle", type_id: "ent_355", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
777
+ { name: "operating_stage", type_id: "ent_356", maturity: "proposed", since: "0.11.6", portfolio_shared: true },
773
778
  // ── Strategic ──
774
779
  { name: "product", type_id: "ent_001", maturity: "stable", since: "0.1.0" },
775
- { name: "outcome", type_id: "ent_002", maturity: "stable", since: "0.1.0" },
780
+ { name: "outcome", type_id: "ent_002", maturity: "stable", since: "0.1.0", portfolio_shared: true },
776
781
  { name: "kpi", type_id: "ent_003", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "metric" },
777
- { name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0" },
778
- { name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0" },
779
- { name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0" },
782
+ { name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0", portfolio_shared: true },
783
+ { name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0", portfolio_shared: true },
784
+ { name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0", portfolio_shared: true },
780
785
  // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,
781
786
  // the metric-quality assessment artefact is settled with no open restructure.
782
787
  { name: "metric_quality_assessment", type_id: "ent_339", maturity: "stable", since: "0.2.2" },
783
- { name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0" },
784
- { name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0" },
785
- { name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0" },
786
- { name: "initiative", type_id: "ent_010", maturity: "stable", since: "0.1.0" },
787
- { name: "capability", type_id: "ent_011", maturity: "stable", since: "0.1.0" },
788
+ { name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0", portfolio_shared: true },
789
+ { name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0", portfolio_shared: true },
790
+ { name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0", portfolio_shared: true },
791
+ { name: "initiative", type_id: "ent_010", maturity: "stable", since: "0.1.0", portfolio_shared: true },
792
+ { name: "capability", type_id: "ent_011", maturity: "stable", since: "0.1.0", portfolio_shared: true },
788
793
  { name: "value_stream", type_id: "ent_012", maturity: "stable", since: "0.1.0" },
789
- { name: "strategic_pillar", type_id: "ent_013", maturity: "stable", since: "0.1.0" },
794
+ { name: "strategic_pillar", type_id: "ent_013", maturity: "stable", since: "0.1.0", portfolio_shared: true },
790
795
  { name: "assumption", type_id: "ent_014", maturity: "stable", since: "0.1.0" },
791
796
  { name: "decision", type_id: "ent_015", maturity: "stable", since: "0.1.0" },
792
797
  { name: "constraint", type_id: "ent_348", maturity: "stable", since: "0.4.3" },
@@ -842,18 +847,18 @@ var UPG_ENTITY_META = [
842
847
  { name: "evidence", type_id: "ent_031", maturity: "stable", since: "0.1.0" },
843
848
  { name: "research_plan", type_id: "ent_032", maturity: "stable", since: "0.1.0" },
844
849
  // ── Market Intelligence ──
845
- { name: "competitor", type_id: "ent_033", maturity: "stable", since: "0.1.0" },
846
- { name: "competitor_feature", type_id: "ent_034", maturity: "stable", since: "0.1.0" },
847
- { name: "competitor_signal", type_id: "ent_354", maturity: "proposed", since: "0.10.0" },
850
+ { name: "competitor", type_id: "ent_033", maturity: "stable", since: "0.1.0", portfolio_shared: true },
851
+ { name: "competitor_feature", type_id: "ent_034", maturity: "stable", since: "0.1.0", portfolio_shared: true },
852
+ { name: "competitor_signal", type_id: "ent_354", maturity: "proposed", since: "0.10.0", portfolio_shared: true },
848
853
  { name: "market_trend", type_id: "ent_035", maturity: "stable", since: "0.1.0" },
849
- { name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0" },
854
+ { name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0", portfolio_shared: true },
850
855
  { name: "competitive_analysis", type_id: "ent_037", maturity: "stable", since: "0.1.0" },
851
856
  // Classification taxonomy hosted by competitive_analysis.
852
857
  // F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases
853
858
  // stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-
854
859
  // analysis classification spine with no open rename/restructure ticket.
855
- { name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0" },
856
- { name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0" },
860
+ { name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0", portfolio_shared: true },
861
+ { name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0", portfolio_shared: true },
857
862
  // ── UX Research ──
858
863
  { name: "research_study", type_id: "ent_038", maturity: "stable", since: "0.1.0" },
859
864
  { name: "research_insight", type_id: "ent_039", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
@@ -875,9 +880,9 @@ var UPG_ENTITY_META = [
875
880
  { name: "how_might_we", type_id: "ent_333", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "design_question" },
876
881
  { name: "design_concept", type_id: "ent_054", maturity: "stable", since: "0.1.0" },
877
882
  { name: "prototype", type_id: "ent_055", maturity: "stable", since: "0.1.0" },
878
- { name: "design_component", type_id: "ent_056", maturity: "stable", since: "0.1.0" },
883
+ { name: "design_component", type_id: "ent_056", maturity: "stable", since: "0.1.0", portfolio_shared: true },
879
884
  { name: "design_token", type_id: "ent_057", maturity: "stable", since: "0.1.0" },
880
- { name: "brand_identity", type_id: "ent_058", maturity: "stable", since: "0.1.0" },
885
+ { name: "brand_identity", type_id: "ent_058", maturity: "stable", since: "0.1.0", portfolio_shared: true },
881
886
  { name: "brand_colour", type_id: "ent_059", maturity: "stable", since: "0.1.0" },
882
887
  { name: "brand_typography", type_id: "ent_060", maturity: "stable", since: "0.1.0" },
883
888
  { name: "brand_voice", type_id: "ent_061", maturity: "stable", since: "0.1.0" },
@@ -886,7 +891,7 @@ var UPG_ENTITY_META = [
886
891
  { name: "design_guideline", type_id: "ent_064", maturity: "stable", since: "0.1.0" },
887
892
  { name: "annotation", type_id: "ent_065", maturity: "stable", since: "0.1.0" },
888
893
  { name: "interaction_spec", type_id: "ent_066", maturity: "stable", since: "0.1.0" },
889
- { name: "design_system", type_id: "ent_067", maturity: "stable", since: "0.1.0" },
894
+ { name: "design_system", type_id: "ent_067", maturity: "stable", since: "0.1.0", portfolio_shared: true },
890
895
  { name: "user_flow", type_id: "ent_068", maturity: "stable", since: "0.1.0" },
891
896
  { name: "screen", type_id: "ent_069", maturity: "stable", since: "0.1.0" },
892
897
  { name: "screen_state", type_id: "ent_070", maturity: "stable", since: "0.1.0" },
@@ -1005,15 +1010,15 @@ var UPG_ENTITY_META = [
1005
1010
  { name: "rebuttal", type_id: "ent_140", maturity: "stable", since: "0.1.0" },
1006
1011
  { name: "proof_point", type_id: "ent_141", maturity: "stable", since: "0.1.0" },
1007
1012
  // ── Team & Organisation ──
1008
- { name: "team", type_id: "ent_142", maturity: "stable", since: "0.1.0" },
1013
+ { name: "team", type_id: "ent_142", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1009
1014
  { name: "role", type_id: "ent_143", maturity: "stable", since: "0.1.0" },
1010
1015
  { name: "stakeholder", type_id: "ent_144", maturity: "stable", since: "0.1.0" },
1011
1016
  { name: "person", type_id: "ent_349", maturity: "stable", since: "0.5.0" },
1012
1017
  { name: "product_decision", type_id: "ent_145", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.2.0", replacement: "decision" },
1013
1018
  { name: "team_okr", type_id: "ent_146", maturity: "stable", since: "0.1.0" },
1014
1019
  { name: "retrospective", type_id: "ent_147", maturity: "stable", since: "0.1.0" },
1015
- { name: "dependency", type_id: "ent_148", maturity: "stable", since: "0.1.0" },
1016
- { name: "department", type_id: "ent_149", maturity: "stable", since: "0.1.0" },
1020
+ { name: "dependency", type_id: "ent_148", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1021
+ { name: "department", type_id: "ent_149", maturity: "stable", since: "0.1.0", portfolio_shared: true },
1017
1022
  { name: "skill", type_id: "ent_150", maturity: "stable", since: "0.1.0" },
1018
1023
  { name: "ceremony", type_id: "ent_151", maturity: "stable", since: "0.1.0" },
1019
1024
  { name: "capacity_plan", type_id: "ent_152", maturity: "stable", since: "0.1.0" },
@@ -1225,6 +1230,10 @@ var UPG_ENTITY_META_BY_ID = new Map(
1225
1230
  );
1226
1231
  var UPG_ACTIVE_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "stable" || m.maturity === "proposed").map((m) => m.name);
1227
1232
  var UPG_DEPRECATED_TYPES = UPG_ENTITY_META.filter((m) => m.maturity === "deprecated").map((m) => m.name);
1233
+ var UPG_PORTFOLIO_SHARED_TYPES = UPG_ENTITY_META.filter((m) => m.portfolio_shared === true).map((m) => m.name);
1234
+ function isPortfolioSharedType(name) {
1235
+ return UPG_ENTITY_META_BY_NAME.get(name)?.portfolio_shared === true;
1236
+ }
1228
1237
  function isDeprecatedType(name) {
1229
1238
  const meta = UPG_ENTITY_META_BY_NAME.get(name);
1230
1239
  return meta?.maturity === "deprecated";
@@ -10319,6 +10328,21 @@ function rotateSlug(node, next) {
10319
10328
  return node;
10320
10329
  }
10321
10330
 
10331
+ // src/grammar/cross-scope.ts
10332
+ var CURATED_CROSS_EDGE_SET = new Set(UPG_CROSS_EDGE_TYPES);
10333
+ function isCrossCapable(sourceType, targetType) {
10334
+ return isPortfolioSharedType(sourceType) || isPortfolioSharedType(targetType);
10335
+ }
10336
+ function isCuratedCrossEligible(edgeType) {
10337
+ return CURATED_CROSS_EDGE_SET.has(edgeType);
10338
+ }
10339
+ function crossProductScope(edgeType) {
10340
+ if (CURATED_CROSS_EDGE_SET.has(edgeType)) return "curated";
10341
+ const def = UPG_EDGE_CATALOG[edgeType];
10342
+ if (def && isCrossCapable(def.source_type, def.target_type)) return "provisional";
10343
+ return "resident";
10344
+ }
10345
+
10322
10346
  // src/properties/property-schema.ts
10323
10347
  var UPG_PROPERTY_SCHEMA = {
10324
10348
  // A11yAnnotationProperties: Accessibility annotation.
@@ -29975,7 +29999,7 @@ function isCanonical(text) {
29975
29999
  }
29976
30000
 
29977
30001
  // src/index.ts
29978
- var UPG_VERSION = "0.17.8";
30002
+ var UPG_VERSION = "0.18.0";
29979
30003
  var UPG_FORMAT_VERSION = "0.4.0";
29980
30004
  var MARKDOWN_FORMAT_VERSION = "0.1";
29981
30005
  var UPG_TYPES = getTypes();
@@ -30113,6 +30137,7 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
30113
30137
  UPG_PLAYBOOKS,
30114
30138
  UPG_POLYMORPHIC_EDGE_KEYS,
30115
30139
  UPG_PORTFOLIO_KINDS,
30140
+ UPG_PORTFOLIO_SHARED_TYPES,
30116
30141
  UPG_PRODUCT_STAGES,
30117
30142
  UPG_PRODUCT_STAGE_COERCION_MAP,
30118
30143
  UPG_PROPERTY_MIGRATIONS,
@@ -30151,6 +30176,7 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
30151
30176
  concernEvaluatedFor,
30152
30177
  concernFor,
30153
30178
  concernGatesFor,
30179
+ crossProductScope,
30154
30180
  describeTreePattern,
30155
30181
  edgeCarriesProperties,
30156
30182
  evaluateAntiPatterns,
@@ -30212,7 +30238,9 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
30212
30238
  isCanonical,
30213
30239
  isCanonicalProductStage,
30214
30240
  isContainmentFreeType,
30241
+ isCrossCapable,
30215
30242
  isCrossProductEligible,
30243
+ isCuratedCrossEligible,
30216
30244
  isDeliberateOnlyEdge,
30217
30245
  isDeprecatedType,
30218
30246
  isDomainGuideStep,
@@ -30223,6 +30251,7 @@ var UPG_META_COUNT = UPG_ENTITY_META.length;
30223
30251
  isLifecyclePlannedType,
30224
30252
  isPolymorphicEdge,
30225
30253
  isPortfolio,
30254
+ isPortfolioSharedType,
30226
30255
  isRecordEntity,
30227
30256
  isRegisteredPolymorphicEdge,
30228
30257
  isRuntimeStateShapedProperty,