From f70ba79af441524b5adfbdfb36033a0629c4bb27 Mon Sep 17 00:00:00 2001 From: Khushboo Mehta Date: Tue, 14 Apr 2026 14:04:57 +0200 Subject: [PATCH] feat: update tutorial to guide user to write mcp server tests --- logos-calc-module/flake.lock | 169 +++++++++++++++++++++++------------ logos-calc-ui-cpp/flake.lock | 167 +++++++++++++++++++++++----------- logos-calc-ui/flake.lock | 167 +++++++++++++++++++++++----------- logos-developer-guide.md | 155 +++++++++++++++++++++++--------- tutorial-cpp-ui-app.md | 45 ++++++++++ tutorial-qml-ui-app.md | 60 +++++++++++++ 6 files changed, 560 insertions(+), 203 deletions(-) diff --git a/logos-calc-module/flake.lock b/logos-calc-module/flake.lock index a74e2d4..160001a 100644 --- a/logos-calc-module/flake.lock +++ b/logos-calc-module/flake.lock @@ -69,11 +69,11 @@ ] }, "locked": { - "lastModified": 1775831954, - "narHash": "sha256-XrYR9l3YZSfX/f90Fsedzz3XZufWfP75OaJQnHIH29Q=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "2a21637e0238b4e629f4b707d13f0b803810cc7d", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", "type": "github" }, "original": { @@ -94,11 +94,11 @@ ] }, "locked": { - "lastModified": 1775831954, - "narHash": "sha256-XrYR9l3YZSfX/f90Fsedzz3XZufWfP75OaJQnHIH29Q=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "2a21637e0238b4e629f4b707d13f0b803810cc7d", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", "type": "github" }, "original": { @@ -201,11 +201,11 @@ "process-stats": "process-stats" }, "locked": { - "lastModified": 1775764743, - "narHash": "sha256-nPWoaPLoeE+pjPg9fP5sc5038ZenbePlD6Hl0/Q4Rpc=", + "lastModified": 1776084938, + "narHash": "sha256-0UL6tG6mK00HN99fm9CLJu3JA9ay2ry6dgeHfyApiWo=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "522c56b4fafb4ef30615231ef6616316a104b935", + "rev": "b293e9d70a04983778ef2ef3ef42596f76f41161", "type": "github" }, "original": { @@ -256,11 +256,11 @@ ] }, "locked": { - "lastModified": 1775839570, - "narHash": "sha256-VclmQ0wz8BF9nuQ1UMcHNgs44wfF6CntRIQVxWIPkyQ=", + "lastModified": 1776167858, + "narHash": "sha256-8deHM95hhH3ICaxuF1kYqIn0FnQ0jLAnYo6iidCEz5g=", "owner": "logos-co", "repo": "logos-module-builder", - "rev": "ba4605b2d316a7d9cbe694266b3928f5e3718f71", + "rev": "5be2407296feb6a28994e40238f9123dfd71e9ad", "type": "github" }, "original": { @@ -709,11 +709,11 @@ "nixpkgs": "nixpkgs_25" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -745,11 +745,11 @@ "nixpkgs": "nixpkgs_27" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -781,11 +781,11 @@ "nixpkgs": "nixpkgs_29" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -835,11 +835,11 @@ "nixpkgs": "nixpkgs_31" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -871,11 +871,11 @@ "nixpkgs": "nixpkgs_33" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -907,11 +907,11 @@ "nixpkgs": "nixpkgs_35" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -979,11 +979,11 @@ "nixpkgs": "nixpkgs_39" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1014,6 +1014,24 @@ "inputs": { "nixpkgs": "nixpkgs_40" }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_41": { + "inputs": { + "nixpkgs": "nixpkgs_41" + }, "locked": { "lastModified": 1773955630, "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", @@ -1028,9 +1046,9 @@ "type": "github" } }, - "logos-nix_41": { + "logos-nix_42": { "inputs": { - "nixpkgs": "nixpkgs_41" + "nixpkgs": "nixpkgs_42" }, "locked": { "lastModified": 1773955630, @@ -1194,7 +1212,7 @@ }, "logos-package-manager_2": { "inputs": { - "logos-nix": "logos-nix_34", + "logos-nix": "logos-nix_35", "logos-package": "logos-package_4", "nix-bundle-appimage": "nix-bundle-appimage_2", "nix-bundle-dir": "nix-bundle-dir_6", @@ -1222,7 +1240,7 @@ }, "logos-package_2": { "inputs": { - "logos-nix": "logos-nix_27", + "logos-nix": "logos-nix_28", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1248,7 +1266,7 @@ }, "logos-package_3": { "inputs": { - "logos-nix": "logos-nix_31", + "logos-nix": "logos-nix_32", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -1273,7 +1291,7 @@ }, "logos-package_4": { "inputs": { - "logos-nix": "logos-nix_35", + "logos-nix": "logos-nix_36", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -1299,7 +1317,7 @@ }, "logos-package_5": { "inputs": { - "logos-nix": "logos-nix_40", + "logos-nix": "logos-nix_41", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -1373,6 +1391,30 @@ "type": "github" } }, + "logos-qt-mcp": { + "inputs": { + "logos-nix": "logos-nix_25", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455349, + "narHash": "sha256-rebrtH1UxC1hDuwQBwyYbGzNCrnuuqiVL7OvzUhk65k=", + "owner": "logos-co", + "repo": "logos-qt-mcp", + "rev": "c5223b4b640add09e461983b8fddbd12c8b31f4f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-qt-mcp", + "type": "github" + } + }, "logos-standalone-app": { "inputs": { "logos-capability-module": "logos-capability-module", @@ -1380,6 +1422,7 @@ "logos-design-system": "logos-design-system", "logos-liblogos": "logos-liblogos", "logos-nix": "logos-nix_24", + "logos-qt-mcp": "logos-qt-mcp", "logos-view-module-runtime": "logos-view-module-runtime", "nix-bundle-lgx": "nix-bundle-lgx", "nixpkgs": [ @@ -1390,11 +1433,11 @@ ] }, "locked": { - "lastModified": 1775836431, - "narHash": "sha256-2zQcNzbO3RnC8zZBB2y1s1ItZNwYzqgJjlevYjzKQHQ=", + "lastModified": 1776167058, + "narHash": "sha256-gFZIedkIQAjrLp744p9RJKUUQrk08ZxwulMo5guPl3Q=", "owner": "logos-co", "repo": "logos-standalone-app", - "rev": "84d24c6a0d5c73bb81160e2a13de9995caa34c0f", + "rev": "3085ca870f95ed163f3fb8bb82caf3f422c41ac9", "type": "github" }, "original": { @@ -1409,7 +1452,7 @@ "logos-module-builder", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_29", + "logos-nix": "logos-nix_30", "nixpkgs": [ "logos-module-builder", "logos-test-framework", @@ -1438,7 +1481,7 @@ "logos-standalone-app", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_25", + "logos-nix": "logos-nix_26", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1490,7 +1533,7 @@ }, "nix-bundle-appimage_2": { "inputs": { - "logos-nix": "logos-nix_36", + "logos-nix": "logos-nix_37", "nix-bundle-dir": "nix-bundle-dir_5", "nixpkgs": [ "logos-module-builder", @@ -1570,7 +1613,7 @@ }, "nix-bundle-dir_3": { "inputs": { - "logos-nix": "logos-nix_28", + "logos-nix": "logos-nix_29", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1596,7 +1639,7 @@ }, "nix-bundle-dir_4": { "inputs": { - "logos-nix": "logos-nix_32", + "logos-nix": "logos-nix_33", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -1621,7 +1664,7 @@ }, "nix-bundle-dir_5": { "inputs": { - "logos-nix": "logos-nix_37", + "logos-nix": "logos-nix_38", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -1646,7 +1689,7 @@ }, "nix-bundle-dir_6": { "inputs": { - "logos-nix": "logos-nix_38", + "logos-nix": "logos-nix_39", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -1672,7 +1715,7 @@ }, "nix-bundle-dir_7": { "inputs": { - "logos-nix": "logos-nix_41", + "logos-nix": "logos-nix_42", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -1698,7 +1741,7 @@ }, "nix-bundle-lgx": { "inputs": { - "logos-nix": "logos-nix_26", + "logos-nix": "logos-nix_27", "logos-package": "logos-package_2", "nix-bundle-dir": "nix-bundle-dir_3", "nixpkgs": [ @@ -1724,7 +1767,7 @@ }, "nix-bundle-lgx_2": { "inputs": { - "logos-nix": "logos-nix_30", + "logos-nix": "logos-nix_31", "logos-package": "logos-package_3", "nix-bundle-dir": "nix-bundle-dir_4", "nixpkgs": [ @@ -1750,7 +1793,7 @@ }, "nix-bundle-lgx_3": { "inputs": { - "logos-nix": "logos-nix_39", + "logos-nix": "logos-nix_40", "logos-package": "logos-package_5", "nix-bundle-dir": "nix-bundle-dir_7", "nixpkgs": [ @@ -1777,7 +1820,7 @@ }, "nix-bundle-logos-module-install": { "inputs": { - "logos-nix": "logos-nix_33", + "logos-nix": "logos-nix_34", "logos-package-manager": "logos-package-manager_2", "nix-bundle-lgx": "nix-bundle-lgx_3", "nixpkgs": [ @@ -2377,6 +2420,22 @@ "type": "github" } }, + "nixpkgs_42": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_5": { "locked": { "lastModified": 1759036355, diff --git a/logos-calc-ui-cpp/flake.lock b/logos-calc-ui-cpp/flake.lock index 838ff22..d2f75de 100644 --- a/logos-calc-ui-cpp/flake.lock +++ b/logos-calc-ui-cpp/flake.lock @@ -256,11 +256,11 @@ ] }, "locked": { - "lastModified": 1775831954, - "narHash": "sha256-XrYR9l3YZSfX/f90Fsedzz3XZufWfP75OaJQnHIH29Q=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "2a21637e0238b4e629f4b707d13f0b803810cc7d", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", "type": "github" }, "original": { @@ -281,11 +281,11 @@ ] }, "locked": { - "lastModified": 1775831954, - "narHash": "sha256-XrYR9l3YZSfX/f90Fsedzz3XZufWfP75OaJQnHIH29Q=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "2a21637e0238b4e629f4b707d13f0b803810cc7d", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", "type": "github" }, "original": { @@ -444,11 +444,11 @@ "process-stats": "process-stats_2" }, "locked": { - "lastModified": 1775764743, - "narHash": "sha256-nPWoaPLoeE+pjPg9fP5sc5038ZenbePlD6Hl0/Q4Rpc=", + "lastModified": 1776084938, + "narHash": "sha256-0UL6tG6mK00HN99fm9CLJu3JA9ay2ry6dgeHfyApiWo=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "522c56b4fafb4ef30615231ef6616316a104b935", + "rev": "b293e9d70a04983778ef2ef3ef42596f76f41161", "type": "github" }, "original": { @@ -532,11 +532,11 @@ ] }, "locked": { - "lastModified": 1775839570, - "narHash": "sha256-VclmQ0wz8BF9nuQ1UMcHNgs44wfF6CntRIQVxWIPkyQ=", + "lastModified": 1776167858, + "narHash": "sha256-8deHM95hhH3ICaxuF1kYqIn0FnQ0jLAnYo6iidCEz5g=", "owner": "logos-co", "repo": "logos-module-builder", - "rev": "ba4605b2d316a7d9cbe694266b3928f5e3718f71", + "rev": "5be2407296feb6a28994e40238f9123dfd71e9ad", "type": "github" }, "original": { @@ -1953,11 +1953,11 @@ "nixpkgs": "nixpkgs_66" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1989,11 +1989,11 @@ "nixpkgs": "nixpkgs_68" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2043,11 +2043,11 @@ "nixpkgs": "nixpkgs_70" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2079,11 +2079,11 @@ "nixpkgs": "nixpkgs_72" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2115,11 +2115,11 @@ "nixpkgs": "nixpkgs_74" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2151,11 +2151,11 @@ "nixpkgs": "nixpkgs_76" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2240,6 +2240,24 @@ "inputs": { "nixpkgs": "nixpkgs_80" }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_81": { + "inputs": { + "nixpkgs": "nixpkgs_81" + }, "locked": { "lastModified": 1774455309, "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", @@ -2254,9 +2272,9 @@ "type": "github" } }, - "logos-nix_81": { + "logos-nix_82": { "inputs": { - "nixpkgs": "nixpkgs_81" + "nixpkgs": "nixpkgs_82" }, "locked": { "lastModified": 1773955630, @@ -2272,9 +2290,9 @@ "type": "github" } }, - "logos-nix_82": { + "logos-nix_83": { "inputs": { - "nixpkgs": "nixpkgs_82" + "nixpkgs": "nixpkgs_83" }, "locked": { "lastModified": 1773955630, @@ -2426,7 +2444,7 @@ }, "logos-package-manager_4": { "inputs": { - "logos-nix": "logos-nix_75", + "logos-nix": "logos-nix_76", "logos-package": "logos-package_9", "nix-bundle-appimage": "nix-bundle-appimage_4", "nix-bundle-dir": "nix-bundle-dir_13", @@ -2454,7 +2472,7 @@ }, "logos-package_10": { "inputs": { - "logos-nix": "logos-nix_81", + "logos-nix": "logos-nix_82", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -2614,7 +2632,7 @@ }, "logos-package_7": { "inputs": { - "logos-nix": "logos-nix_68", + "logos-nix": "logos-nix_69", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -2640,7 +2658,7 @@ }, "logos-package_8": { "inputs": { - "logos-nix": "logos-nix_72", + "logos-nix": "logos-nix_73", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -2665,7 +2683,7 @@ }, "logos-package_9": { "inputs": { - "logos-nix": "logos-nix_76", + "logos-nix": "logos-nix_77", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -2791,6 +2809,30 @@ "type": "github" } }, + "logos-qt-mcp": { + "inputs": { + "logos-nix": "logos-nix_66", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455349, + "narHash": "sha256-rebrtH1UxC1hDuwQBwyYbGzNCrnuuqiVL7OvzUhk65k=", + "owner": "logos-co", + "repo": "logos-qt-mcp", + "rev": "c5223b4b640add09e461983b8fddbd12c8b31f4f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-qt-mcp", + "type": "github" + } + }, "logos-standalone-app": { "inputs": { "logos-capability-module": "logos-capability-module", @@ -2829,6 +2871,7 @@ "logos-design-system": "logos-design-system_2", "logos-liblogos": "logos-liblogos_2", "logos-nix": "logos-nix_65", + "logos-qt-mcp": "logos-qt-mcp", "logos-view-module-runtime": "logos-view-module-runtime_2", "nix-bundle-lgx": "nix-bundle-lgx_4", "nixpkgs": [ @@ -2839,11 +2882,11 @@ ] }, "locked": { - "lastModified": 1775836431, - "narHash": "sha256-2zQcNzbO3RnC8zZBB2y1s1ItZNwYzqgJjlevYjzKQHQ=", + "lastModified": 1776167058, + "narHash": "sha256-gFZIedkIQAjrLp744p9RJKUUQrk08ZxwulMo5guPl3Q=", "owner": "logos-co", "repo": "logos-standalone-app", - "rev": "84d24c6a0d5c73bb81160e2a13de9995caa34c0f", + "rev": "3085ca870f95ed163f3fb8bb82caf3f422c41ac9", "type": "github" }, "original": { @@ -2888,7 +2931,7 @@ "logos-module-builder", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_70", + "logos-nix": "logos-nix_71", "nixpkgs": [ "logos-module-builder", "logos-test-framework", @@ -2948,7 +2991,7 @@ "logos-standalone-app", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_66", + "logos-nix": "logos-nix_67", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3057,7 +3100,7 @@ }, "nix-bundle-appimage_4": { "inputs": { - "logos-nix": "logos-nix_77", + "logos-nix": "logos-nix_78", "nix-bundle-dir": "nix-bundle-dir_12", "nixpkgs": [ "logos-module-builder", @@ -3111,7 +3154,7 @@ }, "nix-bundle-dir_10": { "inputs": { - "logos-nix": "logos-nix_69", + "logos-nix": "logos-nix_70", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3137,7 +3180,7 @@ }, "nix-bundle-dir_11": { "inputs": { - "logos-nix": "logos-nix_73", + "logos-nix": "logos-nix_74", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -3162,7 +3205,7 @@ }, "nix-bundle-dir_12": { "inputs": { - "logos-nix": "logos-nix_78", + "logos-nix": "logos-nix_79", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3187,7 +3230,7 @@ }, "nix-bundle-dir_13": { "inputs": { - "logos-nix": "logos-nix_79", + "logos-nix": "logos-nix_80", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3213,7 +3256,7 @@ }, "nix-bundle-dir_14": { "inputs": { - "logos-nix": "logos-nix_82", + "logos-nix": "logos-nix_83", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3535,7 +3578,7 @@ }, "nix-bundle-lgx_4": { "inputs": { - "logos-nix": "logos-nix_67", + "logos-nix": "logos-nix_68", "logos-package": "logos-package_7", "nix-bundle-dir": "nix-bundle-dir_10", "nixpkgs": [ @@ -3561,7 +3604,7 @@ }, "nix-bundle-lgx_5": { "inputs": { - "logos-nix": "logos-nix_71", + "logos-nix": "logos-nix_72", "logos-package": "logos-package_8", "nix-bundle-dir": "nix-bundle-dir_11", "nixpkgs": [ @@ -3587,7 +3630,7 @@ }, "nix-bundle-lgx_6": { "inputs": { - "logos-nix": "logos-nix_80", + "logos-nix": "logos-nix_81", "logos-package": "logos-package_10", "nix-bundle-dir": "nix-bundle-dir_14", "nixpkgs": [ @@ -3641,7 +3684,7 @@ }, "nix-bundle-logos-module-install_2": { "inputs": { - "logos-nix": "logos-nix_74", + "logos-nix": "logos-nix_75", "logos-package-manager": "logos-package-manager_4", "nix-bundle-lgx": "nix-bundle-lgx_6", "nixpkgs": [ @@ -4961,6 +5004,22 @@ "type": "github" } }, + "nixpkgs_83": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_9": { "locked": { "lastModified": 1759036355, diff --git a/logos-calc-ui/flake.lock b/logos-calc-ui/flake.lock index 838ff22..d2f75de 100644 --- a/logos-calc-ui/flake.lock +++ b/logos-calc-ui/flake.lock @@ -256,11 +256,11 @@ ] }, "locked": { - "lastModified": 1775831954, - "narHash": "sha256-XrYR9l3YZSfX/f90Fsedzz3XZufWfP75OaJQnHIH29Q=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "2a21637e0238b4e629f4b707d13f0b803810cc7d", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", "type": "github" }, "original": { @@ -281,11 +281,11 @@ ] }, "locked": { - "lastModified": 1775831954, - "narHash": "sha256-XrYR9l3YZSfX/f90Fsedzz3XZufWfP75OaJQnHIH29Q=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "2a21637e0238b4e629f4b707d13f0b803810cc7d", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", "type": "github" }, "original": { @@ -444,11 +444,11 @@ "process-stats": "process-stats_2" }, "locked": { - "lastModified": 1775764743, - "narHash": "sha256-nPWoaPLoeE+pjPg9fP5sc5038ZenbePlD6Hl0/Q4Rpc=", + "lastModified": 1776084938, + "narHash": "sha256-0UL6tG6mK00HN99fm9CLJu3JA9ay2ry6dgeHfyApiWo=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "522c56b4fafb4ef30615231ef6616316a104b935", + "rev": "b293e9d70a04983778ef2ef3ef42596f76f41161", "type": "github" }, "original": { @@ -532,11 +532,11 @@ ] }, "locked": { - "lastModified": 1775839570, - "narHash": "sha256-VclmQ0wz8BF9nuQ1UMcHNgs44wfF6CntRIQVxWIPkyQ=", + "lastModified": 1776167858, + "narHash": "sha256-8deHM95hhH3ICaxuF1kYqIn0FnQ0jLAnYo6iidCEz5g=", "owner": "logos-co", "repo": "logos-module-builder", - "rev": "ba4605b2d316a7d9cbe694266b3928f5e3718f71", + "rev": "5be2407296feb6a28994e40238f9123dfd71e9ad", "type": "github" }, "original": { @@ -1953,11 +1953,11 @@ "nixpkgs": "nixpkgs_66" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1989,11 +1989,11 @@ "nixpkgs": "nixpkgs_68" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2043,11 +2043,11 @@ "nixpkgs": "nixpkgs_70" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2079,11 +2079,11 @@ "nixpkgs": "nixpkgs_72" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2115,11 +2115,11 @@ "nixpkgs": "nixpkgs_74" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2151,11 +2151,11 @@ "nixpkgs": "nixpkgs_76" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2240,6 +2240,24 @@ "inputs": { "nixpkgs": "nixpkgs_80" }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_81": { + "inputs": { + "nixpkgs": "nixpkgs_81" + }, "locked": { "lastModified": 1774455309, "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", @@ -2254,9 +2272,9 @@ "type": "github" } }, - "logos-nix_81": { + "logos-nix_82": { "inputs": { - "nixpkgs": "nixpkgs_81" + "nixpkgs": "nixpkgs_82" }, "locked": { "lastModified": 1773955630, @@ -2272,9 +2290,9 @@ "type": "github" } }, - "logos-nix_82": { + "logos-nix_83": { "inputs": { - "nixpkgs": "nixpkgs_82" + "nixpkgs": "nixpkgs_83" }, "locked": { "lastModified": 1773955630, @@ -2426,7 +2444,7 @@ }, "logos-package-manager_4": { "inputs": { - "logos-nix": "logos-nix_75", + "logos-nix": "logos-nix_76", "logos-package": "logos-package_9", "nix-bundle-appimage": "nix-bundle-appimage_4", "nix-bundle-dir": "nix-bundle-dir_13", @@ -2454,7 +2472,7 @@ }, "logos-package_10": { "inputs": { - "logos-nix": "logos-nix_81", + "logos-nix": "logos-nix_82", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -2614,7 +2632,7 @@ }, "logos-package_7": { "inputs": { - "logos-nix": "logos-nix_68", + "logos-nix": "logos-nix_69", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -2640,7 +2658,7 @@ }, "logos-package_8": { "inputs": { - "logos-nix": "logos-nix_72", + "logos-nix": "logos-nix_73", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -2665,7 +2683,7 @@ }, "logos-package_9": { "inputs": { - "logos-nix": "logos-nix_76", + "logos-nix": "logos-nix_77", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -2791,6 +2809,30 @@ "type": "github" } }, + "logos-qt-mcp": { + "inputs": { + "logos-nix": "logos-nix_66", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455349, + "narHash": "sha256-rebrtH1UxC1hDuwQBwyYbGzNCrnuuqiVL7OvzUhk65k=", + "owner": "logos-co", + "repo": "logos-qt-mcp", + "rev": "c5223b4b640add09e461983b8fddbd12c8b31f4f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-qt-mcp", + "type": "github" + } + }, "logos-standalone-app": { "inputs": { "logos-capability-module": "logos-capability-module", @@ -2829,6 +2871,7 @@ "logos-design-system": "logos-design-system_2", "logos-liblogos": "logos-liblogos_2", "logos-nix": "logos-nix_65", + "logos-qt-mcp": "logos-qt-mcp", "logos-view-module-runtime": "logos-view-module-runtime_2", "nix-bundle-lgx": "nix-bundle-lgx_4", "nixpkgs": [ @@ -2839,11 +2882,11 @@ ] }, "locked": { - "lastModified": 1775836431, - "narHash": "sha256-2zQcNzbO3RnC8zZBB2y1s1ItZNwYzqgJjlevYjzKQHQ=", + "lastModified": 1776167058, + "narHash": "sha256-gFZIedkIQAjrLp744p9RJKUUQrk08ZxwulMo5guPl3Q=", "owner": "logos-co", "repo": "logos-standalone-app", - "rev": "84d24c6a0d5c73bb81160e2a13de9995caa34c0f", + "rev": "3085ca870f95ed163f3fb8bb82caf3f422c41ac9", "type": "github" }, "original": { @@ -2888,7 +2931,7 @@ "logos-module-builder", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_70", + "logos-nix": "logos-nix_71", "nixpkgs": [ "logos-module-builder", "logos-test-framework", @@ -2948,7 +2991,7 @@ "logos-standalone-app", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_66", + "logos-nix": "logos-nix_67", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3057,7 +3100,7 @@ }, "nix-bundle-appimage_4": { "inputs": { - "logos-nix": "logos-nix_77", + "logos-nix": "logos-nix_78", "nix-bundle-dir": "nix-bundle-dir_12", "nixpkgs": [ "logos-module-builder", @@ -3111,7 +3154,7 @@ }, "nix-bundle-dir_10": { "inputs": { - "logos-nix": "logos-nix_69", + "logos-nix": "logos-nix_70", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3137,7 +3180,7 @@ }, "nix-bundle-dir_11": { "inputs": { - "logos-nix": "logos-nix_73", + "logos-nix": "logos-nix_74", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -3162,7 +3205,7 @@ }, "nix-bundle-dir_12": { "inputs": { - "logos-nix": "logos-nix_78", + "logos-nix": "logos-nix_79", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3187,7 +3230,7 @@ }, "nix-bundle-dir_13": { "inputs": { - "logos-nix": "logos-nix_79", + "logos-nix": "logos-nix_80", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3213,7 +3256,7 @@ }, "nix-bundle-dir_14": { "inputs": { - "logos-nix": "logos-nix_82", + "logos-nix": "logos-nix_83", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3535,7 +3578,7 @@ }, "nix-bundle-lgx_4": { "inputs": { - "logos-nix": "logos-nix_67", + "logos-nix": "logos-nix_68", "logos-package": "logos-package_7", "nix-bundle-dir": "nix-bundle-dir_10", "nixpkgs": [ @@ -3561,7 +3604,7 @@ }, "nix-bundle-lgx_5": { "inputs": { - "logos-nix": "logos-nix_71", + "logos-nix": "logos-nix_72", "logos-package": "logos-package_8", "nix-bundle-dir": "nix-bundle-dir_11", "nixpkgs": [ @@ -3587,7 +3630,7 @@ }, "nix-bundle-lgx_6": { "inputs": { - "logos-nix": "logos-nix_80", + "logos-nix": "logos-nix_81", "logos-package": "logos-package_10", "nix-bundle-dir": "nix-bundle-dir_14", "nixpkgs": [ @@ -3641,7 +3684,7 @@ }, "nix-bundle-logos-module-install_2": { "inputs": { - "logos-nix": "logos-nix_74", + "logos-nix": "logos-nix_75", "logos-package-manager": "logos-package-manager_4", "nix-bundle-lgx": "nix-bundle-lgx_6", "nixpkgs": [ @@ -4961,6 +5004,22 @@ "type": "github" } }, + "nixpkgs_83": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_9": { "locked": { "lastModified": 1759036355, diff --git a/logos-developer-guide.md b/logos-developer-guide.md index a6cfcaa..1e21cf8 100644 --- a/logos-developer-guide.md +++ b/logos-developer-guide.md @@ -16,28 +16,32 @@ A comprehensive guide to creating, building, testing, packaging, and distributin - [Part 2: Inspecting Your Module](#part-2-inspecting-your-module) - [2.1 The lm CLI Tool](#21-the-lm-cli-tool) - [2.2 The logos-module-viewer](#22-the-logos-module-viewer) -- [Part 3: Packaging Your Module](#part-3-packaging-your-module) - - [3.1 The LGX Package Format](#31-the-lgx-package-format) - - [3.2 Building LGX Packages](#32-building-lgx-packages) +- [Part 3: Testing UI Modules](#part-3-testing-ui-modules) + - [3.1 How It Works](#31-how-it-works) + - [3.2 Writing Tests](#32-writing-tests) + - [3.3 Running Tests](#33-running-tests) +- [Part 4: Packaging Your Module](#part-4-packaging-your-module) + - [4.1 The LGX Package Format](#41-the-lgx-package-format) + - [4.2 Building LGX Packages](#42-building-lgx-packages) - [Built-in Nix Derivation (Preferred)](#built-in-nix-derivation-preferred) - [Using nix bundle (Alternative)](#using-nix-bundle-alternative) -- [Part 4: Installing and Managing Modules](#part-4-installing-and-managing-modules) - - [4.1 The lgpm CLI](#41-the-lgpm-cli) - - [4.2 Installing from Local Files](#42-installing-from-local-files) - - [4.3 Installing from a Registry](#43-installing-from-a-registry) -- [Part 5: Running Your Module](#part-5-running-your-module) - - [5.1 Running with logoscore](#51-running-with-logoscore) -- [Part 6: Running in logos-basecamp](#part-6-running-in-logos-basecamp) - - [6.1 Building logos-basecamp](#61-building-logos-basecamp) - - [6.2 Module Types in logos-basecamp](#62-module-types-in-logos-basecamp) -- [Part 7: Inter-Module Communication](#part-7-inter-module-communication) - - [7.1 The LogosAPI](#71-the-logosapi) - - [7.2 The C++ SDK Code Generator](#72-the-c-sdk-code-generator) - - [7.3 LogosResult](#73-logosresult) - - [7.4 Communication Modes](#74-communication-modes) -- [Part 8: Advanced Topics](#part-8-advanced-topics) - - [8.1 Tutorials](#81-tutorials) - - [8.2 Module Dependencies](#82-module-dependencies) +- [Part 5: Installing and Managing Modules](#part-5-installing-and-managing-modules) + - [5.1 The lgpm CLI](#51-the-lgpm-cli) + - [5.2 Installing from Local Files](#52-installing-from-local-files) + - [5.3 Installing from a Registry](#53-installing-from-a-registry) +- [Part 6: Running Your Module](#part-6-running-your-module) + - [6.1 Running with logoscore](#61-running-with-logoscore) +- [Part 7: Running in logos-basecamp](#part-7-running-in-logos-basecamp) + - [7.1 Building logos-basecamp](#71-building-logos-basecamp) + - [7.2 Module Types in logos-basecamp](#72-module-types-in-logos-basecamp) +- [Part 8: Inter-Module Communication](#part-8-inter-module-communication) + - [8.1 The LogosAPI](#81-the-logosapi) + - [8.2 The C++ SDK Code Generator](#82-the-c-sdk-code-generator) + - [8.3 LogosResult](#83-logosresult) + - [8.4 Communication Modes](#84-communication-modes) +- [Part 9: Advanced Topics](#part-9-advanced-topics) + - [9.1 Tutorials](#91-tutorials) + - [9.2 Module Dependencies](#92-module-dependencies) - [Reference: Repository Map](#reference-repository-map) - [Reference: CLI Tools Summary](#reference-cli-tools-summary) - [Troubleshooting](#troubleshooting) @@ -377,11 +381,82 @@ This opens a window showing the module's metadata, methods, and allows interacti --- -## Part 3: Packaging Your Module +## Part 3: Testing UI Modules + +For `ui_qml` modules (both QML-only and C++ backend), `logos-module-builder` provides automatic integration testing using the [logos-qt-mcp](https://github.com/logos-co/logos-qt-mcp) QML inspector. + +### 3.1 How It Works + +The test infrastructure has three layers: + +1. **QML Inspector** — a TCP server compiled into `logos-standalone-app` that exposes the QML object tree +2. **MCP Server** — a Node.js bridge that translates test commands into inspector calls +3. **Test Framework** — a JavaScript API for writing UI assertions (`expectTexts`, `click`, `waitFor`, etc.) + +When you run `nix build .#integration-test`, the builder: +- Launches `logos-standalone-app` with your plugin in headless mode (`QT_QPA_PLATFORM=offscreen`) +- Connects to the QML inspector +- Runs all `.mjs` test files in your `tests/` directory + +### 3.2 Writing Tests + +Create `.mjs` files in `tests/`. Each file imports the test framework and defines test cases: + +```javascript +import { resolve } from "node:path"; + +// CI sets LOGOS_QT_MCP automatically; for interactive use: nix build .#test-framework -o result-mcp +const root = process.env.LOGOS_QT_MCP || new URL("../result-mcp", import.meta.url).pathname; +const { test, run } = await import(resolve(root, "test-framework/framework.mjs")); + +test("my_module: loads UI", async (app) => { + await app.waitFor( + async () => { await app.expectTexts(["Hello"]); }, + { timeout: 15000, interval: 500, description: "UI to load" } + ); +}); + +test("my_module: click button", async (app) => { + await app.click("Submit"); + await app.expectTexts(["Result:"]); +}); + +run(); +``` + +Key test APIs: +- `app.expectTexts(["text1", "text2"])` — assert text is visible in the UI +- `app.click("Button Text")` — find an element by text and click it +- `app.waitFor(fn, opts)` — retry an assertion until it passes or times out +- `app.screenshot()` — capture the current UI state + +### 3.3 Running Tests + +```bash +# Hermetic CI test (builds everything, no display needed) +nix build .#integration-test -L + +# Interactive: build the test framework locally (one-time) +nix build .#test-framework -o result-mcp + +# Start the app (inspector listens on localhost:3768) +nix run . + +# Run tests against the running app (in another terminal) +node tests/ui-tests.mjs +``` + +Multiple test files in `tests/` are discovered and run automatically. You can organize tests by concern (e.g., `tests/smoke.mjs`, `tests/interactions.mjs`). + +> **Note:** The integration test infrastructure requires `logos-standalone-app` with QML inspector support. This is provided automatically by `logos-module-builder` — no extra flake inputs needed. + +--- + +## Part 4: Packaging Your Module Before you can run your module with `logoscore` or install it into `logos-basecamp`, you need to package the build output into an `.lgx` package and install it into a `modules/` directory. -### 3.1 The LGX Package Format +### 4.1 The LGX Package Format Logos modules are distributed as **`.lgx` packages**. An LGX file is a gzip-compressed tar archive with a specific internal structure: @@ -401,7 +476,7 @@ mymodule.lgx (tar.gz) The **manifest.json** is auto-generated from your module's `metadata.json` by the bundler. It maps each variant to its main entry point. -### 3.2 Building LGX Packages +### 4.2 Building LGX Packages There are two ways to create `.lgx` packages. The preferred approach uses the built-in Nix derivation that comes with `logos-module-builder`. Alternatively, you can use the `nix bundle` command directly. @@ -475,9 +550,9 @@ This produces a `my_module-.lgx` file in the current directory. --- -## Part 4: Installing and Managing Modules +## Part 5: Installing and Managing Modules -### 4.1 The `lgpm` CLI +### 5.1 The `lgpm` CLI The **`lgpm`** CLI (Logos Package Manager) installs, searches, and manages module packages. Installing a package extracts it into a `modules/` directory that `logoscore` and `logos-basecamp` can load from. @@ -514,7 +589,7 @@ nix build 'github:logos-co/logos-package-manager#cli' --out-link ./package-manag | `--json` | Output in JSON format | | `-h, --help` | Show help | -### 4.2 Installing from Local Files +### 5.2 Installing from Local Files ```bash # Install a locally built .lgx package into a modules/ directory @@ -531,7 +606,7 @@ modules/ └── variant ``` -### 4.3 Downloading and Installing from a Registry +### 5.3 Downloading and Installing from a Registry To download packages from the online catalog and then install them locally, use `lgpd` (logos-package-downloader) followed by `lgpm`: @@ -559,11 +634,11 @@ nix build 'github:logos-co/logos-package-downloader#cli' --out-link ./downloader --- -## Part 5: Running Your Module +## Part 6: Running Your Module Once your module is packaged and installed into a `modules/` directory (see Parts 3 and 4), you can run it with `logoscore`. -### 5.1 Running with `logoscore` +### 6.1 Running with `logoscore` The **`logoscore`** CLI (from `logos-liblogos`) is a headless runtime that can load modules and invoke their methods from the command line. @@ -661,9 +736,9 @@ For one-shot execution (load, call, exit), use the legacy inline flags: --- -## Part 6: Running in logos-basecamp +## Part 7: Running in logos-basecamp -### 6.1 Building logos-basecamp +### 7.1 Building logos-basecamp logos-basecamp produces two binary variants: @@ -688,7 +763,7 @@ nix build 'github:logos-co/logos-basecamp#bin-macos-app' # macOS .app bundl > **Note:** When installing modules into logos-basecamp, the LGX variant type must match the build type. Dev builds of basecamp expect **dev** LGX variants (e.g., `darwin-arm64-dev`), while portable builds expect **portable** variants (e.g., `darwin-arm64`). Use the `dual` bundler (see [3.2](#32-bundling-with-nix-bundle-lgx)) to produce packages that work with both. -### 6.2 Module Types in logos-basecamp +### 7.2 Module Types in logos-basecamp The application supports three types of modules: @@ -754,9 +829,9 @@ These have `"type": "ui_qml"` with `"view"` but no `"main"` — pure QML, no C++ --- -## Part 7: Inter-Module Communication +## Part 8: Inter-Module Communication -### 7.1 The LogosAPI +### 8.1 The LogosAPI Every module receives a `LogosAPI*` pointer when `initLogos()` is called. This is your gateway to communicating with other modules. @@ -792,7 +867,7 @@ void MyModulePlugin::initLogos(LogosAPI* logosAPIInstance) > **Prefer async calls.** Synchronous `invokeRemoteMethod` blocks the caller's thread until the remote module responds. Use `invokeRemoteMethodAsync` to avoid blocking, especially in UI modules. -### 7.2 The C++ SDK Code Generator +### 8.2 The C++ SDK Code Generator The `logos-cpp-generator` tool (from `logos-cpp-sdk`) inspects a compiled module and generates typed C++ wrapper classes, so you get compile-time type safety instead of raw `invokeRemoteMethod` calls. @@ -851,7 +926,7 @@ The generated `LogosModules` struct provides a member for each module, with meth > **Prefer async wrappers.** Use `doSomethingAsync(...)` instead of `doSomething(...)` to avoid blocking the caller's thread. Synchronous calls can cause hangs if the target module is slow to respond. -### 7.3 LogosResult +### 8.3 LogosResult Many module methods return `LogosResult` for structured success/error handling: @@ -894,7 +969,7 @@ Q_INVOKABLE LogosResult MyModulePlugin::fetchData(const QString& id) { } ``` -### 7.4 Communication Modes +### 8.4 Communication Modes The SDK supports two communication modes: @@ -915,9 +990,9 @@ LogosModeConfig::setMode(LogosMode::Remote); --- -## Part 8: Advanced Topics +## Part 9: Advanced Topics -### 8.1 Tutorials +### 9.1 Tutorials For hands-on walkthroughs of module development patterns, see the dedicated tutorials: @@ -925,7 +1000,7 @@ For hands-on walkthroughs of module development patterns, see the dedicated tuto - **[Building a QML UI App](tutorial-qml-ui-app.md)** — create `calc_ui`, a QML-only UI plugin that calls a core module via the `logos.callModule()` bridge. - **[Building a C++ UI Module](tutorial-cpp-ui-app.md)** — build `calc_ui_cpp`, a C++ + QML view module that combines a QML frontend with a C++ backend. The backend exposes `Q_INVOKABLE` methods using the generated typed SDK; the QML view calls them via `logos.callModuleAsync()`. -### 8.2 Module Dependencies +### 9.2 Module Dependencies Declare dependencies in your `metadata.json`: diff --git a/tutorial-cpp-ui-app.md b/tutorial-cpp-ui-app.md index 868e1e0..9e37e79 100644 --- a/tutorial-cpp-ui-app.md +++ b/tutorial-cpp-ui-app.md @@ -419,6 +419,51 @@ nix run . -- --load-modules calc_ui_cpp --- +## Step 10: UI Integration Tests (Optional) + +Add automated UI tests using the [logos-qt-mcp](https://github.com/logos-co/logos-qt-mcp) test framework. Just create `.mjs` files in `tests/` and `logos-module-builder` auto-wires `nix build .#integration-test`. + +Create `tests/ui-tests.mjs`: + +```javascript +import { resolve } from "node:path"; + +// CI sets LOGOS_QT_MCP automatically; for interactive use: nix build .#test-framework -o result-mcp +const root = process.env.LOGOS_QT_MCP || new URL("../result-mcp", import.meta.url).pathname; +const { test, run } = await import(resolve(root, "test-framework/framework.mjs")); + +test("calc_ui_cpp: loads and shows title", async (app) => { + await app.waitFor( + async () => { await app.expectTexts(["UI Example (C++ backend)"]); }, + { timeout: 15000, interval: 500, description: "UI to load" } + ); +}); + +test("calc_ui_cpp: shows connection status", async (app) => { + await app.expectTexts(["Connecting to backend..."]); +}); + +test("calc_ui_cpp: add button visible", async (app) => { + await app.expectTexts(["Add"]); +}); + +run(); +``` + +```bash +git add tests/ + +# Hermetic CI test +nix build .#integration-test -L + +# Interactive +nix build .#test-framework -o result-mcp +nix run . # app with inspector on :3768 +node tests/ui-tests.mjs # in another terminal +``` + +--- + ## Comparison: .rep Interface Patterns | Pattern | .rep declaration | Backend C++ | QML usage | diff --git a/tutorial-qml-ui-app.md b/tutorial-qml-ui-app.md index 09d7c2a..82f2ff7 100644 --- a/tutorial-qml-ui-app.md +++ b/tutorial-qml-ui-app.md @@ -484,6 +484,66 @@ qml Main.qml --- +## Step 8: UI Integration Tests (Optional) + +You can add automated UI tests that verify your QML plugin renders correctly. The test infrastructure is built into `logos-module-builder` — just add `.mjs` test files to a `tests/` directory and you get `nix build .#integration-test` for free. + +Tests use the [logos-qt-mcp](https://github.com/logos-co/logos-qt-mcp) test framework, which connects to the QML inspector inside `logos-standalone-app` and can find elements, click buttons, verify text, and take screenshots. + +### 8.1 Create a test file + +Create `tests/ui-tests.mjs`: + +```javascript +import { resolve } from "node:path"; + +// CI sets LOGOS_QT_MCP automatically; for interactive use: nix build .#test-framework -o result-mcp +const root = process.env.LOGOS_QT_MCP || new URL("../result-mcp", import.meta.url).pathname; +const { test, run } = await import(resolve(root, "test-framework/framework.mjs")); + +test("calc_ui: loads and shows title", async (app) => { + await app.waitFor( + async () => { await app.expectTexts(["Calculator"]); }, + { timeout: 15000, interval: 500, description: "calc_ui to load" } + ); +}); + +test("calc_ui: add button visible", async (app) => { + await app.expectTexts(["Add"]); +}); + +test("calc_ui: click add and check result", async (app) => { + await app.click("Add"); + // Verify the result appears (depends on your UI) + await app.waitFor( + async () => { await app.expectTexts(["Result:"]); }, + { timeout: 5000, interval: 500, description: "result to appear" } + ); +}); + +run(); +``` + +### 8.2 Run the tests + +```bash +git add tests/ + +# Hermetic CI test (builds everything, runs headless) +nix build .#integration-test -L + +# Interactive: build test framework, run against a running app +nix build .#test-framework -o result-mcp +nix run . # start the app with inspector on :3768 +node tests/ui-tests.mjs # in another terminal +``` + +The `integration-test` output launches `logos-standalone-app` with `QT_QPA_PLATFORM=offscreen` (no display needed), connects to the QML inspector, and runs all `.mjs` files in `tests/`. + +You can have multiple test files (e.g., `tests/smoke.mjs`, `tests/interactions.mjs`) — they are all discovered and run automatically. + +--- + ## Known Limitations ### QML-to-C++ type coercion