@open-mercato/cli 0.10.1-develop.7983.1.fd91207efe → 0.10.1-develop.7994.1.c9f31972aa

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/agentic/guides/module-facts.json +162 -162
  3. package/dist/agentic/guides/module-facts.v2.json +162 -162
  4. package/dist/agentic/guides/module-tool.md +21 -0
  5. package/dist/agentic/guides/modules/agent_orchestrator/index.md +1 -1
  6. package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
  7. package/dist/agentic/guides/modules/api_docs/index.md +1 -1
  8. package/dist/agentic/guides/modules/api_keys/index.md +1 -1
  9. package/dist/agentic/guides/modules/attachments/index.md +1 -1
  10. package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
  11. package/dist/agentic/guides/modules/auth/index.md +1 -1
  12. package/dist/agentic/guides/modules/availability/index.md +1 -1
  13. package/dist/agentic/guides/modules/business_rules/index.md +1 -1
  14. package/dist/agentic/guides/modules/carrier_inpost/index.md +1 -1
  15. package/dist/agentic/guides/modules/cart/index.md +1 -1
  16. package/dist/agentic/guides/modules/catalog/index.md +1 -1
  17. package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
  18. package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
  19. package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
  20. package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
  21. package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
  22. package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
  23. package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
  24. package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
  25. package/dist/agentic/guides/modules/channel_smtp/index.md +1 -1
  26. package/dist/agentic/guides/modules/checkout/index.md +1 -1
  27. package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
  28. package/dist/agentic/guides/modules/configs/index.md +1 -1
  29. package/dist/agentic/guides/modules/content/index.md +1 -1
  30. package/dist/agentic/guides/modules/currencies/index.md +1 -1
  31. package/dist/agentic/guides/modules/customer_accounts/index.md +1 -1
  32. package/dist/agentic/guides/modules/customer_groups/index.md +1 -1
  33. package/dist/agentic/guides/modules/customers/index.md +1 -1
  34. package/dist/agentic/guides/modules/dashboards/index.md +1 -1
  35. package/dist/agentic/guides/modules/data_sync/index.md +1 -1
  36. package/dist/agentic/guides/modules/design_system/index.md +1 -1
  37. package/dist/agentic/guides/modules/devices/index.md +1 -1
  38. package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
  39. package/dist/agentic/guides/modules/directory/index.md +1 -1
  40. package/dist/agentic/guides/modules/documents/index.md +1 -1
  41. package/dist/agentic/guides/modules/ecommerce/index.md +1 -1
  42. package/dist/agentic/guides/modules/entities/index.md +1 -1
  43. package/dist/agentic/guides/modules/eudr/index.md +1 -1
  44. package/dist/agentic/guides/modules/events/index.md +1 -1
  45. package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
  46. package/dist/agentic/guides/modules/forms/index.md +1 -1
  47. package/dist/agentic/guides/modules/gateway_autopay/index.md +1 -1
  48. package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
  49. package/dist/agentic/guides/modules/gateway_tpay/index.md +1 -1
  50. package/dist/agentic/guides/modules/generators/index.md +1 -1
  51. package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
  52. package/dist/agentic/guides/modules/integrations/index.md +1 -1
  53. package/dist/agentic/guides/modules/messages/index.md +1 -1
  54. package/dist/agentic/guides/modules/notifications/index.md +1 -1
  55. package/dist/agentic/guides/modules/onboarding/index.md +1 -1
  56. package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
  57. package/dist/agentic/guides/modules/perspectives/index.md +1 -1
  58. package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
  59. package/dist/agentic/guides/modules/planner/index.md +1 -1
  60. package/dist/agentic/guides/modules/portal/index.md +1 -1
  61. package/dist/agentic/guides/modules/progress/index.md +1 -1
  62. package/dist/agentic/guides/modules/promotions/index.md +1 -1
  63. package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
  64. package/dist/agentic/guides/modules/query_index/index.md +1 -1
  65. package/dist/agentic/guides/modules/record_locks/index.md +1 -1
  66. package/dist/agentic/guides/modules/resources/index.md +1 -1
  67. package/dist/agentic/guides/modules/sales/index.md +1 -1
  68. package/dist/agentic/guides/modules/scheduler/index.md +1 -1
  69. package/dist/agentic/guides/modules/search/index.md +1 -1
  70. package/dist/agentic/guides/modules/security/index.md +1 -1
  71. package/dist/agentic/guides/modules/seeds/index.md +1 -1
  72. package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
  73. package/dist/agentic/guides/modules/sso/index.md +1 -1
  74. package/dist/agentic/guides/modules/staff/index.md +1 -1
  75. package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
  76. package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
  77. package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
  78. package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
  79. package/dist/agentic/guides/modules/telemetry/index.md +1 -1
  80. package/dist/agentic/guides/modules/tillio/index.md +1 -1
  81. package/dist/agentic/guides/modules/translations/index.md +1 -1
  82. package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
  83. package/dist/agentic/guides/modules/webhooks/index.md +1 -1
  84. package/dist/agentic/guides/modules/wms/index.md +1 -1
  85. package/dist/agentic/guides/modules/workflows/index.md +1 -1
  86. package/dist/agentic/guides/reference-module-facts.json +1 -1
  87. package/dist/agentic/guides/upstream/manifest.json +1 -1
  88. package/dist/agentic/shared/ai/harness/cases.json +23 -9
  89. package/dist/agentic/shared/ai/harness/source-link-inventory.json +90 -4
  90. package/dist/lib/__integration__/TC-INT-007.spec.js +207 -19
  91. package/dist/lib/__integration__/TC-INT-007.spec.js.map +2 -2
  92. package/dist/lib/__integration__/TC-INT-009.spec.js +267 -0
  93. package/dist/lib/__integration__/TC-INT-009.spec.js.map +7 -0
  94. package/dist/lib/eject.js +25 -9
  95. package/dist/lib/eject.js.map +2 -2
  96. package/dist/lib/generators/entity-ids.js +2 -0
  97. package/dist/lib/generators/entity-ids.js.map +2 -2
  98. package/dist/lib/generators/module-di.js +2 -0
  99. package/dist/lib/generators/module-di.js.map +2 -2
  100. package/dist/lib/generators/module-entities.js +2 -0
  101. package/dist/lib/generators/module-entities.js.map +2 -2
  102. package/dist/lib/generators/module-package-sources.js +6 -4
  103. package/dist/lib/generators/module-package-sources.js.map +2 -2
  104. package/dist/lib/generators/module-registry.js +32 -86
  105. package/dist/lib/generators/module-registry.js.map +2 -2
  106. package/dist/lib/generators/openapi.js +2 -0
  107. package/dist/lib/generators/openapi.js.map +2 -2
  108. package/dist/lib/generators/source-exports.js +73 -0
  109. package/dist/lib/generators/source-exports.js.map +7 -0
  110. package/dist/lib/init-summary.js +44 -0
  111. package/dist/lib/init-summary.js.map +7 -0
  112. package/dist/lib/module-github.js +98 -0
  113. package/dist/lib/module-github.js.map +7 -0
  114. package/dist/lib/module-identity.js +131 -0
  115. package/dist/lib/module-identity.js.map +7 -0
  116. package/dist/lib/module-inspection.js +124 -0
  117. package/dist/lib/module-inspection.js.map +7 -0
  118. package/dist/lib/module-install.js +150 -21
  119. package/dist/lib/module-install.js.map +3 -3
  120. package/dist/lib/module-package.js +205 -15
  121. package/dist/lib/module-package.js.map +2 -2
  122. package/dist/lib/modules-config.js +69 -30
  123. package/dist/lib/modules-config.js.map +2 -2
  124. package/dist/lib/resolver.js +33 -34
  125. package/dist/lib/resolver.js.map +2 -2
  126. package/dist/mercato.js +14 -23
  127. package/dist/mercato.js.map +2 -2
  128. package/package.json +7 -7
  129. package/src/__tests__/mercato.test.ts +14 -4
  130. package/src/lib/__fixtures__/official-module-package/dist/modules/test_package/widgets/injection/test/widget.js +1 -0
  131. package/src/lib/__integration__/TC-INT-007.spec.ts +219 -19
  132. package/src/lib/__integration__/TC-INT-009.spec.ts +279 -0
  133. package/src/lib/__tests__/eject.test.ts +98 -4
  134. package/src/lib/__tests__/init-summary.test.ts +50 -0
  135. package/src/lib/__tests__/module-github.test.ts +108 -0
  136. package/src/lib/__tests__/module-identity.test.ts +144 -0
  137. package/src/lib/__tests__/module-inspection.test.ts +195 -0
  138. package/src/lib/__tests__/module-install.test.ts +399 -10
  139. package/src/lib/__tests__/module-package.test.ts +154 -0
  140. package/src/lib/__tests__/modules-config.test.ts +55 -0
  141. package/src/lib/__tests__/resolver.packages.test.ts +29 -0
  142. package/src/lib/eject.ts +28 -10
  143. package/src/lib/generators/__tests__/module-id-collisions.test.ts +146 -0
  144. package/src/lib/generators/__tests__/module-package-sources.test.ts +19 -2
  145. package/src/lib/generators/__tests__/module-requirements.test.ts +56 -0
  146. package/src/lib/generators/entity-ids.ts +2 -0
  147. package/src/lib/generators/module-di.ts +2 -0
  148. package/src/lib/generators/module-entities.ts +2 -0
  149. package/src/lib/generators/module-package-sources.ts +7 -5
  150. package/src/lib/generators/module-registry.ts +33 -115
  151. package/src/lib/generators/openapi.ts +3 -0
  152. package/src/lib/generators/source-exports.ts +93 -0
  153. package/src/lib/init-summary.ts +54 -0
  154. package/src/lib/module-github.ts +109 -0
  155. package/src/lib/module-identity.ts +145 -0
  156. package/src/lib/module-inspection.ts +133 -0
  157. package/src/lib/module-install.ts +170 -22
  158. package/src/lib/module-package.ts +243 -16
  159. package/src/lib/modules-config.ts +80 -32
  160. package/src/lib/resolver.ts +35 -39
  161. package/src/mercato.ts +14 -24
  162. package/src/types/cross-spawn.d.ts +2 -2
@@ -1,5 +1,5 @@
1
1
  # security — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/enterprise 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/enterprise 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/enterprise/src/modules/security
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # seeds — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/seeds
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # shipping_carriers — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/shipping_carriers
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # sso — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/enterprise 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/enterprise 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/enterprise/src/modules/sso
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # staff — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/staff
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # storage_s3 — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/storage-s3 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/storage-s3 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/storage-s3/src/modules/storage_s3
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # sync_akeneo — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/sync-akeneo 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/sync-akeneo 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/sync-akeneo/src/modules/sync_akeneo
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # sync_excel — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/sync_excel
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # system_status_overlays — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/enterprise 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/enterprise 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/enterprise/src/modules/system_status_overlays
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # telemetry — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/telemetry 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/telemetry 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/telemetry/src/modules/telemetry
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # tillio — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/tillio 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/tillio 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/tillio/src/modules/tillio
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # translations — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/translations
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # warranty_claims — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/warranty_claims
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # webhooks — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/webhooks 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/webhooks 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/webhooks/src/modules/webhooks
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # wms — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/wms
4
4
 
5
5
  ## Sections
@@ -1,5 +1,5 @@
1
1
  # workflows — module facts (generated, do not edit)
2
- <!-- generated from @open-mercato/core 0.10.1-develop.7983.1.fd91207efe; core 0.10.1-develop.7983.1.fd91207efe — R1 staleness stamp -->
2
+ <!-- generated from @open-mercato/core 0.10.1-develop.7994.1.c9f31972aa; core 0.10.1-develop.7994.1.c9f31972aa — R1 staleness stamp -->
3
3
  Source root: node_modules/@open-mercato/core/src/modules/workflows
4
4
 
5
5
  ## Sections
@@ -1185,7 +1185,7 @@
1185
1185
  "facts": {
1186
1186
  "title": "Example Module",
1187
1187
  "description": "Demonstrates pages, APIs, entities and DI.",
1188
- "coreVersion": "0.10.1-develop.7983.1.fd91207efe",
1188
+ "coreVersion": "0.10.1-develop.7994.1.c9f31972aa",
1189
1189
  "sourcePackage": null,
1190
1190
  "sourceVersion": null,
1191
1191
  "sourceRoot": "src/modules/example",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generator": "@open-mercato/cli@0.10.1-develop.7983.1.fd91207efe",
3
+ "generator": "@open-mercato/cli@0.10.1-develop.7994.1.c9f31972aa",
4
4
  "files": {
5
5
  "AGENTS.md": "35c948a32e06ca64b4706970c55ec60946412b410938b22478233a2c5c43df56",
6
6
  "BACKWARD_COMPATIBILITY.md": "4fd70dbc9acff26540bb6f290996df23831583a48b025623b49761c42dddbc59"
@@ -21696,13 +21696,15 @@
21696
21696
  "mode": "analysis",
21697
21697
  "evaluationKind": "routing",
21698
21698
  "risk": "medium",
21699
- "prompt": "I am already inside a create-mercato-app Cloud sandbox. Explain the supported npx tool commands to start a new visits module, or package an existing visits module, then publish it to npm and a dedicated GitHub repository. Include a local preview before remote publication and explain how to keep developing in this same app after publication, including the optional repository link and its portability. Distinguish npm login, environment token and trusted publishing requirements. Prepare the workflow only; do not publish or create remote resources.",
21699
+ "prompt": "I am already inside a create-mercato-app Cloud sandbox. Explain the supported npx tool commands to start a new visits module, or package an existing visits module, then publish it to npm and a dedicated GitHub repository. Include a local preview before remote publication and explain how to keep developing in this same app after publication, including the optional repository link and its portability. Distinguish npm login, environment token and trusted publishing requirements. Prepare the workflow only; do not publish or create remote resources. For the receiving app, also explain installing under a dependency alias, rejecting two providers with the same runtime module ID, keeping npm and GitHub source identities distinct, explicitly disabling all consumers before replacing a binding, and preserving local source/provenance when ejecting. Explain resolving old-origin dependants and manual imports and successfully regenerating/building while the old provider remains installed, then replacing the binding and verifying generation/build again. Identify what disabling does not remove.",
21700
21700
  "tags": [
21701
21701
  "architecture",
21702
21702
  "module-package",
21703
21703
  "publication",
21704
21704
  "source-link",
21705
- "auth"
21705
+ "auth",
21706
+ "module-installation",
21707
+ "source-identity"
21706
21708
  ],
21707
21709
  "owner": {
21708
21710
  "kind": "guide",
@@ -21722,15 +21724,22 @@
21722
21724
  "context": {
21723
21725
  "required": [
21724
21726
  "AGENTS.md",
21725
- ".ai/guides/module-tool.md"
21727
+ ".ai/guides/module-tool.md",
21728
+ "node_modules/@open-mercato/cli/src/lib/module-install.ts",
21729
+ "node_modules/@open-mercato/cli/src/lib/module-identity.ts",
21730
+ "node_modules/@open-mercato/cli/src/lib/eject.ts"
21726
21731
  ],
21727
21732
  "allowedExtra": [
21728
21733
  ".ai/guides/architecture.md"
21729
21734
  ],
21730
21735
  "forbidden": [
21731
21736
  ".env*",
21732
- ".git/**",
21733
- "node_modules/**"
21737
+ ".git/**"
21738
+ ],
21739
+ "sourceReferenceIds": [
21740
+ "guides/module-tool:node_modules/@open-mercato/cli/src/lib/module-install.ts",
21741
+ "guides/module-tool:node_modules/@open-mercato/cli/src/lib/module-identity.ts",
21742
+ "guides/module-tool:node_modules/@open-mercato/cli/src/lib/eject.ts"
21734
21743
  ]
21735
21744
  },
21736
21745
  "requiredDecisions": [
@@ -21739,7 +21748,12 @@
21739
21748
  "fresh-consumer-third-party",
21740
21749
  "app-source-preserved",
21741
21750
  "optional-repository-source-link",
21742
- "npm-auth-mode-boundaries"
21751
+ "npm-auth-mode-boundaries",
21752
+ "module-binding-is-not-runtime-id",
21753
+ "npm-github-origins-distinct",
21754
+ "one-enabled-provider-per-runtime-id",
21755
+ "explicit-provider-replacement",
21756
+ "eject-retains-source-provenance"
21743
21757
  ],
21744
21758
  "forbiddenPatterns": [
21745
21759
  "(?:print|display|commit).{0,30}(?:NPM_TOKEN|NODE_AUTH_TOKEN|raw token)",
@@ -21754,9 +21768,9 @@
21754
21768
  "context.forbidden",
21755
21769
  "patterns.forbidden"
21756
21770
  ],
21757
- "maxContextFiles": 3,
21758
- "maxInitialContextBytes": 32768,
21759
- "maxTotalContextBytes": 32768,
21771
+ "maxContextFiles": 6,
21772
+ "maxInitialContextBytes": 73728,
21773
+ "maxTotalContextBytes": 81920,
21760
21774
  "relatedCases": [
21761
21775
  "OMH-002",
21762
21776
  "OMH-046",
@@ -2,10 +2,10 @@
2
2
  "version": 1,
3
3
  "generatedNote": "Derived asset — the app-facing projection of the repository source-link inventory, regenerated with `yarn workspace create-mercato-app harness:generate-source-link-inventory`. Never hand-edit. Harness cases resolve `context.sourceReferenceIds` against `referenceId` here; a record with `readStatus: \"qa-only\"` is validation evidence only and is refused as a case reference.",
4
4
  "derived": {
5
- "ownerCount": 32,
6
- "recordCount": 155,
7
- "sourceRequiredCount": 130,
8
- "readableCount": 155,
5
+ "ownerCount": 33,
6
+ "recordCount": 159,
7
+ "sourceRequiredCount": 133,
8
+ "readableCount": 159,
9
9
  "baselineSha": "f7c941570003f3abe920b1765995cbef98dcad0b"
10
10
  },
11
11
  "notCovered": [
@@ -615,6 +615,81 @@
615
615
  "migration"
616
616
  ]
617
617
  },
618
+ {
619
+ "referenceId": "guides/module-tool:node_modules/@open-mercato/cli/src/lib/eject.ts",
620
+ "requirement": "source-required",
621
+ "originAsset": ".ai/guides/module-tool.md",
622
+ "heading": "Receiving app: installation, aliases, and replacement",
623
+ "href": "../../node_modules/@open-mercato/cli/src/lib/eject.ts",
624
+ "targetKind": "installed-package",
625
+ "readStatus": "readable",
626
+ "resolvedPath": "node_modules/@open-mercato/cli/src/lib/eject.ts",
627
+ "moduleId": null,
628
+ "capabilityIds": [],
629
+ "packageName": "@open-mercato/cli",
630
+ "packageRelativePath": "src/lib/eject.ts",
631
+ "presets": [
632
+ "classic",
633
+ "crm",
634
+ "empty",
635
+ "wms"
636
+ ],
637
+ "tiers": [
638
+ "automation",
639
+ "core",
640
+ "migration"
641
+ ]
642
+ },
643
+ {
644
+ "referenceId": "guides/module-tool:node_modules/@open-mercato/cli/src/lib/module-identity.ts",
645
+ "requirement": "source-required",
646
+ "originAsset": ".ai/guides/module-tool.md",
647
+ "heading": "Receiving app: installation, aliases, and replacement",
648
+ "href": "../../node_modules/@open-mercato/cli/src/lib/module-identity.ts",
649
+ "targetKind": "installed-package",
650
+ "readStatus": "readable",
651
+ "resolvedPath": "node_modules/@open-mercato/cli/src/lib/module-identity.ts",
652
+ "moduleId": null,
653
+ "capabilityIds": [],
654
+ "packageName": "@open-mercato/cli",
655
+ "packageRelativePath": "src/lib/module-identity.ts",
656
+ "presets": [
657
+ "classic",
658
+ "crm",
659
+ "empty",
660
+ "wms"
661
+ ],
662
+ "tiers": [
663
+ "automation",
664
+ "core",
665
+ "migration"
666
+ ]
667
+ },
668
+ {
669
+ "referenceId": "guides/module-tool:node_modules/@open-mercato/cli/src/lib/module-install.ts",
670
+ "requirement": "source-required",
671
+ "originAsset": ".ai/guides/module-tool.md",
672
+ "heading": "Receiving app: installation, aliases, and replacement",
673
+ "href": "../../node_modules/@open-mercato/cli/src/lib/module-install.ts",
674
+ "targetKind": "installed-package",
675
+ "readStatus": "readable",
676
+ "resolvedPath": "node_modules/@open-mercato/cli/src/lib/module-install.ts",
677
+ "moduleId": null,
678
+ "capabilityIds": [],
679
+ "packageName": "@open-mercato/cli",
680
+ "packageRelativePath": "src/lib/module-install.ts",
681
+ "presets": [
682
+ "classic",
683
+ "crm",
684
+ "empty",
685
+ "wms"
686
+ ],
687
+ "tiers": [
688
+ "automation",
689
+ "core",
690
+ "migration"
691
+ ]
692
+ },
618
693
  {
619
694
  "referenceId": "om-backend-ui-design/crud-surfaces:README.md",
620
695
  "requirement": "source-required",
@@ -3913,6 +3988,17 @@
3913
3988
  "core"
3914
3989
  ]
3915
3990
  },
3991
+ {
3992
+ "referenceId": "rule:guides/module-tool#file-artifact-unknown-origin",
3993
+ "requirement": "retained-normative-snippet",
3994
+ "originAsset": ".ai/guides/module-tool.md",
3995
+ "heading": null,
3996
+ "targetKind": "local-owner",
3997
+ "readStatus": "readable",
3998
+ "resolvedPath": ".ai/guides/module-tool.md",
3999
+ "moduleId": null,
4000
+ "capabilityIds": []
4001
+ },
3916
4002
  {
3917
4003
  "referenceId": "rule:guides/testing-debugging#generated-output-is-not-a-patch-target",
3918
4004
  "requirement": "retained-normative-snippet",
@@ -19,21 +19,34 @@ const fixtureModulePackage = path.join(
19
19
  function yarnBinary() {
20
20
  return process.platform === "win32" ? "yarn.cmd" : "yarn";
21
21
  }
22
- function runCommand(command, args, cwd) {
22
+ function runCommand(command, args, cwd, environment = {}) {
23
23
  const yarnCacheFolder = path.join(cwd, ".yarn", "cache");
24
- return execFileSync(command, args, {
25
- cwd,
26
- encoding: "utf8",
27
- env: {
28
- ...process.env,
29
- FORCE_COLOR: "0",
30
- NODE_NO_WARNINGS: "1",
31
- YARN_CACHE_FOLDER: yarnCacheFolder,
32
- YARN_ENABLE_GLOBAL_CACHE: "0",
33
- YARN_ENABLE_IMMUTABLE_INSTALLS: "0",
34
- YARN_NODE_LINKER: "node-modules"
35
- }
36
- });
24
+ try {
25
+ return execFileSync(command, args, {
26
+ cwd,
27
+ encoding: "utf8",
28
+ env: {
29
+ ...process.env,
30
+ FORCE_COLOR: "0",
31
+ NODE_NO_WARNINGS: "1",
32
+ YARN_CACHE_FOLDER: yarnCacheFolder,
33
+ YARN_ENABLE_GLOBAL_CACHE: "0",
34
+ YARN_ENABLE_IMMUTABLE_INSTALLS: "0",
35
+ YARN_NODE_LINKER: "node-modules",
36
+ ...environment
37
+ }
38
+ });
39
+ } catch (error) {
40
+ if (!error || typeof error !== "object") throw error;
41
+ const errorRecord = error;
42
+ const outputs = ["stdout", "stderr"].flatMap((streamName) => {
43
+ const output = errorRecord[streamName];
44
+ return typeof output === "string" || Buffer.isBuffer(output) ? [output.toString().trim()] : [];
45
+ }).filter(Boolean);
46
+ const message = error instanceof Error ? error.message : String(error);
47
+ throw new Error(outputs.length > 0 ? `${message}
48
+ ${outputs.join("\n")}` : message);
49
+ }
37
50
  }
38
51
  function runMercato(args, cwd) {
39
52
  return runCommand(process.execPath, [cliBin, ...args], cwd);
@@ -69,6 +82,7 @@ const commentedModulesSource = [
69
82
  ""
70
83
  ].join("\n");
71
84
  function createMonorepoFixture(rootDir) {
85
+ writeFile(path.join(rootDir, "yarn.lock"), "");
72
86
  writeFile(
73
87
  path.join(rootDir, "package.json"),
74
88
  JSON.stringify(
@@ -103,6 +117,7 @@ function createMonorepoFixture(rootDir) {
103
117
  return appDir;
104
118
  }
105
119
  function createStandaloneFixture(rootDir) {
120
+ writeFile(path.join(rootDir, "yarn.lock"), "");
106
121
  writeFile(
107
122
  path.join(rootDir, ".yarnrc.yml"),
108
123
  ["nodeLinker: node-modules", "enableGlobalCache: false", "cacheFolder: ./.yarn/cache", ""].join("\n")
@@ -173,13 +188,182 @@ test.describe("TC-INT-007: CLI official module install and eject flows", () => {
173
188
  );
174
189
  const modulesSource = readFile(path.join(appDir, "src", "modules.ts"));
175
190
  const cssSource = readFile(path.join(appDir, ".mercato", "generated", "module-package-sources.css"));
176
- expect(modulesSource).toContain("{ id: 'test_package', from: '@app' }");
191
+ expect(modulesSource).toMatch(/id: 'test_package', from: '@app'/);
192
+ expect(modulesSource).not.toContain("locator:");
193
+ expect(modulesSource).toContain("packageName: '@open-mercato/test-package'");
177
194
  expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(true);
195
+ expect(readFile(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(readFile(path.join(fixtureModulePackage, "src", "modules", "test_package", "index.ts")));
178
196
  expect(cssSource).toBe("");
179
197
  } finally {
180
198
  fs.rmSync(appDir, { recursive: true, force: true });
181
199
  }
182
200
  });
201
+ test("module add reports dependencies that must be enabled before registration", () => {
202
+ const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-standalone-dependencies-"));
203
+ try {
204
+ createStandaloneFixture(appDir);
205
+ const packageDir = path.join(appDir, "fixture-module-package");
206
+ fs.cpSync(fixtureModulePackage, packageDir, { recursive: true });
207
+ writeFile(
208
+ path.join(packageDir, "src", "modules", "test_package", "index.ts"),
209
+ "export const metadata = { id: 'test_package', requires: ['customers'], ejectable: true }\n"
210
+ );
211
+ runCommand(yarnBinary(), ["install"], appDir);
212
+ expect(() => runMercato(
213
+ ["module", "add", "@open-mercato/test-package@file:./fixture-module-package"],
214
+ appDir
215
+ )).toThrow(/requires module\(s\) that are not enabled: customers/);
216
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe("export const enabledModules = []\n");
217
+ } finally {
218
+ fs.rmSync(appDir, { recursive: true, force: true });
219
+ }
220
+ });
221
+ test("module add resolves canonical requirements from retained ejected origins", () => {
222
+ const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-canonical-requires-"));
223
+ try {
224
+ createStandaloneFixture(appDir);
225
+ const packageDir = path.join(appDir, "fixture-module-package");
226
+ fs.cpSync(fixtureModulePackage, packageDir, { recursive: true });
227
+ const requirements = [
228
+ "@pkarw/marketing_consents@preview",
229
+ "npm:@pkarw/marketing_consents@1.0.0",
230
+ "github:pkarw/marketing-consents",
231
+ "npm:consent-helper@next",
232
+ "github:pkarw/consent-tools#main",
233
+ "pkarw/consent-tools",
234
+ "https://github.com/pkarw/consent-tools.git#release",
235
+ "ssh://git@github.com/pkarw/consent-tools.git#main",
236
+ "git@github.com:pkarw/consent-tools.git",
237
+ "github:pkarw/installed-tools",
238
+ "npm:@open-mercato/core@preview"
239
+ ];
240
+ writeFile(
241
+ path.join(packageDir, "src", "modules", "test_package", "index.ts"),
242
+ `export const metadata = { id: 'test_package', requires: ${JSON.stringify(requirements)}, ejectable: true }
243
+ `
244
+ );
245
+ const entries = [
246
+ { id: "marketing_consents", from: "@app", locator: "github:pkarw/marketing-consents", packageName: "@pkarw/marketing_consents" },
247
+ { id: "npm_consents", from: "@app", locator: "npm:@pkarw/marketing_consents", packageName: "@pkarw/marketing_consents" },
248
+ { id: "npm_core", from: "@app", locator: "npm:@open-mercato/core", packageName: "@open-mercato/core" },
249
+ { id: "consent_helper", from: "@app", locator: "npm:consent-helper" },
250
+ { id: "consent_tools", from: "@app", locator: "github:pkarw/consent-tools" }
251
+ ];
252
+ for (const entry of entries) {
253
+ writeFile(
254
+ path.join(appDir, "src", "modules", entry.id, "index.ts"),
255
+ `export const metadata = { id: '${entry.id}' }
256
+ `
257
+ );
258
+ }
259
+ const corePackageDir = path.join(appDir, "vendor", "core");
260
+ writeFile(
261
+ path.join(corePackageDir, "package.json"),
262
+ JSON.stringify({ name: "@open-mercato/core", version: "0.4.7", type: "module", repository: { type: "git", url: "https://github.com/pkarw/installed-tools.git" } })
263
+ );
264
+ writeFile(
265
+ path.join(corePackageDir, "src", "modules", "repository_tools", "index.ts"),
266
+ "export const metadata = { id: 'repository_tools' }\n"
267
+ );
268
+ writeFile(
269
+ path.join(corePackageDir, "dist", "modules", "repository_tools", "index.js"),
270
+ "export const metadata = { id: 'repository_tools' }\n"
271
+ );
272
+ const enabledEntries = [...entries, { id: "repository_tools", from: "@open-mercato/core", locator: "github:pkarw/installed-tools" }];
273
+ writeFile(path.join(appDir, "src", "modules.ts"), `export const enabledModules = ${JSON.stringify(enabledEntries)}
274
+ `);
275
+ runCommand(yarnBinary(), ["install"], appDir);
276
+ runMercato(["module", "add", "npm:@open-mercato/test-package@file:./fixture-module-package"], appDir);
277
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package'");
278
+ } finally {
279
+ fs.rmSync(appDir, { recursive: true, force: true });
280
+ }
281
+ });
282
+ test("same-name modules from different origins do not satisfy canonical requirements", () => {
283
+ const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-wrong-origin-"));
284
+ try {
285
+ createStandaloneFixture(appDir);
286
+ const packageDir = path.join(appDir, "fixture-module-package");
287
+ fs.cpSync(fixtureModulePackage, packageDir, { recursive: true });
288
+ writeFile(
289
+ path.join(packageDir, "src", "modules", "test_package", "index.ts"),
290
+ "export const metadata = { id: 'test_package', requires: ['@pkarw/marketing_consents', 'github:pkarw/consent-tools'], ejectable: true }\n"
291
+ );
292
+ const modulesSource = `export const enabledModules = [
293
+ { id: 'marketing_consents', from: '@app', locator: 'npm:@open-mercato/marketing_consents' },
294
+ { id: 'consent_tools', from: '@app', locator: 'github:another-owner/consent-tools' },
295
+ ]
296
+ `;
297
+ writeFile(path.join(appDir, "src", "modules.ts"), modulesSource);
298
+ runCommand(yarnBinary(), ["install"], appDir);
299
+ expect(() => runMercato(
300
+ ["module", "add", "@open-mercato/test-package@file:./fixture-module-package", "--eject"],
301
+ appDir
302
+ )).toThrow(/@pkarw\/marketing_consents[\s\S]*github:pkarw\/consent-tools[\s\S]*npx create-mercato-module install/);
303
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe(modulesSource);
304
+ expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package"))).toBe(false);
305
+ } finally {
306
+ fs.rmSync(appDir, { recursive: true, force: true });
307
+ }
308
+ });
309
+ test("module add rejects a same-ID source collision before ejecting", () => {
310
+ const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-module-collision-"));
311
+ try {
312
+ createStandaloneFixture(appDir);
313
+ const modulesSource = "export const enabledModules = [{ id: 'test_package', from: '@app', locator: 'github:another-owner/test-package' }]\n";
314
+ const localSource = "export const metadata = { id: 'test_package', locator: 'github:another-owner/test-package' }\n";
315
+ writeFile(path.join(appDir, "src", "modules.ts"), modulesSource);
316
+ writeFile(path.join(appDir, "src", "modules", "test_package", "index.ts"), localSource);
317
+ runCommand(yarnBinary(), ["install"], appDir);
318
+ expect(() => runMercato(
319
+ ["module", "add", `@open-mercato/test-package@file:${fixtureModulePackage}`, "--eject"],
320
+ appDir
321
+ )).toThrow(/(?=[\s\S]*test_package)(?=[\s\S]*(?:collision|already|conflict))(?=[\s\S]*another-owner)(?=[\s\S]*@open-mercato\/test-package)/i);
322
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe(modulesSource);
323
+ expect(readFile(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(localSource);
324
+ } finally {
325
+ fs.rmSync(appDir, { recursive: true, force: true });
326
+ }
327
+ });
328
+ test("GitHub locators detect a runtime ID collision before invoking Yarn", () => {
329
+ const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-github-collision-"));
330
+ try {
331
+ createStandaloneFixture(appDir);
332
+ const modulesSource = "export const enabledModules = [{ id: 'test_package', from: '@app', locator: 'github:other/test-package' }]\n";
333
+ writeFile(path.join(appDir, "src", "modules.ts"), modulesSource);
334
+ const originalManifest = readFile(path.join(appDir, "package.json"));
335
+ const executableDir = path.join(appDir, "bin");
336
+ const packageManifest = Buffer.from(JSON.stringify({ name: "@pkarw/test-package" })).toString("base64");
337
+ const ghPath = path.join(executableDir, "gh");
338
+ writeFile(ghPath, `#!/usr/bin/env node
339
+ const endpoint = process.argv[3]
340
+ const sha = 'a'.repeat(40)
341
+ const value = endpoint === 'user' ? { login: 'pkarw' }
342
+ : endpoint.includes('/commits/') ? { sha }
343
+ : endpoint.includes('/contents/') ? { encoding: 'base64', content: ${JSON.stringify(packageManifest)} }
344
+ : endpoint.includes('/git/trees/') ? { tree: [{ path: 'src/modules/test_package/index.ts' }] }
345
+ : { default_branch: 'main' }
346
+ process.stdout.write(JSON.stringify(value))
347
+ `);
348
+ const yarnPath = path.join(executableDir, "yarn");
349
+ const marker = path.join(appDir, "yarn-invoked");
350
+ writeFile(yarnPath, "#!/usr/bin/env node\nrequire('node:fs').writeFileSync(process.env.COLLISION_YARN_MARKER, 'invoked')\nprocess.exit(1)\n");
351
+ fs.chmodSync(ghPath, 493);
352
+ fs.chmodSync(yarnPath, 493);
353
+ for (const locator of ["github:pkarw/test-package", "https://github.com/pkarw/test-package.git", "git@github.com:pkarw/test-package.git", "github:test-package"]) {
354
+ expect(() => runCommand(process.execPath, [cliBin, "module", "add", locator, "--allow-third-party"], appDir, {
355
+ PATH: executableDir + path.delimiter + process.env.PATH,
356
+ COLLISION_YARN_MARKER: marker
357
+ })).toThrow(/Module name collision[\s\S]*test_package[\s\S]*github:other\/test-package[\s\S]*github:pkarw\/test-package/);
358
+ }
359
+ expect(fs.existsSync(marker)).toBe(false);
360
+ expect(readFile(path.join(appDir, "package.json"))).toBe(originalManifest);
361
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toBe(modulesSource);
362
+ expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package"))).toBe(false);
363
+ } finally {
364
+ fs.rmSync(appDir, { recursive: true, force: true });
365
+ }
366
+ });
183
367
  test("module enable supports package-backed and ejected flows plus both eject entrypoints", () => {
184
368
  const appDir = fs.mkdtempSync(path.join(os.tmpdir(), "mercato-cli-standalone-eject-"));
185
369
  try {
@@ -192,22 +376,26 @@ test.describe("TC-INT-007: CLI official module install and eject flows", () => {
192
376
  );
193
377
  runMercato(["module", "enable", "@open-mercato/test-package"], appDir);
194
378
  expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain(
195
- "{ id: 'test_package', from: '@open-mercato/test-package' }"
379
+ "id: 'test_package', from: '@open-mercato/test-package'"
196
380
  );
197
381
  writeFile(path.join(appDir, "src", "modules.ts"), "export const enabledModules = []\n");
198
382
  fs.rmSync(path.join(appDir, "src", "modules", "test_package"), { recursive: true, force: true });
199
383
  runMercato(["module", "enable", "@open-mercato/test-package", "--eject"], appDir);
200
- expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("{ id: 'test_package', from: '@app' }");
384
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package', from: '@app'");
201
385
  expect(fs.existsSync(path.join(appDir, "src", "modules", "test_package", "index.ts"))).toBe(true);
202
386
  expect(readFile(path.join(appDir, ".mercato", "generated", "module-package-sources.css"))).toBe("");
203
387
  writeFile(path.join(appDir, "src", "modules.ts"), "export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\n");
204
388
  fs.rmSync(path.join(appDir, "src", "modules", "test_package"), { recursive: true, force: true });
205
389
  runMercato(["module", "eject", "test_package"], appDir);
206
- expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("{ id: 'test_package', from: '@app' }");
390
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("packageName: '@open-mercato/test-package'");
391
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).not.toContain("locator: 'npm:@open-mercato/test-package'");
392
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package', from: '@app'");
207
393
  writeFile(path.join(appDir, "src", "modules.ts"), "export const enabledModules = [{ id: 'test_package', from: '@open-mercato/test-package' }]\n");
208
394
  fs.rmSync(path.join(appDir, "src", "modules", "test_package"), { recursive: true, force: true });
209
395
  runMercato(["eject", "test_package"], appDir);
210
- expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("{ id: 'test_package', from: '@app' }");
396
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("packageName: '@open-mercato/test-package'");
397
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).not.toContain("locator: 'npm:@open-mercato/test-package'");
398
+ expect(readFile(path.join(appDir, "src", "modules.ts"))).toContain("id: 'test_package', from: '@app'");
211
399
  } finally {
212
400
  fs.rmSync(appDir, { recursive: true, force: true });
213
401
  }