@xgent-ai/skills 0.7.5 → 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.
- package/.claude/hooks/xgent-statusline.js +32 -18
- package/README.md +61 -35
- package/bin/phoenix-diagram.js +14 -0
- package/bin/xgent-skills.js +132 -240
- package/dist/phoenix-diagram/LICENSE +21 -0
- package/dist/phoenix-diagram/NOTICE.md +34 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/005fc765ddc5115da796cca915baa9557abae13ff35e0a47c47affc56f6c414d.txt +272 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/010492e490b92ec85db01daad2a290ea5959f29314a1c4ff25e7a172e223abf9.txt +18 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f.txt +3 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/02bb8c3b4e70190e3986c0404ad2fd8d639b4f534252d82379cc1b502b6d1812.txt +191 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0552c898248eadfc130df0c0e8f6f82776fcb3f1dd5a5af2fa991b5baff9367a.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0ab4d106b6faac07fb6a051815fd1b4d862d730895e2d7d7358c2f13565e7a38.txt +20 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0d3f7c086c6b6cf3ea4aac714e9aa3e1fb02e355ce35bd21c56acf8d04390885.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/117829c3ca21efb132d81a44b55363d395ab8eea18526873bc828da4c0e5f038.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df.txt +26 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5.txt +373 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/1f485f0d6125658861351e3d6084ea90fefe78f89450be9915044b7c56d5a75a.txt +15 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b.txt +26 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/20fe7b00e904ed690e3b9fd6073784d3fc428141dbd10b81c01fd143d0797f58.txt +176 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/219920e865eee70b7dcfc948a86b099e7f4fe2de01bcca2ca9a20c0a033f2b59.txt +7 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d.txt +7 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3.txt +23 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5.txt +220 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/27995d58ad5c1145c1a8cd86244ce844886958a35eb2b78c6b772748669999ac.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/28a9529c7d0bb4dc51f4bf5c116a3d16ef247a052f7591466768ddf563fd1cf5.txt +428 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4.txt +26 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/30fefc3a7d6a0041541858293bcbea2dde4caa4c0a5802f996a7f7e8c0085652.txt +23 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3521672491a3479422d5fe1aca6645dd2984090f85da6e5205abfb18fb7a6897.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab.txt +176 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/36516aefdc84c5d5a1e7485425913a22dbda69eb1930c5e84d6ae4972b5194b9.txt +23 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/375bdbf54d6584debb4bcc5bce1c9dcfdd581f977c9a8469113dbdf208f4c927.txt +131 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/391a5396cec6230bfabd4ef4eb2350eb895bc5efce377a2218f5702ed020d3e3.txt +20 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/39712155836e5c10ef1b07037b606e4ad2d633e72205d162fdd7e2290aa54f15.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3bb1e548250b3acc43febde65a5cdba9f2e0a3288018aa41f009a3c59ffab51a.txt +390 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3bc70e239e91272782006c638fc0452a714d384224f11f0923036b7be07cf9b5.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3f3d9e0024b1921b067d6f7f88deb4a60cbe7a78e76c64e3f1d7fc3b779b9d04.txt +373 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3f941b3b89cf7b8370ceb83cc76d2120d471b58735d8ca60238a751a48d7f72f.txt +359 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737.txt +26 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/4455bf75a91154108304cb283e0fea9948c14f13e20d60887cf2552449dea3b1.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/451167c55c0fa447cc2d5632714f5e3c567fe4f1e1badefab2c1333852198aca.txt +542 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/45fd05c4865e7c350b98ad7ac50e1b15462d49af4a91e9b0c9dd933dc9a69742.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/4789210f4df8abc03fce1cddd9c2ba517f184840687f2815d741de282c1aa93a.txt +228 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/553fffcd9b1cb158bc3e9edc35da85ca5c3b3d7d2e61c883ebcfa8a65814b583.txt +13 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/5757a1f28eff735a8b5e7425478f367812d71e974530f5bedd01219480965f4a.txt +51 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a.txt +19 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/5e05b024f653a5ce199e77cbbbd42fb5553562ec714b819421ed0c3e552a75d7.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/60a7062291b01ba068f300612cdbdc20382ac1d4934f07bcdd7167c15299f309.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a.txt +176 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51.txt +187 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/71674605ec4c087fe9eb534e3e4f9e26eb2e4aabcd76a29fd156c6a844d44b3d.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7abd9b6960dcf7d4d0a48606a5b71bfe37d472db68d70637f3a58a56785f1621.txt +13 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7ca6700600dfa9c9497bf5556365067daa802c871ea78239f129309c7a2048f7.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4.txt +15 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c.txt +24 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7e5886959f67f8c75063a9d55cd3cb08c5a8cbea9a944fa1df2d4ae038f53721.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/7fea0ee51a4ca5d5cea7464135fd55e8b09caf3a61da3d451ac8a22af95c033f.txt +20 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32.txt +24 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/86dd7f026f916daf7511e39951ad8ea8cf55a8db67ae64060dacf829761c18f3.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8a35369f3ca263b3c62fbb5032947e53b6bfebc6c8a4d1bb982de1c069f6fba5.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8b43ce8accd61e9d370b5ca9e9c4f953279b5c239926c62315b40e24df51b726.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8bb1b50b0e5c9399ae33bd35fab2769010fa6c14e8860c729a52295d84896b7a.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8bce3b45e49ecd1461f223b46de133d8f62cd39f745cfdaf81bee554b908bd42.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/8c7516d4b27b1e495be5e38b612298b63de48d05f49cdac94f70f3cd70f8864b.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9046848b63a5c92bff14e4accca80bd987e0623b74adf9226ce5198d312b79d5.txt +30 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5.txt +12 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9117d922e667125508dde62b02c1f57ed22f5ad21eb536aa2e2d99e1c796e639.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9387c2d197e2370a740ca457dae1662c56de56b811ee4862024343961307f9bf.txt +19 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/946c9835d8034d24404f8cfec5f4654cee5dad17e944afc3d06d742cf2882831.txt +240 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/95bd3988beee069fa2848f648dab43cc6e0b2add2ad6bcb17360caf749802bcc.txt +176 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9ba9550ad48438d0836ddab3da480b3b69ffa0aac7b7878b5a0039e7ab429411.txt +396 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3.txt +202 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9e0dfd2dd4173a530e238cb6adb37aa78c34c6bc7444e0e10c1ab5d8881f63ba.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9f2ae19ef94ba82887729a4a1617ff25eede56611dd21a4b2c6f797df30fca33.txt +2013 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/9fa38f610a00115dd1f612bdd3559e3b381ea579538b6ff25a5899da250a5fce.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a00511478c83ebb464ef19d840f061c7444adc4636bb561900e75c5808cfc6cc.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499.txt +121 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a5dea80c1f383cb5f80a6bb0da5e55a2beb9f24adb123ce6300af2cbaaa3bf65.txt +19 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ae9baa7beea910273c2f384c2a6b721fb7bd02bda3436074a1072e4ee689f985.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b1181a40b2a7b25cf66fd01481713bc1005df082c53ef73e851e55071b102744.txt +19 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b3d734001a94efff3579978d953391aa7115f877657d25eb54037a43875d078a.txt +9 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1.txt +27 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b68ad1a3367b825447089e1f8d6829b97f47a89eb78d2f4ebaef4672f5606186.txt +22 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/b7e650f3fce5c53249d1cdc608b54df156a97edd636cf9d23498d0cfe7aec63e.txt +19 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c09aae9d3c77b531f56351a9947bc7446511d6b025b3255312d3e3442a9a7583.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383.txt +21 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c30152c94a6d75e021adbc52b3a52470366a46edb917e17deae3259251af244c.txt +42 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c394e3bda1f3b9378f30a7cab11242887eeeafc73c7bef36a0fe13e09691e18b.txt +17 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4.txt +201 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c962ee4d1d05ddc138b202b2540219ebc57893fcf97b364852094a9a94ce1365.txt +7 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30.txt +202 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/d1fc1bc0d155df60b2e7705b6b2ae02a05c96f948e1cec6e2fb86360b09f346b.txt +29 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/d5c22aa3118d240e877ad41c5d9fa232f9c77d757d4aac0c2f943afc0a95e0ef.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/d5fca2653c88ad02d197faead77e22b80c70636b5bec6e02f2805f389a21b86d.txt +10 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a.txt +1 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/dc91f8200e4b2a1f9261035d4c18c33c246911a6c0f7b543d75347e61b249cff.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ddea4e94a1c35ed9826e54e13a5b50b8f81b21665a00ca07c8861f1859e56b6b.txt +14 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/e271993808fec50ab29350b39539cdec611a9103f827e0aa26d61da70e2d33f8.txt +61 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/e66c269d4819aaab34b49ef5220c4ddab6756f21bb5180761a4eb8561f2b7bbd.txt +438 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829.txt +22 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f025ccfb7dfb6bdfedc75ca0f67acc69e6fb4998143d834f7c2f38a29989680f.txt +13 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2.txt +46 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f7715d38a3fa1b4ac97c5729740752505a39cb92ee83ab5b102aeb5eaa7cdea4.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1.txt +39 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/f9c4c77baa3828004ee54b8a4f2db2e88ed44a6237a493965bf551fac0fcb62d.txt +17 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85.txt +373 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2.txt +25 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/ff92bed461f50338dd703a9ba9aee496a425957873df1d91192776e4bdf5dda7.txt +74 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/COPYRIGHT-library.html +29357 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/Apache-2.0.txt +73 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/BSD-2-Clause.txt +9 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/CC-BY-SA-4.0.txt +427 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/GCC-exception-3.1.txt +30 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/GPL-2.0-only.txt +133 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/GPL-3.0-or-later.txt +202 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/ISC.txt +7 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/LLVM-exception.txt +15 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/MIT.txt +9 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/NCSA.txt +29 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/OFL-1.1.txt +43 -0
- package/dist/phoenix-diagram/THIRD-PARTY-LICENSES/rust-std-1.99.1/licenses/Unicode-3.0.txt +39 -0
- package/dist/phoenix-diagram/THIRD-PARTY-NOTICES.md +210 -0
- package/dist/phoenix-diagram/THIRD-PARTY.json +5459 -0
- package/dist/phoenix-diagram/VERSION.json +39 -0
- package/dist/phoenix-diagram/bundle/ENGINE.json +39 -0
- package/dist/phoenix-diagram/bundle/SKILL.md +109 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.architecture.json +11 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.class.json +23 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.dataflow.json +11 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.erd.json +25 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.lifecycle.json +11 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.sequence.json +13 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.timeline.json +15 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.tree.json +13 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.waterfall.json +12 -0
- package/dist/phoenix-diagram/bundle/examples/minimal.workflow.json +12 -0
- package/dist/phoenix-diagram/bundle/manifest.json +253 -0
- package/dist/phoenix-diagram/bundle/references/architecture-compare.md +111 -0
- package/dist/phoenix-diagram/bundle/references/authoring-defaults.md +42 -0
- package/dist/phoenix-diagram/bundle/references/brand-marks.md +52 -0
- package/dist/phoenix-diagram/bundle/references/compatibility.md +22 -0
- package/dist/phoenix-diagram/bundle/references/delivery-contract.md +127 -0
- package/dist/phoenix-diagram/bundle/references/extending-types.md +14 -0
- package/dist/phoenix-diagram/bundle/references/migration.md +57 -0
- package/dist/phoenix-diagram/bundle/references/preview.md +45 -0
- package/dist/phoenix-diagram/bundle/references/repository-authoring.md +29 -0
- package/dist/phoenix-diagram/bundle/references/viewer-runtime.md +27 -0
- package/dist/phoenix-diagram/bundle/schemas/README.md +23 -0
- package/dist/phoenix-diagram/bundle/schemas/architecture.schema.json +329 -0
- package/dist/phoenix-diagram/bundle/schemas/class.schema.json +348 -0
- package/dist/phoenix-diagram/bundle/schemas/common.schema.json +358 -0
- package/{skills/archify → dist/phoenix-diagram/bundle}/schemas/dataflow.schema.json +36 -8
- package/dist/phoenix-diagram/bundle/schemas/erd.schema.json +384 -0
- package/dist/phoenix-diagram/bundle/schemas/lifecycle.schema.json +202 -0
- package/{skills/archify → dist/phoenix-diagram/bundle}/schemas/sequence.schema.json +41 -10
- package/dist/phoenix-diagram/bundle/schemas/timeline.schema.json +170 -0
- package/dist/phoenix-diagram/bundle/schemas/tree.schema.json +144 -0
- package/dist/phoenix-diagram/bundle/schemas/waterfall.schema.json +150 -0
- package/{skills/archify → dist/phoenix-diagram/bundle}/schemas/workflow.schema.json +42 -10
- package/dist/phoenix-diagram/bundle/scripts/phoenix-bootstrap.cjs +589 -0
- package/dist/phoenix-diagram/bundle/scripts/phoenix-diagram +6 -0
- package/dist/phoenix-diagram/bundle/scripts/phoenix-launcher.cjs +10 -0
- package/dist/phoenix-ui/THIRD-PARTY.json +164 -158
- package/dist/phoenix-ui/VERSION.json +17 -17
- package/dist/phoenix-ui/bundle/blobs/00727f7b333a7be8ac7740aa257a3a3f691db8ae545a6afab2b787acab5e88df +46 -0
- package/dist/phoenix-ui/bundle/blobs/{547e3c89d5b8feeddd67e43131fd84b95253eb42bf7d730b4e471dba011f6e51 → 00f4a6a630f31eb05fbdd5725e4a294233d24574bd70f4f32f4597d8256a7c1c} +0 -4
- package/dist/phoenix-ui/bundle/blobs/{41400e182e2180a567923d58bfa935d2799a54f2a747b2c5813c3884c84f768b → 04057592e18ea9dd3c4edcac14cde3fa5b75239c2552d4459db8e047068f61a8} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{34571f7d46632205d518d15cb008457494dfad745c6b483bb11d63ca3a22ac48 → 0cb3bf26e1980b0e530373fb32edbe5864a171492a04e2abe1952ffe78bff231} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{852d2943678a76c33b2f7a090d2ca6c152cd120e9ae62775fcc91519b9289011 → 0e684572eb98d24b39cd70fa23e66c163178f5a11756dcf8a98fe2335636b33f} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{d17b3a454146e74ef4ecf69d7b72a8fa45c4fe1c695dffb0d36690b653cd2d8f → 10553c45c7bf38e527a57a281c4365152a768b4dd7ef597ff34ae841e9ff7d41} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{e49257c0fd32b195cccb16fbfda769c007be6b38f25aceefecd23cfff9366cec → 125bc7030d7f2ba789d7b1d5f474af34f8902b764e7bc351b98f1f6f55779929} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{74dbcbbad6c3831e95abb38775dd488c59ae9f1d44a95f5fd4bc0051577488fa → 13cf6c054ed424e2eb639ea12d20a4aa2b1c85eeb00afa8cbd8a30c6c22aadd8} +1 -1
- package/dist/phoenix-ui/bundle/blobs/1832ff9624cebd30370eb0e806665c656ac879215f93d33bcc0750baa47459dc +46 -0
- package/dist/phoenix-ui/bundle/blobs/{8e7de5ca347036a07f5f1e9cab942d8ff378d029bc101fa6d126406f3298c9db → 1864a10c29e7062cca5e49d1790dc7d9d8ea777bfa2ab6fd941635965cd0084d} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{784722b72224a7005a80cdcd6408dd2b25b23fd9619d0f6c8788f7ac681fad4c → 1ecc81de39d28b85b95e797bcc338d4213a50231c3315a741d14571fd22c844f} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{b8c614dc7c2eb30ee0f864fec116dbcafb39e5a199dce66d0c1a88b13f76265a → 2079e4146039a8dadf19a39237cbdc0b8b54ea1fa16d320716c2cbf58161c835} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{dba6e4a09c5d752e5ddebe7c2c1aefc9c4b2a84e01a3178599579778ed2d09e9 → 2813aa68c0804a7fe061d88201d8a684cac9987b48511e1e2cbfe0a869a67a82} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{2889c2817b5079abff254bb6d13f92dbde0fabc38be4acc7d20e613eef5e5829 → 2873e340be947c83c3d03520139b73524fd166a34063d2693d3b711021ea5b87} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{64c4aa2d1c24ae5028e987498ac544020d48600a51d9654b2df562681ba480f2 → 298ef41899acefa056eccf2345378078832db6d868d2377f471f896d5c1599f9} +6 -14
- package/dist/phoenix-ui/bundle/blobs/{1b7174a6f3f49a8efc8f7fa74ff84cf8960e2646b9bc976e4129a7c8ad608faa → 2b5cef2a14a5b1256ec6de9172a4f57f227948ced1921ef86e899f48524d7fb8} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{f148f630f43f3c91cf10feeda5a3c21448ca0683ce82d0fe763c1b43dee584d6 → 2d376cbbf7ec1e262614aac4f1b200e8f60e86e940c7137a2a26788bc857e509} +6 -7
- package/dist/phoenix-ui/bundle/blobs/2e5985a6eb339d70cfa25f6d2b420a0ef286caa8467f0226eb841702ec438d0b +46 -0
- package/dist/phoenix-ui/bundle/blobs/{7e199833376de5d2b6e088ee2965b448f94da842f28ccbd707e1cc3a295147c8 → 3322d691bf7b578b38723576df6b266993b2afb9e567b0cd1ded898ffe1dc17e} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{f82bfc4c6bc9169d4978d5e16fb925f6e152fdd21dc6a2fae719dfdc1645581f → 3625c5c2750f117021232ce81c1e39ac5ef7c21445729327b88cf54dfc937df0} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{2ceacad745665f79fd7ad5565646426a36a1b508c0469b931d0f202fad45a80b → 36310febe3e7bd4c9b21407603f2a04afefdc87b7821758bb47098b1b2876765} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{24d92a176573768bfffaf8f9c6483e58bceb5bf2a095d1cdf3d3a2c0bcda0707 → 3a9c2daf4ef284ca83b0e7f6fef3a5300e273c32b20769e090463cb8a8b0b06f} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{153e377c44b162cf0074698a61716db7f664db78f5635efa926bed484de4f54c → 3ce1a44efe39b93e7a39307c6a5e5f514e938fbae818e358986b4db1b05883ca} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{ad8ad0b7acf6c88ef9ce0ee1a640c2200da77821f0d97d605d4f1d4a10e5897a → 403fcde498d75abec7844ee31434201152ac229f7675772164d69563f0572da4} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{e8ee6c08e94b80324173d89d6f4cdc5b4829ea6858b3a11fc186588a490cada4 → 45d0e7eff0923c40296e971318756617944c4f1c97f03126cd74c0f8c629f8a4} +3 -1
- package/dist/phoenix-ui/bundle/blobs/{e23dabf908842be08751fc4e7f3b586e8c6b1ca0fc30303ec5317c77f83dcf26 → 4c0f396bfa85171f61972d3f3765733318769bb53fe06d2cdcb5d7f64578b5b8} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{a5517d32c1539c388c47c00879a0d807ed2989647bfa8c0844ef22328f75f5be → 4f6563876e0e0cc51c38a06767b8800eb3238611e9fdd11e5ff9dd487c742e74} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{a9d2203acd45ca33a13d5c68b02b23ed512425ac15f0e8438318ed124b43729d → 4fcada229d0c689c1a493d13184145a81ff40c498e882142ae390bda8e5b2492} +15 -0
- package/dist/phoenix-ui/bundle/blobs/5293adc55cf66068b6df20468ad9e91433fd1c48e75d66c86f874aca951a8fb9 +46 -0
- package/dist/phoenix-ui/bundle/blobs/{96e2e6bd4fcf9a2c6da65fb029f96d9176308fae2efd9d8653d3b8d838960e07 → 5436f0301ec258f3badcc6842019ee29a9b870d2727dc425fbc9cc0f4f88a284} +3 -1
- package/dist/phoenix-ui/bundle/blobs/{d0f4939e86a62b0ca437d51a997ceba7e77d64566b7fa8ca2747487e31ca819d → 54a09a4afdffca3cc135e5007716ea684dc1ed7a78349de859225c55a2fed810} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{d5102701d41f7c6195d410a873f742ac72c428b04196e47df5555c5ccaf80504 → 55277fa15eb4bd2f09bf7bb24c4e79df417b06654b1e10f502c7928b192fd7cc} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{878064e46af4e4109bab405f965e4149bee40bbe8912ffede10b74cec6cff027 → 567c3f42394f9aee9b048a001016a7ba9d8773d78027f8c995c379886634e719} +6 -3
- package/dist/phoenix-ui/bundle/blobs/57c8f33a7401f918566b8a4883871a69ef2223438c51f158c67f69e3250be465 +46 -0
- package/dist/phoenix-ui/bundle/blobs/{bc29e115fd337dda2cc7fc70b868dc18e426b08ec186fd270fcfe96bb2efaa5d → 61450dbef64859e3136cd17ae3e997134d5df5721d96985c4e07367f38522129} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{e3c1e925be0b2deb0e3765b83ab94b86560292364f275e98bb23a8bdf2c2e049 → 656bbfda3e72b40d53b5832293dc8700ad8a784e804a6246271bf0ea23527822} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{ffcaa5c58e779ec74d18bfc3013ad8003f6e7a23f629c1a3b878618961a8b6a3 → 68b454a99ba72c3b9b93ed96c4267847297169f6a5bf321b20e60d637c271068} +6 -3
- package/dist/phoenix-ui/bundle/blobs/68e44832c82b873b0aeb2da56def7b1de5f612c019445e5e28238c690124cbbe +46 -0
- package/dist/phoenix-ui/bundle/blobs/{45bbd4a8e02ca0012216c5c68e1dcd655ae0046bd50ba4295ef1f58ec4a0957c → 6b8d4c71355429a0b16bf367163fea46103a0a99b4e34f87608a39d85b1b980a} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{264815d0080e4862715a4f82542e66241c6563f07259d32aed4a17bbc329b9cc → 6cef874722442de7c60ea96f4221dc54cc4250a270cd05a1e818b58c5b43e232} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{2028a857c0476324a4256faf66693e2a869275e53a88d2b182a28b62c2a17893 → 7181f1f4c452c4345695f9100f6deb610f54f4c55f126043433a65b8491fc680} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{ccb76aabba47938d518a5d46a09d7e70c4a9222bc391e163763f2a7f12d30437 → 75850a8c9d2a8259f71ef1f86dd5d1325415227c1887e81a3467ae1ee400979f} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{4b03cdb5b17d534b5c7e84b079c066f59e8b60b9e454671a453867c4aeb9920d → 77bcc6c2d6ac00a8bfead3b6c6b5fc69f4b60bf086ebbc89271e1b23003168c9} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{9520e25a381c82af6f46e175b7c347d1dc513d933dd6cf8c52570c72abb4ca7f → 792552563745d208594cf4ade19110f2c811a0e1a2661ae1ef43a185ccff5a69} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{f7c8af35acf71a96056afb6afcff6a3ea42f65561f02652d04e11ad9ece9b8e9 → 7acd9b6f2f61b509c6a518508b8b52c2f0de67cdea4fd3f3d383b3ce8b38cf5e} +6 -7
- package/dist/phoenix-ui/bundle/blobs/7bacc1e3da7e8b7127ca3f8f69a2422098b9b2d23fbedefc56dfe76117c1c0e3 +46 -0
- package/dist/phoenix-ui/bundle/blobs/{78662176c1d31cec2d640f70df203f93cc1aec604cfc31619f4d2c62ab78861b → 8078b804bea630ed9c4ea07ec2f8ac92aba4128725860a66599eda90390d98f6} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{2291169748fe0c4c80634dff3083e7464f82d4358b9b2186759b316e612d466f → 88b150cb804bc141b80a5687a091f61b99627155c465a27adb88546ef615af92} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{bde88bf5ac59d744440d9b65f95ceaae01c803b101d48e6afd644a06eeb5de63 → 90f8b07ec12b78e633e306322cda58415aea70d8e0f9ff85bd439361c01dabe1} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{486145071d3445e82774f1b39b2bb15986ce52277e798a31ef7e9c27afb42af3 → 95b2944686e8258a655c3b5e6db68593e24e5199354e46aac553918ea2c0f55a} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{a1998e37084c11f496d4970f86a85d5a6375bbeaa4797b9f42bbac2d44048d23 → 979639f0e8859d600a8db57e733566d9ad37ff8258c3e05a6f9c0f3008e92373} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{3173293607055ea6e1a153ec6f51fb8154782157c8a61abf411da1f41be61728 → 9eaaa00049844060f842fe7fb73cc8edc4be5225cf38a96f33bda3ffc381456c} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{69086f7cb235b35ccc230e1f2da41cbb10cea8f0636b6d4514672113a3adc2cb → a420bbda622399399a6b5c7c3614dcaebc6c62faceaf7b3c83c97db53d26b165} +1 -1
- package/dist/phoenix-ui/bundle/blobs/a63054b8920905045753facece83f154bf806158c6f46ef380036e7a82d4fde5 +46 -0
- package/dist/phoenix-ui/bundle/blobs/{e802e4f7bdc89050a9c0f2ca506e1d493a2316e6e810c0336c57aa073717ef3e → a63788c764b0e4fdcbc029d46093016310edcbcf702d62688e5aaac7ddeee6fd} +3 -1
- package/dist/phoenix-ui/bundle/blobs/{827a211ea03d2cb44b4ea1bc81ba1a6dc51a87fa16d6692997c4e4751241c815 → acfc4c26b135d5b27fc0930738486c9d43d379704102fab45564320180942e4b} +4 -2
- package/dist/phoenix-ui/bundle/blobs/{8da14f3eabac53c990a66e721387367b46cb676cc4204e8c67d6f88c95a6217f → ad243ca615349127aa422bccc1a6604ad17149735659087ca5bab3c5fae97f4e} +6 -7
- package/dist/phoenix-ui/bundle/blobs/b63931066e2b2623d012e1a3c1a0769cc43ed6640460c3899669b45539d6a20d +46 -0
- package/dist/phoenix-ui/bundle/blobs/{bb65af58ecc3e0c0093dc9a705a7ab643035e4e592c3adb93583c82d1aef1f51 → bde793ab5ad776f7e6f6d25ce2b838c1b5022054a1dad5502a873423eb0ad917} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{8de7c97949b0bc4194b3be7645e4b13e9419767927482d01cf19476f6cbeda14 → c0a70ab2889e5c16e1f09249aefad948ce352c42cfe2b5afb758a4524e1b21b6} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{60b2914df394800688c4e20f4eb34e117cd430df9954cf4d48574734507723f4 → c9ee9006ae6c0194a5d39a9f0cb275c52d74a71ea3f6dc2b4c1c7bd89f48a2c0} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{6d8315e307eab11d3236935daf7267746cce6da3b51296e6999651ac97bda3a3 → cadc2daefcf238aab981fa56388381d3d5ab9c0686bb9dd8187035c9933dfcee} +6 -3
- package/dist/phoenix-ui/bundle/blobs/{d7b744fcc95164d96d9f811a93e2e8a374887146eb762ef775f3d3c7f27abc8d → cbea5728b90f58ff047be6ec4f14eed9d63c7148f5db99b5f147d2f17b472317} +1 -1
- package/dist/phoenix-ui/bundle/blobs/d408a4fea71b656aa8a5f6b5c037815a6e4229df336629ebddf4b5c85ed82fac +46 -0
- package/dist/phoenix-ui/bundle/blobs/{6ff950a5729ad9ea480ddf8c1b489b1c84189bbf7d6034b3b5a98e7c11a28cec → d9ae0c782d8a77787561536c0d7bc3b61175d59303f3cb8c20796f85140c6984} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{1d53e2226465b1047faec7cda2e743e61540ea69e073a3a4057e8d86b277405f → e2932d63eb7f52a82960a19ba79bc800ef4f212164e098f96dee7a4326302f38} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{fa576f6655b235bdea535198647305b7a3855e810180cbdf5d4c246c03c7d190 → e381bcfec42ac541d574011460600cf0818aa0e3362e8c6d205b4157890bf821} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{8fbce5b4859e6011afa83b1c07c4436589cd7181f9cb997538f4c27f196d0d34 → e415657d8725d9b60ece42cc18581da177c42fc47cb11e501db722a5f524ecf7} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{546a8428a2d8628bb3496fadb8c36a6dd65a33464291f214ceb581828f37081b → e46d63e5f8a6ead1d44c8b6302a0c7247af8585b975ab5715518381777622ede} +6 -3
- package/dist/phoenix-ui/bundle/blobs/ee63b3f9b354d69443d05ea4a338af56546897335ace7533546e10be56ea2207 +46 -0
- package/dist/phoenix-ui/bundle/blobs/{c23617601e9c4d97b775c175a5ce1642c40459b157d0821609fe1d253b83ced8 → ef7d57633252f4604749447608850e299c277f7dd1a32776685df0724b1051c8} +6 -7
- package/dist/phoenix-ui/bundle/blobs/{0581c8428246f43c5374393878a29e38f2b1865df87e6f13f2309b8eae54e76f → f0652c6ce41e6949133360178f192ea4ee9f6129a018c7a8b6652870c2330392} +1 -1
- package/dist/phoenix-ui/bundle/blobs/{cfac9eaf96481a8874391e5cecc6149abea1f1f19622f77f1ebb9e1876720e91 → f06c9d797ca2ac8c6a49d3dcd2e99d1b4df8bc9637a49c7e80f3161f49d06b1b} +4 -2
- package/dist/phoenix-ui/bundle/blobs/{d50780cb0a345051ae3fb12c5f8249a5dac9324d6a1963f04d03aaf769ffc27c → f077545caeb3ecb9f51a3f703a09736ca924869f4b4345c1b1ffbd9bf927a287} +6 -3
- package/dist/phoenix-ui/bundle/blobs/f781c5874bcd79ebe1b3b012275b9af7eae6c4867e9a16e29bb3d3ed3dc1940b +46 -0
- package/dist/phoenix-ui/bundle/blobs/fa10c0c926997387c89b7c1070e25b1b2b53ee891741e3c450a89ec6c6dcaf7d +46 -0
- package/dist/phoenix-ui/bundle/blobs/fb1a36ab7116b0c6709b89720cdded29d80982114c2f87cad614e01e126270dd +46 -0
- package/dist/phoenix-ui/bundle/blobs/fbd3214fc12ba70d9c69a995742ba73dc5365823af63afdc93c0c8a8f0c484af +46 -0
- package/dist/phoenix-ui/bundle/blobs/{77682e9d63b484f94a699f2c0b393e4540797d311362c384a3d643aec11d6985 → fea19b8381ec10ff8ed1923a336332974bbb552227ed215e7ddaaf0ec0112c1d} +1 -1
- package/dist/phoenix-ui/bundle/manifest.json +126 -126
- package/docs/phoenix-diagram.md +173 -0
- package/docs/phoenix-ui.md +40 -12
- package/package.json +14 -10
- package/skills/agi-mode/SKILL.md +3 -1
- package/skills/agi-mode/assets/sdlc/event.md +4 -5
- package/skills/agi-mode/assets/sdlc/object-status.md +1 -1
- package/skills/agi-mode/assets/sdlc/protocol.md +4 -2
- package/skills/agi-mode/evals/scenarios.md +108 -3
- package/skills/agi-mode/playbooks/authoring-a-skill.md +13 -2
- package/skills/agi-mode/playbooks/eval.md +19 -3
- package/skills/agi-mode/playbooks/hillclimb.md +4 -2
- package/skills/agi-mode/playbooks/reflection.md +1 -1
- package/skills/agi-mode/playbooks/sdlc.md +10 -6
- package/skills/agi-mode/playbooks/what-next.md +6 -2
- package/skills/agi-mode/references/eval-protocol.md +13 -4
- package/skills/agi-mode/references/interface-design.md +1 -0
- package/skills/agi-mode/references/remote-evolution.md +178 -0
- package/skills/agi-mode/references/skill-evolution.md +2 -0
- package/skills/agi-mode/scripts/evolution/compare.py +569 -0
- package/skills/agi-mode/scripts/evolution/evolution.py +2886 -0
- package/skills/agi-mode/scripts/evolution/examples/public-smoke.json +128 -0
- package/skills/agi-mode/scripts/evolution/examples/quality-calibration.json +128 -0
- package/skills/agi-mode/scripts/evolution/examples/quality-rubric.json +133 -0
- package/skills/agi-mode/scripts/evolution/protocol.py +1586 -0
- package/skills/agi-mode/scripts/evolution/pyproject.toml +16 -0
- package/skills/agi-mode/scripts/evolution/quality.py +689 -0
- package/skills/agi-mode/scripts/evolution/remote.py +2303 -0
- package/skills/agi-mode/scripts/evolution/tests/support.py +201 -0
- package/skills/agi-mode/scripts/evolution/tests/test_apply.py +643 -0
- package/skills/agi-mode/scripts/evolution/tests/test_bounded_exploration.py +236 -0
- package/skills/agi-mode/scripts/evolution/tests/test_bundles.py +414 -0
- package/skills/agi-mode/scripts/evolution/tests/test_calibration.py +460 -0
- package/skills/agi-mode/scripts/evolution/tests/test_compare.py +377 -0
- package/skills/agi-mode/scripts/evolution/tests/test_protocol.py +357 -0
- package/skills/agi-mode/scripts/evolution/tests/test_quality.py +647 -0
- package/skills/agi-mode/scripts/evolution/tests/test_remote.py +857 -0
- package/skills/agi-mode/scripts/evolution/tests/test_search.py +1109 -0
- package/skills/agi-mode/scripts/evolution/tests/test_typesafe.py +624 -0
- package/skills/agi-mode/scripts/evolution/tests/test_verifier_context.py +132 -0
- package/skills/agi-mode/scripts/evolution/typesafe_worker.py +145 -0
- package/skills/agi-mode/scripts/evolution/uv.lock +2548 -0
- package/skills/apply-code-review/SKILL.md +1 -0
- package/skills/apply-code-review/agents/openai.yaml +2 -0
- package/skills/apply-doc-review/SKILL.md +1 -0
- package/skills/apply-doc-review/agents/openai.yaml +2 -0
- package/skills/apply-ui-review/SKILL.md +1 -0
- package/skills/apply-ui-review/agents/openai.yaml +2 -0
- package/skills/autoresearch/SKILL.md +1 -0
- package/skills/clean-artifacts/SKILL.md +52 -0
- package/skills/clean-artifacts/agents/openai.yaml +4 -0
- package/skills/clean-artifacts/evals/scenarios.md +13 -0
- package/skills/clean-artifacts/references/history-cleanup.md +41 -0
- package/skills/crd/SKILL.md +100 -65
- package/skills/crd/assets/cr-template.md +15 -0
- package/skills/crd-respond/SKILL.md +17 -5
- package/skills/crd-respond/agents/openai.yaml +2 -2
- package/skills/crd-respond/assets/response-template.md +7 -0
- package/skills/crd-respond/evals/scenarios.md +7 -0
- package/skills/create-verification-skill/SKILL.md +1 -0
- package/skills/debugging/SKILL.md +1 -0
- package/skills/design-md/SKILL.md +1 -0
- package/skills/design-reference/SKILL.md +6 -2
- package/skills/design-reference/evals/scenarios.md +4 -0
- package/skills/dev-plan/SKILL.md +11 -6
- package/skills/dev-plan/references/execution-workflow.md +1 -1
- package/skills/dev-plan/references/plan-skeleton.md +234 -69
- package/skills/dev-plan/scripts/check_plan.py +1 -1
- package/skills/documentation-writer/SKILL.md +19 -14
- package/skills/documentation-writer/references/architecture.md +6 -2
- package/skills/documentation-writer/references/user-manual.md +2 -2
- package/skills/elintp/SKILL.md +12 -6
- package/skills/experience-capture/SKILL.md +1 -0
- package/skills/gdpr-compliant/SKILL.md +1 -0
- package/skills/kpi-dashboard-design/SKILL.md +1 -0
- package/skills/landing-page-conversion-audit/SKILL.md +1 -0
- package/skills/mcp-release-qa/SKILL.md +2 -1
- package/skills/meeting-minutes/SKILL.md +1 -0
- package/skills/optimize-agents-md/SKILL.md +128 -0
- package/skills/optimize-agents-md/assets/coding-principles.md +118 -0
- package/skills/phoenix-diagram/ENGINE.json +39 -0
- package/skills/phoenix-diagram/SKILL.md +109 -0
- package/skills/phoenix-diagram/examples/legacy.agent-tool-call.workflow.json +94 -0
- package/skills/phoenix-diagram/examples/legacy.async-job-roundtrip.sequence.json +61 -0
- package/skills/phoenix-diagram/examples/legacy.deployment-release.lifecycle.json +49 -0
- package/skills/phoenix-diagram/examples/legacy.product-analytics.dataflow.json +76 -0
- package/skills/{archify/test/fixtures/v1-baseline/web-app.architecture.json → phoenix-diagram/examples/legacy.web-app.architecture.json} +16 -11
- package/skills/phoenix-diagram/examples/minimal.architecture.json +11 -0
- package/skills/phoenix-diagram/examples/minimal.class.json +23 -0
- package/skills/phoenix-diagram/examples/minimal.dataflow.json +11 -0
- package/skills/phoenix-diagram/examples/minimal.erd.json +25 -0
- package/skills/phoenix-diagram/examples/minimal.lifecycle.json +11 -0
- package/skills/phoenix-diagram/examples/minimal.sequence.json +13 -0
- package/skills/phoenix-diagram/examples/minimal.timeline.json +15 -0
- package/skills/phoenix-diagram/examples/minimal.tree.json +13 -0
- package/skills/phoenix-diagram/examples/minimal.waterfall.json +12 -0
- package/skills/phoenix-diagram/examples/minimal.workflow.json +12 -0
- package/skills/phoenix-diagram/references/architecture-compare.md +111 -0
- package/skills/phoenix-diagram/references/authoring-defaults.md +42 -0
- package/skills/phoenix-diagram/references/brand-marks.md +52 -0
- package/skills/phoenix-diagram/references/compatibility.md +22 -0
- package/skills/phoenix-diagram/references/delivery-contract.md +127 -0
- package/skills/phoenix-diagram/references/extending-types.md +14 -0
- package/skills/phoenix-diagram/references/migration.md +57 -0
- package/skills/phoenix-diagram/references/preview.md +45 -0
- package/skills/phoenix-diagram/references/repository-authoring.md +29 -0
- package/skills/phoenix-diagram/references/viewer-runtime.md +27 -0
- package/skills/phoenix-diagram/schemas/README.md +23 -0
- package/skills/phoenix-diagram/schemas/architecture.schema.json +329 -0
- package/skills/phoenix-diagram/schemas/class.schema.json +348 -0
- package/skills/phoenix-diagram/schemas/common.schema.json +358 -0
- package/skills/{archify/schemas/lifecycle.schema.json → phoenix-diagram/schemas/dataflow.schema.json} +63 -58
- package/skills/phoenix-diagram/schemas/erd.schema.json +384 -0
- package/skills/phoenix-diagram/schemas/lifecycle.schema.json +202 -0
- package/skills/phoenix-diagram/schemas/sequence.schema.json +254 -0
- package/skills/phoenix-diagram/schemas/timeline.schema.json +170 -0
- package/skills/phoenix-diagram/schemas/tree.schema.json +144 -0
- package/skills/phoenix-diagram/schemas/waterfall.schema.json +150 -0
- package/skills/phoenix-diagram/schemas/workflow.schema.json +460 -0
- package/skills/phoenix-diagram/scripts/phoenix-bootstrap.cjs +589 -0
- package/skills/phoenix-diagram/scripts/phoenix-diagram +6 -0
- package/skills/phoenix-diagram/scripts/phoenix-launcher.cjs +10 -0
- package/skills/phoenix-ui/GENERATED.json +255 -240
- package/skills/phoenix-ui/SKILL.md +7 -4
- package/skills/phoenix-ui/evals/scenarios.md +8 -1
- package/skills/phoenix-ui/reference/craft-floor.md +3 -1
- package/skills/phoenix-ui/reference/critique.md +6 -14
- package/skills/phoenix-ui/reference/init.md +1 -1
- package/skills/phoenix-ui/reference/live.md +1 -1
- package/skills/phoenix-ui/reference/operate.md +15 -0
- package/skills/phoenix-ui/scripts/ENGINE.json +17 -17
- package/skills/phoenix-ui/scripts/phoenix-bootstrap.cjs +0 -4
- package/skills/portal-app-exchange/SKILL.md +1 -0
- package/skills/portal-dev-setup/SKILL.md +71 -12
- package/skills/portal-dev-setup/scripts/onebox.sh +69 -6
- package/skills/portal-external-app/SKILL.md +55 -16
- package/skills/portal-external-app/references/config-placement.md +108 -2
- package/skills/portal-external-app/references/registration-and-onebox.md +56 -2
- package/skills/portal-logging/SKILL.md +1 -0
- package/skills/portal-micro-app/SKILL.md +2 -1
- package/skills/portal-micro-app/references/sdk-reference.md +3 -1
- package/skills/prd/SKILL.md +238 -159
- package/skills/prd/evals/scenarios.md +13 -0
- package/skills/prd/references/prd-skeleton.md +14 -4
- package/skills/react/SKILL.md +1 -0
- package/skills/resolve-blocked/SKILL.md +46 -19
- package/skills/resolve-blocked/agents/openai.yaml +2 -2
- package/skills/resolve-blocked/evals/scenarios.md +22 -0
- package/skills/resolve-blocked/references/decisions-contract.md +7 -4
- package/skills/review-code/SKILL.md +308 -46
- package/skills/review-code/agents/openai.yaml +2 -0
- package/skills/review-dev-plan/SKILL.md +88 -33
- package/skills/review-dev-plan/agents/openai.yaml +2 -0
- package/skills/review-dev-plan/references/report-contract.md +53 -19
- package/skills/review-dev-plan/references/review-lenses.md +2 -1
- package/skills/review-prd/SKILL.md +90 -34
- package/skills/review-prd/agents/openai.yaml +2 -0
- package/skills/review-prd/references/report-contract.md +54 -18
- package/skills/review-prd-dev-gaps/SKILL.md +1 -0
- package/skills/review-prd-dev-gaps/agents/openai.yaml +2 -0
- package/skills/review-ui/SKILL.md +369 -71
- package/skills/review-ui/agents/openai.yaml +2 -0
- package/skills/review-ui/evals/scenarios.md +2 -0
- package/skills/rust/SKILL.md +76 -84
- package/skills/rust/references/api-design.md +97 -0
- package/skills/rust/references/{chapter_10.md → async-tokio.md} +42 -18
- package/skills/rust/references/behavioral-patterns.md +49 -0
- package/skills/rust/references/bevy.md +95 -0
- package/skills/rust/references/{chapter_02.md → clippy-and-linting.md} +26 -15
- package/skills/rust/references/{chapter_01.md → coding-idioms.md} +58 -7
- package/skills/rust/references/crates-and-dependencies.md +66 -0
- package/skills/rust/references/{chapter_08.md → documentation.md} +30 -3
- package/skills/rust/references/{chapter_04.md → error-handling.md} +32 -6
- package/skills/rust/references/{chapter_06.md → generics-and-dispatch.md} +28 -11
- package/skills/rust/references/macros.md +45 -0
- package/skills/rust/references/{chapter_03.md → performance.md} +25 -2
- package/skills/rust/references/{chapter_09.md → pointers-and-ownership.md} +37 -17
- package/skills/rust/references/{chapter_05.md → testing.md} +18 -2
- package/skills/rust/references/{chapter_07.md → type-state.md} +5 -1
- package/skills/rust/references/unsafe-and-ffi.md +56 -0
- package/skills/rust-port/SKILL.md +144 -0
- package/skills/rust-review/SKILL.md +177 -0
- package/skills/security-audit/SKILL.md +1 -0
- package/skills/spec-human-decision/SKILL.md +1 -0
- package/skills/sql-optimization/SKILL.md +1 -0
- package/skills/story-points/SKILL.md +1 -0
- package/skills/swarm/SKILL.md +1 -0
- package/skills/test-plan/SKILL.md +1 -0
- package/skills/ui-loop/SKILL.md +39 -0
- package/skills/ui-loop/agents/openai.yaml +3 -0
- package/skills/ui-pattern-research/SKILL.md +1 -0
- package/skills/use-llm-gateway/SKILL.md +58 -0
- package/skills/use-llm-gateway/agents/openai.yaml +4 -0
- package/skills/use-llm-gateway/references/api.md +129 -0
- package/skills/use-llm-gateway/references/recovery.md +86 -0
- package/skills/use-prompt-dsl/SKILL.md +165 -0
- package/skills/use-prompt-dsl/references/examples.md +726 -0
- package/skills/use-prompt-dsl/references/language.md +938 -0
- package/skills/use-rustify-docs/SKILL.md +60 -0
- package/skills/use-rustify-docs/agents/openai.yaml +4 -0
- package/skills/use-rustify-docs/references/rustify-docs.md +138 -0
- package/skills/use-task-gateway/SKILL.md +60 -0
- package/skills/use-task-gateway/agents/openai.yaml +3 -0
- package/skills/use-task-gateway/references/authentication.md +75 -0
- package/skills/use-task-gateway/references/task-api.md +121 -0
- package/skills/use-task-gateway/references/workers.md +85 -0
- package/skills/use-task-gateway/references/workflow-actions.md +66 -0
- package/skills/use-workflow-service/SKILL.md +57 -0
- package/skills/use-workflow-service/agents/openai.yaml +3 -0
- package/skills/use-workflow-service/references/action-provider.md +84 -0
- package/skills/use-workflow-service/references/authentication.md +76 -0
- package/skills/use-workflow-service/references/authoring.md +62 -0
- package/skills/use-workflow-service/references/mcp.md +47 -0
- package/skills/use-workflow-service/references/open-api.md +88 -0
- package/skills/use-workflow-service/references/orchestration-choice.md +63 -0
- package/skills/working-with-mbx/SKILL.md +1 -0
- package/skills/working-with-mise/SKILL.md +1 -0
- package/skills/xgent-app-release/SKILL.md +114 -16
- package/skills/xgent-app-release/references/build-and-package.md +2 -1
- package/skills/xgent-app-release/references/publish-api.md +6 -1
- package/skills/xgent-app-release/references/troubleshooting.md +2 -1
- package/skills/xgent-app-release/references/verify-preflight.mjs +21 -1
- package/skills/xgent-app-release/scripts/preflight.mjs +42 -3
- package/skills/xgent-image-push/SKILL.md +1 -0
- package/skills/xgent-init/SKILL.md +1 -0
- package/docs/claude-context-goal-guard.md +0 -124
- package/docs/codex-context-goal-guard.md +0 -109
- package/hooks/claude/context-goal-guard.js +0 -139
- package/hooks/claude/settings.example.json +0 -26
- package/hooks/codex/context-goal-guard.py +0 -189
- package/hooks/codex/hooks.example.json +0 -26
- package/skills/archify/SKILL.md +0 -137
- package/skills/archify/assets/template.html +0 -14937
- package/skills/archify/bin/archify.mjs +0 -2139
- package/skills/archify/bin/open-artifact.mjs +0 -86
- package/skills/archify/bin/preview.mjs +0 -653
- package/skills/archify/bin/visual-check.mjs +0 -829
- package/skills/archify/brand-marks/README.md +0 -31
- package/skills/archify/brand-marks/catalog.json +0 -131
- package/skills/archify/delta/architecture-delta.mjs +0 -1232
- package/skills/archify/examples/agent-run.lifecycle.json +0 -60
- package/skills/archify/examples/brand-aware-delivery.architecture.json +0 -47
- package/skills/archify/examples/cache-miss-request.sequence.json +0 -82
- package/skills/archify/examples/checkout-platform.base.architecture.json +0 -31
- package/skills/archify/examples/checkout-platform.head.architecture.json +0 -31
- package/skills/archify/examples/dataflow-product-analytics.html +0 -15048
- package/skills/archify/examples/event-stream.dataflow.json +0 -57
- package/skills/archify/examples/incident-response.workflow.json +0 -64
- package/skills/archify/examples/lifecycle-agent-run.html +0 -14983
- package/skills/archify/examples/production-deployment.architecture.json +0 -71
- package/skills/archify/examples/release-delivery.workflow.json +0 -62
- package/skills/archify/examples/sequence-cache-miss-request.html +0 -15063
- package/skills/archify/examples/web-app-rendered.html +0 -15012
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +0 -15054
- package/skills/archify/migrations/workflow-v2.mjs +0 -279
- package/skills/archify/package-lock.json +0 -149
- package/skills/archify/package.json +0 -39
- package/skills/archify/recipes/scenarios.mjs +0 -391
- package/skills/archify/references/authoring-contract.md +0 -247
- package/skills/archify/references/brand-marks.md +0 -65
- package/skills/archify/references/delivery-contract.md +0 -138
- package/skills/archify/references/viewer-runtime.md +0 -45
- package/skills/archify/renderers/architecture/grid.mjs +0 -62
- package/skills/archify/renderers/architecture/render-architecture.mjs +0 -1078
- package/skills/archify/renderers/dataflow/README.md +0 -104
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +0 -483
- package/skills/archify/renderers/lifecycle/README.md +0 -115
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +0 -561
- package/skills/archify/renderers/sequence/README.md +0 -114
- package/skills/archify/renderers/sequence/render-sequence.mjs +0 -464
- package/skills/archify/renderers/shared/brand-marks.mjs +0 -563
- package/skills/archify/renderers/shared/cli.mjs +0 -218
- package/skills/archify/renderers/shared/desktop-readability.mjs +0 -26
- package/skills/archify/renderers/shared/diagnostics.mjs +0 -160
- package/skills/archify/renderers/shared/engineering-profiles.mjs +0 -157
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +0 -2003
- package/skills/archify/renderers/shared/generated-validators.mjs +0 -13
- package/skills/archify/renderers/shared/geometry.mjs +0 -1423
- package/skills/archify/renderers/shared/i18n.mjs +0 -595
- package/skills/archify/renderers/shared/layout-report.mjs +0 -40
- package/skills/archify/renderers/shared/legend.mjs +0 -217
- package/skills/archify/renderers/shared/output-path.mjs +0 -340
- package/skills/archify/renderers/shared/repository-evidence.mjs +0 -239
- package/skills/archify/renderers/shared/repository-location.mjs +0 -58
- package/skills/archify/renderers/shared/text-fit.mjs +0 -49
- package/skills/archify/renderers/shared/utils.mjs +0 -232
- package/skills/archify/renderers/shared/validator.mjs +0 -86
- package/skills/archify/renderers/workflow/README.md +0 -223
- package/skills/archify/renderers/workflow/render-workflow.mjs +0 -35
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +0 -4400
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +0 -144
- package/skills/archify/schemas/README.md +0 -211
- package/skills/archify/schemas/architecture.schema.json +0 -178
- package/skills/archify/schemas/common.schema.json +0 -115
- package/skills/archify/scripts/check-render-output.mjs +0 -916
- package/skills/archify/scripts/check-update.mjs +0 -1667
- package/skills/archify/scripts/generate-brand-marks.mjs +0 -141
- package/skills/archify/scripts/generate-validators.mjs +0 -66
- package/skills/archify/scripts/render-examples.mjs +0 -26
- package/skills/archify/scripts/update-contract.mjs +0 -182
- package/skills/archify/skill-release.json +0 -10
- package/skills/archify/test/adaptive-reader-layout.test.mjs +0 -86
- package/skills/archify/test/animation.test.mjs +0 -179
- package/skills/archify/test/architecture-compare-recovery.test.mjs +0 -157
- package/skills/archify/test/architecture-delta-markers.test.mjs +0 -137
- package/skills/archify/test/architecture-delta.test.mjs +0 -705
- package/skills/archify/test/artifact-receipt-flush.test.mjs +0 -126
- package/skills/archify/test/authored-reachability.test.mjs +0 -95
- package/skills/archify/test/authoring-safety-contract.test.mjs +0 -54
- package/skills/archify/test/automatic-port-spread.test.mjs +0 -376
- package/skills/archify/test/base-input-compatibility.test.mjs +0 -42
- package/skills/archify/test/brand-marks.test.mjs +0 -678
- package/skills/archify/test/chapter-delta-preview.test.mjs +0 -157
- package/skills/archify/test/chapter-handoff.test.mjs +0 -97
- package/skills/archify/test/chapter-rail.test.mjs +0 -86
- package/skills/archify/test/checkout-line-endings.test.mjs +0 -72
- package/skills/archify/test/ci-scope.test.mjs +0 -59
- package/skills/archify/test/clean-skill-staging.test.mjs +0 -440
- package/skills/archify/test/cli-output-types.test.mjs +0 -201
- package/skills/archify/test/cli.test.mjs +0 -986
- package/skills/archify/test/community-proof-intake.test.mjs +0 -125
- package/skills/archify/test/cursor-onboarding.test.mjs +0 -74
- package/skills/archify/test/degraded.test.mjs +0 -161
- package/skills/archify/test/delivery-contract.test.mjs +0 -52
- package/skills/archify/test/desktop-reader-browser.test.mjs +0 -80
- package/skills/archify/test/diagram-guide.test.mjs +0 -92
- package/skills/archify/test/engineering-profile.test.mjs +0 -209
- package/skills/archify/test/export-browser.test.mjs +0 -305
- package/skills/archify/test/export-cleanup-browser.test.mjs +0 -294
- package/skills/archify/test/finder-browser.test.mjs +0 -274
- package/skills/archify/test/finder.test.mjs +0 -104
- package/skills/archify/test/fixtures/automatic-routing-node-border-clearance.workflow.json +0 -40
- package/skills/archify/test/fixtures/fail-migration-cleanup.mjs +0 -17
- package/skills/archify/test/fixtures/issue-126/custom-widths.workflow.json +0 -18
- package/skills/archify/test/fixtures/issue-126/explicit-route.workflow.json +0 -28
- package/skills/archify/test/fixtures/issue-126/explicit-viewbox.workflow.json +0 -19
- package/skills/archify/test/fixtures/issue-126/labels.workflow.json +0 -18
- package/skills/archify/test/fixtures/v1-baseline/agent-run.lifecycle.json +0 -64
- package/skills/archify/test/fixtures/v1-baseline/agent-tool-call.workflow.json +0 -88
- package/skills/archify/test/fixtures/v1-baseline/cache-miss-request.sequence.json +0 -75
- package/skills/archify/test/fixtures/v1-baseline/event-stream.dataflow.json +0 -57
- package/skills/archify/test/fixtures/v1-baseline/product-analytics.dataflow.json +0 -70
- package/skills/archify/test/fixtures/v1-baseline/production-deployment.architecture.json +0 -71
- package/skills/archify/test/fixtures/v1-workflow-700x400.workflow.json +0 -22
- package/skills/archify/test/fixtures/v1-workflow-explicit-coordinates.workflow.json +0 -47
- package/skills/archify/test/focus-browser.test.mjs +0 -226
- package/skills/archify/test/gallery.test.mjs +0 -130
- package/skills/archify/test/generate-validators.test.mjs +0 -59
- package/skills/archify/test/generate-viewer.test.mjs +0 -165
- package/skills/archify/test/generated-artifact-xml.test.mjs +0 -88
- package/skills/archify/test/geometry.test.mjs +0 -739
- package/skills/archify/test/golden.mjs +0 -207
- package/skills/archify/test/grid.test.mjs +0 -47
- package/skills/archify/test/guide-page.test.mjs +0 -85
- package/skills/archify/test/guide.test.mjs +0 -81
- package/skills/archify/test/guided-views-browser.test.mjs +0 -460
- package/skills/archify/test/guided-views.test.mjs +0 -144
- package/skills/archify/test/helpers/desktop-browser.mjs +0 -48
- package/skills/archify/test/helpers/offline-fonts.mjs +0 -76
- package/skills/archify/test/helpers/viewer-click.mjs +0 -72
- package/skills/archify/test/helpers/xml.mjs +0 -37
- package/skills/archify/test/i18n.test.mjs +0 -422
- package/skills/archify/test/intent-trace-browser.test.mjs +0 -284
- package/skills/archify/test/intent-trace.test.mjs +0 -111
- package/skills/archify/test/landing.test.mjs +0 -97
- package/skills/archify/test/layout-rules.test.mjs +0 -1498
- package/skills/archify/test/legend-contract.test.mjs +0 -404
- package/skills/archify/test/motion-governor-browser.test.mjs +0 -342
- package/skills/archify/test/motion-governor.test.mjs +0 -111
- package/skills/archify/test/offline-font-browser.test.mjs +0 -210
- package/skills/archify/test/offline-self-containment.test.mjs +0 -80
- package/skills/archify/test/open-artifact.test.mjs +0 -118
- package/skills/archify/test/ordinary-model-floor.test.mjs +0 -1052
- package/skills/archify/test/output-path.test.mjs +0 -587
- package/skills/archify/test/presentation.test.mjs +0 -71
- package/skills/archify/test/preset-tryon.test.mjs +0 -113
- package/skills/archify/test/preview-contract.test.mjs +0 -40
- package/skills/archify/test/preview.test.mjs +0 -530
- package/skills/archify/test/proof-aperture.test.mjs +0 -78
- package/skills/archify/test/reach-share-card.test.mjs +0 -149
- package/skills/archify/test/reader-layout-browser.test.mjs +0 -320
- package/skills/archify/test/readme-showcase.test.mjs +0 -319
- package/skills/archify/test/real-repository-proof.test.mjs +0 -209
- package/skills/archify/test/relationship-direct-explorer.test.mjs +0 -115
- package/skills/archify/test/relationship-lens.test.mjs +0 -128
- package/skills/archify/test/relationship-permalink.test.mjs +0 -130
- package/skills/archify/test/relationship-pulse.test.mjs +0 -122
- package/skills/archify/test/release-identity.test.mjs +0 -476
- package/skills/archify/test/release-package-gates.test.mjs +0 -750
- package/skills/archify/test/render-output-checks.test.mjs +0 -588
- package/skills/archify/test/renderer-diagnostic-boundary.test.mjs +0 -107
- package/skills/archify/test/repair-receipt.test.mjs +0 -181
- package/skills/archify/test/repository-evidence-replacement.test.mjs +0 -136
- package/skills/archify/test/repository-evidence.test.mjs +0 -605
- package/skills/archify/test/repository-language-metadata.test.mjs +0 -67
- package/skills/archify/test/route-journey.test.mjs +0 -125
- package/skills/archify/test/route-probe-browser.test.mjs +0 -363
- package/skills/archify/test/route-probe.test.mjs +0 -114
- package/skills/archify/test/route-share-card.test.mjs +0 -163
- package/skills/archify/test/semantic-camera.test.mjs +0 -88
- package/skills/archify/test/semantic-flow.test.mjs +0 -90
- package/skills/archify/test/semantic-legend-gateway.test.mjs +0 -156
- package/skills/archify/test/semantic-lens-browser.test.mjs +0 -372
- package/skills/archify/test/semantic-lens.test.mjs +0 -103
- package/skills/archify/test/semantic-passport.test.mjs +0 -99
- package/skills/archify/test/semantic-radar.test.mjs +0 -735
- package/skills/archify/test/semantic-zoom.test.mjs +0 -86
- package/skills/archify/test/sequence-column-fit.test.mjs +0 -137
- package/skills/archify/test/settled-flow.test.mjs +0 -97
- package/skills/archify/test/share-card-export.test.mjs +0 -132
- package/skills/archify/test/site-language-continuity.test.mjs +0 -569
- package/skills/archify/test/site-language-integration.mjs +0 -9
- package/skills/archify/test/skill-metadata.test.mjs +0 -84
- package/skills/archify/test/stable-update-manifest.test.mjs +0 -167
- package/skills/archify/test/start-page.test.mjs +0 -312
- package/skills/archify/test/story-beat-navigator.test.mjs +0 -103
- package/skills/archify/test/story-carrier.test.mjs +0 -90
- package/skills/archify/test/story-director-strip.test.mjs +0 -91
- package/skills/archify/test/story-follow-camera.test.mjs +0 -103
- package/skills/archify/test/story-horizon.test.mjs +0 -91
- package/skills/archify/test/story-moment-link.test.mjs +0 -93
- package/skills/archify/test/story-shelf.test.mjs +0 -84
- package/skills/archify/test/story-trail.test.mjs +0 -81
- package/skills/archify/test/toolbar-polish.test.mjs +0 -57
- package/skills/archify/test/update-contract.test.mjs +0 -133
- package/skills/archify/test/update-notifier.test.mjs +0 -3317
- package/skills/archify/test/v1-compatibility.test.mjs +0 -329
- package/skills/archify/test/vertical-edge.test.mjs +0 -68
- package/skills/archify/test/viewer-camera-browser.test.mjs +0 -395
- package/skills/archify/test/viewer-chrome-layout.test.mjs +0 -1104
- package/skills/archify/test/viewer-identifiers-browser.test.mjs +0 -135
- package/skills/archify/test/visual-check.test.mjs +0 -400
- package/skills/archify/test/webm-artifact.smoke.mjs +0 -1855
- package/skills/archify/test/workflow-compiler-hard-contract.test.mjs +0 -2136
- package/skills/archify/test/workflow-compiler.test.mjs +0 -1163
- package/skills/archify/test/workflow-migration.test.mjs +0 -620
- package/skills/archify/test/workflow-semantic-contract.test.mjs +0 -131
- /package/{skills/archify/THIRD_PARTY_NOTICES.md → dist/phoenix-diagram/THIRD-PARTY-LICENSES/0b7fb59365dc21c93b0f62526d74ee913aeec9ae532c112bc76afa7edcd56e14.txt} +0 -0
- /package/{skills/archify/LICENSE → dist/phoenix-diagram/THIRD-PARTY-LICENSES/b799ab081703e7821ae5096d2c1abdf14bbdc75e8ea1c4045998c36ed6db9706.txt} +0 -0
- /package/{skills/archify/assets/JetBrainsMono-OFL.txt → dist/phoenix-diagram/THIRD-PARTY-LICENSES/c1ab7c666206842a02b35b30770dac0d7a10156ed401c9defc3f02a754d89e90.txt} +0 -0
- /package/{skills/archify/examples/agent-tool-call.workflow.json → dist/phoenix-diagram/bundle/examples/legacy.agent-tool-call.workflow.json} +0 -0
- /package/{skills/archify/examples/async-job-roundtrip.sequence.json → dist/phoenix-diagram/bundle/examples/legacy.async-job-roundtrip.sequence.json} +0 -0
- /package/{skills/archify/examples/deployment-release.lifecycle.json → dist/phoenix-diagram/bundle/examples/legacy.deployment-release.lifecycle.json} +0 -0
- /package/{skills/archify/examples/product-analytics.dataflow.json → dist/phoenix-diagram/bundle/examples/legacy.product-analytics.dataflow.json} +0 -0
- /package/{skills/archify/examples/web-app.architecture.json → dist/phoenix-diagram/bundle/examples/legacy.web-app.architecture.json} +0 -0
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// Adapted from Phoenix UI's phoenix-bootstrap.cjs, engine 0.1.0, repository
|
|
4
|
+
// 4a65a1525f9ed03c775a0e18935901e1edbb773f, SHA-256
|
|
5
|
+
// 8b1723fb51e6aad9bfc0bc5ba8e09b5a373b0e33c251331f6ca14ff6b1c261ef.
|
|
6
|
+
// Its Apache-2.0 Impeccable provenance is retained in tools/phoenix-ui/NOTICE.md.
|
|
7
|
+
// Phoenix changes: diagram-only identities/resources/cache, Unix targets,
|
|
8
|
+
// explicit acquisition, complete offline validation and installed ownership.
|
|
9
|
+
// No hooks, renderer, UI installer or update lookup is included.
|
|
10
|
+
|
|
11
|
+
const fs = require('node:fs');
|
|
12
|
+
const os = require('node:os');
|
|
13
|
+
const path = require('node:path');
|
|
14
|
+
const crypto = require('node:crypto');
|
|
15
|
+
const http = require('node:http');
|
|
16
|
+
const https = require('node:https');
|
|
17
|
+
const tls = require('node:tls');
|
|
18
|
+
const net = require('node:net');
|
|
19
|
+
const { spawn, spawnSync } = require('node:child_process');
|
|
20
|
+
|
|
21
|
+
const TOOL = 'phoenix-diagram';
|
|
22
|
+
const TOOL_VERSION = '0.2.0';
|
|
23
|
+
const TARGETS = ['darwin-arm64', 'darwin-x64', 'linux-x64', 'linux-arm64'];
|
|
24
|
+
const PROVIDERS = ['.agent', '.agents', '.claude', '.codex', '.cursor', '.dsh', '.gemini', '.github', '.grok', '.hermes', '.kiro', '.opencode', '.pi', '.qoder', '.rovodev', '.trae', '.trae-cn', '.veto', '.vibe'];
|
|
25
|
+
const SHA = /^[a-f0-9]{64}$/;
|
|
26
|
+
const SEMVER = /^\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/;
|
|
27
|
+
const MAX_ENGINE = 256 * 1024 * 1024;
|
|
28
|
+
const sha256 = bytes => crypto.createHash('sha256').update(bytes).digest('hex');
|
|
29
|
+
const failure = (message, code = 4) => Object.assign(new Error(message), { code });
|
|
30
|
+
const encoded = value => Buffer.from(JSON.stringify(value) + '\n');
|
|
31
|
+
const object = value => value && typeof value === 'object' && !Array.isArray(value);
|
|
32
|
+
|
|
33
|
+
function platformTarget(platform = process.platform, arch = process.arch) {
|
|
34
|
+
const target = `${platform}-${arch}`;
|
|
35
|
+
if (!TARGETS.includes(target)) throw failure(`Unsupported Phoenix Diagram platform ${platform}/${arch}; the engine supports the four declared macOS/Linux targets.`);
|
|
36
|
+
return target;
|
|
37
|
+
}
|
|
38
|
+
function packageVersion(options = {}) {
|
|
39
|
+
if (options.packageJsonPath) {
|
|
40
|
+
const data = JSON.parse(readRegular(path.resolve(options.packageJsonPath), 1024 * 1024).bytes);
|
|
41
|
+
if (data.name !== '@xgent-ai/skills' || !SEMVER.test(data.version || '')) throw failure('Invalid owning npm package identity.');
|
|
42
|
+
return data.version;
|
|
43
|
+
}
|
|
44
|
+
// This relative location is the owning npm package, not an application's
|
|
45
|
+
// package.json above an installed provider skill.
|
|
46
|
+
const file = path.resolve(__dirname, '../../..', 'package.json');
|
|
47
|
+
if (fs.existsSync(file)) {
|
|
48
|
+
const data = JSON.parse(readRegular(file, 1024 * 1024).bytes);
|
|
49
|
+
if (data.name === '@xgent-ai/skills' && SEMVER.test(data.version || '')) return data.version;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function readRegular(file, limit, mode, digestOnly = false) {
|
|
54
|
+
const stat = fs.lstatSync(file, { bigint: true });
|
|
55
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1n) throw failure(`Expected a regular, singly linked file, not a symlink: ${file}`);
|
|
56
|
+
if (stat.size > BigInt(limit) || (mode !== undefined && Number(stat.mode & 0o777n) !== mode)) throw failure(`File size or mode differs from the pinned resource: ${file}`);
|
|
57
|
+
const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
|
|
58
|
+
try {
|
|
59
|
+
const opened = fs.fstatSync(fd, { bigint: true });
|
|
60
|
+
let bytes; let digest; let size;
|
|
61
|
+
if (digestOnly) {
|
|
62
|
+
const hash = crypto.createHash('sha256'); const chunk = Buffer.allocUnsafe(64 * 1024); size = 0;
|
|
63
|
+
for (;;) {
|
|
64
|
+
const length = fs.readSync(fd, chunk, 0, chunk.length, null);
|
|
65
|
+
if (!length) break;
|
|
66
|
+
if ((size += length) > limit) throw failure(`Resource exceeds its size bound: ${file}`);
|
|
67
|
+
hash.update(chunk.subarray(0, length));
|
|
68
|
+
}
|
|
69
|
+
digest = hash.digest('hex');
|
|
70
|
+
} else { bytes = fs.readFileSync(fd); size = bytes.length; }
|
|
71
|
+
const after = fs.fstatSync(fd, { bigint: true });
|
|
72
|
+
if (opened.dev !== stat.dev || opened.ino !== stat.ino || after.size !== stat.size || size > limit || BigInt(size) !== stat.size || opened.mtimeNs !== after.mtimeNs || opened.ctimeNs !== after.ctimeNs) throw failure(`Resource changed during verification: ${file}`);
|
|
73
|
+
return { bytes, stat, size, digest };
|
|
74
|
+
} finally { fs.closeSync(fd); }
|
|
75
|
+
}
|
|
76
|
+
function relative(value) {
|
|
77
|
+
return typeof value === 'string' && value.length > 0 && !value.includes('\\') && !value.includes(':') && !value.includes('\0')
|
|
78
|
+
&& value.split('/').every(part => part && part !== '.' && part !== '..' && !/[. ]$/.test(part));
|
|
79
|
+
}
|
|
80
|
+
function childFile(root, relativePath) {
|
|
81
|
+
if (!relative(relativePath)) throw failure(`Unsafe relative resource path: ${relativePath}`);
|
|
82
|
+
let directory = path.resolve(root);
|
|
83
|
+
const parts = relativePath.split('/');
|
|
84
|
+
for (const part of [null, ...parts.slice(0, -1)]) {
|
|
85
|
+
if (part !== null) directory = path.join(directory, part);
|
|
86
|
+
const stat = fs.lstatSync(directory);
|
|
87
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) throw failure(`Resource parent is not a regular directory: ${directory}`);
|
|
88
|
+
}
|
|
89
|
+
return path.join(directory, parts[parts.length - 1]);
|
|
90
|
+
}
|
|
91
|
+
function allowed(name, derived = false) {
|
|
92
|
+
if (!relative(name)) return false;
|
|
93
|
+
if (['SKILL.md', 'agents/openai.yaml', 'schemas/README.md', 'scripts/phoenix-diagram', 'scripts/phoenix-launcher.cjs', 'scripts/phoenix-bootstrap.cjs'].includes(name)) return true;
|
|
94
|
+
if (name === 'ENGINE.json') return derived;
|
|
95
|
+
const parts = name.split('/');
|
|
96
|
+
return parts.length === 2 && (['schemas', 'examples'].includes(parts[0]) && parts[1].endsWith('.json') && parts[1].length > 5
|
|
97
|
+
|| parts[0] === 'references' && parts[1].endsWith('.md') && parts[1].length > 3);
|
|
98
|
+
}
|
|
99
|
+
function checkedUrl(value, distribution) {
|
|
100
|
+
const url = new URL(value);
|
|
101
|
+
const local = ['127.0.0.1', '[::1]', 'localhost'].includes(url.hostname);
|
|
102
|
+
if (url.username || url.password || (url.protocol !== 'https:' && !(distribution === 'candidate' && url.protocol === 'http:' && local))) throw failure('Engine download requires credential-free HTTPS; loopback HTTP is allowed only for candidate verification.');
|
|
103
|
+
return url;
|
|
104
|
+
}
|
|
105
|
+
function manifestAt(file, options = {}) {
|
|
106
|
+
file = path.resolve(file);
|
|
107
|
+
const { bytes } = readRegular(file, 1024 * 1024);
|
|
108
|
+
const data = JSON.parse(bytes);
|
|
109
|
+
const keys = ['schemaVersion', 'distribution', 'tool', 'toolVersion', 'npmPackageVersion', 'sourceCommit', 'sourceInputSha256', 'inputContractSchema', 'receiptSchema', 'viewerRevision', 'bundleSha256', 'engines'];
|
|
110
|
+
const npmVersion = options.packageJsonPath || path.basename(file) === 'VERSION.json' ? packageVersion(options) : undefined;
|
|
111
|
+
if (!object(data) || Object.keys(data).some(key => !keys.includes(key)) || data.schemaVersion !== 1 || data.tool !== TOOL || data.toolVersion !== TOOL_VERSION
|
|
112
|
+
|| !['development', 'candidate', 'release'].includes(data.distribution) || !SEMVER.test(data.npmPackageVersion || '') || npmVersion && data.npmPackageVersion !== npmVersion
|
|
113
|
+
|| !/^[a-f0-9]{40}$/.test(data.sourceCommit || '') || !SHA.test(data.sourceInputSha256 || '') || !SHA.test(data.bundleSha256 || '')
|
|
114
|
+
|| data.inputContractSchema !== 1 || data.receiptSchema !== 1 || data.viewerRevision !== 'phoenix-v2' || !object(data.engines)) throw failure('Invalid Phoenix Diagram package manifest or fixed package/version/contract identity.');
|
|
115
|
+
const targets = Object.keys(data.engines);
|
|
116
|
+
if (!targets.length || targets.some(target => !TARGETS.includes(target)) || data.distribution !== 'development' && TARGETS.some(target => !targets.includes(target))) throw failure('Engine manifest is missing a supported platform or names an unknown target.');
|
|
117
|
+
for (const [target, engine] of Object.entries(data.engines)) {
|
|
118
|
+
if (!object(engine) || Object.keys(engine).some(key => !['asset', 'size', 'sha256', 'url'].includes(key)) || engine.asset !== `${TOOL}-${target}` || !SHA.test(engine.sha256 || '') || !Number.isSafeInteger(engine.size) || engine.size <= 0 || engine.size > MAX_ENGINE) throw failure(`Invalid engine metadata for ${target}.`);
|
|
119
|
+
if (data.distribution !== 'development' && !engine.url) throw failure(`Pinned engine URL is missing for ${target}.`);
|
|
120
|
+
if (engine.url) checkedUrl(engine.url, data.distribution);
|
|
121
|
+
}
|
|
122
|
+
return { data, bytes, hash: sha256(bytes), path: file };
|
|
123
|
+
}
|
|
124
|
+
function inventory(root, expected) {
|
|
125
|
+
let count = 0;
|
|
126
|
+
function visit(prefix) {
|
|
127
|
+
const directory = prefix ? path.dirname(childFile(root, `${prefix}/placeholder`)) : root;
|
|
128
|
+
for (const name of fs.readdirSync(directory)) {
|
|
129
|
+
if (++count > 50000) throw failure('Bundle inventory exceeds its bound.');
|
|
130
|
+
const namePath = prefix ? `${prefix}/${name}` : name;
|
|
131
|
+
const file = childFile(root, namePath);
|
|
132
|
+
const stat = fs.lstatSync(file);
|
|
133
|
+
if (stat.isDirectory() && !stat.isSymbolicLink() && [...expected].some(item => item.startsWith(`${namePath}/`))) visit(namePath);
|
|
134
|
+
else if (!stat.isFile() || stat.isSymbolicLink() || !expected.has(namePath)) throw failure(`Unlisted, extra or nonregular bundle entry: ${namePath}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
visit('');
|
|
138
|
+
}
|
|
139
|
+
function verifyBundle(root, manifest) {
|
|
140
|
+
root = path.resolve(root);
|
|
141
|
+
const raw = readRegular(childFile(root, 'manifest.json'), 16 * 1024 * 1024).bytes;
|
|
142
|
+
const data = JSON.parse(raw);
|
|
143
|
+
if (sha256(raw) !== manifest.data.bundleSha256 || !object(data) || Object.keys(data).some(key => !['schemaVersion', 'tool', 'version', 'files'].includes(key)) || data.schemaVersion !== 1 || data.tool !== TOOL || data.version !== TOOL_VERSION || !Array.isArray(data.files) || !data.files.length || data.files.length > 10000) throw failure('Bundle manifest identity or digest differs from VERSION.');
|
|
144
|
+
const names = new Set(); const folded = new Set(); let total = 0;
|
|
145
|
+
for (const entry of data.files) {
|
|
146
|
+
if (!object(entry) || Object.keys(entry).some(key => !['path', 'size', 'sha256', 'mode'].includes(key)) || !allowed(entry.path) || folded.has(entry.path.toLowerCase()) || !SHA.test(entry.sha256 || '') || !Number.isSafeInteger(entry.size) || entry.size < 0 || entry.size > 64 * 1024 * 1024 || ![0o644, 0o755].includes(entry.mode)) throw failure(`Unsafe bundle file or duplicate entry: ${entry.path}`);
|
|
147
|
+
if ((total += entry.size) > MAX_ENGINE) throw failure('Bundle exceeds its size bound.');
|
|
148
|
+
const { bytes } = readRegular(childFile(root, entry.path), 64 * 1024 * 1024, entry.mode);
|
|
149
|
+
if (bytes.length !== entry.size || sha256(bytes) !== entry.sha256) throw failure(`Bundle file digest or size differs: ${entry.path}`);
|
|
150
|
+
names.add(entry.path); folded.add(entry.path.toLowerCase());
|
|
151
|
+
}
|
|
152
|
+
for (const required of ['SKILL.md', 'scripts/phoenix-diagram', 'scripts/phoenix-launcher.cjs', 'scripts/phoenix-bootstrap.cjs']) if (!names.has(required)) throw failure(`Incomplete bundle: ${required}`);
|
|
153
|
+
const engine = readRegular(childFile(root, 'ENGINE.json'), 1024 * 1024, 0o644).bytes;
|
|
154
|
+
if (!engine.equals(manifest.bytes)) throw failure('Bundle ENGINE.json must be a byte-for-byte copy of VERSION.json.');
|
|
155
|
+
names.add('manifest.json'); names.add('ENGINE.json'); inventory(root, names);
|
|
156
|
+
return { root, data, bytes: raw, hash: sha256(raw) };
|
|
157
|
+
}
|
|
158
|
+
function legalResources(root) {
|
|
159
|
+
const files = new Map();
|
|
160
|
+
for (const name of ['LICENSE', 'NOTICE.md', 'THIRD-PARTY.json', 'THIRD-PARTY-NOTICES.md']) {
|
|
161
|
+
const bytes = readRegular(childFile(root, name), 64 * 1024 * 1024).bytes;
|
|
162
|
+
if (!bytes.length) throw failure(`Empty license resource: ${name}`);
|
|
163
|
+
files.set(name, bytes);
|
|
164
|
+
}
|
|
165
|
+
const catalog = JSON.parse(files.get('THIRD-PARTY.json'));
|
|
166
|
+
function visit(value) {
|
|
167
|
+
if (!object(value) && !Array.isArray(value)) return;
|
|
168
|
+
if (object(value) && typeof value.path === 'string' && value.path.startsWith('THIRD-PARTY-LICENSES/')) {
|
|
169
|
+
if (!SHA.test(value.sha256 || '')) throw failure(`Invalid license digest: ${value.path}`);
|
|
170
|
+
const bytes = readRegular(childFile(root, value.path), 64 * 1024 * 1024).bytes;
|
|
171
|
+
if (!bytes.length || sha256(bytes) !== value.sha256) throw failure(`License digest differs: ${value.path}`);
|
|
172
|
+
files.set(value.path, bytes);
|
|
173
|
+
}
|
|
174
|
+
for (const child of Object.values(value)) visit(child);
|
|
175
|
+
}
|
|
176
|
+
visit(catalog);
|
|
177
|
+
if (files.size === 4) throw failure('THIRD-PARTY catalog has no full license resources.');
|
|
178
|
+
const licenses = new Set([...files.keys()].filter(name => name.startsWith('THIRD-PARTY-LICENSES/')).map(name => name.slice('THIRD-PARTY-LICENSES/'.length)));
|
|
179
|
+
inventory(path.join(root, 'THIRD-PARTY-LICENSES'), licenses);
|
|
180
|
+
return files;
|
|
181
|
+
}
|
|
182
|
+
function verifyOffline(releaseDir, manifest, packageBundle) {
|
|
183
|
+
const offline = manifestAt(path.join(releaseDir, 'VERSION.json'));
|
|
184
|
+
if (!offline.bytes.equals(manifest.bytes)) throw failure('Offline VERSION manifest differs byte-for-byte from this npm package.');
|
|
185
|
+
if (manifest.data.distribution !== 'development' && TARGETS.some(target => !manifest.data.engines[target])) throw failure('Offline release must contain all four platform assets.');
|
|
186
|
+
const bundle = verifyBundle(path.join(releaseDir, 'bundle'), manifest);
|
|
187
|
+
if (packageBundle && !bundle.bytes.equals(packageBundle.bytes)) throw failure('Offline bundle manifest differs from the package.');
|
|
188
|
+
for (const target of Object.keys(manifest.data.engines)) {
|
|
189
|
+
const meta = manifest.data.engines[target];
|
|
190
|
+
const { size, digest } = readRegular(childFile(releaseDir, meta.asset), MAX_ENGINE, undefined, true);
|
|
191
|
+
if (size !== meta.size || digest !== meta.sha256) throw failure(`Offline engine digest or size differs: ${target}`);
|
|
192
|
+
}
|
|
193
|
+
const expected = path.basename(manifest.path) === 'VERSION.json' ? legalResources(path.dirname(manifest.path)) : null;
|
|
194
|
+
const actual = legalResources(releaseDir);
|
|
195
|
+
if (expected && (expected.size !== actual.size || [...expected].some(([name, bytes]) => !actual.get(name)?.equals(bytes)))) throw failure('Offline license resources differ from this package.');
|
|
196
|
+
return offline;
|
|
197
|
+
}
|
|
198
|
+
function cacheRoot(env = process.env) { return path.resolve(env.PHOENIX_DIAGRAM_HOME || path.join(os.homedir(), '.phoenix-diagram')); }
|
|
199
|
+
function enginePath(manifest, target, env = process.env) {
|
|
200
|
+
const meta = manifest.data.engines[target];
|
|
201
|
+
if (!meta) throw failure(`This package has no verified engine for ${target}.`);
|
|
202
|
+
return path.join(cacheRoot(env), 'bin', manifest.data.toolVersion, target, meta.sha256, TOOL);
|
|
203
|
+
}
|
|
204
|
+
function verifyEngine(file, manifest, target, env = process.env) {
|
|
205
|
+
const meta = manifest.data.engines[target];
|
|
206
|
+
if (!meta) throw failure(`No pinned engine for ${target}.`);
|
|
207
|
+
const { size, digest, stat } = readRegular(file, MAX_ENGINE, undefined, true);
|
|
208
|
+
if (size !== meta.size || digest !== meta.sha256 || Number(stat.mode & 0o111n) === 0) throw failure('Phoenix Diagram binary digest, size or executable mode differs from VERSION.');
|
|
209
|
+
const probe = spawnSync(file, ['engine-probe'], { env, encoding: 'utf8', timeout: 3000, maxBuffer: 4096, windowsHide: true });
|
|
210
|
+
if (probe.error || probe.status !== 0 || probe.stdout !== `phoenix-diagram-engine ${TOOL_VERSION} input=1 receipt=1 viewer=phoenix-v2\n`) throw failure(`Phoenix Diagram engine probe identity differs: ${JSON.stringify({ error: probe.error?.code || null, status: probe.status, signal: probe.signal, stdout: probe.stdout, stderr: probe.stderr })}`);
|
|
211
|
+
const after = fs.lstatSync(file, { bigint: true });
|
|
212
|
+
if (after.dev !== stat.dev || after.ino !== stat.ino || after.size !== stat.size || after.mtimeNs !== stat.mtimeNs || after.ctimeNs !== stat.ctimeNs) throw failure('Phoenix Diagram binary changed during its probe.');
|
|
213
|
+
return file;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Transport copied from Phoenix UI's verified bootstrap; the destination and
|
|
217
|
+
// every redirect remain subject to this tool's stricter distribution rule.
|
|
218
|
+
function proxyFor(url, env) {
|
|
219
|
+
const noProxy = env.no_proxy || env.NO_PROXY || '';
|
|
220
|
+
const hostname = url.hostname.replace(/^\[|\]$/g, '').toLowerCase();
|
|
221
|
+
if (noProxy.split(',').some(value => {
|
|
222
|
+
const item = value.trim().toLowerCase();
|
|
223
|
+
const [host, port] = item.split(':');
|
|
224
|
+
return item === '*' || ((!port || port === (url.port || (url.protocol === 'https:' ? '443' : '80')))
|
|
225
|
+
&& (hostname === host || (host?.startsWith('.') && hostname.endsWith(host))));
|
|
226
|
+
})) return null;
|
|
227
|
+
const value = url.protocol === 'https:'
|
|
228
|
+
? env.https_proxy || env.HTTPS_PROXY || env.all_proxy || env.ALL_PROXY || env.http_proxy || env.HTTP_PROXY
|
|
229
|
+
: env.http_proxy || env.HTTP_PROXY || env.all_proxy || env.ALL_PROXY;
|
|
230
|
+
if (!value) return null;
|
|
231
|
+
const proxy = new URL(value);
|
|
232
|
+
if (!['http:', 'https:'].includes(proxy.protocol)) throw failure('Phoenix Diagram supports HTTP or HTTPS proxies.');
|
|
233
|
+
return proxy;
|
|
234
|
+
}
|
|
235
|
+
async function responseFor(url, env) {
|
|
236
|
+
const proxy = proxyFor(url, env);
|
|
237
|
+
const authorization = proxy?.username ? `Basic ${Buffer.from(`${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`).toString('base64')}` : null;
|
|
238
|
+
let connection;
|
|
239
|
+
if (proxy && url.protocol === 'https:') {
|
|
240
|
+
connection = await new Promise((resolve, reject) => {
|
|
241
|
+
const request = (proxy.protocol === 'https:' ? https : http).request(proxy, {
|
|
242
|
+
method: 'CONNECT', path: `${url.hostname}:${url.port || 443}`,
|
|
243
|
+
rejectUnauthorized: true,
|
|
244
|
+
headers: authorization ? { 'Proxy-Authorization': authorization } : {},
|
|
245
|
+
});
|
|
246
|
+
request.setTimeout(60000, () => request.destroy(failure('Engine proxy timed out.')));
|
|
247
|
+
request.on('connect', (res, socket, head) => {
|
|
248
|
+
if (res.statusCode !== 200) { socket.destroy(); reject(failure(`Engine proxy HTTP ${res.statusCode}.`)); return; }
|
|
249
|
+
if (head.length) socket.unshift(head);
|
|
250
|
+
const hostname = url.hostname.replace(/^\[|\]$/g, '');
|
|
251
|
+
let secure;
|
|
252
|
+
try { secure = tls.connect({ socket, host: hostname, rejectUnauthorized: true, ...(net.isIP(hostname) ? {} : { servername: hostname }) }); }
|
|
253
|
+
catch (error) { socket.destroy(); reject(error); return; }
|
|
254
|
+
secure.setTimeout(60000, () => secure.destroy(failure('Engine proxy TLS timed out.')));
|
|
255
|
+
secure.once('secureConnect', () => resolve(secure)); secure.once('error', reject);
|
|
256
|
+
});
|
|
257
|
+
request.once('error', reject); request.end();
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return new Promise((resolve, reject) => {
|
|
261
|
+
// Leaving agent unset makes Node use this verified CONNECT socket. With
|
|
262
|
+
// agent:false Node constructs another agent and can bypass the tunnel.
|
|
263
|
+
const options = connection ? { createConnection: () => connection, rejectUnauthorized: true } : { rejectUnauthorized: true };
|
|
264
|
+
const destination = proxy && url.protocol === 'http:' ? proxy : url;
|
|
265
|
+
const client = proxy && url.protocol === 'http:' ? (proxy.protocol === 'https:' ? https : http) : url.protocol === 'https:' ? https : http;
|
|
266
|
+
if (proxy && url.protocol === 'http:') Object.assign(options, { path: url.href, headers: { Host: url.host, ...(authorization ? { 'Proxy-Authorization': authorization } : {}) } });
|
|
267
|
+
const request = client.get(destination, options, resolve);
|
|
268
|
+
request.setTimeout(60000, () => request.destroy(failure('Engine download timed out.')));
|
|
269
|
+
request.once('error', reject);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
async function download(meta, distribution, env) {
|
|
273
|
+
let url = checkedUrl(meta.url, distribution);
|
|
274
|
+
for (let redirects = 0; redirects <= 5; redirects++) {
|
|
275
|
+
const res = await responseFor(url, env);
|
|
276
|
+
if ([301, 302, 303, 307, 308].includes(res.statusCode)) {
|
|
277
|
+
res.resume();
|
|
278
|
+
if (!res.headers.location || redirects === 5) throw failure('Invalid engine download redirect or redirect limit exceeded.');
|
|
279
|
+
const next = checkedUrl(new URL(res.headers.location, url).href, distribution);
|
|
280
|
+
if (url.protocol === 'https:' && next.protocol !== 'https:') throw failure('Engine download refused an HTTPS downgrade.');
|
|
281
|
+
url = next; continue;
|
|
282
|
+
}
|
|
283
|
+
if (res.statusCode !== 200) { res.resume(); throw failure(`Engine download HTTP ${res.statusCode}.`); }
|
|
284
|
+
const chunks = []; let length = 0;
|
|
285
|
+
for await (const chunk of res) {
|
|
286
|
+
length += chunk.length;
|
|
287
|
+
if (length > meta.size) { res.destroy(); throw failure('Engine download exceeded the pinned size.'); }
|
|
288
|
+
chunks.push(chunk);
|
|
289
|
+
}
|
|
290
|
+
const bytes = Buffer.concat(chunks);
|
|
291
|
+
if (bytes.length !== meta.size || sha256(bytes) !== meta.sha256) throw failure('Engine download failed the pinned digest/size check.');
|
|
292
|
+
return bytes;
|
|
293
|
+
}
|
|
294
|
+
throw failure('Engine redirect limit exceeded.');
|
|
295
|
+
}
|
|
296
|
+
async function retryStagedFile(operation) {
|
|
297
|
+
for (let attempt = 0;; attempt++) {
|
|
298
|
+
try { return operation(); } catch (error) {
|
|
299
|
+
if (!['EBUSY', 'EPERM'].includes(error.code) || attempt === 5) throw error;
|
|
300
|
+
await new Promise(resolve => setTimeout(resolve, 25 * 2 ** attempt));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async function installEngine(manifest, target, project, releaseDir, env = process.env) {
|
|
305
|
+
// Validate an explicit offline request before considering an existing cache.
|
|
306
|
+
const packageBundle = path.basename(manifest.path) === 'VERSION.json' ? verifyBundle(path.join(path.dirname(manifest.path), 'bundle'), manifest) : null;
|
|
307
|
+
if (packageBundle) legalResources(path.dirname(manifest.path));
|
|
308
|
+
if (releaseDir) verifyOffline(path.resolve(releaseDir), manifest, packageBundle);
|
|
309
|
+
const destination = enginePath(manifest, target, env);
|
|
310
|
+
try { return verifyEngine(destination, manifest, target, env); } catch { /* Only explicit acquisition may repair a bad cache. */ }
|
|
311
|
+
const meta = manifest.data.engines[target];
|
|
312
|
+
let bytes;
|
|
313
|
+
if (releaseDir) bytes = readRegular(childFile(releaseDir, meta.asset), MAX_ENGINE).bytes;
|
|
314
|
+
else {
|
|
315
|
+
if (!meta.url) throw failure('This development engine has no URL; supply a complete verified --release-dir.');
|
|
316
|
+
bytes = await download(meta, manifest.data.distribution, env);
|
|
317
|
+
}
|
|
318
|
+
if (bytes.length !== meta.size || sha256(bytes) !== meta.sha256) throw failure('Engine digest/size differs from the fixed VERSION manifest.');
|
|
319
|
+
const home = cacheRoot(env);
|
|
320
|
+
fs.mkdirSync(home, { recursive: true, mode: 0o700 });
|
|
321
|
+
const relativeDirectory = path.relative(home, path.dirname(destination));
|
|
322
|
+
let directory = home;
|
|
323
|
+
for (const part of relativeDirectory.split(path.sep)) {
|
|
324
|
+
const stat = fs.lstatSync(directory);
|
|
325
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) throw failure(`Unsafe engine cache directory: ${directory}`);
|
|
326
|
+
directory = path.join(directory, part); fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
327
|
+
}
|
|
328
|
+
if (fs.lstatSync(directory).isSymbolicLink()) throw failure('Unsafe content-addressed engine cache.');
|
|
329
|
+
const temporary = `${destination}.${process.pid}.${crypto.randomBytes(6).toString('hex')}.part`;
|
|
330
|
+
let created = false; let installError;
|
|
331
|
+
try {
|
|
332
|
+
fs.writeFileSync(temporary, bytes, { flag: 'wx', mode: 0o700 }); created = true;
|
|
333
|
+
verifyEngine(temporary, manifest, target, env);
|
|
334
|
+
await retryStagedFile(() => fs.renameSync(temporary, destination));
|
|
335
|
+
verifyEngine(destination, manifest, target, env);
|
|
336
|
+
} catch (error) { installError = error; throw error; }
|
|
337
|
+
finally {
|
|
338
|
+
if (created && fs.existsSync(temporary)) {
|
|
339
|
+
try { await retryStagedFile(() => fs.unlinkSync(temporary)); }
|
|
340
|
+
catch (error) { if (!installError) throw error; installError.message += ` Staging cleanup failed: ${error.message}`; }
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return destination;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function projectRoot(start) {
|
|
347
|
+
let initial;
|
|
348
|
+
try { initial = fs.realpathSync(path.resolve(start)); }
|
|
349
|
+
catch (error) {
|
|
350
|
+
if (error.code === 'ENOENT' || error.code === 'ENOTDIR') throw failure(`Project is not an existing directory: ${start}`, 2);
|
|
351
|
+
throw error;
|
|
352
|
+
}
|
|
353
|
+
let directory = initial;
|
|
354
|
+
if (!fs.statSync(initial).isDirectory()) throw failure(`Project is not a directory: ${start}`, 2);
|
|
355
|
+
for (;;) {
|
|
356
|
+
if (exists(path.join(directory, '.phoenix-diagram/install/active.json')) || exists(path.join(directory, '.git'))) return directory;
|
|
357
|
+
const parent = path.dirname(directory);
|
|
358
|
+
if (parent === directory) return initial;
|
|
359
|
+
directory = parent;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
function physical(stat) { return { device: stat.dev.toString(), inode: stat.ino.toString() }; }
|
|
363
|
+
function identity(snapshot) {
|
|
364
|
+
const { stat, bytes } = snapshot;
|
|
365
|
+
return { ...physical(stat), links: Number(stat.nlink), mode: Number(stat.mode & 0o777n), uid: Number(stat.uid), sha256: sha256(bytes), bytes: bytes.length };
|
|
366
|
+
}
|
|
367
|
+
function same(left, right) { return JSON.stringify(left) === JSON.stringify(right); }
|
|
368
|
+
function sealed(file) {
|
|
369
|
+
const snapshot = readRegular(file, MAX_ENGINE, 0o600);
|
|
370
|
+
const data = JSON.parse(snapshot.bytes);
|
|
371
|
+
if (!object(data) || !SHA.test(data.checksum || '') || sha256(encoded({ ...data, checksum: '' })) !== data.checksum || !snapshot.bytes.equals(encoded(data))) throw failure(`Invalid canonical installation ownership/journal checksum: ${file}`);
|
|
372
|
+
if (snapshot.stat.uid !== BigInt(process.getuid())) throw failure(`Installation state belongs to a different owner: ${file}`);
|
|
373
|
+
return { ...snapshot, data };
|
|
374
|
+
}
|
|
375
|
+
function managed(name) {
|
|
376
|
+
if (!relative(name)) return false;
|
|
377
|
+
const [provider, skills, tool, ...rest] = name.split('/');
|
|
378
|
+
return PROVIDERS.includes(provider) && provider !== '.codex' && skills === 'skills' && tool === TOOL && allowed(rest.join('/'), true);
|
|
379
|
+
}
|
|
380
|
+
function verifiedJournalPublicationEntry(journals, name) {
|
|
381
|
+
const parent = fs.lstatSync(journals, { bigint: true });
|
|
382
|
+
if (!parent.isDirectory() || parent.isSymbolicLink() || parent.uid !== BigInt(process.getuid()) || (parent.mode & 0o7777n) !== 0o700n) throw failure('Installation journal directory is not private.');
|
|
383
|
+
if (name === '.phoenix-diagram-output-cleanup') {
|
|
384
|
+
const directory = childFile(journals, name), stat = fs.lstatSync(directory, { bigint: true });
|
|
385
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || stat.uid !== parent.uid || (stat.mode & 0o7777n) !== 0o700n) throw failure('Unknown journal publication cleanup directory.');
|
|
386
|
+
const marker = readRegular(childFile(directory, 'owner-v1.json'), 16 * 1024, 0o600);
|
|
387
|
+
const owner = JSON.parse(marker.bytes);
|
|
388
|
+
const expected = { schemaVersion: 1, tool: TOOL, kind: 'output-cleanup-directory', parentPath: journals, parent: physical(parent), directory: physical(stat), recordIdentity: physical(marker.stat), checksum: '' };
|
|
389
|
+
expected.checksum = sha256(Buffer.from(JSON.stringify(expected)));
|
|
390
|
+
if (marker.stat.uid !== parent.uid || !marker.bytes.equals(encoded(expected)) || !same(owner, expected)) throw failure('Journal publication cleanup owner binding or checksum differs.');
|
|
391
|
+
if (fs.readdirSync(directory).some(entry => entry !== 'owner-v1.json')) throw failure('Journal publication cleanup requires explicit native recovery; unknown records are preserved.');
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
if (name.startsWith('.phoenix-diagram-lock-')) {
|
|
395
|
+
const marker = readRegular(childFile(journals, name), 16 * 1024, 0o600), lock = JSON.parse(marker.bytes);
|
|
396
|
+
if (!/^[a-f0-9]{32}\.json$/.test(lock.name || '') || name !== `.phoenix-diagram-lock-${sha256(lock.name)}.lock` || !exists(childFile(journals, lock.name))) throw failure('Unknown journal publication lock target or filename.');
|
|
397
|
+
const expected = { schemaVersion: 1, tool: TOOL, kind: 'output-lock', name: lock.name, parentDevice: parent.dev.toString(), parentInode: parent.ino.toString() };
|
|
398
|
+
if (marker.stat.uid !== parent.uid || !marker.bytes.equals(Buffer.from(JSON.stringify(expected)))) throw failure('Journal publication lock identity or bytes differ.');
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
function verifyReceipt(project, manifest, options = {}) {
|
|
404
|
+
const receiptPath = '.phoenix-diagram/install/active.json';
|
|
405
|
+
const file = path.join(project, receiptPath);
|
|
406
|
+
if (!exists(file)) {
|
|
407
|
+
if (options.installedSkillRoot) throw failure('Installed skill has no diagram ownership receipt.');
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
const snapshot = sealed(childFile(project, receiptPath));
|
|
411
|
+
const active = snapshot.data; const version = manifest.data;
|
|
412
|
+
const transaction = active.transactionId;
|
|
413
|
+
if (![1, 2].includes(active.schemaVersion) || active.tool !== TOOL || active.toolVersion !== TOOL_VERSION || !/^[a-f0-9]{32}$/.test(transaction || '') || !same(active.project, physical(fs.statSync(project, { bigint: true })))
|
|
414
|
+
|| active.npmPackageVersion !== version.npmPackageVersion || active.bundleManifestSha256 !== version.bundleSha256 || active.engineManifestSha256 !== manifest.hash
|
|
415
|
+
|| active.engine?.sourceInputSha256 !== version.sourceInputSha256 || active.engine?.inputContractSchema !== 1 || active.engine?.receiptSchema !== 1 || active.engine?.viewerRevision !== 'phoenix-v2'
|
|
416
|
+
|| !Object.values(version.engines).some(meta => meta.sha256 === active.engine?.binary?.sha256 && meta.size === active.engine?.binary?.bytes)
|
|
417
|
+
|| !Array.isArray(active.providers) || !active.providers.length || new Set(active.providers).size !== active.providers.length || active.providers.some(provider => !PROVIDERS.includes(provider))
|
|
418
|
+
|| active.journal !== `.phoenix-diagram/install/journals/${transaction}.json` || active.backup !== `.phoenix-diagram/install/transactions/${transaction}/before`
|
|
419
|
+
|| !Array.isArray(active.ownership) || !active.ownership.length || active.ownership.length > 200000
|
|
420
|
+
|| active.planSha256 !== sha256(encoded([active.bundleManifestSha256, active.engineManifestSha256, active.providers, active.ownership]))) throw failure('Project ownership requires a different or invalid Phoenix Diagram package/contract identity.');
|
|
421
|
+
const journal = sealed(childFile(project, active.journal)).data;
|
|
422
|
+
if (![1, 2].includes(journal.schemaVersion) || journal.tool !== TOOL || journal.transactionId !== transaction || journal.phase !== 'committed' || journal.pending !== null || !Array.isArray(journal.operations) || !journal.operations.length || journal.completed !== journal.operations.length
|
|
423
|
+
|| !same(journal.project, active.project) || !same(journal.active, active)
|
|
424
|
+
|| !same(journal.transaction, physical(fs.statSync(path.dirname(path.join(project, active.backup)), { bigint: true })))
|
|
425
|
+
|| journal.operations[journal.operations.length - 1].path !== receiptPath || !same(journal.operations[journal.operations.length - 1].after, identity(snapshot))) throw failure('Installed ownership is not bound to a completed native journal.');
|
|
426
|
+
if (journal.migration && (journal.schemaVersion !== 2 || journal.migration.confirmed !== true || !Array.isArray(journal.migration.roots) || journal.migration.roots.some(root => root.kind !== 'legacy-root-remove' || !active.providers.some(provider => root.path === `${provider}/skills/archify`) || !['legacy-2.17', 'legacy-2.17-when-to-use', 'reference-3.1.0'].includes(root.source) || root.pending !== null || !Array.isArray(root.entries) || !root.entries.length || root.entries.some(entry => entry.removed !== true)))) throw failure('Legacy removal journal has not committed its confirmed scope.');
|
|
427
|
+
let previous; const owned = new Map();
|
|
428
|
+
for (const entry of active.ownership) {
|
|
429
|
+
if (!managed(entry.path) || !active.providers.includes(entry.path.split('/')[0]) || previous && Buffer.compare(Buffer.from(previous), Buffer.from(entry.path)) >= 0 || ![0o644, 0o755].includes(entry.identity?.mode)) throw failure(`Unsafe managed ownership path: ${entry.path}`);
|
|
430
|
+
const actual = readRegular(childFile(project, entry.path), MAX_ENGINE, entry.identity.mode);
|
|
431
|
+
if (!same(identity(actual), entry.identity)) throw failure(`Managed ownership identity or digest changed: ${entry.path}`);
|
|
432
|
+
owned.set(entry.path, entry.identity); previous = entry.path;
|
|
433
|
+
}
|
|
434
|
+
for (const [index, operation] of journal.operations.entries()) {
|
|
435
|
+
if ((journal.schemaVersion === 2 ? operation.kind !== 'file-write' : operation.kind !== undefined)) throw failure('Unknown native journal operation kind.');
|
|
436
|
+
if (operation.stagePath !== `after/${index}` || operation.retiredPath !== `retired/${index}` || operation.undoPath !== `undo/${index}` || operation.backupPath !== (operation.before ? `before/${index}` : null)) throw failure('Journal staging/backup paths differ from native ownership.');
|
|
437
|
+
if (index + 1 < journal.operations.length && (!managed(operation.path) || !same(owned.get(operation.path), operation.after))) throw failure(`Journal operation differs from managed ownership: ${operation.path}`);
|
|
438
|
+
}
|
|
439
|
+
const journals = path.join(project, '.phoenix-diagram/install/journals');
|
|
440
|
+
for (const name of fs.readdirSync(journals)) {
|
|
441
|
+
if (verifiedJournalPublicationEntry(journals, name)) continue;
|
|
442
|
+
if (!/^[a-f0-9]{32}\.json$/.test(name)) throw failure(`Unknown installation journal entry: ${name}`);
|
|
443
|
+
const other = sealed(childFile(journals, name)).data;
|
|
444
|
+
if (![1, 2].includes(other.schemaVersion) || other.tool !== TOOL || !same(other.project, active.project) || !['committed', 'recovered'].includes(other.phase)) throw failure('Diagram installation requires explicit native recovery before ordinary use.');
|
|
445
|
+
}
|
|
446
|
+
if (options.installedSkillRoot) {
|
|
447
|
+
const relativeRoot = path.relative(project, options.installedSkillRoot).split(path.sep).join('/');
|
|
448
|
+
if (!owned.has(`${relativeRoot}/ENGINE.json`) || !owned.has(`${relativeRoot}/SKILL.md`)) throw failure('Launcher skill root is not managed by this project ownership record.');
|
|
449
|
+
const engine = readRegular(childFile(options.installedSkillRoot, 'ENGINE.json'), 1024 * 1024).bytes;
|
|
450
|
+
if (!engine.equals(manifest.bytes)) throw failure('Installed ENGINE bytes differ from their native ownership identity.');
|
|
451
|
+
inventory(options.installedSkillRoot, new Set([...owned.keys()].filter(name => name.startsWith(`${relativeRoot}/`)).map(name => name.slice(relativeRoot.length + 1))));
|
|
452
|
+
}
|
|
453
|
+
return active;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function exists(file) {
|
|
457
|
+
try { fs.lstatSync(file); return true; } catch (error) { if (error.code === 'ENOENT') return false; throw error; }
|
|
458
|
+
}
|
|
459
|
+
async function preflight(options = {}) {
|
|
460
|
+
const env = { ...process.env, ...options.env };
|
|
461
|
+
const skillDir = path.resolve(options.skillDir || path.join(__dirname, '..'));
|
|
462
|
+
const versionManifestPath = path.resolve(options.manifestPath || path.join(skillDir, 'ENGINE.json'));
|
|
463
|
+
const manifest = manifestAt(versionManifestPath, options);
|
|
464
|
+
const target = platformTarget();
|
|
465
|
+
let project = options.exactProject ? path.resolve(options.project) : projectRoot(options.project || process.cwd());
|
|
466
|
+
if (options.exactProject) {
|
|
467
|
+
const stat = fs.lstatSync(project);
|
|
468
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) throw failure('Migration project must be an explicit regular project directory.', 2);
|
|
469
|
+
project = fs.realpathSync(project);
|
|
470
|
+
}
|
|
471
|
+
let bundleRoot;
|
|
472
|
+
if (options.bundleRoot) {
|
|
473
|
+
bundleRoot = path.resolve(options.bundleRoot);
|
|
474
|
+
verifyBundle(bundleRoot, manifest);
|
|
475
|
+
legalResources(path.dirname(versionManifestPath));
|
|
476
|
+
if (options.releaseDir && options.allowInstall !== true) verifyOffline(path.resolve(options.releaseDir), manifest, verifyBundle(bundleRoot, manifest));
|
|
477
|
+
// An explicit package upgrade lets native --dry-run validate the prior
|
|
478
|
+
// ownership. Ordinary use never opts out of the current receipt binding.
|
|
479
|
+
if (options.checkReceipt !== false) verifyReceipt(project, manifest);
|
|
480
|
+
} else {
|
|
481
|
+
if (!options.project && !exists(path.join(project, '.phoenix-diagram/install/active.json'))) project = projectRoot(skillDir);
|
|
482
|
+
if (options.checkReceipt !== false) verifyReceipt(project, manifest, { installedSkillRoot: skillDir });
|
|
483
|
+
bundleRoot = skillDir;
|
|
484
|
+
if (options.releaseDir && options.allowInstall !== true) verifyOffline(path.resolve(options.releaseDir), manifest, null);
|
|
485
|
+
}
|
|
486
|
+
const binary = options.allowInstall === true
|
|
487
|
+
? await installEngine(manifest, target, project, options.releaseDir && path.resolve(options.releaseDir), env)
|
|
488
|
+
: verifyEngine(enginePath(manifest, target, env), manifest, target, env);
|
|
489
|
+
return { enginePath: binary, bundleRoot, versionManifestPath, version: manifest.data, manifest, target, project, skillDir };
|
|
490
|
+
}
|
|
491
|
+
function shellQuote(value) { return `'${String(value).replaceAll("'", "'\"'\"'")}'`; }
|
|
492
|
+
function setupCommand(manifest, project, options = {}) {
|
|
493
|
+
if (!manifest) {
|
|
494
|
+
try { manifest = manifestAt(options.manifestPath || path.join(options.skillDir || path.join(__dirname, '..'), 'ENGINE.json'), options); }
|
|
495
|
+
catch { /* Unknown distribution must not imply a registry release. */ }
|
|
496
|
+
}
|
|
497
|
+
if (manifest?.data.distribution === 'release') return `npm exec --package=@xgent-ai/skills@${manifest.data.npmPackageVersion} -- phoenix-diagram engine install --project ${shellQuote(project)}`;
|
|
498
|
+
const launcher = options.packageJsonPath
|
|
499
|
+
? path.join(path.dirname(path.resolve(options.packageJsonPath)), 'bin/phoenix-diagram.js')
|
|
500
|
+
: path.join(options.skillDir || path.join(__dirname, '..'), 'scripts/phoenix-launcher.cjs');
|
|
501
|
+
return `${shellQuote(process.execPath)} ${shellQuote(path.resolve(launcher))} engine install --project ${shellQuote(project)} --release-dir ${shellQuote(options.releaseDir || 'MATCHING_RELEASE_DIR')}`;
|
|
502
|
+
}
|
|
503
|
+
function help(options, args = []) {
|
|
504
|
+
let version;
|
|
505
|
+
try { version = packageVersion(options); } catch { /* Help is available even when package metadata is damaged. */ }
|
|
506
|
+
return `phoenix-diagram ${TOOL_VERSION}${version ? ` (@xgent-ai/skills ${version})` : ''}\n`
|
|
507
|
+
+ 'Native diagrams: guide, brands, validate, deliver, compare, preview, check, browser-check, visual-check, finalize, review-record, recover-output, recover-compare, doctor, install, migrate.\n'
|
|
508
|
+
+ 'Usage: phoenix-diagram engine install --project DIR [--release-dir DIR] [--json]\n'
|
|
509
|
+
+ 'Engine acquisition is explicit. Ordinary commands only verify an existing engine and never download or use a Node renderer.\n'
|
|
510
|
+
+ (args[0] === 'recover-output' ? 'Recovery: recover-output <original-private-recovery-directory> --json\nIn the original output parent P, records move from P/.phoenix-diagram-recovery-<id>/publication-recovery-v1.json to sibling P/.phoenix-diagram-recovery-<id>.cleanup.json, then P/.phoenix-diagram-output-cleanup/<id>.json. The fixed cleanup directory includes its owned owner-v1.json. Always pass the original recovery directory explicitly, even if it has disappeared. Unknown or ambiguous multiple record locations are preserved and refused; recovery does not scan to choose a transaction. Native recovery preserves later claimants; it does not replace delivery checks or image review.\n' : '')
|
|
511
|
+
+ (args[0] === 'migrate' ? 'migrate --from-archify --project DIR [--providers claude,codex] [--confirm-remove-archify] [--dry-run] --json\nmigrate --recover ID --project DIR --json\nmigrate --rollback ID --project DIR [--dry-run] --json\nOnly the explicitly selected project/providers are eligible. Apply requires confirmed removal; the old skill has no backup and is not rebuilt by rollback. Recovery uses an already verified engine and the specified local transaction; no implicit download or old-skill reinstall.\n' : '')
|
|
512
|
+
+ `${setupCommand(null, options.project || process.cwd(), options)}\n`;
|
|
513
|
+
}
|
|
514
|
+
function migrationOptions(args) {
|
|
515
|
+
if (args[0] !== 'migrate') return null;
|
|
516
|
+
const values = new Map();
|
|
517
|
+
const switches = new Set(['from-archify', 'confirm-remove-archify', 'dry-run', 'json']);
|
|
518
|
+
for (let i = 1; i < args.length; i++) {
|
|
519
|
+
const match = /^--([a-z-]+)(?:=(.*))?$/.exec(args[i]);
|
|
520
|
+
if (!match || !['from-archify', 'confirm-remove-archify', 'dry-run', 'json', 'recover', 'rollback', 'project', 'bundle-root', 'providers'].includes(match[1]) || values.has(match[1])) throw failure('Invalid or duplicate migration option.', 2);
|
|
521
|
+
let value = match[2];
|
|
522
|
+
if (switches.has(match[1])) { if (value !== undefined) throw failure(`--${match[1]} has no value.`, 2); value = true; }
|
|
523
|
+
else { value ??= args[++i]; if (!value || value.startsWith('--')) throw failure(`--${match[1]} requires a value.`, 2); }
|
|
524
|
+
values.set(match[1], value);
|
|
525
|
+
}
|
|
526
|
+
if (['from-archify', 'recover', 'rollback'].filter(key => values.has(key)).length !== 1 || !values.has('project')) throw failure('Migration requires exactly one mode and an explicit --project DIR.', 2);
|
|
527
|
+
const from = values.has('from-archify');
|
|
528
|
+
if (!from && ['bundle-root', 'providers', 'confirm-remove-archify'].some(key => values.has(key)) || values.has('recover') && values.has('dry-run')) throw failure('Invalid migration mode options.', 2);
|
|
529
|
+
for (const key of ['recover', 'rollback']) if (values.has(key) && !/^[a-f0-9]{32}$/.test(values.get(key))) throw failure('Invalid migration transaction ID.', 2);
|
|
530
|
+
return { project: path.resolve(values.get('project')), from, bundleRoot: values.get('bundle-root') };
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
async function main(args, options = {}) {
|
|
534
|
+
if (!Array.isArray(args) || args.some(arg => typeof arg !== 'string')) throw failure('CLI arguments must be a string array.', 2);
|
|
535
|
+
const wantsHelp = args.includes('--help') || args.includes('-h');
|
|
536
|
+
if (!args.length || wantsHelp && args[0] === 'engine') { process.stdout.write(help(options, args)); return 0; }
|
|
537
|
+
if (args.length === 1 && ['--version', '-V', 'version'].includes(args[0])) { process.stdout.write(help(options).split('\n')[0] + '\n'); return 0; }
|
|
538
|
+
const env = { ...process.env, ...options.env };
|
|
539
|
+
const json = args.includes('--json');
|
|
540
|
+
let manifest; let target; let project = options.project || process.cwd();
|
|
541
|
+
try {
|
|
542
|
+
if (args[0] === 'engine' && args[1] !== 'install') throw failure('Usage: phoenix-diagram engine install --project DIR [--release-dir DIR] [--json]', 2);
|
|
543
|
+
if (args[0] === 'engine') {
|
|
544
|
+
let releaseDir; let requested;
|
|
545
|
+
for (let i = 2; i < args.length; i++) {
|
|
546
|
+
if (args[i] === '--json') continue;
|
|
547
|
+
if (!['--project', '--release-dir'].includes(args[i]) || !args[i + 1] || args[i + 1].startsWith('--')) throw failure('Usage: phoenix-diagram engine install --project DIR [--release-dir DIR] [--json]', 2);
|
|
548
|
+
const flag = args[i++];
|
|
549
|
+
if (flag === '--project') { if (requested) throw failure('Duplicate --project.', 2); requested = args[i]; }
|
|
550
|
+
else { if (releaseDir) throw failure('Duplicate --release-dir.', 2); releaseDir = path.resolve(args[i]); }
|
|
551
|
+
}
|
|
552
|
+
if (!requested) throw failure('Engine installation requires an explicit --project DIR.', 2);
|
|
553
|
+
project = projectRoot(requested);
|
|
554
|
+
const ready = await preflight({ ...options, project, releaseDir, env, allowInstall: true, checkReceipt: true });
|
|
555
|
+
manifest = ready.manifest; target = ready.target;
|
|
556
|
+
const result = { schemaVersion: 1, tool: TOOL, toolVersion: TOOL_VERSION, command: 'engine install', status: 'installed', scope: 'engine-cache', diagnostics: [], npmPackageVersion: ready.version.npmPackageVersion, target, enginePath: ready.enginePath, project: ready.project };
|
|
557
|
+
process.stdout.write(json ? encoded(result) : `Phoenix Diagram engine ${TOOL_VERSION} ready: ${ready.enginePath}\n`);
|
|
558
|
+
return 0;
|
|
559
|
+
}
|
|
560
|
+
const migration = migrationOptions(args);
|
|
561
|
+
const ready = await preflight({ ...options, ...(migration ? { project: migration.project, exactProject: true, ...(migration.from && migration.bundleRoot ? { bundleRoot: path.resolve(migration.bundleRoot) } : {}) } : {}), env, allowInstall: false, checkReceipt: !['install', 'migrate'].includes(args[0]) });
|
|
562
|
+
manifest = ready.manifest; target = ready.target; project = ready.project;
|
|
563
|
+
const childArgs = [...args];
|
|
564
|
+
if ((args[0] === 'install' || migration?.from) && !args.some(arg => arg === '--bundle-root' || arg.startsWith('--bundle-root='))) childArgs.push('--bundle-root', ready.bundleRoot);
|
|
565
|
+
const childEnv = { ...env, PHOENIX_DIAGRAM_BUNDLE_ROOT: ready.bundleRoot, PHOENIX_DIAGRAM_SETUP_COMMAND: setupCommand(manifest, project, options) };
|
|
566
|
+
const code = await new Promise((resolve, reject) => {
|
|
567
|
+
const child = spawn(ready.enginePath, childArgs, { env: childEnv, stdio: 'inherit', windowsHide: true });
|
|
568
|
+
const interrupt = () => child.kill('SIGINT'); const terminate = () => child.kill('SIGTERM');
|
|
569
|
+
process.on('SIGINT', interrupt); process.on('SIGTERM', terminate);
|
|
570
|
+
child.once('error', reject);
|
|
571
|
+
child.once('close', (code, signal) => {
|
|
572
|
+
process.removeListener('SIGINT', interrupt); process.removeListener('SIGTERM', terminate);
|
|
573
|
+
resolve(code ?? (signal === 'SIGINT' ? 130 : 143));
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
if (wantsHelp && args[0].startsWith('-') && code === 0) process.stdout.write(`\nBootstrap: phoenix-diagram engine install --project DIR [--release-dir DIR] --json\n${setupCommand(manifest, project, options)}\n`);
|
|
577
|
+
return code;
|
|
578
|
+
} catch (error) {
|
|
579
|
+
if (wantsHelp) { process.stdout.write(help(options, args)); return 0; }
|
|
580
|
+
try { manifest ||= manifestAt(options.manifestPath || path.join(options.skillDir || path.join(__dirname, '..'), 'ENGINE.json'), options); } catch { /* Recovery never trusts malformed metadata. */ }
|
|
581
|
+
const recovery = setupCommand(manifest, project, options);
|
|
582
|
+
process.stderr.write(`Phoenix Diagram: ${error.message}\n${recovery}\n`);
|
|
583
|
+
if (json) process.stdout.write(encoded({ schemaVersion: 1, tool: TOOL, toolVersion: TOOL_VERSION, command: args.slice(0, args[0] === 'engine' ? 2 : 1).join(' '), status: 'unavailable', diagnostics: [{ stage: 'bootstrap', code: 'bootstrap/unavailable', severity: 'error', message: error.message }], target, setupCommand: recovery }));
|
|
584
|
+
return error.code === 2 || error.code === 3 ? error.code : 4;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
module.exports = { TARGETS, platformTarget, manifestAt, verifyBundle, verifyReceipt, verifyEngine, enginePath, installEngine, preflight, setupCommand, shellQuote, proxyFor, checkedUrl, sha256, migrationOptions, main };
|
|
589
|
+
if (require.main === module) main(process.argv.slice(2)).then(code => { process.exitCode = code; }).catch(error => { process.stderr.write(`Phoenix Diagram: ${error.message}\n`); process.exitCode = 4; });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// Apache-2.0: adapted from Phoenix UI launcher, engine 0.1.0.
|
|
4
|
+
// Phoenix modification: the installed diagram skill and its ENGINE identity.
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const { main } = require('./phoenix-bootstrap.cjs');
|
|
7
|
+
const skillDir = path.resolve(__dirname, '..');
|
|
8
|
+
main(process.argv.slice(2), { skillDir, manifestPath: path.join(skillDir, 'ENGINE.json') })
|
|
9
|
+
.then(code => { process.exitCode = code; })
|
|
10
|
+
.catch(error => { process.stderr.write(`Phoenix Diagram: ${error.message}\n`); process.exitCode = 4; });
|