@xgent-ai/skills 0.7.4 → 0.7.6

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 (717) hide show
  1. package/.claude/hooks/xgent-statusline.js +32 -18
  2. package/README.md +65 -37
  3. package/bin/phoenix-diagram.js +14 -0
  4. package/bin/xgent-skills.js +259 -243
  5. package/dist/phoenix-diagram/LICENSE +21 -0
  6. package/dist/phoenix-diagram/NOTICE.md +34 -0
  7. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/005fc765ddc5115da796cca915baa9557abae13ff35e0a47c47affc56f6c414d.txt +272 -0
  8. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/010492e490b92ec85db01daad2a290ea5959f29314a1c4ff25e7a172e223abf9.txt +18 -0
  9. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f.txt +3 -0
  10. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a.txt +201 -0
  11. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/02bb8c3b4e70190e3986c0404ad2fd8d639b4f534252d82379cc1b502b6d1812.txt +191 -0
  12. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb.txt +25 -0
  13. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0552c898248eadfc130df0c0e8f6f82776fcb3f1dd5a5af2fa991b5baff9367a.txt +21 -0
  14. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0ab4d106b6faac07fb6a051815fd1b4d862d730895e2d7d7358c2f13565e7a38.txt +20 -0
  15. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9.txt +25 -0
  16. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0d3f7c086c6b6cf3ea4aac714e9aa3e1fb02e355ce35bd21c56acf8d04390885.txt +21 -0
  17. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7.txt +21 -0
  18. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f.txt +21 -0
  19. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/117829c3ca21efb132d81a44b55363d395ab8eea18526873bc828da4c0e5f038.txt +21 -0
  20. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e.txt +25 -0
  21. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df.txt +26 -0
  22. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5.txt +373 -0
  23. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/1f485f0d6125658861351e3d6084ea90fefe78f89450be9915044b7c56d5a75a.txt +15 -0
  24. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b.txt +26 -0
  25. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e.txt +25 -0
  26. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/20fe7b00e904ed690e3b9fd6073784d3fc428141dbd10b81c01fd143d0797f58.txt +176 -0
  27. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/219920e865eee70b7dcfc948a86b099e7f4fe2de01bcca2ca9a20c0a033f2b59.txt +7 -0
  28. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d.txt +7 -0
  29. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3.txt +23 -0
  30. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5.txt +220 -0
  31. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/27995d58ad5c1145c1a8cd86244ce844886958a35eb2b78c6b772748669999ac.txt +25 -0
  32. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/28a9529c7d0bb4dc51f4bf5c116a3d16ef247a052f7591466768ddf563fd1cf5.txt +428 -0
  33. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4.txt +26 -0
  34. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/30fefc3a7d6a0041541858293bcbea2dde4caa4c0a5802f996a7f7e8c0085652.txt +23 -0
  35. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3521672491a3479422d5fe1aca6645dd2984090f85da6e5205abfb18fb7a6897.txt +25 -0
  36. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab.txt +176 -0
  37. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/36516aefdc84c5d5a1e7485425913a22dbda69eb1930c5e84d6ae4972b5194b9.txt +23 -0
  38. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/375bdbf54d6584debb4bcc5bce1c9dcfdd581f977c9a8469113dbdf208f4c927.txt +131 -0
  39. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397.txt +25 -0
  40. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/391a5396cec6230bfabd4ef4eb2350eb895bc5efce377a2218f5702ed020d3e3.txt +20 -0
  41. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/39712155836e5c10ef1b07037b606e4ad2d633e72205d162fdd7e2290aa54f15.txt +21 -0
  42. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3bb1e548250b3acc43febde65a5cdba9f2e0a3288018aa41f009a3c59ffab51a.txt +390 -0
  43. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3bc70e239e91272782006c638fc0452a714d384224f11f0923036b7be07cf9b5.txt +21 -0
  44. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3f3d9e0024b1921b067d6f7f88deb4a60cbe7a78e76c64e3f1d7fc3b779b9d04.txt +373 -0
  45. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3f941b3b89cf7b8370ceb83cc76d2120d471b58735d8ca60238a751a48d7f72f.txt +359 -0
  46. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c.txt +25 -0
  47. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737.txt +26 -0
  48. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/4455bf75a91154108304cb283e0fea9948c14f13e20d60887cf2552449dea3b1.txt +21 -0
  49. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/451167c55c0fa447cc2d5632714f5e3c567fe4f1e1badefab2c1333852198aca.txt +542 -0
  50. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42.txt +25 -0
  51. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/45fd05c4865e7c350b98ad7ac50e1b15462d49af4a91e9b0c9dd933dc9a69742.txt +201 -0
  52. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/4789210f4df8abc03fce1cddd9c2ba517f184840687f2815d741de282c1aa93a.txt +228 -0
  53. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f.txt +25 -0
  54. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406.txt +201 -0
  55. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/553fffcd9b1cb158bc3e9edc35da85ca5c3b3d7d2e61c883ebcfa8a65814b583.txt +13 -0
  56. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/5757a1f28eff735a8b5e7425478f367812d71e974530f5bedd01219480965f4a.txt +51 -0
  57. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a.txt +19 -0
  58. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/5e05b024f653a5ce199e77cbbbd42fb5553562ec714b819421ed0c3e552a75d7.txt +25 -0
  59. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/60a7062291b01ba068f300612cdbdc20382ac1d4934f07bcdd7167c15299f309.txt +25 -0
  60. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3.txt +25 -0
  61. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a.txt +176 -0
  62. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb.txt +25 -0
  63. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee.txt +25 -0
  64. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51.txt +187 -0
  65. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c.txt +25 -0
  66. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/71674605ec4c087fe9eb534e3e4f9e26eb2e4aabcd76a29fd156c6a844d44b3d.txt +21 -0
  67. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349.txt +25 -0
  68. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7abd9b6960dcf7d4d0a48606a5b71bfe37d472db68d70637f3a58a56785f1621.txt +13 -0
  69. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0.txt +25 -0
  70. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7ca6700600dfa9c9497bf5556365067daa802c871ea78239f129309c7a2048f7.txt +21 -0
  71. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4.txt +15 -0
  72. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c.txt +24 -0
  73. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7e5886959f67f8c75063a9d55cd3cb08c5a8cbea9a944fa1df2d4ae038f53721.txt +21 -0
  74. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7fea0ee51a4ca5d5cea7464135fd55e8b09caf3a61da3d451ac8a22af95c033f.txt +20 -0
  75. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90.txt +201 -0
  76. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32.txt +24 -0
  77. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/86dd7f026f916daf7511e39951ad8ea8cf55a8db67ae64060dacf829761c18f3.txt +25 -0
  78. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8a35369f3ca263b3c62fbb5032947e53b6bfebc6c8a4d1bb982de1c069f6fba5.txt +21 -0
  79. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8b43ce8accd61e9d370b5ca9e9c4f953279b5c239926c62315b40e24df51b726.txt +25 -0
  80. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8bb1b50b0e5c9399ae33bd35fab2769010fa6c14e8860c729a52295d84896b7a.txt +201 -0
  81. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8bce3b45e49ecd1461f223b46de133d8f62cd39f745cfdaf81bee554b908bd42.txt +21 -0
  82. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8c7516d4b27b1e495be5e38b612298b63de48d05f49cdac94f70f3cd70f8864b.txt +25 -0
  83. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9046848b63a5c92bff14e4accca80bd987e0623b74adf9226ce5198d312b79d5.txt +30 -0
  84. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5.txt +12 -0
  85. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9117d922e667125508dde62b02c1f57ed22f5ad21eb536aa2e2d99e1c796e639.txt +25 -0
  86. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9387c2d197e2370a740ca457dae1662c56de56b811ee4862024343961307f9bf.txt +19 -0
  87. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/946c9835d8034d24404f8cfec5f4654cee5dad17e944afc3d06d742cf2882831.txt +240 -0
  88. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/95bd3988beee069fa2848f648dab43cc6e0b2add2ad6bcb17360caf749802bcc.txt +176 -0
  89. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411.txt +396 -0
  90. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3.txt +202 -0
  91. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9e0dfd2dd4173a530e238cb6adb37aa78c34c6bc7444e0e10c1ab5d8881f63ba.txt +25 -0
  92. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9f2ae19ef94ba82887729a4a1617ff25eede56611dd21a4b2c6f797df30fca33.txt +2013 -0
  93. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9fa38f610a00115dd1f612bdd3559e3b381ea579538b6ff25a5899da250a5fce.txt +21 -0
  94. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a00511478c83ebb464ef19d840f061c7444adc4636bb561900e75c5808cfc6cc.txt +21 -0
  95. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499.txt +121 -0
  96. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a5dea80c1f383cb5f80a6bb0da5e55a2beb9f24adb123ce6300af2cbaaa3bf65.txt +19 -0
  97. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2.txt +201 -0
  98. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f.txt +21 -0
  99. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5.txt +201 -0
  100. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf.txt +201 -0
  101. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ae9baa7beea910273c2f384c2a6b721fb7bd02bda3436074a1072e4ee689f985.txt +25 -0
  102. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b1181a40b2a7b25cf66fd01481713bc1005df082c53ef73e851e55071b102744.txt +19 -0
  103. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5.txt +25 -0
  104. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b3d734001a94efff3579978d953391aa7115f877657d25eb54037a43875d078a.txt +9 -0
  105. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1.txt +201 -0
  106. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1.txt +27 -0
  107. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b68ad1a3367b825447089e1f8d6829b97f47a89eb78d2f4ebaef4672f5606186.txt +22 -0
  108. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b7e650f3fce5c53249d1cdc608b54df156a97edd636cf9d23498d0cfe7aec63e.txt +19 -0
  109. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c09aae9d3c77b531f56351a9947bc7446511d6b025b3255312d3e3442a9a7583.txt +21 -0
  110. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b.txt +201 -0
  111. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383.txt +21 -0
  112. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c30152c94a6d75e021adbc52b3a52470366a46edb917e17deae3259251af244c.txt +42 -0
  113. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c394e3bda1f3b9378f30a7cab11242887eeeafc73c7bef36a0fe13e09691e18b.txt +17 -0
  114. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4.txt +201 -0
  115. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c962ee4d1d05ddc138b202b2540219ebc57893fcf97b364852094a9a94ce1365.txt +7 -0
  116. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5.txt +25 -0
  117. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30.txt +202 -0
  118. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/d1fc1bc0d155df60b2e7705b6b2ae02a05c96f948e1cec6e2fb86360b09f346b.txt +29 -0
  119. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/d5c22aa3118d240e877ad41c5d9fa232f9c77d757d4aac0c2f943afc0a95e0ef.txt +25 -0
  120. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/d5fca2653c88ad02d197faead77e22b80c70636b5bec6e02f2805f389a21b86d.txt +10 -0
  121. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a.txt +1 -0
  122. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/dc91f8200e4b2a1f9261035d4c18c33c246911a6c0f7b543d75347e61b249cff.txt +25 -0
  123. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ddea4e94a1c35ed9826e54e13a5b50b8f81b21665a00ca07c8861f1859e56b6b.txt +14 -0
  124. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/e271993808fec50ab29350b39539cdec611a9103f827e0aa26d61da70e2d33f8.txt +61 -0
  125. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/e66c269d4819aaab34b49ef5220c4ddab6756f21bb5180761a4eb8561f2b7bbd.txt +438 -0
  126. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055.txt +25 -0
  127. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829.txt +22 -0
  128. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f025ccfb7dfb6bdfedc75ca0f67acc69e6fb4998143d834f7c2f38a29989680f.txt +13 -0
  129. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2.txt +46 -0
  130. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7.txt +25 -0
  131. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f7715d38a3fa1b4ac97c5729740752505a39cb92ee83ab5b102aeb5eaa7cdea4.txt +25 -0
  132. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1.txt +39 -0
  133. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f9c4c77baa3828004ee54b8a4f2db2e88ed44a6237a493965bf551fac0fcb62d.txt +17 -0
  134. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85.txt +373 -0
  135. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7.txt +25 -0
  136. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2.txt +25 -0
  137. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ff92bed461f50338dd703a9ba9aee496a425957873df1d91192776e4bdf5dda7.txt +74 -0
  138. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/COPYRIGHT-library.html +29357 -0
  139. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/Apache-2.0.txt +73 -0
  140. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/BSD-2-Clause.txt +9 -0
  141. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/CC-BY-SA-4.0.txt +427 -0
  142. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/GCC-exception-3.1.txt +30 -0
  143. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/GPL-2.0-only.txt +133 -0
  144. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/GPL-3.0-or-later.txt +202 -0
  145. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/ISC.txt +7 -0
  146. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/LLVM-exception.txt +15 -0
  147. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/MIT.txt +9 -0
  148. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/NCSA.txt +29 -0
  149. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/OFL-1.1.txt +43 -0
  150. package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/Unicode-3.0.txt +39 -0
  151. package/dist/phoenix-diagram/THIRD-PARTY-NOTICES.md +210 -0
  152. package/dist/phoenix-diagram/THIRD-PARTY.json +5459 -0
  153. package/dist/phoenix-diagram/VERSION.json +39 -0
  154. package/dist/phoenix-diagram/bundle/ENGINE.json +39 -0
  155. package/dist/phoenix-diagram/bundle/SKILL.md +109 -0
  156. package/dist/phoenix-diagram/bundle/examples/minimal.architecture.json +11 -0
  157. package/dist/phoenix-diagram/bundle/examples/minimal.class.json +23 -0
  158. package/dist/phoenix-diagram/bundle/examples/minimal.dataflow.json +11 -0
  159. package/dist/phoenix-diagram/bundle/examples/minimal.erd.json +25 -0
  160. package/dist/phoenix-diagram/bundle/examples/minimal.lifecycle.json +11 -0
  161. package/dist/phoenix-diagram/bundle/examples/minimal.sequence.json +13 -0
  162. package/dist/phoenix-diagram/bundle/examples/minimal.timeline.json +15 -0
  163. package/dist/phoenix-diagram/bundle/examples/minimal.tree.json +13 -0
  164. package/dist/phoenix-diagram/bundle/examples/minimal.waterfall.json +12 -0
  165. package/dist/phoenix-diagram/bundle/examples/minimal.workflow.json +12 -0
  166. package/dist/phoenix-diagram/bundle/manifest.json +253 -0
  167. package/dist/phoenix-diagram/bundle/references/architecture-compare.md +111 -0
  168. package/dist/phoenix-diagram/bundle/references/authoring-defaults.md +42 -0
  169. package/dist/phoenix-diagram/bundle/references/brand-marks.md +52 -0
  170. package/dist/phoenix-diagram/bundle/references/compatibility.md +22 -0
  171. package/dist/phoenix-diagram/bundle/references/delivery-contract.md +127 -0
  172. package/dist/phoenix-diagram/bundle/references/extending-types.md +14 -0
  173. package/dist/phoenix-diagram/bundle/references/migration.md +57 -0
  174. package/dist/phoenix-diagram/bundle/references/preview.md +45 -0
  175. package/dist/phoenix-diagram/bundle/references/repository-authoring.md +29 -0
  176. package/dist/phoenix-diagram/bundle/references/viewer-runtime.md +27 -0
  177. package/dist/phoenix-diagram/bundle/schemas/README.md +23 -0
  178. package/dist/phoenix-diagram/bundle/schemas/architecture.schema.json +329 -0
  179. package/dist/phoenix-diagram/bundle/schemas/class.schema.json +348 -0
  180. package/dist/phoenix-diagram/bundle/schemas/common.schema.json +358 -0
  181. package/{skills/archify → dist/phoenix-diagram/bundle}/schemas/dataflow.schema.json +36 -8
  182. package/dist/phoenix-diagram/bundle/schemas/erd.schema.json +384 -0
  183. package/dist/phoenix-diagram/bundle/schemas/lifecycle.schema.json +202 -0
  184. package/{skills/archify → dist/phoenix-diagram/bundle}/schemas/sequence.schema.json +41 -10
  185. package/dist/phoenix-diagram/bundle/schemas/timeline.schema.json +170 -0
  186. package/dist/phoenix-diagram/bundle/schemas/tree.schema.json +144 -0
  187. package/dist/phoenix-diagram/bundle/schemas/waterfall.schema.json +150 -0
  188. package/{skills/archify → dist/phoenix-diagram/bundle}/schemas/workflow.schema.json +42 -10
  189. package/dist/phoenix-diagram/bundle/scripts/phoenix-bootstrap.cjs +589 -0
  190. package/dist/phoenix-diagram/bundle/scripts/phoenix-diagram +6 -0
  191. package/dist/phoenix-diagram/bundle/scripts/phoenix-launcher.cjs +10 -0
  192. package/dist/phoenix-ui/THIRD-PARTY.json +164 -158
  193. package/dist/phoenix-ui/VERSION.json +17 -17
  194. package/dist/phoenix-ui/bundle/blobs/00727f7b333a7be8ac7740aa257a3a3f691db8ae545a6afab2b787acab5e88df +46 -0
  195. package/dist/phoenix-ui/bundle/blobs/{8b1723fb51e6aad9bfc0bc5ba8e09b5a373b0e33c251331f6ca14ff6b1c261ef → 00f4a6a630f31eb05fbdd5725e4a294233d24574bd70f4f32f4597d8256a7c1c} +2 -5
  196. package/dist/phoenix-ui/bundle/blobs/{41400e182e2180a567923d58bfa935d2799a54f2a747b2c5813c3884c84f768b → 04057592e18ea9dd3c4edcac14cde3fa5b75239c2552d4459db8e047068f61a8} +6 -7
  197. package/dist/phoenix-ui/bundle/blobs/{34571f7d46632205d518d15cb008457494dfad745c6b483bb11d63ca3a22ac48 → 0cb3bf26e1980b0e530373fb32edbe5864a171492a04e2abe1952ffe78bff231} +6 -7
  198. package/dist/phoenix-ui/bundle/blobs/{3133bec6998506bf92baeeabba39438c5ee27aa3330c2e6245f9df216fbe7b2d → 0e684572eb98d24b39cd70fa23e66c163178f5a11756dcf8a98fe2335636b33f} +6 -3
  199. package/dist/phoenix-ui/bundle/blobs/{d17b3a454146e74ef4ecf69d7b72a8fa45c4fe1c695dffb0d36690b653cd2d8f → 10553c45c7bf38e527a57a281c4365152a768b4dd7ef597ff34ae841e9ff7d41} +6 -7
  200. package/dist/phoenix-ui/bundle/blobs/{b544da38492c15f5295053b64189a9ec5ebe446c77138ac52ca7bd9da9c0e842 → 125bc7030d7f2ba789d7b1d5f474af34f8902b764e7bc351b98f1f6f55779929} +6 -3
  201. package/dist/phoenix-ui/bundle/blobs/{74dbcbbad6c3831e95abb38775dd488c59ae9f1d44a95f5fd4bc0051577488fa → 13cf6c054ed424e2eb639ea12d20a4aa2b1c85eeb00afa8cbd8a30c6c22aadd8} +1 -1
  202. package/dist/phoenix-ui/bundle/blobs/1832ff9624cebd30370eb0e806665c656ac879215f93d33bcc0750baa47459dc +46 -0
  203. package/dist/phoenix-ui/bundle/blobs/{8e7de5ca347036a07f5f1e9cab942d8ff378d029bc101fa6d126406f3298c9db → 1864a10c29e7062cca5e49d1790dc7d9d8ea777bfa2ab6fd941635965cd0084d} +1 -1
  204. package/dist/phoenix-ui/bundle/blobs/{784722b72224a7005a80cdcd6408dd2b25b23fd9619d0f6c8788f7ac681fad4c → 1ecc81de39d28b85b95e797bcc338d4213a50231c3315a741d14571fd22c844f} +6 -7
  205. package/dist/phoenix-ui/bundle/blobs/{b8c614dc7c2eb30ee0f864fec116dbcafb39e5a199dce66d0c1a88b13f76265a → 2079e4146039a8dadf19a39237cbdc0b8b54ea1fa16d320716c2cbf58161c835} +1 -1
  206. package/dist/phoenix-ui/bundle/blobs/{dba6e4a09c5d752e5ddebe7c2c1aefc9c4b2a84e01a3178599579778ed2d09e9 → 2813aa68c0804a7fe061d88201d8a684cac9987b48511e1e2cbfe0a869a67a82} +6 -7
  207. package/dist/phoenix-ui/bundle/blobs/{2889c2817b5079abff254bb6d13f92dbde0fabc38be4acc7d20e613eef5e5829 → 2873e340be947c83c3d03520139b73524fd166a34063d2693d3b711021ea5b87} +6 -7
  208. package/dist/phoenix-ui/bundle/blobs/{64c4aa2d1c24ae5028e987498ac544020d48600a51d9654b2df562681ba480f2 → 298ef41899acefa056eccf2345378078832db6d868d2377f471f896d5c1599f9} +6 -14
  209. package/dist/phoenix-ui/bundle/blobs/{1b7174a6f3f49a8efc8f7fa74ff84cf8960e2646b9bc976e4129a7c8ad608faa → 2b5cef2a14a5b1256ec6de9172a4f57f227948ced1921ef86e899f48524d7fb8} +1 -1
  210. package/dist/phoenix-ui/bundle/blobs/{f148f630f43f3c91cf10feeda5a3c21448ca0683ce82d0fe763c1b43dee584d6 → 2d376cbbf7ec1e262614aac4f1b200e8f60e86e940c7137a2a26788bc857e509} +6 -7
  211. package/dist/phoenix-ui/bundle/blobs/2e5985a6eb339d70cfa25f6d2b420a0ef286caa8467f0226eb841702ec438d0b +46 -0
  212. package/dist/phoenix-ui/bundle/blobs/{7e199833376de5d2b6e088ee2965b448f94da842f28ccbd707e1cc3a295147c8 → 3322d691bf7b578b38723576df6b266993b2afb9e567b0cd1ded898ffe1dc17e} +1 -1
  213. package/dist/phoenix-ui/bundle/blobs/{6530364f99c98b9ae9a8f9f3d34866a6393a75e75db48d8c0cbb49dd93a69f81 → 3625c5c2750f117021232ce81c1e39ac5ef7c21445729327b88cf54dfc937df0} +6 -3
  214. package/dist/phoenix-ui/bundle/blobs/{335ccd78685b679dc0c880fc46139d0fa94aebcfa6e5ff848fd0599b187d25c4 → 36310febe3e7bd4c9b21407603f2a04afefdc87b7821758bb47098b1b2876765} +6 -3
  215. package/dist/phoenix-ui/bundle/blobs/{24d92a176573768bfffaf8f9c6483e58bceb5bf2a095d1cdf3d3a2c0bcda0707 → 3a9c2daf4ef284ca83b0e7f6fef3a5300e273c32b20769e090463cb8a8b0b06f} +1 -1
  216. package/dist/phoenix-ui/bundle/blobs/{153e377c44b162cf0074698a61716db7f664db78f5635efa926bed484de4f54c → 3ce1a44efe39b93e7a39307c6a5e5f514e938fbae818e358986b4db1b05883ca} +1 -1
  217. package/dist/phoenix-ui/bundle/blobs/{ad8ad0b7acf6c88ef9ce0ee1a640c2200da77821f0d97d605d4f1d4a10e5897a → 403fcde498d75abec7844ee31434201152ac229f7675772164d69563f0572da4} +1 -1
  218. package/dist/phoenix-ui/bundle/blobs/{e8ee6c08e94b80324173d89d6f4cdc5b4829ea6858b3a11fc186588a490cada4 → 45d0e7eff0923c40296e971318756617944c4f1c97f03126cd74c0f8c629f8a4} +3 -1
  219. package/dist/phoenix-ui/bundle/blobs/{e23dabf908842be08751fc4e7f3b586e8c6b1ca0fc30303ec5317c77f83dcf26 → 4c0f396bfa85171f61972d3f3765733318769bb53fe06d2cdcb5d7f64578b5b8} +1 -1
  220. package/dist/phoenix-ui/bundle/blobs/{a5517d32c1539c388c47c00879a0d807ed2989647bfa8c0844ef22328f75f5be → 4f6563876e0e0cc51c38a06767b8800eb3238611e9fdd11e5ff9dd487c742e74} +1 -1
  221. package/dist/phoenix-ui/bundle/blobs/{a9d2203acd45ca33a13d5c68b02b23ed512425ac15f0e8438318ed124b43729d → 4fcada229d0c689c1a493d13184145a81ff40c498e882142ae390bda8e5b2492} +15 -0
  222. package/dist/phoenix-ui/bundle/blobs/5293adc55cf66068b6df20468ad9e91433fd1c48e75d66c86f874aca951a8fb9 +46 -0
  223. package/dist/phoenix-ui/bundle/blobs/{96e2e6bd4fcf9a2c6da65fb029f96d9176308fae2efd9d8653d3b8d838960e07 → 5436f0301ec258f3badcc6842019ee29a9b870d2727dc425fbc9cc0f4f88a284} +3 -1
  224. package/dist/phoenix-ui/bundle/blobs/{d0f4939e86a62b0ca437d51a997ceba7e77d64566b7fa8ca2747487e31ca819d → 54a09a4afdffca3cc135e5007716ea684dc1ed7a78349de859225c55a2fed810} +6 -7
  225. package/dist/phoenix-ui/bundle/blobs/{d9f1d8e01b40a8d7310e367f7e3da7d1fac5850313082feb853093b7eb36d2bd → 55277fa15eb4bd2f09bf7bb24c4e79df417b06654b1e10f502c7928b192fd7cc} +6 -3
  226. package/dist/phoenix-ui/bundle/blobs/{3759780bd25526f7eaa3793c010356bccb850d40db931e0c6d47d35e81e96f96 → 567c3f42394f9aee9b048a001016a7ba9d8773d78027f8c995c379886634e719} +6 -3
  227. package/dist/phoenix-ui/bundle/blobs/57c8f33a7401f918566b8a4883871a69ef2223438c51f158c67f69e3250be465 +46 -0
  228. package/dist/phoenix-ui/bundle/blobs/{5f5fc6bb04605feb7ac6f6b19e35ff2f8d39e11a89fdd260159c6829f27b4a4d → 61450dbef64859e3136cd17ae3e997134d5df5721d96985c4e07367f38522129} +6 -3
  229. package/dist/phoenix-ui/bundle/blobs/{e3c1e925be0b2deb0e3765b83ab94b86560292364f275e98bb23a8bdf2c2e049 → 656bbfda3e72b40d53b5832293dc8700ad8a784e804a6246271bf0ea23527822} +1 -1
  230. package/dist/phoenix-ui/bundle/blobs/{b49cdd7f125d9cb5ce10de7d39c5e3daff7d6649b9ac1c5ffd36a0aebdc4e7ca → 68b454a99ba72c3b9b93ed96c4267847297169f6a5bf321b20e60d637c271068} +6 -3
  231. package/dist/phoenix-ui/bundle/blobs/68e44832c82b873b0aeb2da56def7b1de5f612c019445e5e28238c690124cbbe +46 -0
  232. package/dist/phoenix-ui/bundle/blobs/{ec8968ee6a8e42b952e5ece2369ba69f40185c62a135ed54e930df3170421d9c → 6b8d4c71355429a0b16bf367163fea46103a0a99b4e34f87608a39d85b1b980a} +6 -3
  233. package/dist/phoenix-ui/bundle/blobs/{264815d0080e4862715a4f82542e66241c6563f07259d32aed4a17bbc329b9cc → 6cef874722442de7c60ea96f4221dc54cc4250a270cd05a1e818b58c5b43e232} +6 -7
  234. package/dist/phoenix-ui/bundle/blobs/{2028a857c0476324a4256faf66693e2a869275e53a88d2b182a28b62c2a17893 → 7181f1f4c452c4345695f9100f6deb610f54f4c55f126043433a65b8491fc680} +6 -7
  235. package/dist/phoenix-ui/bundle/blobs/{ccb76aabba47938d518a5d46a09d7e70c4a9222bc391e163763f2a7f12d30437 → 75850a8c9d2a8259f71ef1f86dd5d1325415227c1887e81a3467ae1ee400979f} +1 -1
  236. package/dist/phoenix-ui/bundle/blobs/{4b03cdb5b17d534b5c7e84b079c066f59e8b60b9e454671a453867c4aeb9920d → 77bcc6c2d6ac00a8bfead3b6c6b5fc69f4b60bf086ebbc89271e1b23003168c9} +1 -1
  237. package/dist/phoenix-ui/bundle/blobs/{9520e25a381c82af6f46e175b7c347d1dc513d933dd6cf8c52570c72abb4ca7f → 792552563745d208594cf4ade19110f2c811a0e1a2661ae1ef43a185ccff5a69} +1 -1
  238. package/dist/phoenix-ui/bundle/blobs/{f7c8af35acf71a96056afb6afcff6a3ea42f65561f02652d04e11ad9ece9b8e9 → 7acd9b6f2f61b509c6a518508b8b52c2f0de67cdea4fd3f3d383b3ce8b38cf5e} +6 -7
  239. package/dist/phoenix-ui/bundle/blobs/7bacc1e3da7e8b7127ca3f8f69a2422098b9b2d23fbedefc56dfe76117c1c0e3 +46 -0
  240. package/dist/phoenix-ui/bundle/blobs/{3077452231f1ce3c48ae5d8dd912b14ab30de55a270a031d07065357bc1cca94 → 8078b804bea630ed9c4ea07ec2f8ac92aba4128725860a66599eda90390d98f6} +6 -3
  241. package/dist/phoenix-ui/bundle/blobs/{99f49df49ade2ca21deffcc752fc8a76c9a6645f5416b9314ea3ab1bd010f34c → 88b150cb804bc141b80a5687a091f61b99627155c465a27adb88546ef615af92} +6 -3
  242. package/dist/phoenix-ui/bundle/blobs/{a64a45a4e082a0d05daf711080cb7c3195f15fb6b3f3dce0521f4816b64452f3 → 90f8b07ec12b78e633e306322cda58415aea70d8e0f9ff85bd439361c01dabe1} +6 -3
  243. package/dist/phoenix-ui/bundle/blobs/{486145071d3445e82774f1b39b2bb15986ce52277e798a31ef7e9c27afb42af3 → 95b2944686e8258a655c3b5e6db68593e24e5199354e46aac553918ea2c0f55a} +1 -1
  244. package/dist/phoenix-ui/bundle/blobs/{a1998e37084c11f496d4970f86a85d5a6375bbeaa4797b9f42bbac2d44048d23 → 979639f0e8859d600a8db57e733566d9ad37ff8258c3e05a6f9c0f3008e92373} +1 -1
  245. package/dist/phoenix-ui/bundle/blobs/{3173293607055ea6e1a153ec6f51fb8154782157c8a61abf411da1f41be61728 → 9eaaa00049844060f842fe7fb73cc8edc4be5225cf38a96f33bda3ffc381456c} +6 -7
  246. package/dist/phoenix-ui/bundle/blobs/{69086f7cb235b35ccc230e1f2da41cbb10cea8f0636b6d4514672113a3adc2cb → a420bbda622399399a6b5c7c3614dcaebc6c62faceaf7b3c83c97db53d26b165} +1 -1
  247. package/dist/phoenix-ui/bundle/blobs/a63054b8920905045753facece83f154bf806158c6f46ef380036e7a82d4fde5 +46 -0
  248. package/dist/phoenix-ui/bundle/blobs/{e802e4f7bdc89050a9c0f2ca506e1d493a2316e6e810c0336c57aa073717ef3e → a63788c764b0e4fdcbc029d46093016310edcbcf702d62688e5aaac7ddeee6fd} +3 -1
  249. package/dist/phoenix-ui/bundle/blobs/{827a211ea03d2cb44b4ea1bc81ba1a6dc51a87fa16d6692997c4e4751241c815 → acfc4c26b135d5b27fc0930738486c9d43d379704102fab45564320180942e4b} +4 -2
  250. package/dist/phoenix-ui/bundle/blobs/{8da14f3eabac53c990a66e721387367b46cb676cc4204e8c67d6f88c95a6217f → ad243ca615349127aa422bccc1a6604ad17149735659087ca5bab3c5fae97f4e} +6 -7
  251. package/dist/phoenix-ui/bundle/blobs/b63931066e2b2623d012e1a3c1a0769cc43ed6640460c3899669b45539d6a20d +46 -0
  252. package/dist/phoenix-ui/bundle/blobs/{bb65af58ecc3e0c0093dc9a705a7ab643035e4e592c3adb93583c82d1aef1f51 → bde793ab5ad776f7e6f6d25ce2b838c1b5022054a1dad5502a873423eb0ad917} +6 -7
  253. package/dist/phoenix-ui/bundle/blobs/{48b7e6acf597d4f0320834db1393003451d1bd7c0d024dd62f7577a398b2e320 → c0a70ab2889e5c16e1f09249aefad948ce352c42cfe2b5afb758a4524e1b21b6} +6 -3
  254. package/dist/phoenix-ui/bundle/blobs/{60b2914df394800688c4e20f4eb34e117cd430df9954cf4d48574734507723f4 → c9ee9006ae6c0194a5d39a9f0cb275c52d74a71ea3f6dc2b4c1c7bd89f48a2c0} +1 -1
  255. package/dist/phoenix-ui/bundle/blobs/{d21ccafc83495872c80ec9873ad4fbfb4223837a747b524aa03b6d819f7c08e3 → cadc2daefcf238aab981fa56388381d3d5ab9c0686bb9dd8187035c9933dfcee} +6 -3
  256. package/dist/phoenix-ui/bundle/blobs/{d7b744fcc95164d96d9f811a93e2e8a374887146eb762ef775f3d3c7f27abc8d → cbea5728b90f58ff047be6ec4f14eed9d63c7148f5db99b5f147d2f17b472317} +1 -1
  257. package/dist/phoenix-ui/bundle/blobs/d408a4fea71b656aa8a5f6b5c037815a6e4229df336629ebddf4b5c85ed82fac +46 -0
  258. package/dist/phoenix-ui/bundle/blobs/{6ff950a5729ad9ea480ddf8c1b489b1c84189bbf7d6034b3b5a98e7c11a28cec → d9ae0c782d8a77787561536c0d7bc3b61175d59303f3cb8c20796f85140c6984} +1 -1
  259. package/dist/phoenix-ui/bundle/blobs/{1d53e2226465b1047faec7cda2e743e61540ea69e073a3a4057e8d86b277405f → e2932d63eb7f52a82960a19ba79bc800ef4f212164e098f96dee7a4326302f38} +1 -1
  260. package/dist/phoenix-ui/bundle/blobs/{fa576f6655b235bdea535198647305b7a3855e810180cbdf5d4c246c03c7d190 → e381bcfec42ac541d574011460600cf0818aa0e3362e8c6d205b4157890bf821} +6 -7
  261. package/dist/phoenix-ui/bundle/blobs/{8fbce5b4859e6011afa83b1c07c4436589cd7181f9cb997538f4c27f196d0d34 → e415657d8725d9b60ece42cc18581da177c42fc47cb11e501db722a5f524ecf7} +6 -7
  262. package/dist/phoenix-ui/bundle/blobs/{1ba392d45294b3e90cc7f3964f134ae685118bbbcc84ca944953a4270ec67a54 → e46d63e5f8a6ead1d44c8b6302a0c7247af8585b975ab5715518381777622ede} +6 -3
  263. package/dist/phoenix-ui/bundle/blobs/ee63b3f9b354d69443d05ea4a338af56546897335ace7533546e10be56ea2207 +46 -0
  264. package/dist/phoenix-ui/bundle/blobs/{c23617601e9c4d97b775c175a5ce1642c40459b157d0821609fe1d253b83ced8 → ef7d57633252f4604749447608850e299c277f7dd1a32776685df0724b1051c8} +6 -7
  265. package/dist/phoenix-ui/bundle/blobs/{0581c8428246f43c5374393878a29e38f2b1865df87e6f13f2309b8eae54e76f → f0652c6ce41e6949133360178f192ea4ee9f6129a018c7a8b6652870c2330392} +1 -1
  266. package/dist/phoenix-ui/bundle/blobs/{cfac9eaf96481a8874391e5cecc6149abea1f1f19622f77f1ebb9e1876720e91 → f06c9d797ca2ac8c6a49d3dcd2e99d1b4df8bc9637a49c7e80f3161f49d06b1b} +4 -2
  267. package/dist/phoenix-ui/bundle/blobs/{882bfe4d8ffd9bc217b0c1bdd5e3cf659cd4b46598d631c4649aaaf0e13333ce → f077545caeb3ecb9f51a3f703a09736ca924869f4b4345c1b1ffbd9bf927a287} +6 -3
  268. package/dist/phoenix-ui/bundle/blobs/f781c5874bcd79ebe1b3b012275b9af7eae6c4867e9a16e29bb3d3ed3dc1940b +46 -0
  269. package/dist/phoenix-ui/bundle/blobs/fa10c0c926997387c89b7c1070e25b1b2b53ee891741e3c450a89ec6c6dcaf7d +46 -0
  270. package/dist/phoenix-ui/bundle/blobs/fb1a36ab7116b0c6709b89720cdded29d80982114c2f87cad614e01e126270dd +46 -0
  271. package/dist/phoenix-ui/bundle/blobs/fbd3214fc12ba70d9c69a995742ba73dc5365823af63afdc93c0c8a8f0c484af +46 -0
  272. package/dist/phoenix-ui/bundle/blobs/{77682e9d63b484f94a699f2c0b393e4540797d311362c384a3d643aec11d6985 → fea19b8381ec10ff8ed1923a336332974bbb552227ed215e7ddaaf0ec0112c1d} +1 -1
  273. package/dist/phoenix-ui/bundle/manifest.json +126 -126
  274. package/docs/phoenix-diagram.md +173 -0
  275. package/docs/phoenix-ui.md +57 -16
  276. package/package.json +14 -10
  277. package/skills/agi-mode/SKILL.md +3 -1
  278. package/skills/agi-mode/assets/sdlc/event.md +4 -5
  279. package/skills/agi-mode/assets/sdlc/object-status.md +1 -1
  280. package/skills/agi-mode/assets/sdlc/protocol.md +4 -2
  281. package/skills/agi-mode/evals/scenarios.md +108 -3
  282. package/skills/agi-mode/playbooks/authoring-a-skill.md +13 -2
  283. package/skills/agi-mode/playbooks/eval.md +19 -3
  284. package/skills/agi-mode/playbooks/hillclimb.md +4 -2
  285. package/skills/agi-mode/playbooks/reflection.md +1 -1
  286. package/skills/agi-mode/playbooks/sdlc.md +10 -6
  287. package/skills/agi-mode/playbooks/what-next.md +6 -2
  288. package/skills/agi-mode/references/eval-protocol.md +13 -4
  289. package/skills/agi-mode/references/interface-design.md +1 -0
  290. package/skills/agi-mode/references/remote-evolution.md +178 -0
  291. package/skills/agi-mode/references/skill-evolution.md +2 -0
  292. package/skills/agi-mode/scripts/evolution/compare.py +569 -0
  293. package/skills/agi-mode/scripts/evolution/evolution.py +2886 -0
  294. package/skills/agi-mode/scripts/evolution/examples/public-smoke.json +128 -0
  295. package/skills/agi-mode/scripts/evolution/examples/quality-calibration.json +128 -0
  296. package/skills/agi-mode/scripts/evolution/examples/quality-rubric.json +133 -0
  297. package/skills/agi-mode/scripts/evolution/protocol.py +1586 -0
  298. package/skills/agi-mode/scripts/evolution/pyproject.toml +16 -0
  299. package/skills/agi-mode/scripts/evolution/quality.py +689 -0
  300. package/skills/agi-mode/scripts/evolution/remote.py +2303 -0
  301. package/skills/agi-mode/scripts/evolution/tests/support.py +201 -0
  302. package/skills/agi-mode/scripts/evolution/tests/test_apply.py +643 -0
  303. package/skills/agi-mode/scripts/evolution/tests/test_bounded_exploration.py +236 -0
  304. package/skills/agi-mode/scripts/evolution/tests/test_bundles.py +414 -0
  305. package/skills/agi-mode/scripts/evolution/tests/test_calibration.py +460 -0
  306. package/skills/agi-mode/scripts/evolution/tests/test_compare.py +377 -0
  307. package/skills/agi-mode/scripts/evolution/tests/test_protocol.py +357 -0
  308. package/skills/agi-mode/scripts/evolution/tests/test_quality.py +647 -0
  309. package/skills/agi-mode/scripts/evolution/tests/test_remote.py +857 -0
  310. package/skills/agi-mode/scripts/evolution/tests/test_search.py +1109 -0
  311. package/skills/agi-mode/scripts/evolution/tests/test_typesafe.py +624 -0
  312. package/skills/agi-mode/scripts/evolution/tests/test_verifier_context.py +132 -0
  313. package/skills/agi-mode/scripts/evolution/typesafe_worker.py +145 -0
  314. package/skills/agi-mode/scripts/evolution/uv.lock +2548 -0
  315. package/skills/apply-code-review/SKILL.md +1 -0
  316. package/skills/apply-code-review/agents/openai.yaml +2 -0
  317. package/skills/apply-doc-review/SKILL.md +1 -0
  318. package/skills/apply-doc-review/agents/openai.yaml +2 -0
  319. package/skills/apply-ui-review/SKILL.md +1 -0
  320. package/skills/apply-ui-review/agents/openai.yaml +2 -0
  321. package/skills/autoresearch/SKILL.md +1 -0
  322. package/skills/clean-artifacts/SKILL.md +52 -0
  323. package/skills/clean-artifacts/agents/openai.yaml +4 -0
  324. package/skills/clean-artifacts/evals/scenarios.md +13 -0
  325. package/skills/clean-artifacts/references/history-cleanup.md +41 -0
  326. package/skills/crd/SKILL.md +100 -65
  327. package/skills/crd/assets/cr-template.md +15 -0
  328. package/skills/crd-respond/SKILL.md +17 -5
  329. package/skills/crd-respond/agents/openai.yaml +2 -2
  330. package/skills/crd-respond/assets/response-template.md +7 -0
  331. package/skills/crd-respond/evals/scenarios.md +7 -0
  332. package/skills/create-verification-skill/SKILL.md +1 -0
  333. package/skills/debugging/SKILL.md +1 -0
  334. package/skills/design-md/SKILL.md +1 -0
  335. package/skills/design-reference/SKILL.md +6 -2
  336. package/skills/design-reference/evals/scenarios.md +4 -0
  337. package/skills/dev-plan/SKILL.md +11 -6
  338. package/skills/dev-plan/references/execution-workflow.md +1 -1
  339. package/skills/dev-plan/references/plan-skeleton.md +234 -69
  340. package/skills/dev-plan/scripts/check_plan.py +1 -1
  341. package/skills/documentation-writer/SKILL.md +19 -14
  342. package/skills/documentation-writer/references/architecture.md +6 -2
  343. package/skills/documentation-writer/references/user-manual.md +2 -2
  344. package/skills/elintp/SKILL.md +12 -6
  345. package/skills/experience-capture/SKILL.md +1 -0
  346. package/skills/gdpr-compliant/SKILL.md +1 -0
  347. package/skills/kpi-dashboard-design/SKILL.md +1 -0
  348. package/skills/landing-page-conversion-audit/SKILL.md +1 -0
  349. package/skills/mcp-release-qa/SKILL.md +2 -1
  350. package/skills/meeting-minutes/SKILL.md +1 -0
  351. package/skills/optimize-agents-md/SKILL.md +128 -0
  352. package/skills/optimize-agents-md/assets/coding-principles.md +118 -0
  353. package/skills/phoenix-diagram/ENGINE.json +39 -0
  354. package/skills/phoenix-diagram/SKILL.md +109 -0
  355. package/skills/phoenix-diagram/examples/legacy.agent-tool-call.workflow.json +94 -0
  356. package/skills/phoenix-diagram/examples/legacy.async-job-roundtrip.sequence.json +61 -0
  357. package/skills/phoenix-diagram/examples/legacy.deployment-release.lifecycle.json +49 -0
  358. package/skills/phoenix-diagram/examples/legacy.product-analytics.dataflow.json +76 -0
  359. package/skills/{archify/test/fixtures/v1-baseline/web-app.architecture.json → phoenix-diagram/examples/legacy.web-app.architecture.json} +16 -11
  360. package/skills/phoenix-diagram/examples/minimal.architecture.json +11 -0
  361. package/skills/phoenix-diagram/examples/minimal.class.json +23 -0
  362. package/skills/phoenix-diagram/examples/minimal.dataflow.json +11 -0
  363. package/skills/phoenix-diagram/examples/minimal.erd.json +25 -0
  364. package/skills/phoenix-diagram/examples/minimal.lifecycle.json +11 -0
  365. package/skills/phoenix-diagram/examples/minimal.sequence.json +13 -0
  366. package/skills/phoenix-diagram/examples/minimal.timeline.json +15 -0
  367. package/skills/phoenix-diagram/examples/minimal.tree.json +13 -0
  368. package/skills/phoenix-diagram/examples/minimal.waterfall.json +12 -0
  369. package/skills/phoenix-diagram/examples/minimal.workflow.json +12 -0
  370. package/skills/phoenix-diagram/references/architecture-compare.md +111 -0
  371. package/skills/phoenix-diagram/references/authoring-defaults.md +42 -0
  372. package/skills/phoenix-diagram/references/brand-marks.md +52 -0
  373. package/skills/phoenix-diagram/references/compatibility.md +22 -0
  374. package/skills/phoenix-diagram/references/delivery-contract.md +127 -0
  375. package/skills/phoenix-diagram/references/extending-types.md +14 -0
  376. package/skills/phoenix-diagram/references/migration.md +57 -0
  377. package/skills/phoenix-diagram/references/preview.md +45 -0
  378. package/skills/phoenix-diagram/references/repository-authoring.md +29 -0
  379. package/skills/phoenix-diagram/references/viewer-runtime.md +27 -0
  380. package/skills/phoenix-diagram/schemas/README.md +23 -0
  381. package/skills/phoenix-diagram/schemas/architecture.schema.json +329 -0
  382. package/skills/phoenix-diagram/schemas/class.schema.json +348 -0
  383. package/skills/phoenix-diagram/schemas/common.schema.json +358 -0
  384. package/skills/{archify/schemas/lifecycle.schema.json → phoenix-diagram/schemas/dataflow.schema.json} +63 -58
  385. package/skills/phoenix-diagram/schemas/erd.schema.json +384 -0
  386. package/skills/phoenix-diagram/schemas/lifecycle.schema.json +202 -0
  387. package/skills/phoenix-diagram/schemas/sequence.schema.json +254 -0
  388. package/skills/phoenix-diagram/schemas/timeline.schema.json +170 -0
  389. package/skills/phoenix-diagram/schemas/tree.schema.json +144 -0
  390. package/skills/phoenix-diagram/schemas/waterfall.schema.json +150 -0
  391. package/skills/phoenix-diagram/schemas/workflow.schema.json +460 -0
  392. package/skills/phoenix-diagram/scripts/phoenix-bootstrap.cjs +589 -0
  393. package/skills/phoenix-diagram/scripts/phoenix-diagram +6 -0
  394. package/skills/phoenix-diagram/scripts/phoenix-launcher.cjs +10 -0
  395. package/skills/phoenix-ui/GENERATED.json +255 -240
  396. package/skills/phoenix-ui/SKILL.md +7 -4
  397. package/skills/phoenix-ui/evals/scenarios.md +8 -1
  398. package/skills/phoenix-ui/reference/craft-floor.md +3 -1
  399. package/skills/phoenix-ui/reference/critique.md +6 -14
  400. package/skills/phoenix-ui/reference/init.md +1 -1
  401. package/skills/phoenix-ui/reference/live.md +1 -1
  402. package/skills/phoenix-ui/reference/operate.md +15 -0
  403. package/skills/phoenix-ui/scripts/ENGINE.json +17 -17
  404. package/skills/phoenix-ui/scripts/phoenix-bootstrap.cjs +2 -5
  405. package/skills/portal-app-exchange/SKILL.md +1 -0
  406. package/skills/portal-dev-setup/SKILL.md +71 -12
  407. package/skills/portal-dev-setup/scripts/onebox.sh +69 -6
  408. package/skills/portal-external-app/SKILL.md +55 -16
  409. package/skills/portal-external-app/references/config-placement.md +108 -2
  410. package/skills/portal-external-app/references/registration-and-onebox.md +56 -2
  411. package/skills/portal-logging/SKILL.md +1 -0
  412. package/skills/portal-micro-app/SKILL.md +2 -1
  413. package/skills/portal-micro-app/references/sdk-reference.md +3 -1
  414. package/skills/prd/SKILL.md +238 -159
  415. package/skills/prd/evals/scenarios.md +13 -0
  416. package/skills/prd/references/prd-skeleton.md +14 -4
  417. package/skills/react/SKILL.md +1 -0
  418. package/skills/resolve-blocked/SKILL.md +46 -19
  419. package/skills/resolve-blocked/agents/openai.yaml +2 -2
  420. package/skills/resolve-blocked/evals/scenarios.md +22 -0
  421. package/skills/resolve-blocked/references/decisions-contract.md +7 -4
  422. package/skills/review-code/SKILL.md +308 -46
  423. package/skills/review-code/agents/openai.yaml +2 -0
  424. package/skills/review-dev-plan/SKILL.md +88 -33
  425. package/skills/review-dev-plan/agents/openai.yaml +2 -0
  426. package/skills/review-dev-plan/references/report-contract.md +53 -19
  427. package/skills/review-dev-plan/references/review-lenses.md +2 -1
  428. package/skills/review-prd/SKILL.md +90 -34
  429. package/skills/review-prd/agents/openai.yaml +2 -0
  430. package/skills/review-prd/references/report-contract.md +54 -18
  431. package/skills/review-prd-dev-gaps/SKILL.md +1 -0
  432. package/skills/review-prd-dev-gaps/agents/openai.yaml +2 -0
  433. package/skills/review-ui/SKILL.md +369 -71
  434. package/skills/review-ui/agents/openai.yaml +2 -0
  435. package/skills/review-ui/evals/scenarios.md +2 -0
  436. package/skills/rust/SKILL.md +76 -84
  437. package/skills/rust/references/api-design.md +97 -0
  438. package/skills/rust/references/{chapter_10.md → async-tokio.md} +42 -18
  439. package/skills/rust/references/behavioral-patterns.md +49 -0
  440. package/skills/rust/references/bevy.md +95 -0
  441. package/skills/rust/references/{chapter_02.md → clippy-and-linting.md} +26 -15
  442. package/skills/rust/references/{chapter_01.md → coding-idioms.md} +58 -7
  443. package/skills/rust/references/crates-and-dependencies.md +66 -0
  444. package/skills/rust/references/{chapter_08.md → documentation.md} +30 -3
  445. package/skills/rust/references/{chapter_04.md → error-handling.md} +32 -6
  446. package/skills/rust/references/{chapter_06.md → generics-and-dispatch.md} +28 -11
  447. package/skills/rust/references/macros.md +45 -0
  448. package/skills/rust/references/{chapter_03.md → performance.md} +25 -2
  449. package/skills/rust/references/{chapter_09.md → pointers-and-ownership.md} +37 -17
  450. package/skills/rust/references/{chapter_05.md → testing.md} +18 -2
  451. package/skills/rust/references/{chapter_07.md → type-state.md} +5 -1
  452. package/skills/rust/references/unsafe-and-ffi.md +56 -0
  453. package/skills/rust-port/SKILL.md +144 -0
  454. package/skills/rust-review/SKILL.md +177 -0
  455. package/skills/security-audit/SKILL.md +1 -0
  456. package/skills/spec-human-decision/SKILL.md +1 -0
  457. package/skills/sql-optimization/SKILL.md +1 -0
  458. package/skills/story-points/SKILL.md +1 -0
  459. package/skills/swarm/SKILL.md +1 -0
  460. package/skills/test-plan/SKILL.md +1 -0
  461. package/skills/ui-loop/SKILL.md +39 -0
  462. package/skills/ui-loop/agents/openai.yaml +3 -0
  463. package/skills/ui-pattern-research/SKILL.md +1 -0
  464. package/skills/use-llm-gateway/SKILL.md +58 -0
  465. package/skills/use-llm-gateway/agents/openai.yaml +4 -0
  466. package/skills/use-llm-gateway/references/api.md +129 -0
  467. package/skills/use-llm-gateway/references/recovery.md +86 -0
  468. package/skills/use-prompt-dsl/SKILL.md +165 -0
  469. package/skills/use-prompt-dsl/references/examples.md +726 -0
  470. package/skills/use-prompt-dsl/references/language.md +938 -0
  471. package/skills/use-rustify-docs/SKILL.md +60 -0
  472. package/skills/use-rustify-docs/agents/openai.yaml +4 -0
  473. package/skills/use-rustify-docs/references/rustify-docs.md +138 -0
  474. package/skills/use-task-gateway/SKILL.md +60 -0
  475. package/skills/use-task-gateway/agents/openai.yaml +3 -0
  476. package/skills/use-task-gateway/references/authentication.md +75 -0
  477. package/skills/use-task-gateway/references/task-api.md +121 -0
  478. package/skills/use-task-gateway/references/workers.md +85 -0
  479. package/skills/use-task-gateway/references/workflow-actions.md +66 -0
  480. package/skills/use-workflow-service/SKILL.md +57 -0
  481. package/skills/use-workflow-service/agents/openai.yaml +3 -0
  482. package/skills/use-workflow-service/references/action-provider.md +84 -0
  483. package/skills/use-workflow-service/references/authentication.md +76 -0
  484. package/skills/use-workflow-service/references/authoring.md +62 -0
  485. package/skills/use-workflow-service/references/mcp.md +47 -0
  486. package/skills/use-workflow-service/references/open-api.md +88 -0
  487. package/skills/use-workflow-service/references/orchestration-choice.md +63 -0
  488. package/skills/working-with-mbx/SKILL.md +1 -0
  489. package/skills/working-with-mise/SKILL.md +1 -0
  490. package/skills/xgent-app-release/SKILL.md +114 -16
  491. package/skills/xgent-app-release/references/build-and-package.md +2 -1
  492. package/skills/xgent-app-release/references/publish-api.md +6 -1
  493. package/skills/xgent-app-release/references/troubleshooting.md +2 -1
  494. package/skills/xgent-app-release/references/verify-preflight.mjs +21 -1
  495. package/skills/xgent-app-release/scripts/preflight.mjs +42 -3
  496. package/skills/xgent-image-push/SKILL.md +1 -0
  497. package/skills/xgent-init/SKILL.md +1 -0
  498. package/docs/claude-context-goal-guard.md +0 -124
  499. package/docs/codex-context-goal-guard.md +0 -109
  500. package/hooks/claude/context-goal-guard.js +0 -139
  501. package/hooks/claude/settings.example.json +0 -26
  502. package/hooks/codex/context-goal-guard.py +0 -189
  503. package/hooks/codex/hooks.example.json +0 -26
  504. package/skills/archify/SKILL.md +0 -137
  505. package/skills/archify/assets/template.html +0 -14937
  506. package/skills/archify/bin/archify.mjs +0 -2139
  507. package/skills/archify/bin/open-artifact.mjs +0 -86
  508. package/skills/archify/bin/preview.mjs +0 -653
  509. package/skills/archify/bin/visual-check.mjs +0 -829
  510. package/skills/archify/brand-marks/README.md +0 -31
  511. package/skills/archify/brand-marks/catalog.json +0 -131
  512. package/skills/archify/delta/architecture-delta.mjs +0 -1232
  513. package/skills/archify/examples/agent-run.lifecycle.json +0 -60
  514. package/skills/archify/examples/brand-aware-delivery.architecture.json +0 -47
  515. package/skills/archify/examples/cache-miss-request.sequence.json +0 -82
  516. package/skills/archify/examples/checkout-platform.base.architecture.json +0 -31
  517. package/skills/archify/examples/checkout-platform.head.architecture.json +0 -31
  518. package/skills/archify/examples/dataflow-product-analytics.html +0 -15048
  519. package/skills/archify/examples/event-stream.dataflow.json +0 -57
  520. package/skills/archify/examples/incident-response.workflow.json +0 -64
  521. package/skills/archify/examples/lifecycle-agent-run.html +0 -14983
  522. package/skills/archify/examples/production-deployment.architecture.json +0 -71
  523. package/skills/archify/examples/release-delivery.workflow.json +0 -62
  524. package/skills/archify/examples/sequence-cache-miss-request.html +0 -15063
  525. package/skills/archify/examples/web-app-rendered.html +0 -15012
  526. package/skills/archify/examples/workflow-agent-tool-call-rendered.html +0 -15054
  527. package/skills/archify/migrations/workflow-v2.mjs +0 -279
  528. package/skills/archify/package-lock.json +0 -149
  529. package/skills/archify/package.json +0 -39
  530. package/skills/archify/recipes/scenarios.mjs +0 -391
  531. package/skills/archify/references/authoring-contract.md +0 -247
  532. package/skills/archify/references/brand-marks.md +0 -65
  533. package/skills/archify/references/delivery-contract.md +0 -138
  534. package/skills/archify/references/viewer-runtime.md +0 -45
  535. package/skills/archify/renderers/architecture/grid.mjs +0 -62
  536. package/skills/archify/renderers/architecture/render-architecture.mjs +0 -1078
  537. package/skills/archify/renderers/dataflow/README.md +0 -104
  538. package/skills/archify/renderers/dataflow/render-dataflow.mjs +0 -483
  539. package/skills/archify/renderers/lifecycle/README.md +0 -115
  540. package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +0 -561
  541. package/skills/archify/renderers/sequence/README.md +0 -114
  542. package/skills/archify/renderers/sequence/render-sequence.mjs +0 -464
  543. package/skills/archify/renderers/shared/brand-marks.mjs +0 -563
  544. package/skills/archify/renderers/shared/cli.mjs +0 -218
  545. package/skills/archify/renderers/shared/desktop-readability.mjs +0 -26
  546. package/skills/archify/renderers/shared/diagnostics.mjs +0 -160
  547. package/skills/archify/renderers/shared/engineering-profiles.mjs +0 -157
  548. package/skills/archify/renderers/shared/generated-brand-marks.mjs +0 -2003
  549. package/skills/archify/renderers/shared/generated-validators.mjs +0 -13
  550. package/skills/archify/renderers/shared/geometry.mjs +0 -1423
  551. package/skills/archify/renderers/shared/i18n.mjs +0 -595
  552. package/skills/archify/renderers/shared/layout-report.mjs +0 -40
  553. package/skills/archify/renderers/shared/legend.mjs +0 -217
  554. package/skills/archify/renderers/shared/output-path.mjs +0 -340
  555. package/skills/archify/renderers/shared/repository-evidence.mjs +0 -239
  556. package/skills/archify/renderers/shared/repository-location.mjs +0 -58
  557. package/skills/archify/renderers/shared/text-fit.mjs +0 -49
  558. package/skills/archify/renderers/shared/utils.mjs +0 -232
  559. package/skills/archify/renderers/shared/validator.mjs +0 -86
  560. package/skills/archify/renderers/workflow/README.md +0 -223
  561. package/skills/archify/renderers/workflow/render-workflow.mjs +0 -35
  562. package/skills/archify/renderers/workflow/workflow-compiler.mjs +0 -4400
  563. package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +0 -144
  564. package/skills/archify/schemas/README.md +0 -211
  565. package/skills/archify/schemas/architecture.schema.json +0 -178
  566. package/skills/archify/schemas/common.schema.json +0 -115
  567. package/skills/archify/scripts/check-render-output.mjs +0 -916
  568. package/skills/archify/scripts/check-update.mjs +0 -1667
  569. package/skills/archify/scripts/generate-brand-marks.mjs +0 -141
  570. package/skills/archify/scripts/generate-validators.mjs +0 -66
  571. package/skills/archify/scripts/render-examples.mjs +0 -26
  572. package/skills/archify/scripts/update-contract.mjs +0 -182
  573. package/skills/archify/skill-release.json +0 -10
  574. package/skills/archify/test/adaptive-reader-layout.test.mjs +0 -86
  575. package/skills/archify/test/animation.test.mjs +0 -179
  576. package/skills/archify/test/architecture-compare-recovery.test.mjs +0 -157
  577. package/skills/archify/test/architecture-delta-markers.test.mjs +0 -137
  578. package/skills/archify/test/architecture-delta.test.mjs +0 -705
  579. package/skills/archify/test/artifact-receipt-flush.test.mjs +0 -126
  580. package/skills/archify/test/authored-reachability.test.mjs +0 -95
  581. package/skills/archify/test/authoring-safety-contract.test.mjs +0 -54
  582. package/skills/archify/test/automatic-port-spread.test.mjs +0 -376
  583. package/skills/archify/test/base-input-compatibility.test.mjs +0 -42
  584. package/skills/archify/test/brand-marks.test.mjs +0 -678
  585. package/skills/archify/test/chapter-delta-preview.test.mjs +0 -157
  586. package/skills/archify/test/chapter-handoff.test.mjs +0 -97
  587. package/skills/archify/test/chapter-rail.test.mjs +0 -86
  588. package/skills/archify/test/checkout-line-endings.test.mjs +0 -72
  589. package/skills/archify/test/ci-scope.test.mjs +0 -59
  590. package/skills/archify/test/clean-skill-staging.test.mjs +0 -440
  591. package/skills/archify/test/cli-output-types.test.mjs +0 -201
  592. package/skills/archify/test/cli.test.mjs +0 -986
  593. package/skills/archify/test/community-proof-intake.test.mjs +0 -125
  594. package/skills/archify/test/cursor-onboarding.test.mjs +0 -74
  595. package/skills/archify/test/degraded.test.mjs +0 -161
  596. package/skills/archify/test/delivery-contract.test.mjs +0 -52
  597. package/skills/archify/test/desktop-reader-browser.test.mjs +0 -80
  598. package/skills/archify/test/diagram-guide.test.mjs +0 -92
  599. package/skills/archify/test/engineering-profile.test.mjs +0 -209
  600. package/skills/archify/test/export-browser.test.mjs +0 -305
  601. package/skills/archify/test/export-cleanup-browser.test.mjs +0 -294
  602. package/skills/archify/test/finder-browser.test.mjs +0 -274
  603. package/skills/archify/test/finder.test.mjs +0 -104
  604. package/skills/archify/test/fixtures/automatic-routing-node-border-clearance.workflow.json +0 -40
  605. package/skills/archify/test/fixtures/fail-migration-cleanup.mjs +0 -17
  606. package/skills/archify/test/fixtures/issue-126/custom-widths.workflow.json +0 -18
  607. package/skills/archify/test/fixtures/issue-126/explicit-route.workflow.json +0 -28
  608. package/skills/archify/test/fixtures/issue-126/explicit-viewbox.workflow.json +0 -19
  609. package/skills/archify/test/fixtures/issue-126/labels.workflow.json +0 -18
  610. package/skills/archify/test/fixtures/v1-baseline/agent-run.lifecycle.json +0 -64
  611. package/skills/archify/test/fixtures/v1-baseline/agent-tool-call.workflow.json +0 -88
  612. package/skills/archify/test/fixtures/v1-baseline/cache-miss-request.sequence.json +0 -75
  613. package/skills/archify/test/fixtures/v1-baseline/event-stream.dataflow.json +0 -57
  614. package/skills/archify/test/fixtures/v1-baseline/product-analytics.dataflow.json +0 -70
  615. package/skills/archify/test/fixtures/v1-baseline/production-deployment.architecture.json +0 -71
  616. package/skills/archify/test/fixtures/v1-workflow-700x400.workflow.json +0 -22
  617. package/skills/archify/test/fixtures/v1-workflow-explicit-coordinates.workflow.json +0 -47
  618. package/skills/archify/test/focus-browser.test.mjs +0 -226
  619. package/skills/archify/test/gallery.test.mjs +0 -130
  620. package/skills/archify/test/generate-validators.test.mjs +0 -59
  621. package/skills/archify/test/generate-viewer.test.mjs +0 -165
  622. package/skills/archify/test/generated-artifact-xml.test.mjs +0 -88
  623. package/skills/archify/test/geometry.test.mjs +0 -739
  624. package/skills/archify/test/golden.mjs +0 -207
  625. package/skills/archify/test/grid.test.mjs +0 -47
  626. package/skills/archify/test/guide-page.test.mjs +0 -85
  627. package/skills/archify/test/guide.test.mjs +0 -81
  628. package/skills/archify/test/guided-views-browser.test.mjs +0 -460
  629. package/skills/archify/test/guided-views.test.mjs +0 -144
  630. package/skills/archify/test/helpers/desktop-browser.mjs +0 -48
  631. package/skills/archify/test/helpers/offline-fonts.mjs +0 -76
  632. package/skills/archify/test/helpers/viewer-click.mjs +0 -72
  633. package/skills/archify/test/helpers/xml.mjs +0 -37
  634. package/skills/archify/test/i18n.test.mjs +0 -422
  635. package/skills/archify/test/intent-trace-browser.test.mjs +0 -284
  636. package/skills/archify/test/intent-trace.test.mjs +0 -111
  637. package/skills/archify/test/landing.test.mjs +0 -97
  638. package/skills/archify/test/layout-rules.test.mjs +0 -1498
  639. package/skills/archify/test/legend-contract.test.mjs +0 -404
  640. package/skills/archify/test/motion-governor-browser.test.mjs +0 -342
  641. package/skills/archify/test/motion-governor.test.mjs +0 -111
  642. package/skills/archify/test/offline-font-browser.test.mjs +0 -210
  643. package/skills/archify/test/offline-self-containment.test.mjs +0 -80
  644. package/skills/archify/test/open-artifact.test.mjs +0 -118
  645. package/skills/archify/test/ordinary-model-floor.test.mjs +0 -1052
  646. package/skills/archify/test/output-path.test.mjs +0 -587
  647. package/skills/archify/test/presentation.test.mjs +0 -71
  648. package/skills/archify/test/preset-tryon.test.mjs +0 -113
  649. package/skills/archify/test/preview-contract.test.mjs +0 -40
  650. package/skills/archify/test/preview.test.mjs +0 -530
  651. package/skills/archify/test/proof-aperture.test.mjs +0 -78
  652. package/skills/archify/test/reach-share-card.test.mjs +0 -149
  653. package/skills/archify/test/reader-layout-browser.test.mjs +0 -320
  654. package/skills/archify/test/readme-showcase.test.mjs +0 -319
  655. package/skills/archify/test/real-repository-proof.test.mjs +0 -209
  656. package/skills/archify/test/relationship-direct-explorer.test.mjs +0 -115
  657. package/skills/archify/test/relationship-lens.test.mjs +0 -128
  658. package/skills/archify/test/relationship-permalink.test.mjs +0 -130
  659. package/skills/archify/test/relationship-pulse.test.mjs +0 -122
  660. package/skills/archify/test/release-identity.test.mjs +0 -476
  661. package/skills/archify/test/release-package-gates.test.mjs +0 -750
  662. package/skills/archify/test/render-output-checks.test.mjs +0 -588
  663. package/skills/archify/test/renderer-diagnostic-boundary.test.mjs +0 -107
  664. package/skills/archify/test/repair-receipt.test.mjs +0 -181
  665. package/skills/archify/test/repository-evidence-replacement.test.mjs +0 -136
  666. package/skills/archify/test/repository-evidence.test.mjs +0 -605
  667. package/skills/archify/test/repository-language-metadata.test.mjs +0 -67
  668. package/skills/archify/test/route-journey.test.mjs +0 -125
  669. package/skills/archify/test/route-probe-browser.test.mjs +0 -363
  670. package/skills/archify/test/route-probe.test.mjs +0 -114
  671. package/skills/archify/test/route-share-card.test.mjs +0 -163
  672. package/skills/archify/test/semantic-camera.test.mjs +0 -88
  673. package/skills/archify/test/semantic-flow.test.mjs +0 -90
  674. package/skills/archify/test/semantic-legend-gateway.test.mjs +0 -156
  675. package/skills/archify/test/semantic-lens-browser.test.mjs +0 -372
  676. package/skills/archify/test/semantic-lens.test.mjs +0 -103
  677. package/skills/archify/test/semantic-passport.test.mjs +0 -99
  678. package/skills/archify/test/semantic-radar.test.mjs +0 -735
  679. package/skills/archify/test/semantic-zoom.test.mjs +0 -86
  680. package/skills/archify/test/sequence-column-fit.test.mjs +0 -137
  681. package/skills/archify/test/settled-flow.test.mjs +0 -97
  682. package/skills/archify/test/share-card-export.test.mjs +0 -132
  683. package/skills/archify/test/site-language-continuity.test.mjs +0 -569
  684. package/skills/archify/test/site-language-integration.mjs +0 -9
  685. package/skills/archify/test/skill-metadata.test.mjs +0 -84
  686. package/skills/archify/test/stable-update-manifest.test.mjs +0 -167
  687. package/skills/archify/test/start-page.test.mjs +0 -312
  688. package/skills/archify/test/story-beat-navigator.test.mjs +0 -103
  689. package/skills/archify/test/story-carrier.test.mjs +0 -90
  690. package/skills/archify/test/story-director-strip.test.mjs +0 -91
  691. package/skills/archify/test/story-follow-camera.test.mjs +0 -103
  692. package/skills/archify/test/story-horizon.test.mjs +0 -91
  693. package/skills/archify/test/story-moment-link.test.mjs +0 -93
  694. package/skills/archify/test/story-shelf.test.mjs +0 -84
  695. package/skills/archify/test/story-trail.test.mjs +0 -81
  696. package/skills/archify/test/toolbar-polish.test.mjs +0 -57
  697. package/skills/archify/test/update-contract.test.mjs +0 -133
  698. package/skills/archify/test/update-notifier.test.mjs +0 -3317
  699. package/skills/archify/test/v1-compatibility.test.mjs +0 -329
  700. package/skills/archify/test/vertical-edge.test.mjs +0 -68
  701. package/skills/archify/test/viewer-camera-browser.test.mjs +0 -395
  702. package/skills/archify/test/viewer-chrome-layout.test.mjs +0 -1104
  703. package/skills/archify/test/viewer-identifiers-browser.test.mjs +0 -135
  704. package/skills/archify/test/visual-check.test.mjs +0 -400
  705. package/skills/archify/test/webm-artifact.smoke.mjs +0 -1855
  706. package/skills/archify/test/workflow-compiler-hard-contract.test.mjs +0 -2136
  707. package/skills/archify/test/workflow-compiler.test.mjs +0 -1163
  708. package/skills/archify/test/workflow-migration.test.mjs +0 -620
  709. package/skills/archify/test/workflow-semantic-contract.test.mjs +0 -131
  710. /package/{skills/archify/THIRD_PARTY_NOTICES.md → dist/phoenix-diagram/THIRD-PARTY-LICENSES/0b7fb59365dc21c93b0f62526d74ee913aeec9ae532c112bc76afa7edcd56e14.txt} +0 -0
  711. /package/{skills/archify/LICENSE → dist/phoenix-diagram/THIRD-PARTY-LICENSES/b799ab081703e7821ae5096d2c1abdf14bbdc75e8ea1c4045998c36ed6db9706.txt} +0 -0
  712. /package/{skills/archify/assets/JetBrainsMono-OFL.txt → dist/phoenix-diagram/THIRD-PARTY-LICENSES/c1ab7c666206842a02b35b30770dac0d7a10156ed401c9defc3f02a754d89e90.txt} +0 -0
  713. /package/{skills/archify/examples/agent-tool-call.workflow.json → dist/phoenix-diagram/bundle/examples/legacy.agent-tool-call.workflow.json} +0 -0
  714. /package/{skills/archify/examples/async-job-roundtrip.sequence.json → dist/phoenix-diagram/bundle/examples/legacy.async-job-roundtrip.sequence.json} +0 -0
  715. /package/{skills/archify/examples/deployment-release.lifecycle.json → dist/phoenix-diagram/bundle/examples/legacy.deployment-release.lifecycle.json} +0 -0
  716. /package/{skills/archify/examples/product-analytics.dataflow.json → dist/phoenix-diagram/bundle/examples/legacy.product-analytics.dataflow.json} +0 -0
  717. /package/{skills/archify/examples/web-app.architecture.json → dist/phoenix-diagram/bundle/examples/legacy.web-app.architecture.json} +0 -0
@@ -1,1078 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { esc, renderDefinitions, renderSemanticSigil, textUnits } from '../shared/utils.mjs';
4
- import { animateAttr, focusEdgeAttrs, focusNodeAttrs, focusNodeTitle, loadDiagramWithBrandMarks, writeDiagram, svgAccessibleText, svgRootAttrs } from '../shared/cli.mjs';
5
- import { componentBox, boundaryBox, connectionPath } from '../shared/layout-report.mjs';
6
- import { throwDiagnosticProblems } from '../shared/diagnostics.mjs';
7
- import { legendFootprint, relationshipLegendObstacles, resolveLegend, renderLegend as renderResolvedLegend } from '../shared/legend.mjs';
8
- import { availableNodeTextWidth, fittedNodeFontSize, minimumNodeTextWidth } from '../shared/text-fit.mjs';
9
- import { brandLabelFitWidth, brandMetadataFor, brandTopRailProblem, renderBrandMark } from '../shared/brand-marks.mjs';
10
- import { minimumReadableSourceTextPx } from '../shared/desktop-readability.mjs';
11
- import { translateMessage as i18nText } from '../shared/i18n.mjs';
12
- import { gridLayout, resolveComponentPos, validateGridPlacement } from './grid.mjs';
13
- import {
14
- asArray,
15
- isFinitePoint,
16
- rectsOverlap,
17
- segmentIntersectsRect,
18
- cleanEndpointSideProblems,
19
- cleanFlowProblems,
20
- cleanCrossingProblems,
21
- cleanAmbiguousCorridorProblems,
22
- cleanBorderRunProblems,
23
- cleanRouteRhythmProblems,
24
- cleanLabelRouteClearanceProblems,
25
- suggestLabelObstacleFix,
26
- suggestComponentSeparation,
27
- anchor,
28
- automaticPortSpread,
29
- automaticPortRhythmBridge,
30
- defaultFromSide,
31
- defaultToSide,
32
- chosenSide,
33
- routeHonorsEndpointSides,
34
- normalizeRoutePoints,
35
- polylinePath,
36
- routePointsValue,
37
- roundedPath,
38
- labelPoint,
39
- componentFill,
40
- componentText,
41
- arrowClassMap,
42
- variantAccent,
43
- } from '../shared/geometry.mjs';
44
-
45
- const componentTextFit = {
46
- sublabelPreferred: 9,
47
- sublabelMinimum: 6,
48
- tagPreferred: 7,
49
- tagMinimum: 6,
50
- };
51
-
52
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
53
- const layoutJsonMode = process.argv.includes('--layout-json');
54
- const cliArgs = process.argv.filter((arg) => arg !== '--layout-json');
55
- const { diagram: arch, template, outPath, sourceEvidence } = await loadDiagramWithBrandMarks({
56
- rendererDir: __dirname,
57
- diagramType: 'architecture',
58
- defaultExample: 'web-app.architecture.json',
59
- argv: cliArgs,
60
- });
61
-
62
- const grid = gridLayout(arch);
63
-
64
- const layout = {
65
- defaultW: 120,
66
- defaultH: 60,
67
- margin: 40,
68
- // Boundary padding — the 30/50 rule that was a hand-arithmetic footgun
69
- // (CHANGELOG v2.2.1): 30px on top/left/right, plus 20px extra at the bottom.
70
- boundaryPad: 30,
71
- boundaryExtraBottom: 20,
72
- boundaryLabelBaseline: 18,
73
- boundaryLabelClearance: 4,
74
- boundaryLabelFontPreferred: 9,
75
- boundaryLabelFontMinimum: 6,
76
- boundaryLabelMaskHeight: 16,
77
- boundaryLabelRailGap: 2,
78
- boundaryLabelFrameInset: 4,
79
- legendH: 28,
80
- };
81
-
82
- const LEGEND_CATALOG = [
83
- 'frontend',
84
- 'backend',
85
- 'database',
86
- 'cloud',
87
- 'security',
88
- 'messagebus',
89
- 'external',
90
- ].map((kind) => ({ kind, label: i18nText(arch.meta.locale, `legend.architecture.${kind}`) }));
91
-
92
- // ---- Measure components from free coordinates --------------------------------
93
- function measureComponent(c) {
94
- const [x, y] = resolveComponentPos(c, grid);
95
- const [w, h] = Array.isArray(c.size) ? c.size : [layout.defaultW, layout.defaultH];
96
- return { ...c, x, y, width: w, height: h, cx: x + w / 2, cy: y + h / 2 };
97
- }
98
-
99
- const components = new Map(asArray(arch.components).map((c) => [c.id, measureComponent(c)]));
100
- const enforcesBoundaryTitleComposition = Boolean(arch.meta?.quality_profile);
101
- const componentSteps = new Map();
102
- for (const [index, conn] of asArray(arch.connections).entries()) {
103
- if (!componentSteps.has(conn.from)) componentSteps.set(conn.from, index);
104
- if (!componentSteps.has(conn.to)) componentSteps.set(conn.to, index + 1);
105
- }
106
- for (const [index, c] of asArray(arch.components).entries()) {
107
- if (!componentSteps.has(c.id)) componentSteps.set(c.id, index);
108
- }
109
-
110
- // ---- Boundaries computed from the `wraps` id list ---------------------------
111
- function boundaryRect(boundary) {
112
- const members = asArray(boundary.wraps).map((id) => components.get(id)).filter(Boolean);
113
- if (!members.length) return null;
114
- const minX = Math.min(...members.map((m) => m.x));
115
- const minY = Math.min(...members.map((m) => m.y));
116
- const maxX = Math.max(...members.map((m) => m.x + m.width));
117
- const maxY = Math.max(...members.map((m) => m.y + m.height));
118
- const pad = boundary.pad ?? layout.boundaryPad;
119
- const topPad = Math.max(
120
- pad,
121
- layout.boundaryLabelBaseline + layout.boundaryLabelClearance,
122
- );
123
- return {
124
- ...boundary,
125
- x: minX - pad,
126
- y: minY - topPad,
127
- width: maxX - minX + pad * 2,
128
- height: maxY - minY + topPad + layout.boundaryExtraBottom,
129
- memberTop: minY,
130
- };
131
- }
132
-
133
- function rectContains(outer, inner) {
134
- const epsilon = 1e-9;
135
- return outer.x <= inner.x + epsilon
136
- && outer.y <= inner.y + epsilon
137
- && outer.x + outer.width + epsilon >= inner.x + inner.width
138
- && outer.y + outer.height + epsilon >= inner.y + inner.height;
139
- }
140
-
141
- function boundaryLabelWidth(label, fontSize) {
142
- return Math.max(30, textUnits(label) * fontSize * 0.6 + 10);
143
- }
144
-
145
- const architectureLegendEntries = resolveLegend(
146
- arch.meta?.legend,
147
- LEGEND_CATALOG,
148
- new Set([...components.values()].map((component) => component.type)),
149
- );
150
-
151
- function autoViewBoxFor(candidateBoundaries) {
152
- const maxX = Math.max(
153
- 0,
154
- ...[...components.values()].map((component) => component.x + component.width),
155
- ...candidateBoundaries.map((boundary) => boundary.x + boundary.width),
156
- );
157
- const maxY = Math.max(
158
- 0,
159
- ...[...components.values()].map((component) => component.y + component.height),
160
- ...candidateBoundaries.map((boundary) => boundary.y + boundary.height),
161
- );
162
- let width = Math.ceil(maxX + layout.margin);
163
- let footprint = legendFootprint(architectureLegendEntries, {
164
- width: Math.max(1, width - layout.margin * 2),
165
- });
166
- if (footprint.minWidth > width - layout.margin * 2) {
167
- width = Math.ceil(footprint.minWidth + layout.margin * 2);
168
- footprint = legendFootprint(architectureLegendEntries, {
169
- width: width - layout.margin * 2,
170
- });
171
- }
172
- return [
173
- width,
174
- Math.ceil(maxY + layout.margin + layout.legendH + footprint.extraHeight),
175
- ];
176
- }
177
-
178
- function resolvedViewBoxWidth(candidateBoundaries) {
179
- if (Array.isArray(arch.meta?.viewBox) && Number.isFinite(arch.meta.viewBox[0])) {
180
- return arch.meta.viewBox[0];
181
- }
182
- return autoViewBoxFor(candidateBoundaries)[0];
183
- }
184
-
185
- function expandBoundaryForReadableTitle(boundary, minimumFontSize) {
186
- if (!enforcesBoundaryTitleComposition) return boundary;
187
- const requiredWidth = boundaryLabelWidth(boundary.label, minimumFontSize)
188
- + layout.boundaryLabelFrameInset * 2;
189
- const extra = Math.max(0, requiredWidth - boundary.width);
190
- if (!extra) return boundary;
191
- return {
192
- ...boundary,
193
- x: boundary.x - extra / 2,
194
- width: boundary.width + extra,
195
- };
196
- }
197
-
198
- function measureBoundaryTitle(boundary, minimumFontSize) {
199
- const availableWidth = Math.max(0, boundary.width - layout.boundaryLabelFrameInset * 2);
200
- const units = textUnits(boundary.label);
201
- const fitted = units > 0
202
- ? (availableWidth - 10) / (units * 0.6)
203
- : layout.boundaryLabelFontPreferred;
204
- const preferredFontSize = Math.max(layout.boundaryLabelFontPreferred, minimumFontSize);
205
- const fontSize = Math.max(
206
- minimumFontSize,
207
- Math.min(preferredFontSize, fitted),
208
- );
209
- const desiredWidth = boundaryLabelWidth(boundary.label, fontSize);
210
- const height = Math.max(layout.boundaryLabelMaskHeight, Math.ceil(fontSize + 7));
211
- return {
212
- x: boundary.x + layout.boundaryLabelFrameInset,
213
- y: boundary.memberTop
214
- - layout.boundaryLabelClearance
215
- - height,
216
- width: Math.min(availableWidth, desiredWidth),
217
- height,
218
- fontSize,
219
- minimumFontSize,
220
- baselineOffset: fontSize + 4,
221
- availableWidth,
222
- minimumWidth: boundaryLabelWidth(boundary.label, minimumFontSize),
223
- };
224
- }
225
-
226
- function horizontalOverlap(left, right) {
227
- return left.x < right.x + right.width && left.x + left.width > right.x;
228
- }
229
-
230
- function layoutBoundaryTitles(rawBoundaries, minimumFontSize) {
231
- const placedTitles = [];
232
- const measured = new Map();
233
- const ordered = rawBoundaries
234
- .map((boundary, index) => ({ boundary, index }))
235
- .sort((left, right) => {
236
- const areaDelta = left.boundary.width * left.boundary.height
237
- - right.boundary.width * right.boundary.height;
238
- return areaDelta || left.index - right.index;
239
- });
240
-
241
- for (const entry of ordered) {
242
- const { index } = entry;
243
- const boundary = expandBoundaryForReadableTitle(entry.boundary, minimumFontSize);
244
- const title = measureBoundaryTitle(boundary, minimumFontSize);
245
- let guard = 0;
246
- while (guard < rawBoundaries.length + components.size + 1) {
247
- guard += 1;
248
- const blockers = [
249
- ...placedTitles,
250
- ...components.values(),
251
- ].filter((candidate) => horizontalOverlap(title, candidate) && rectsOverlap(title, candidate));
252
- if (!blockers.length) break;
253
- title.y = Math.min(
254
- ...blockers.map((blocker) => blocker.y - layout.boundaryLabelRailGap - title.height),
255
- );
256
- }
257
- placedTitles.push(title);
258
- measured.set(index, { boundary, title });
259
- }
260
-
261
- return rawBoundaries.map((_boundary, index) => {
262
- const { boundary, title } = measured.get(index);
263
- const bottom = boundary.y + boundary.height;
264
- // Profile-less schema-v1 inputs keep their legacy boundary geometry. A
265
- // quality profile opts into the stricter title-composition contract and
266
- // may expand the frame to contain an adapted title rail.
267
- const y = enforcesBoundaryTitleComposition
268
- ? Math.min(boundary.y, title.y - layout.boundaryLabelFrameInset)
269
- : boundary.y;
270
- return {
271
- ...boundary,
272
- y,
273
- height: bottom - y,
274
- title,
275
- };
276
- });
277
- }
278
-
279
- const rawBoundaries = asArray(arch.boundaries).map(boundaryRect).filter(Boolean);
280
- function resolveBoundaryTitles() {
281
- if (!enforcesBoundaryTitleComposition || rawBoundaries.length === 0) {
282
- return {
283
- boundaries: layoutBoundaryTitles(rawBoundaries, layout.boundaryLabelFontMinimum),
284
- readabilityProblem: null,
285
- };
286
- }
287
-
288
- const maximumIterations = 32;
289
- let candidateBoundaries = rawBoundaries;
290
- for (let iteration = 0; iteration < maximumIterations; iteration += 1) {
291
- const budgetViewBoxWidth = resolvedViewBoxWidth(candidateBoundaries);
292
- const minimumFontSize = Math.max(
293
- layout.boundaryLabelFontMinimum,
294
- minimumReadableSourceTextPx(budgetViewBoxWidth) + 1e-6,
295
- );
296
- const nextBoundaries = layoutBoundaryTitles(rawBoundaries, minimumFontSize);
297
- const finalViewBoxWidth = resolvedViewBoxWidth(nextBoundaries);
298
- const finalMinimumFontSize = Math.max(
299
- layout.boundaryLabelFontMinimum,
300
- minimumReadableSourceTextPx(finalViewBoxWidth),
301
- );
302
- if (minimumFontSize >= finalMinimumFontSize) {
303
- return { boundaries: nextBoundaries, readabilityProblem: null };
304
- }
305
- candidateBoundaries = nextBoundaries;
306
- }
307
-
308
- const finalViewBoxWidth = resolvedViewBoxWidth(candidateBoundaries);
309
- return {
310
- boundaries: candidateBoundaries,
311
- readabilityProblem: `[composition/desktop-readability] Boundary title layout did not converge after ${maximumIterations} iterations for the final ${finalViewBoxWidth}px viewBox — shorten boundary labels, provide a wider authored viewBox, or move wrapped components closer to the left edge.`,
312
- };
313
- }
314
-
315
- const resolvedBoundaryTitles = resolveBoundaryTitles();
316
- const boundaries = resolvedBoundaryTitles.boundaries;
317
- const compositionFrames = boundaries.map((boundary, index) => ({
318
- ...boundary,
319
- id: boundary.id || index,
320
- kind: boundary.kind || 'boundary',
321
- radius: boundary.kind === 'security-group' ? 8 : 12,
322
- }));
323
-
324
- function componentContext(component) {
325
- const scopes = boundaries
326
- .filter((boundary) => asArray(boundary.wraps).includes(component.id))
327
- .sort((a, b) => (b.width * b.height) - (a.width * a.height))
328
- .map((boundary) => boundary.label);
329
- return scopes.length ? scopes.join(' › ') : i18nText(arch.meta.locale, 'node.context.architecture');
330
- }
331
-
332
- // ---- Auto viewBox: fit all geometry + the measured resolved legend ----------
333
- const viewBox = arch.meta?.viewBox || autoViewBoxFor(boundaries);
334
- const legendY = () => viewBox[1] - 16;
335
-
336
- // ---- Validation: mechanical correctness, never layout taste -----------------
337
- function validateArchitecture() {
338
- const problems = [];
339
- if (resolvedBoundaryTitles.readabilityProblem) {
340
- problems.push(resolvedBoundaryTitles.readabilityProblem);
341
- }
342
- const requiresNestedBoundaryMembership = arch.meta?.engineering_profile === 'deployment-ownership';
343
- if (components.size !== asArray(arch.components).length) problems.push('Component ids must be unique.');
344
- if (grid) {
345
- validateGridPlacement(arch, grid, problems);
346
- } else {
347
- for (const c of asArray(arch.components)) {
348
- if (!Array.isArray(c.pos) || c.pos.length !== 2) {
349
- problems.push(`Component "${c.id}" must include pos [x, y] when layout.mode is omitted (free placement).`);
350
- }
351
- }
352
- }
353
-
354
- for (const c of components.values()) {
355
- if (!isFinitePoint(c.x, c.y, c.width, c.height)) {
356
- problems.push(`Component "${c.id}" has non-finite pos/size — pos and size must be [number, number].`);
357
- continue;
358
- }
359
- if (c.width <= 0 || c.height <= 0) {
360
- problems.push(`Component "${c.id}" has invalid size ${c.width}x${c.height} — width and height must be greater than 0.`);
361
- continue;
362
- }
363
- if (c.x < 0 || c.y < 0 || c.x + c.width > viewBox[0] || c.y + c.height > viewBox[1]) {
364
- problems.push(`Component "${c.id}" falls outside the viewBox ${viewBox[0]}x${viewBox[1]} — adjust pos/size or set a larger meta.viewBox.`);
365
- }
366
- const estLabelW = textUnits(c.label) * 6.6;
367
- if (estLabelW > c.width + 8) {
368
- problems.push(`Label "${c.label}" (~${Math.round(estLabelW)}px) is wider than component "${c.id}" (${c.width}px) — shorten the label or widen size.`);
369
- }
370
- const brandRailProblem = brandTopRailProblem(c, c.width, 8, 'Component');
371
- if (brandRailProblem) problems.push(brandRailProblem);
372
- // sublabel and tag render as single unwrapped <text> elements; shrink-to-fit
373
- // handles the ordinary case, this rejects what it cannot rescue.
374
- const availableTextW = availableNodeTextWidth(c.width);
375
- for (const [field, value, minimum] of [
376
- ['Sublabel', c.sublabel, componentTextFit.sublabelMinimum],
377
- ['Tag', c.tag, componentTextFit.tagMinimum],
378
- ]) {
379
- if (!value) continue;
380
- const minimumW = minimumNodeTextWidth(value, minimum);
381
- if (minimumW > availableTextW) {
382
- problems.push(`${field} "${value}" needs ~${Math.ceil(minimumW)}px at the ${minimum}px legible minimum, but component "${c.id}" provides ${availableTextW}px — shorten the ${field.toLowerCase()} or widen size.`);
383
- }
384
- }
385
- }
386
-
387
- // Component overlap — the highest-traffic hand-placement failure mode.
388
- const list = [...components.values()];
389
- for (let i = 0; i < list.length; i += 1) {
390
- for (let j = i + 1; j < list.length; j += 1) {
391
- if (rectsOverlap(list[i], list[j], 8)) {
392
- problems.push(`Components "${list[i].id}" and "${list[j].id}" are less than 8px apart — move one or shrink its size.\n${suggestComponentSeparation(list[i], list[j], 8)}`);
393
- }
394
- }
395
- }
396
-
397
- // Boundaries: every wrapped id must exist; the computed box must stay in view.
398
- for (const boundary of asArray(arch.boundaries)) {
399
- for (const id of asArray(boundary.wraps)) {
400
- if (!components.has(id)) problems.push(`Boundary "${boundary.label}" wraps unknown component "${id}".`);
401
- }
402
- }
403
- const viewBoxRect = { x: 0, y: 0, width: viewBox[0], height: viewBox[1] };
404
- for (const boundary of boundaries) {
405
- if (!enforcesBoundaryTitleComposition) continue;
406
- if (boundary.title.minimumWidth > boundary.title.availableWidth) {
407
- problems.push(
408
- `Boundary label "${boundary.label}" needs ~${Math.ceil(boundary.title.minimumWidth)}px to fit at the `
409
- + `${Number(boundary.title.minimumFontSize.toFixed(2))}px desktop-readable source minimum, but its frame provides ${Math.floor(boundary.title.availableWidth)}px — `
410
- + 'shorten the boundary label, increase pad, or widen the wrapped component layout.',
411
- );
412
- }
413
- if (!rectContains(boundary, boundary.title)) {
414
- problems.push(
415
- `Boundary label "${boundary.label}" extends outside its final frame — shorten the label or increase boundary pad.`,
416
- );
417
- }
418
- if (!rectContains(viewBoxRect, boundary.title)) {
419
- problems.push(
420
- `Boundary label "${boundary.label}" extends outside the viewBox — move wrapped components away from the canvas edge, shorten the label, or increase the viewBox.`,
421
- );
422
- }
423
- for (const component of components.values()) {
424
- if (!rectsOverlap(boundary.title, component)) continue;
425
- problems.push(
426
- `Boundary label "${boundary.label}" overlaps component "${component.id}" — move the component, increase boundary title space, or shorten the label.`,
427
- );
428
- }
429
- }
430
- for (let leftIndex = 0; leftIndex < boundaries.length; leftIndex += 1) {
431
- const left = boundaries[leftIndex];
432
- const leftMembers = new Set(asArray(left.wraps));
433
- for (let rightIndex = leftIndex + 1; rightIndex < boundaries.length; rightIndex += 1) {
434
- const right = boundaries[rightIndex];
435
- if (enforcesBoundaryTitleComposition && rectsOverlap(left.title, right.title)) {
436
- problems.push(
437
- `Boundary labels "${left.label}" and "${right.label}" overlap — shorten a label or increase boundary title space.`,
438
- );
439
- }
440
- // Ordinary architecture boundaries are sets, not an implied ownership
441
- // tree: orthogonal scopes such as runtime and compliance may share some
442
- // components while each contains others. The opt-in deployment profile
443
- // does promise hierarchical region/private-scope membership, so only it
444
- // receives the stricter membership-to-frame containment contract.
445
- if (!requiresNestedBoundaryMembership) continue;
446
- const rightMembers = new Set(asArray(right.wraps));
447
- const shared = [...leftMembers].filter((id) => rightMembers.has(id));
448
- const leftNested = [...leftMembers].every((id) => rightMembers.has(id));
449
- const rightNested = [...rightMembers].every((id) => leftMembers.has(id));
450
- if (shared.length && !leftNested && !rightNested) {
451
- const leftOnly = [...leftMembers].filter((id) => !rightMembers.has(id));
452
- const rightOnly = [...rightMembers].filter((id) => !leftMembers.has(id));
453
- problems.push(
454
- `Boundary "${left.label}" crosses boundary "${right.label}" because their memberships partially overlap `
455
- + `(shared: ${shared.map((id) => `"${id}"`).join(', ')}; `
456
- + `only in "${left.label}": ${leftOnly.map((id) => `"${id}"`).join(', ')}; `
457
- + `only in "${right.label}": ${rightOnly.map((id) => `"${id}"`).join(', ')}) — `
458
- + 'keep one boundary fully nested by removing outside members, or split the boundary.',
459
- );
460
- continue;
461
- }
462
-
463
- if (!rectsOverlap(left, right)) continue;
464
- const leftContainsRight = rectContains(left, right);
465
- const rightContainsLeft = rectContains(right, left);
466
- if (!leftContainsRight && !rightContainsLeft) {
467
- problems.push(
468
- `Boundary "${left.label}" and boundary "${right.label}" final frames partially overlap — `
469
- + 'adjust wraps, pad, or component positions so the frames are disjoint or one fully contains the other.',
470
- );
471
- continue;
472
- }
473
-
474
- if (!shared.length) {
475
- problems.push(
476
- `Boundary "${left.label}" and boundary "${right.label}" final frames overlap even though their memberships are disjoint — `
477
- + 'adjust pad or component positions so the frames are disjoint, or make wraps express the intended nesting.',
478
- );
479
- continue;
480
- }
481
-
482
- const containmentMatchesMembership = (leftNested && rightContainsLeft)
483
- || (rightNested && leftContainsRight);
484
- if (!containmentMatchesMembership) {
485
- problems.push(
486
- `Boundary "${left.label}" and boundary "${right.label}" final frame containment contradicts their wraps membership — `
487
- + 'reduce the inner boundary pad, move its components, or correct wraps so geometry and nesting agree.',
488
- );
489
- }
490
- }
491
- }
492
- for (const b of boundaries) {
493
- if (b.x < 0 || b.y < 0 || b.x + b.width > viewBox[0] || b.y + b.height > viewBox[1]) {
494
- problems.push(`Boundary "${b.label}" extends outside the viewBox — its members sit too close to the canvas edge; add margin or enlarge meta.viewBox.`);
495
- }
496
- }
497
-
498
- for (const conn of asArray(arch.connections)) {
499
- if (!components.has(conn.from)) problems.push(`Connection "${conn.label || conn.from}" references unknown source "${conn.from}".`);
500
- if (!components.has(conn.to)) problems.push(`Connection "${conn.label || conn.to}" references unknown target "${conn.to}".`);
501
- if (components.has(conn.from) && components.has(conn.to)) {
502
- const routed = pathFor(conn);
503
- const [start, end] = [routed.points[0], routed.points[routed.points.length - 1]];
504
- const distance = Math.hypot(end[0] - start[0], end[1] - start[1]);
505
- if (distance < 24) problems.push(`Connection "${conn.label || `${conn.from}->${conn.to}`}" is too short (${Math.round(distance)}px; minimum 24px) — place its components farther apart.`);
506
- }
507
- }
508
-
509
- problems.push(...cleanEndpointSideProblems({
510
- relations: arch.connections,
511
- endpointIds: new Set(components.keys()),
512
- pathFor,
513
- diagramType: 'architecture',
514
- relationCollection: 'connections',
515
- fromSideFor: (conn) => connectionEndpointSide(conn, 'source'),
516
- toSideFor: (conn) => connectionEndpointSide(conn, 'target'),
517
- routeHint: 'keep automatic routing so the renderer can use a side-aware bridge, or set truthful fromSide/toSide with perpendicular via segments',
518
- }));
519
- problems.push(...cleanFlowProblems({
520
- relations: arch.connections,
521
- obstacles: components.values(),
522
- pathFor,
523
- diagramType: 'architecture',
524
- relationCollection: 'connections',
525
- obstacleKind: 'component',
526
- routeHint: 'adjust fromSide/toSide, set route/via, or move the component'
527
- }));
528
- problems.push(...cleanCrossingProblems({
529
- relations: arch.connections,
530
- endpointIds: new Set(components.keys()),
531
- pathFor,
532
- diagramType: 'architecture',
533
- relationCollection: 'connections',
534
- profile: arch.meta?.quality_profile,
535
- routeHint: 'adjust route/via or fromSide/toSide so the connections use separate corridors'
536
- }));
537
- problems.push(...cleanAmbiguousCorridorProblems({
538
- relations: arch.connections,
539
- endpointIds: new Set(components.keys()),
540
- pathFor,
541
- diagramType: 'architecture',
542
- relationCollection: 'connections',
543
- profile: arch.meta?.quality_profile,
544
- routeHint: 'adjust route/via or fromSide/toSide so unrelated connections do not visually merge'
545
- }));
546
- problems.push(...cleanBorderRunProblems({
547
- relations: arch.connections,
548
- endpointIds: new Set(components.keys()),
549
- frames: compositionFrames,
550
- pathFor,
551
- diagramType: 'architecture',
552
- relationCollection: 'connections',
553
- profile: arch.meta?.quality_profile,
554
- routeHint: 'adjust route/via or fromSide/toSide so the connection crosses the boundary perpendicularly instead of following its border'
555
- }));
556
- problems.push(...cleanRouteRhythmProblems({
557
- relations: arch.connections,
558
- endpointIds: new Set(components.keys()),
559
- pathFor,
560
- diagramType: 'architecture',
561
- relationCollection: 'connections',
562
- profile: arch.meta?.quality_profile,
563
- routeHint: 'move route/via points into a wider corridor or move the component so every turn has room to read'
564
- }));
565
-
566
- // Connection labels must not land on top of components.
567
- const labelRects = [];
568
- for (const [connectionIndex, conn] of asArray(arch.connections).entries()) {
569
- if (!conn.label || !components.has(conn.from) || !components.has(conn.to)) continue;
570
- const [lx, ly] = labelPoint(conn, pathFor(conn).points);
571
- const w = Math.max(30, textUnits(conn.label) * 4.8 + 10);
572
- labelRects.push({ relation: conn, relationIndex: connectionIndex, label: conn.label, x: lx - w / 2, y: ly - 10, width: w, height: 14, lx, ly });
573
- }
574
- for (const rect of labelRects) {
575
- for (const c of components.values()) {
576
- if (rectsOverlap(rect, c, -2)) {
577
- problems.push(`Label "${rect.label}" overlaps component "${c.id}" — adjust labelDx/labelDy/labelSegment or set labelAt.\n${suggestLabelObstacleFix(rect, rect.lx, rect.ly, c)}`);
578
- }
579
- }
580
- if (enforcesBoundaryTitleComposition) {
581
- for (const boundary of boundaries) {
582
- if (!rectsOverlap(boundary.title, rect)) continue;
583
- problems.push(
584
- `Boundary label "${boundary.label}" overlaps connection label "${rect.label}" — move the boundary title rail by adjusting wrapped component positions, or move the connection label with labelAt/labelDx/labelDy/labelSegment.`,
585
- );
586
- }
587
- }
588
- }
589
- problems.push(...cleanLabelRouteClearanceProblems({
590
- relations: arch.connections,
591
- labels: labelRects,
592
- endpointIds: new Set(components.keys()),
593
- pathFor,
594
- diagramType: 'architecture',
595
- relationCollection: 'connections',
596
- profile: arch.meta?.quality_profile,
597
- }));
598
-
599
- if (problems.length) {
600
- throwDiagnosticProblems('Architecture layout validation failed', problems, {
601
- subject: { diagramType: 'architecture' },
602
- });
603
- }
604
- }
605
-
606
- function buildLayoutReport() {
607
- const labels = [];
608
- for (const conn of asArray(arch.connections)) {
609
- if (!conn.label || !components.has(conn.from) || !components.has(conn.to)) continue;
610
- const [lx, ly] = labelPoint(conn, pathFor(conn).points);
611
- const w = Math.max(30, textUnits(conn.label) * 4.8 + 10);
612
- labels.push({
613
- text: conn.label,
614
- x: Math.round(lx - w / 2),
615
- y: Math.round(ly - 10),
616
- width: Math.round(w),
617
- height: 14,
618
- labelAt: [Math.round(lx), Math.round(ly)],
619
- });
620
- }
621
- return {
622
- ok: true,
623
- diagram_type: 'architecture',
624
- layout: grid ? { mode: 'grid', ...grid } : { mode: 'free' },
625
- viewBox,
626
- components: [...components.values()].map(componentBox),
627
- boundaries: boundaries.map(boundaryBox),
628
- connections: asArray(arch.connections)
629
- .filter((conn) => components.has(conn.from) && components.has(conn.to))
630
- .map((conn) => {
631
- const routed = pathFor(conn);
632
- const labelAt = conn.label ? labelPoint(conn, routed.points) : null;
633
- return connectionPath(conn, routed, labelAt);
634
- }),
635
- labels,
636
- };
637
- }
638
-
639
- // ---- Connection routing ------------------------------------------------------
640
- function routeClearsComponents(conn, points, clearance = 2) {
641
- const endpointIds = new Set([conn.from, conn.to]);
642
- for (const component of components.values()) {
643
- if (endpointIds.has(component.id)) continue;
644
- for (let index = 0; index < points.length - 1; index += 1) {
645
- if (segmentIntersectsRect({ start: points[index], end: points[index + 1] }, component, clearance)) {
646
- return false;
647
- }
648
- }
649
- }
650
- return true;
651
- }
652
-
653
- function routeClearsEndpointComponents(points, from, to) {
654
- const lastSegment = points.length - 2;
655
- for (let index = 0; index <= lastSegment; index += 1) {
656
- const segment = { start: points[index], end: points[index + 1] };
657
- if (index > 0 && segmentIntersectsRect(segment, from)) return false;
658
- if (index < lastSegment && segmentIntersectsRect(segment, to)) return false;
659
- }
660
- return true;
661
- }
662
-
663
- const OUTWARD_SIDE_VECTOR = {
664
- left: [-1, 0],
665
- right: [1, 0],
666
- top: [0, -1],
667
- bottom: [0, 1],
668
- };
669
-
670
- function outwardStub(point, side, distance = 24) {
671
- const [dx, dy] = OUTWARD_SIDE_VECTOR[side] || [0, 0];
672
- return [point[0] + dx * distance, point[1] + dy * distance];
673
- }
674
-
675
- function collinearBacktrack(a, b, c) {
676
- const first = [b[0] - a[0], b[1] - a[1]];
677
- const second = [c[0] - b[0], c[1] - b[1]];
678
- const cross = first[0] * second[1] - first[1] * second[0];
679
- const dot = first[0] * second[0] + first[1] * second[1];
680
- return Math.abs(cross) <= 0.0001 && dot < -0.0001;
681
- }
682
-
683
- function sideAwareBridgeCandidates(start, end, fromSide, toSide) {
684
- const startStub = outwardStub(start, fromSide);
685
- const endStub = outwardStub(end, toSide);
686
- const rawCandidates = [];
687
- const minimumBridge = 16;
688
- const verticalSides = new Set(['top', 'bottom']);
689
- const horizontalSides = new Set(['left', 'right']);
690
-
691
- // Port spreading can leave parallel-side anchors only a few pixels apart.
692
- // Route through a bounded outside channel so we keep both endpoint normals
693
- // without introducing a tiny, noisy connector between the two stubs.
694
- if (verticalSides.has(fromSide) && verticalSides.has(toSide)
695
- && Math.abs(start[0] - end[0]) < minimumBridge) {
696
- for (const channelX of [
697
- Math.max(start[0], end[0]) + minimumBridge,
698
- Math.min(start[0], end[0]) - minimumBridge,
699
- ]) {
700
- rawCandidates.push([
701
- startStub,
702
- [channelX, startStub[1]],
703
- [channelX, endStub[1]],
704
- endStub,
705
- ]);
706
- }
707
- }
708
- if (horizontalSides.has(fromSide) && horizontalSides.has(toSide)
709
- && Math.abs(start[1] - end[1]) < minimumBridge) {
710
- for (const channelY of [
711
- Math.max(start[1], end[1]) + minimumBridge,
712
- Math.min(start[1], end[1]) - minimumBridge,
713
- ]) {
714
- rawCandidates.push([
715
- startStub,
716
- [startStub[0], channelY],
717
- [endStub[0], channelY],
718
- endStub,
719
- ]);
720
- }
721
- }
722
-
723
- rawCandidates.push(
724
- [startStub, [endStub[0], startStub[1]], endStub],
725
- [startStub, [startStub[0], endStub[1]], endStub],
726
- );
727
- return rawCandidates.map((candidate) => normalizeRoutePoints([start, ...candidate, end]))
728
- .filter((points) => points.length >= 2)
729
- .filter((points) => !collinearBacktrack(points[0], points[1], points[2] || points[1]))
730
- .filter((points) => !collinearBacktrack(points.at(-3) || points.at(-2), points.at(-2), points.at(-1)))
731
- .filter((points) => routeHonorsEndpointSides(points, fromSide, toSide))
732
- .map((points) => points.slice(1, -1));
733
- }
734
-
735
- const AUTOMATIC_PORT_CORNER_GUTTER = 16;
736
- const AUTOMATIC_PORT_ALIGNMENT_DELTA = 16;
737
-
738
- function portHasCornerClearance(rect, side, point) {
739
- if (side === 'left' || side === 'right') {
740
- const inset = Math.min(AUTOMATIC_PORT_CORNER_GUTTER, rect.height / 2);
741
- return point[1] >= rect.y + inset && point[1] <= rect.y + rect.height - inset;
742
- }
743
- if (side === 'top' || side === 'bottom') {
744
- const inset = Math.min(AUTOMATIC_PORT_CORNER_GUTTER, rect.width / 2);
745
- return point[0] >= rect.x + inset && point[0] <= rect.x + rect.width - inset;
746
- }
747
- return false;
748
- }
749
-
750
- function alignFacingPorts(conn, from, to, start, end, fromSide, toSide, ports) {
751
- const hasExplicitGeometry = (
752
- conn.via
753
- || (conn.route && conn.route !== 'auto')
754
- || conn.channelX !== undefined
755
- || conn.channelY !== undefined
756
- || conn.labelAt
757
- );
758
- const horizontallyFacing = (
759
- (fromSide === 'right' && toSide === 'left')
760
- || (fromSide === 'left' && toSide === 'right')
761
- );
762
- const verticallyFacing = (
763
- (fromSide === 'bottom' && toSide === 'top')
764
- || (fromSide === 'top' && toSide === 'bottom')
765
- );
766
- if (hasExplicitGeometry || (!horizontallyFacing && !verticallyFacing)) return { start, end };
767
-
768
- const fromSpread = Boolean(ports?.from);
769
- const toSpread = Boolean(ports?.to);
770
- if (fromSpread && toSpread) return { start, end };
771
- const hasExplicitSides = (
772
- (conn.fromSide && conn.fromSide !== 'auto')
773
- || (conn.toSide && conn.toSide !== 'auto')
774
- );
775
- if (!fromSpread && !toSpread && hasExplicitSides) return { start, end };
776
-
777
- const alignmentDelta = horizontallyFacing
778
- ? Math.abs(start[1] - end[1])
779
- : Math.abs(start[0] - end[0]);
780
- if (alignmentDelta >= AUTOMATIC_PORT_ALIGNMENT_DELTA) return { start, end };
781
-
782
- // Keep the shared endpoint's distinct spread slot and move only the
783
- // relationship's unshared endpoint onto that axis. With no spread endpoint,
784
- // retain the existing least-movement choice between the two facing sides.
785
- // If both endpoints are shared, preserve the outside bridge so no competing
786
- // port is silently collapsed.
787
- const alignEndToStart = horizontallyFacing
788
- ? { start, end: [end[0], start[1]] }
789
- : { start, end: [start[0], end[1]] };
790
- const alignStartToEnd = horizontallyFacing
791
- ? { start: [start[0], end[1]], end }
792
- : { start: [end[0], start[1]], end };
793
- const candidates = fromSpread
794
- ? [alignEndToStart]
795
- : toSpread
796
- ? [alignStartToEnd]
797
- : [alignEndToStart, alignStartToEnd];
798
- for (const candidate of candidates) {
799
- const points = [candidate.start, candidate.end];
800
- if (portHasCornerClearance(from, fromSide, candidate.start)
801
- && portHasCornerClearance(to, toSide, candidate.end)
802
- && routeHonorsEndpointSides(points, fromSide, toSide)
803
- && routeClearsEndpointComponents(points, from, to)
804
- && routeClearsComponents(conn, points)) {
805
- return candidate;
806
- }
807
- }
808
- return { start, end };
809
- }
810
-
811
- function routeVia(conn, from, to, start, end, fromSide, toSide) {
812
- if (conn.via) return conn.via;
813
- switch (conn.route || 'auto') {
814
- case 'straight':
815
- return [];
816
- case 'orthogonal-h': {
817
- const midX = (start[0] + end[0]) / 2;
818
- return [[midX, start[1]], [midX, end[1]]];
819
- }
820
- case 'orthogonal-v': {
821
- const midY = (start[1] + end[1]) / 2;
822
- return [[start[0], midY], [end[0], midY]];
823
- }
824
- case 'auto':
825
- default: {
826
- // Direct line unless the anchors are clearly orthogonal-friendly.
827
- const deltaX = Math.abs(start[0] - end[0]);
828
- const deltaY = Math.abs(start[1] - end[1]);
829
- if ((deltaX < 4 || deltaY < 4) && routeHonorsEndpointSides([start, end], fromSide, toSide)) return [];
830
-
831
- const rhythmBridge = automaticPortRhythmBridge(start, end, fromSide, toSide, {
832
- accept: (points) => (
833
- routeClearsEndpointComponents(points, from, to)
834
- && routeClearsComponents(conn, points)
835
- ),
836
- });
837
- if (rhythmBridge) return rhythmBridge.slice(1, -1);
838
-
839
- // Automatic port spreading can leave otherwise aligned endpoints only a
840
- // few pixels apart. A midpoint route would split that tiny difference
841
- // into two unreadable endpoint stubs, so take a bounded outside channel
842
- // when both anchors sit on parallel component sides.
843
- const minimumStub = 8;
844
- const fromVerticalSide = start[1] === from.y || start[1] === from.y + from.height;
845
- const toVerticalSide = end[1] === to.y || end[1] === to.y + to.height;
846
- if (fromVerticalSide && toVerticalSide && deltaX < minimumStub * 2) {
847
- const outsideChannels = [
848
- Math.max(start[0], end[0]) + minimumStub * 2,
849
- Math.min(start[0], end[0]) - minimumStub * 2,
850
- ];
851
- for (const channelX of outsideChannels) {
852
- const candidate = [[channelX, start[1]], [channelX, end[1]]];
853
- const points = [start, ...candidate, end];
854
- if (routeHonorsEndpointSides(points, fromSide, toSide) && routeClearsComponents(conn, points)) return candidate;
855
- }
856
- }
857
-
858
- const fromHorizontalSide = start[0] === from.x || start[0] === from.x + from.width;
859
- const toHorizontalSide = end[0] === to.x || end[0] === to.x + to.width;
860
- if (fromHorizontalSide && toHorizontalSide && deltaY < minimumStub * 2) {
861
- const outsideChannels = [
862
- Math.max(start[1], end[1]) + minimumStub * 2,
863
- Math.min(start[1], end[1]) - minimumStub * 2,
864
- ];
865
- for (const channelY of outsideChannels) {
866
- const candidate = [[start[0], channelY], [end[0], channelY]];
867
- const points = [start, ...candidate, end];
868
- if (routeHonorsEndpointSides(points, fromSide, toSide) && routeClearsComponents(conn, points)) return candidate;
869
- }
870
- }
871
-
872
- const midX = (start[0] + end[0]) / 2;
873
- const horizontalFirst = [[midX, start[1]], [midX, end[1]]];
874
- const midY = (start[1] + end[1]) / 2;
875
- const verticalFirst = [[start[0], midY], [end[0], midY]];
876
- const candidates = [horizontalFirst, verticalFirst];
877
- const sideSafe = candidates.filter((candidate) => (
878
- routeHonorsEndpointSides([start, ...candidate, end], fromSide, toSide)
879
- ));
880
- const sideAware = sideAwareBridgeCandidates(start, end, fromSide, toSide);
881
- const nearParallelPorts = (
882
- ((fromSide === 'top' || fromSide === 'bottom')
883
- && (toSide === 'top' || toSide === 'bottom')
884
- && deltaX < minimumStub * 2)
885
- || ((fromSide === 'left' || fromSide === 'right')
886
- && (toSide === 'left' || toSide === 'right')
887
- && deltaY < minimumStub * 2)
888
- );
889
- const ordered = [
890
- ...(nearParallelPorts ? sideAware : sideSafe),
891
- ...(nearParallelPorts ? sideSafe : sideAware),
892
- ...candidates.filter((candidate) => !sideSafe.includes(candidate)),
893
- ];
894
- for (const candidate of ordered) {
895
- const points = [start, ...candidate, end];
896
- if (routeClearsEndpointComponents(points, from, to) && routeClearsComponents(conn, points)) return candidate;
897
- }
898
-
899
- // Both bounded doglegs are blocked. Keep the best endpoint-safe route
900
- // when one exists so the universal Clean Flow gate reports the actual
901
- // obstacle; otherwise preserve the historical deterministic fallback
902
- // and let the endpoint-direction gate explain the side mismatch.
903
- return sideSafe[0] || sideAware[0] || horizontalFirst;
904
- }
905
- }
906
- }
907
-
908
- const pathCache = new Map();
909
- const automaticPorts = automaticPortSpread(arch.connections, components);
910
- function connectionSides(conn) {
911
- const from = components.get(conn.from);
912
- const to = components.get(conn.to);
913
- return {
914
- fromSide: chosenSide(conn.fromSide, defaultFromSide(from, to)),
915
- toSide: chosenSide(conn.toSide, defaultToSide(from, to)),
916
- };
917
- }
918
-
919
- function connectionEndpointSide(conn, endpoint) {
920
- const field = endpoint === 'source' ? 'fromSide' : 'toSide';
921
- if (conn[field] && conn[field] !== 'auto') return conn[field];
922
- return connectionSides(conn)[field];
923
- }
924
-
925
- function pathFor(conn) {
926
- if (pathCache.has(conn)) return pathCache.get(conn);
927
- const from = components.get(conn.from);
928
- const to = components.get(conn.to);
929
- const ports = automaticPorts.get(conn);
930
- const { fromSide, toSide } = connectionSides(conn);
931
- const baseStart = ports?.from || anchor(from, fromSide);
932
- const baseEnd = ports?.to || anchor(to, toSide);
933
- const { start, end } = alignFacingPorts(
934
- conn,
935
- from,
936
- to,
937
- baseStart,
938
- baseEnd,
939
- fromSide,
940
- toSide,
941
- ports,
942
- );
943
- const points = [start, ...routeVia(conn, from, to, start, end, fromSide, toSide), end];
944
- const routed = { d: roundedPath(points, 8), points };
945
- pathCache.set(conn, routed);
946
- return routed;
947
- }
948
-
949
- // ---- Rendering ---------------------------------------------------------------
950
- function renderBoundaryFrame(b, index) {
951
- const cls = b.kind === 'security-group' ? 'c-security-group' : 'c-region';
952
- const rx = b.kind === 'security-group' ? 8 : 12;
953
- return ` <rect data-graph-role="structural-frame" data-composition-frame-kind="${esc(b.kind || 'boundary')}" data-composition-frame-id="${index}" data-composition-frame-label="${esc(b.label)}" x="${b.x}" y="${b.y}" width="${b.width}" height="${b.height}" rx="${rx}" class="${cls}" stroke-width="1"/>`;
954
- }
955
-
956
- function renderBoundaryLabel(b, index) {
957
- const labelCls = b.kind === 'security-group' ? 't-security' : 't-cloud';
958
- return ` <g data-graph-role="structural-frame-label" data-composition-frame-id="${index}" data-composition-frame-kind="${esc(b.kind || 'boundary')}" data-composition-frame-label="${esc(b.label)}">
959
- <rect data-graph-role="structural-frame-label-mask" x="${b.title.x}" y="${b.title.y}" width="${b.title.width}" height="${b.title.height}" rx="3" class="c-mask"/>
960
- <text data-boundary-label="" x="${b.title.x + 4}" y="${b.title.y + b.title.baselineOffset}" class="${labelCls}" font-size="${b.title.fontSize}" font-weight="600">${esc(b.label)}</text>
961
- </g>`;
962
- }
963
-
964
- function renderConnectionPath(conn, index) {
965
- const [cls, marker] = arrowClassMap[conn.variant || 'default'] || arrowClassMap.default;
966
- const routed = pathFor(conn);
967
- const strokeWidth = conn.width || (conn.variant === 'emphasis' ? 1.8 : 1.5);
968
- return ` <path ${focusEdgeAttrs(conn.from, conn.to, conn.label, index, conn.id)} data-composition-points="${routePointsValue(routed.points)}" d="${routed.d}" class="${cls}"${animateAttr(arch.meta, 'edge', index)} stroke-width="${strokeWidth}" marker-end="url(#${marker})"/>`;
969
- }
970
-
971
- function renderConnectionLabel(conn, index) {
972
- if (!conn.label) return '';
973
- const [lx, ly] = labelPoint(conn, pathFor(conn).points);
974
- const w = Math.max(30, textUnits(conn.label) * 4.8 + 10);
975
- return ` <g data-detail="context" ${focusEdgeAttrs(conn.from, conn.to, conn.label, index, conn.id)}>
976
- <rect x="${lx - w / 2}" y="${ly - 10}" width="${w}" height="14" rx="3" class="c-mask"/>
977
- <text x="${lx}" y="${ly}" class="${variantAccent(conn.variant)}" font-size="8" text-anchor="middle">${esc(conn.label)}</text>
978
- </g>`;
979
- }
980
-
981
- function renderComponent(c) {
982
- const fill = componentFill[c.type] || 'c-external';
983
- const accent = componentText[c.type] || 't-muted';
984
- const cx = c.cx;
985
- const hasSub = c.sublabel != null && c.sublabel !== '';
986
- const labelY = hasSub ? c.y + c.height / 2 - 2 : c.y + c.height / 2 + 4;
987
- const sub = hasSub
988
- ? `\n <text data-detail="context" x="${cx}" y="${c.y + c.height / 2 + 14}" class="t-muted" font-size="${fittedNodeFontSize(c.sublabel, c.width, componentTextFit.sublabelPreferred, componentTextFit.sublabelMinimum)}" text-anchor="middle">${esc(c.sublabel)}</text>`
989
- : '';
990
- const tag = c.tag
991
- ? `\n <text data-detail="fine" x="${cx}" y="${c.y + c.height - 8}" class="${accent}" font-size="${fittedNodeFontSize(c.tag, c.width, componentTextFit.tagPreferred, componentTextFit.tagMinimum)}" text-anchor="middle">${esc(c.tag)}</text>`
992
- : '';
993
- const brand = renderBrandMark(c, { x: c.x + c.width - 22, y: c.y + 6 });
994
- const labelFontSize = fittedNodeFontSize(c.label, brandLabelFitWidth(c, c.width), 11, 8);
995
- const passport = { kind: c.type, sublabel: c.sublabel, tag: c.tag, context: componentContext(c), ...brandMetadataFor(c) };
996
- return ` <g ${focusNodeAttrs(c.id, c.label, passport, arch.meta.locale)}>
997
- ${focusNodeTitle(c.label, passport)}
998
- <rect x="${c.x}" y="${c.y}" width="${c.width}" height="${c.height}" rx="6" class="c-mask"/>
999
- <rect x="${c.x}" y="${c.y}" width="${c.width}" height="${c.height}" rx="6" class="${fill}"${animateAttr(arch.meta, 'node', componentSteps.get(c.id))} stroke-width="1.5"/>
1000
- ${renderSemanticSigil(c.type, { x: c.x + 6, y: c.y + 6 })}${brand ? `\n ${brand}` : ''}
1001
- <text data-node-label=""${hasSub ? ' data-detail-anchor=""' : ''} x="${cx}" y="${labelY}" class="t-primary" font-size="${labelFontSize}" font-weight="600" text-anchor="middle">${esc(c.label)}</text>${sub}${tag}
1002
- </g>`;
1003
- }
1004
-
1005
- function renderLegend() {
1006
- const entries = architectureLegendEntries;
1007
- const relationshipObstacles = relationshipLegendObstacles(arch.connections, {
1008
- pointsFor: (connection) => pathFor(connection).points,
1009
- labelRectFor: (connection) => {
1010
- if (!connection.label) return null;
1011
- const [x, y] = labelPoint(connection, pathFor(connection).points);
1012
- const width = Math.max(30, textUnits(connection.label) * 4.8 + 10);
1013
- return { x: x - width / 2, y: y - 10, width, height: 14 };
1014
- },
1015
- });
1016
- const contentBottom = Math.max(
1017
- 0,
1018
- ...[...components.values()].map((component) => component.y + component.height),
1019
- ...boundaries.map((boundary) => boundary.y + boundary.height),
1020
- );
1021
- return renderResolvedLegend({
1022
- entries,
1023
- locale: arch.meta.locale,
1024
- layout: {
1025
- x: layout.margin,
1026
- baselineY: legendY(),
1027
- width: viewBox[0] - layout.margin * 2,
1028
- minTitleY: contentBottom + 8,
1029
- obstacles: relationshipObstacles,
1030
- unfit: arch.meta?.legend === undefined ? 'hide' : 'error',
1031
- diagramType: 'architecture',
1032
- },
1033
- renderSwatch: (entry) => `<rect x="${entry.x}" y="${entry.baseline - 9}" width="16" height="10" rx="2.5" class="${componentFill[entry.kind] || 'c-external'}" stroke-width="1"/>`,
1034
- });
1035
- }
1036
-
1037
- function renderSvg() {
1038
- return ` <svg viewBox="0 0 ${viewBox[0]} ${viewBox[1]}" ${svgRootAttrs(arch.meta)}>
1039
- ${svgAccessibleText(arch.meta, 'architecture')}
1040
- ${renderDefinitions()}
1041
-
1042
- <!-- Background Grid -->
1043
- <rect width="100%" height="100%" fill="url(#grid)" />
1044
-
1045
- <!-- Boundaries (behind everything) -->
1046
- ${boundaries.map(renderBoundaryFrame).join('\n\n')}
1047
-
1048
- <!-- Connection paths (before components for correct z-order) -->
1049
- ${asArray(arch.connections).map(renderConnectionPath).join('\n')}
1050
-
1051
- <!-- Components -->
1052
- ${[...components.values()].map(renderComponent).join('\n\n')}
1053
-
1054
- <!-- Connection labels -->
1055
- ${asArray(arch.connections).map(renderConnectionLabel).join('\n')}
1056
-
1057
- <!-- Boundary labels (foreground masks keep routes out of titles) -->
1058
- ${boundaries.map(renderBoundaryLabel).join('\n\n')}
1059
-
1060
- <!-- Legend -->
1061
- ${renderLegend()}
1062
- </svg>`;
1063
- }
1064
-
1065
- validateArchitecture();
1066
- if (layoutJsonMode) {
1067
- console.log(JSON.stringify(buildLayoutReport(), null, 2));
1068
- process.exit(0);
1069
- }
1070
- writeDiagram({
1071
- outPath,
1072
- template,
1073
- diagramType: 'architecture',
1074
- meta: arch.meta,
1075
- svg: renderSvg(),
1076
- cards: arch.cards,
1077
- sourceEvidence,
1078
- });