commit 93ad1a72c2e3adc6184e94b0c874260b05c3d538 Author: Antoine Date: Wed Dec 10 10:18:41 2025 -0500 Initial commit: Server configurations and license management diff --git a/NX Licenses/DocumentationProxy.3.3.1.aol b/NX Licenses/DocumentationProxy.3.3.1.aol new file mode 100644 index 0000000..f2b0f8f Binary files /dev/null and b/NX Licenses/DocumentationProxy.3.3.1.aol differ diff --git a/NX Licenses/License_Ugslmd.txt b/NX Licenses/License_Ugslmd.txt new file mode 100644 index 0000000..c9fd0a9 --- /dev/null +++ b/NX Licenses/License_Ugslmd.txt @@ -0,0 +1,416 @@ + + + + + +################################################################################ +# # +# # +# Siemens Industry Software Inc. # +# License File # +# # +# Sold-To/Install: 10219284 WebKey Access Code: 94H8K31Z45 # +# Contact Name: Mayahtt Licensing NA Created: 11/26/2025 # +# Customer Name: Atomaste # +# E-mail Address: antoine@atomaste.ca Version: 2506 # +# Type: Production 1 # +################################################################################ +# For issues with the license file please open a service ticket at # +# https://www.sw.siemens.com/en-US/support-services/ # +# # +################################################################################ +SERVER YourHostname ANY 28000 +VENDOR ugslmd +PACKAGE NX93300 ugslmd 2025.06 COMPONENTS="NX93300_3d_to_2d_flattener \ + NX93300_adv_assemblies NX93300_assemblies \ + NX93300_design_studio NX93300_drafting NX93300_dxf_to_ug \ + NX93300_dxfdwg NX93300_features_modeling \ + NX93300_free_form_modeling NX93300_gateway \ + NX93300_geometric_tol NX93300_grip_execute NX93300_iges \ + NX93300_nx_design_explr_eval NX93300_nx_freeform_1 \ + NX93300_nx_freeform_2 NX93300_nx_ml_region_finder \ + NX93300_nx_ml_sel_pred_std NX93300_nx_ml_show_hide \ + NX93300_nx_multi_scale NX93300_nx_nastran_export \ + NX93300_nx_sheet_metal NX93300_nx_spsd_stress \ + NX93300_nx_spsd_vibration NX93300_nx_subdivision \ + NX93300_nx_synchronous NX93300_nx_visual_reporting \ + NX93300_pcf_package_file NX93300_pstudio_cons \ + NX93300_pv_ugdatagenerator NX93300_routing_base \ + NX93300_sla_3d_systems NX93300_solid_modeling \ + NX93300_step_ap203 NX93300_step_ap214 NX93300_studio_analyze \ + NX93300_studio_free_form NX93300_studio_render \ + NX93300_studio_visualize NX93300_ug_checkmate \ + NX93300_ug_kf_checker NX93300_ug_kf_execute NX93300_ug_nas_des \ + NX93300_ug_opt_wizard NX93300_ug_prod_des_advisor \ + NX93300_ug_smart_models NX93300_ug_to_dxf \ + NX93300_ug_web_express NX93300_ugopen_menuscript \ + NX93300_usr_defined_features NX93300_wave " OPTIONS=SUITE \ + SIGN="1A25 C82B 267E 8FE0 B53B 01ED 1C72 5D22 247C 8E77 B1D7 \ + 3754 6068 BBDF F291 0670 F840 5BF3 E795 C408 8C6C 1E30 D331 \ + 77F1 DF45 7FC0 CDCB BBBA 04D3 695C" +PACKAGE SC13500 ugslmd 2025.06 COMPONENTS="SC13500_3d_to_2d_flattener \ + SC13500_assemblies SC13500_dxfdwg SC13500_features_modeling \ + SC13500_gateway SC13500_grip_execute SC13500_id_ext_fem_beam \ + SC13500_iges SC13500_nx_freeform_1 SC13500_nx_freeform_2 \ + SC13500_nx_ftk SC13500_nx_masterfem SC13500_nx_material_system \ + SC13500_nx_nastran_export SC13500_nx_nastran_import \ + SC13500_nx_spsd_stress SC13500_nx_spsd_vibration \ + SC13500_nx_visual_reporting SC13500_pcf_package_file \ + SC13500_pstudio_cons SC13500_pv_ugdatagenerator \ + SC13500_sc_enabled SC13500_sla_3d_systems \ + SC13500_solid_modeling SC13500_step_ap203 SC13500_step_ap214 \ + SC13500_studio_render SC13500_studio_visualize \ + SC13500_ug_checkmate SC13500_ug_kf_checker \ + SC13500_ug_kf_execute SC13500_ug_nas_bn \ + SC13500_ug_smart_models SC13500_ug_struct_pe_solver \ + SC13500_ug_web_express SC13500_ugopen_menuscript \ + SC13500_usr_defined_features" OPTIONS=SUITE SIGN="1257 B7C1 \ + 671A BDB0 D205 6472 EE46 9510 2A46 60D1 1522 E095 8BB7 4403 \ + 4864 1CBD 96B9 4A5B C59D 2FD7 058C 8122 8A11 6F47 53A4 7B73 \ + C079 424E 84B2 4295" +INCREMENT NX93300 ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="NX Design for Industrial Design" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="0921 2972 E79F DEBF 11A2 \ + A26D C67F B071 D56F D973 2715 B968 9198 6FBF 4CA4 0986 825C \ + 4C2B 2739 D0BF C9D3 778B 2724 B26C A5E8 9878 E5E6 53D4 AF0E \ + 559B" +INCREMENT SC13500 ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="1A99 2218 8B08 3AD2 73CC \ + F260 D83B 306C 6FE2 E1E0 1C1B 1BD1 33A1 CC21 2349 0DC1 A3FD \ + 10B0 7710 5080 894A 92BA 69C8 732E FABE 15CC 6BA2 3EBC 1294 \ + D299" +INCREMENT active_collab ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="16E9 9029 75B8 FEA5 \ + 8519 7DD3 6858 018A 6992 B695 2ADB 6861 0A00 923D CCA6 005A \ + 5FB5 9D23 7E99 F4BD 0401 ABD0 9944 C2B7 1FCD A3D3 B7C5 0E2C \ + C851 202B" +INCREMENT adv_structure_mgt ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="1B19 5175 ADB1 69E1 \ + D5DE E2AB 6135 E2CE 7967 533C E4EC 81E1 5E9A 306E AE4A 1932 \ + AD3E CEBD 1AD4 6266 E4D3 150E 34B1 2D00 269A 558A 74A8 759E \ + A16E F14F" +INCREMENT ansys_meshers ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="0A20 EF24 B6EA 46F1 9F7F \ + 7149 1E75 4881 46EB ED8E 863B A3F4 A56F 84FA 00FA 13DB 47C9 \ + 1944 5743 4089 D2E5 5A5C BC3F DB45 CAE3 29EC 9738 9165 88C2 \ + 0585" +INCREMENT gfem_ansys ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="0A7A 87D9 4526 8C10 ADBB \ + 7780 562E DEA3 2973 422A 2262 2700 C04D BAC0 2629 1B0A B372 \ + 5313 C1F9 8E26 721F C0AD 0BF5 A95A BEA4 0EF9 02A3 280A A7AC \ + B26F" +INCREMENT gfem_nastran ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="1950 DF26 784C 0CE5 B3A1 \ + F9C4 3BE7 EE91 5E47 979F 260F 9661 A7A6 5930 0F0B 0DEA 8949 \ + D268 56BD A573 184A 1C6A 9EB1 C5B6 9054 7B24 B602 9D2C CE19 \ + 0CF4" +INCREMENT hds_heeds_dll_nx ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="1355 5397 1CE3 90D1 2018 \ + 5CCD 5128 7338 A444 E09C 9F4D 2572 D2A6 423A 42DD 1137 3985 \ + 285E 223D A33F E702 C654 B3B0 23A8 D1C0 ABFE D918 D41E D828 \ + 9DF3" +INCREMENT ideas_integration ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0066 09CF F78B D7BB \ + DF40 980F 9BAA DE46 9322 BBBB 161E A5E0 2D8D CD46 8967 14FC \ + BF0E 46E5 0DE1 6544 DECC 1DAB E3B0 970D EFDF 556F 8224 DB0A \ + CFE3 1F4C" +INCREMENT nx_design_explr_eval ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="080D C59F 4E60 7D10 49FE \ + 6F55 AFCC A5F0 4512 34F4 AAE3 AB25 7DA2 4E94 043D 1E68 E48B \ + 7F78 6FF5 D9A7 FEB7 8288 B3D8 CC27 CDFC 73BA 0637 464C 5311 \ + 9562" +INCREMENT nx_design_token ugslmd 2025.06 03-dec-2025 50 SUPERSEDE \ + DUP_GROUP=NONE ISSUED=26-nov-2025 SIGN="152C 4330 B6BE F1B2 \ + 15A0 E913 1CCF B17B 0475 EB7E 4217 C994 0C5B 7065 B7CB 0DD3 \ + C22A F151 BB49 7168 1CFD 8E32 0AEB 0078 7A02 608F 40F4 9F6A \ + E54E 320D" +INCREMENT nx_integration ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="055C 70C3 541D 9DD1 \ + E5B8 3050 CF67 6431 098A D4A8 7134 CCF4 EBFB 2FF6 3358 00D9 \ + 2EB4 74BD F6C8 BA1A 402A 188E 813E D4D5 04CB 5109 051E 3F46 \ + 2F3B 2157" +INCREMENT nx_nas_bn_basic_dsk ugslmd 2025.06 03-dec-2025 2 SUPERSEDE \ + DUP_GROUP=NONE user_info="Common to NX Design for Industrial \ + Design; Simcenter Structures" ISSUED=26-nov-2025 BORROW=2880 \ + SIGN="17C6 AC2D EC5A 2782 8BF4 04A8 DF07 3F07 FDD0 F58A D075 \ + F58A E1AD 9C84 D1C4 03A2 8104 8FA9 4682 B3D5 02E4 947E C0AC \ + FBEA 2369 957F F5C6 A113 AAB9 62D4" +INCREMENT nx_nas_nonlin_dsk ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=NONE user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="08EA A596 E192 1A67 C901 \ + 0B91 E172 7353 EF0E 96C9 A5C7 0B65 7E9D 4BF6 657C 1D2F 435C \ + 7B0D 5290 8E47 3EB7 8CC0 BC29 B136 878D F426 AC4E 7453 130E \ + 342C" +INCREMENT nx_synchronous ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="1881 4DA3 33D9 2D3E 73BD \ + 35DD 17E9 59F6 32AC 35CB 8350 4DA0 ECF7 1241 62EA 0CF2 45C5 \ + FAFE AEA5 DA90 43AA 63CD 4988 0A1F 36AB 55C0 8196 8C10 BD78 \ + CC18" +INCREMENT ple_diagram ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0BF8 A2A0 02D0 4055 \ + A026 30A1 B0F6 F377 2589 6479 1D72 51BA 96B4 FC52 1D36 02F9 \ + 596D 6325 E480 147A 35A2 C3CF 4FB2 EF01 7A20 2DBF 0B6F D6EB \ + F37A BDDA" +INCREMENT remotesim_plugin ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="08C9 5335 9133 BAA2 E81E \ + 9A07 BADA CE54 C617 5319 0834 EEFE C817 7AD3 3414 0D3E 392C \ + 497D 8E52 6741 88F7 8E63 B482 922E D5F5 A4AA B9C6 757F D150 \ + DD03" +INCREMENT remotesim_server ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="0A2C 0F2D 4B18 4C62 1889 \ + F0E7 B94A 5658 3794 37E5 AFDB CEED 08D2 DBD0 DBF3 104B 36CB \ + 7664 3FE3 BAD1 94A3 3850 0ADE F3C2 ABDB 4915 790F 4137 8C64 \ + E8C1" +INCREMENT sc3d_dsktop_presence ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="0849 37BB A206 7C6B A33A \ + 3B04 ED69 7E4B 932A 6F1C 3EB8 D564 8BC2 1EC4 B600 01C8 57E2 \ + F546 802E 1ADC 39D2 F3DF 6135 6E93 BFAE D0AC 3AC2 754B 675C \ + 77A3" +INCREMENT sc_design_explr_eval ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="100D E52C 3EF9 2014 0AAA \ + D4D1 D7CE 447F A9C7 C5BA 6903 F7E4 5193 1936 9ADF 1159 D92E \ + 5E05 DF99 4B51 A444 6989 6AFA 673C 5F21 2DF3 002E 5845 730F \ + EE4B" +INCREMENT teamcenter_admin ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="1E00 7C83 E7DB 38AE \ + 1E31 1A0C 2D8B D825 81A4 7C0C 9B59 AEEF 104F 2B74 B119 10CF \ + 687C 457A 54A4 D2D5 08F9 5FDA A69E 336C B373 8B7D 14E9 0333 \ + AC34 A7D4" +INCREMENT teamcenter_author ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="1DE6 C4C9 62BA 7037 \ + E3DB 550E 1CB8 58AE 69EA 04C6 CD22 772C FC02 16D3 16EE 0921 \ + 546B DEDF D069 9192 287D 5775 57A6 3A9F FA84 3A83 486E 38DB \ + 862E 059E" +INCREMENT teamcenter_designer ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0909 B063 9ED5 B35D \ + 2F8F 9B7B 0F31 A6F2 97B4 18E7 5BCA D635 77F0 8A3A A8F8 09A2 \ + B173 9B73 D7A3 744E 19DB 7C38 9A8A 788B 2589 746B C441 B0F9 \ + 5C88 C759" +INCREMENT teamcenter_doctor ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="0F17 F741 AA07 E493 \ + C666 A92D 3D07 3895 578B 20A0 ABAE A4FC 9FFF 6947 FCCF 14E9 \ + 0D04 7150 B65D AA02 F581 6479 EBEB 6B24 005B F855 7949 1BD9 \ + 04B0 181B" +INCREMENT teamcenter_tcrs ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="08BB D943 BE42 5945 \ + C5EF 9560 39CC A93A 84FD 01BB 8759 A4AF 0BDE F028 ED36 1896 \ + B627 2455 C299 ABCB 066C DDE0 B8B3 3863 786B 6335 510F DF55 \ + 5EDD 7832" +INCREMENT ug_scenario ugslmd 2025.06 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=26-nov-2025 BORROW=2880 SIGN="18C0 BB1F 9A6D F9D5 37E9 \ + 7F70 5D82 880D 74A6 8CDB 7CD9 9771 C35C 4CB2 A64E 014C D206 \ + 49F7 0920 04C4 3C3F E359 9987 C610 A834 5853 453F 91EC E4EC \ + A789" +INCREMENT vendor_mgt ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="00EE 4076 BD93 D0E4 \ + FECA DC40 D1F6 A4E9 D915 8C0D 9099 3F91 D5F2 7E95 DD04 19F8 \ + 7488 2A07 41E8 4E8A DC88 79C6 B6E6 309A 2A75 A51F 2160 4248 \ + 2BE6 85F8" +INCREMENT visview_base ugslmd 2025.12 03-dec-2025 2 SUPERSEDE \ + DUP_GROUP=UHD user_info="Common to Simcenter Structures; Tc \ + Author" ISSUED=26-nov-2025 BORROW=2880 SIGN="1888 6747 B96E \ + 3958 4D2F 284B 55EF 9409 676F 2114 C85B F903 561E F1BC 7D64 \ + 1603 B224 48C3 F930 894E EE27 A15D 36F9 600F D944 B504 3AEF \ + 4B3B 5D54 3AAA" +INCREMENT vp_convert ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Tc Author" ISSUED=26-nov-2025 \ + BORROW=2880 SIGN="0E9A 700F FD75 6033 2D37 C4A4 B846 087E F704 \ + DF12 6036 07BB 36B4 C639 A1F1 0726 15AF E25A A16A 2239 CBE2 \ + 6108 0BAE 984D 5DFF D0D7 8238 D7A5 803A B9A3" +INCREMENT vp_print ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Tc Author" ISSUED=26-nov-2025 \ + BORROW=2880 SIGN="11CE 4367 8C35 33C6 D4B3 4A76 A0D9 0286 FD66 \ + E720 DF9D E457 8029 E4E0 C9B8 0BD9 2D68 0697 F1BC CE30 DE71 \ + 0903 7DC2 B138 AC76 0695 06F2 F1D0 8E00 AED7" +INCREMENT xc_nx ugslmd 2025.06 03-dec-2025 1 SUPERSEDE DUP_GROUP=NONE \ + ISSUED=26-nov-2025 SIGN="0CBE 9E31 0C26 0B9A C17E 7B57 50DE \ + B991 D264 6938 82DE BF6B 039D F7A2 4BC1 0924 651D C9C0 6C2C \ + F6BA EF75 7C43 9B95 E271 8EE1 885A 4C62 9269 6EEE B4B1" +INCREMENT xc_teamcenter ugslmd 2025.12 03-dec-2025 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=26-nov-2025 SIGN="121F 25DB 6728 F11E \ + F885 6E24 1B9F 8885 1C2B 3394 FEF6 EF3E B56B B202 B860 072F \ + 2250 F750 7989 F8EE A560 E5AD 3B52 8324 F594 760A E189 25D7 \ + 75E7 73A0" +INCREMENT xc_vis ugslmd 2025.12 03-dec-2025 1 SUPERSEDE DUP_GROUP=UHD \ + ISSUED=26-nov-2025 SIGN="028C 4AF2 916F 28DA D0B6 80C4 3CE9 \ + FD89 B4A3 2D81 D928 94C5 2D94 0179 EE6A 0E72 016B 6F07 60F6 \ + 7671 E7F3 59EF AD9C A926 50BB B57A 3D39 5CBA E93B 14BC" +INCREMENT borrowing ugslmd 2025.12 permanent 1 DUP_GROUP=NONE \ + user_info="License Borrow Option" ISSUED=26-nov-2025 \ + SIGN="10E0 F841 7EFA 75D5 9F7A 4E26 B763 7601 DDFD 3D09 5E8F \ + 3A5D 2E7D E10C 68F2 1403 AA39 A604 B9FA 8870 310B 9848 3936 \ + B7D0 FD65 530D 37F0 7C26 61F4 4AFA" +INCREMENT gateway_id ugslmd 2025.06 permanent 1000 SUPERSEDE \ + DUP_GROUP=UHD user_info="I-deas gateway" ISSUED=26-nov-2025 \ + BORROW=2880 SIGN="0E25 E9DE 76FF 553A 54DC DA57 7C60 AEE5 9B9E \ + 461A 3598 021A 0FFB 0E70 4CBC 05D1 236E 67E9 AF4A 759B 2E59 \ + 2D14 0B13 2210 4DA8 96EE 1AF3 7D68 C928 EDCA" +INCREMENT server_id ugslmd 2025.12 permanent 1 \ + VENDOR_STRING="10219284 - Atomaste" user_info=94H8K31Z45 \ + ISSUER=SIEMENS BORROW=2880 SIGN="07FC 7D42 D528 9194 8CA1 03CC \ + 7823 7B31 705B A7C1 9B0D A8A2 3B96 8469 B297 0604 9136 7FDC \ + 3D95 C356 F040 5418 E524 BD89 D035 1DC7 60A1 9104 C553 2680" + + + + + +################################################################################ +# # +# SOFTWARE LICENSE TO FEATURE NAME CROSS REFERENCE # +# Version: 2506 Created: 11/26/2025 14:04:39# +# Atomaste Sold-To/Install: 10219284 # +################################################################################ + +# LICENSE PRODUCT QTY DESCRIPTION QTY FEATURE NAME + +# --------------- ----- -------------------- ----- --------------------------- +# NX35050 1 NX Value Based Licensing 50 pack +# 50 nx_design_token +# NX93300 1 NX Design for Industrial Design +# 1 3d_to_2d_flattener +# 1 adv_assemblies +# 1 assemblies +# 1 design_studio +# 1 drafting +# 1 dxf_to_ug +# 1 dxfdwg +# 1 features_modeling +# 1 free_form_modeling +# 1 gateway +# 1 geometric_tol +# 1 grip_execute +# 1 ideas_integration +# 1 iges +# 1 nx_design_explr_eval +# 1 nx_freeform_1 +# 1 nx_freeform_2 +# 1 nx_integration +# 1 nx_ml_region_finder +# 1 nx_ml_sel_pred_std +# 1 nx_ml_show_hide +# 1 nx_multi_scale +# 1 nx_nas_bn_basic_dsk +# 1 nx_nastran_export +# 1 nx_sheet_metal +# 1 nx_spsd_stress +# 1 nx_spsd_vibration +# 1 nx_subdivision +# 1 nx_synchronous +# 1 nx_visual_reporting +# 1 pcf_package_file +# 1 ple_diagram +# 1 pstudio_cons +# 1 pv_ugdatagenerator +# 1 routing_base +# 1 sla_3d_systems +# 1 solid_modeling +# 1 step_ap203 +# 1 step_ap214 +# 1 studio_analyze +# 1 studio_free_form +# 1 studio_render +# 1 studio_visualize +# 1 ug_checkmate +# 1 ug_kf_checker +# 1 ug_kf_execute +# 1 ug_nas_des +# 1 ug_opt_wizard +# 1 ug_prod_des_advisor +# 1 ug_smart_models +# 1 ug_to_dxf +# 1 ug_web_express +# 1 ugopen_menuscript +# 1 usr_defined_features +# 1 wave +# SC13500 1 Simcenter Structures 1 3d_to_2d_flattener +# 1 ansys_meshers +# 1 assemblies +# 1 dxfdwg +# 1 features_modeling +# 1 gateway +# 1 gfem_ansys +# 1 gfem_nastran +# 1 grip_execute +# 1 hds_heeds_dll_nx +# 1 id_ext_fem_beam +# 1 ideas_integration +# 1 iges +# 1 nx_design_explr_eval +# 1 nx_freeform_1 +# 1 nx_freeform_2 +# 1 nx_ftk +# 1 nx_integration +# 1 nx_masterfem +# 1 nx_material_system +# 1 nx_nas_bn_basic_dsk +# 1 nx_nas_nonlin_dsk +# 1 nx_nastran_export +# 1 nx_nastran_import +# 1 nx_spsd_stress +# 1 nx_spsd_vibration +# 1 nx_synchronous +# 1 nx_visual_reporting +# 1 pcf_package_file +# 1 pstudio_cons +# 1 pv_ugdatagenerator +# 1 remotesim_plugin +# 1 remotesim_server +# 1 sc3d_dsktop_presence +# 1 sc_design_explr_eval +# 1 sc_enabled +# 1 sla_3d_systems +# 1 solid_modeling +# 1 step_ap203 +# 1 step_ap214 +# 1 studio_render +# 1 studio_visualize +# 1 teamcenter_designer +# 1 ug_checkmate +# 1 ug_kf_checker +# 1 ug_kf_execute +# 1 ug_nas_bn +# 1 ug_scenario +# 1 ug_smart_models +# 1 ug_struct_pe_solver +# 1 ug_web_express +# 1 ugopen_menuscript +# 1 usr_defined_features +# 1 visview_base +# TC10101 1 Tc Author 1 active_collab +# 1 adv_structure_mgt +# 1 teamcenter_author +# 1 teamcenter_doctor +# 1 vendor_mgt +# 1 visview_base +# 1 vp_convert +# 1 vp_print +# TC50100 1 Teamcenter Rapid Start +# 1 teamcenter_tcrs +# TCADMIN 2 Teamcenter Admin 2 teamcenter_admin + + + + +################################################################################ +# # +# The following products are not included on this file # +# for the respective reason listed # +# # +################################################################################ + +# PRODUCT QTY DESCRIPTION REASON +# ------------------ ----- ----------------------- --------------------- +# TC1DOTC 1 Teamcenter Deployment Deployment Option diff --git a/NX Licenses/License_Ugslmd_2.txt b/NX Licenses/License_Ugslmd_2.txt new file mode 100644 index 0000000..8ac6abc --- /dev/null +++ b/NX Licenses/License_Ugslmd_2.txt @@ -0,0 +1,416 @@ + + + + + +################################################################################ +# # +# # +# Siemens Industry Software Inc. # +# License File # +# # +# Sold-To/Install: 10219284 WebKey Access Code: R1FCRAKGPG # +# Contact Name: Mayahtt Licensing NA Created: 02.12.2025 # +# Customer Name: Atomaste # +# E-mail Address: licensingna@mayahtt.com Version: 2506 # +# Type: Production 1 # +################################################################################ +# For issues with the license file please open a service ticket at # +# https://www.sw.siemens.com/en-US/support-services/ # +# # +################################################################################ +SERVER dalidou COMPOSITE=88F027D30355 28000 +VENDOR ugslmd +PACKAGE NX93300 ugslmd 2025.06 COMPONENTS="NX93300_3d_to_2d_flattener \ + NX93300_adv_assemblies NX93300_assemblies \ + NX93300_design_studio NX93300_drafting NX93300_dxf_to_ug \ + NX93300_dxfdwg NX93300_features_modeling \ + NX93300_free_form_modeling NX93300_gateway \ + NX93300_geometric_tol NX93300_grip_execute NX93300_iges \ + NX93300_nx_design_explr_eval NX93300_nx_freeform_1 \ + NX93300_nx_freeform_2 NX93300_nx_ml_region_finder \ + NX93300_nx_ml_sel_pred_std NX93300_nx_ml_show_hide \ + NX93300_nx_multi_scale NX93300_nx_nastran_export \ + NX93300_nx_sheet_metal NX93300_nx_spsd_stress \ + NX93300_nx_spsd_vibration NX93300_nx_subdivision \ + NX93300_nx_synchronous NX93300_nx_visual_reporting \ + NX93300_pcf_package_file NX93300_pstudio_cons \ + NX93300_pv_ugdatagenerator NX93300_routing_base \ + NX93300_sla_3d_systems NX93300_solid_modeling \ + NX93300_step_ap203 NX93300_step_ap214 NX93300_studio_analyze \ + NX93300_studio_free_form NX93300_studio_render \ + NX93300_studio_visualize NX93300_ug_checkmate \ + NX93300_ug_kf_checker NX93300_ug_kf_execute NX93300_ug_nas_des \ + NX93300_ug_opt_wizard NX93300_ug_prod_des_advisor \ + NX93300_ug_smart_models NX93300_ug_to_dxf \ + NX93300_ug_web_express NX93300_ugopen_menuscript \ + NX93300_usr_defined_features NX93300_wave " OPTIONS=SUITE \ + SIGN="1A25 C82B 267E 8FE0 B53B 01ED 1C72 5D22 247C 8E77 B1D7 \ + 3754 6068 BBDF F291 0670 F840 5BF3 E795 C408 8C6C 1E30 D331 \ + 77F1 DF45 7FC0 CDCB BBBA 04D3 695C" +PACKAGE SC13500 ugslmd 2025.06 COMPONENTS="SC13500_3d_to_2d_flattener \ + SC13500_assemblies SC13500_dxfdwg SC13500_features_modeling \ + SC13500_gateway SC13500_grip_execute SC13500_id_ext_fem_beam \ + SC13500_iges SC13500_nx_freeform_1 SC13500_nx_freeform_2 \ + SC13500_nx_ftk SC13500_nx_masterfem SC13500_nx_material_system \ + SC13500_nx_nastran_export SC13500_nx_nastran_import \ + SC13500_nx_spsd_stress SC13500_nx_spsd_vibration \ + SC13500_nx_visual_reporting SC13500_pcf_package_file \ + SC13500_pstudio_cons SC13500_pv_ugdatagenerator \ + SC13500_sc_enabled SC13500_sla_3d_systems \ + SC13500_solid_modeling SC13500_step_ap203 SC13500_step_ap214 \ + SC13500_studio_render SC13500_studio_visualize \ + SC13500_ug_checkmate SC13500_ug_kf_checker \ + SC13500_ug_kf_execute SC13500_ug_nas_bn \ + SC13500_ug_smart_models SC13500_ug_struct_pe_solver \ + SC13500_ug_web_express SC13500_ugopen_menuscript \ + SC13500_usr_defined_features" OPTIONS=SUITE SIGN="1257 B7C1 \ + 671A BDB0 D205 6472 EE46 9510 2A46 60D1 1522 E095 8BB7 4403 \ + 4864 1CBD 96B9 4A5B C59D 2FD7 058C 8122 8A11 6F47 53A4 7B73 \ + C079 424E 84B2 4295" +INCREMENT NX93300 ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="NX Design for Industrial Design" \ + ISSUED=02-dec-2025 BORROW=2880 SIGN="1206 B94C C1B3 EE1F 3F06 \ + 0285 8E3B 8559 84A8 72F1 1436 9086 157A 818A D74D 1C33 1EDC \ + C297 4C1F 62D2 EA12 AED9 1F23 F836 8766 4396 50D9 7CC3 C914 \ + C91E" +INCREMENT SC13500 ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="047C 6BBB 8D45 F7B2 2AE9 \ + 4E52 49EA 554E 4701 5312 0EEB 19D5 45D7 2BFD 8D80 0E5D 901C \ + 77C1 D037 7191 0A26 9AA5 350C 5197 4AD2 5170 A19C 20F9 0015 \ + D2E4" +INCREMENT active_collab ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1AB8 9C55 D5C9 5000 \ + 0329 C374 E7C9 E84D C96F F06C 1BED C709 2845 D64F CCBA 0D44 \ + 65FD A438 F028 305C A0C2 9306 A8EB 60E4 AD6B 6081 1248 3EF2 \ + 371F DBE9" +INCREMENT adv_structure_mgt ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="07A1 34CE 41C7 8373 \ + 999C E10A E38E 0D24 A8D7 6EC5 0A65 941F 70C5 0D75 0619 0B49 \ + D9A3 48C0 2FD8 0FC5 301D EA59 E100 ACAB A217 3A25 EDB5 D202 \ + 1EC7 20F5" +INCREMENT ansys_meshers ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="1E58 CCCE AEB8 F250 B98D \ + 5A51 5D29 4EBB 9B8E 5FC5 C753 75BB 704B ED26 C1A7 0015 1CC3 \ + 1D6C EE0D 5B1D 3661 EFF2 50C6 B10B B630 A15B 17F9 6683 CADE \ + 0925" +INCREMENT gfem_ansys ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="0ED7 D431 3BFA DBD6 E43D \ + 1A40 5206 0257 9E85 25E6 4A8F 0E2A 8055 CFA0 A2D6 1DFF 2169 \ + AF0C 346D 135F 8525 1BB4 5803 F736 87D7 9BB6 96D1 F22D DDDC \ + 99C4" +INCREMENT gfem_nastran ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="0BF3 E2D9 453F DD1A 7E6C \ + FD26 5306 B32F 4174 2C07 CB90 5929 A951 A907 D36B 0CBE 87C2 \ + 7C53 2AE2 47A8 8BA4 1E5A 3405 924F E79F 6F2A 595D 5F6D C1EE \ + E8D8" +INCREMENT hds_heeds_dll_nx ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="1175 361F A1A3 79C5 F89E \ + 256F F16B 9430 E2E0 32E1 8B24 FEA0 2408 BBA4 B0DB 1DFA C0C2 \ + 6C10 4A16 C043 7E61 251F 810E A0ED B8F9 E84A 51B5 439C B33D \ + A74C" +INCREMENT ideas_integration ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="11F6 3EF9 2F63 DA3F \ + 88DB 1631 EB01 C7B4 A1DF 5BF2 46E3 D5D5 E2BD 3FD9 9DC5 0EA4 \ + 7722 FF2D 9F72 C70B A82F B07D CCDF 2651 E607 7145 A0D9 5BBA \ + 868C 0E27" +INCREMENT nx_design_explr_eval ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="1DBD 1075 3983 0A98 AA3F \ + E331 E7EE 0A96 6D2B 156B DF46 564E CB11 8E7B D148 1B91 C141 \ + 6719 E779 301A DF5E 123B 709D 6258 6CF0 385D 521D C216 73CA \ + 1BD9" +INCREMENT nx_design_token ugslmd 2025.06 02-mar-2026 50 SUPERSEDE \ + DUP_GROUP=NONE ISSUED=02-dec-2025 SIGN="0C68 ACA8 2B66 005E \ + 3786 2D87 5669 363A 18E4 4E27 B3A7 3E46 F639 74DE 2E76 0D2D \ + 8203 FC7D B00B 3543 8FAE 7B24 ADA3 FFB1 1135 A811 10FA 2FD3 \ + 7520 6271" +INCREMENT nx_integration ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1AC9 82E1 FCE5 1A8E \ + EA07 0FB5 6452 808C 466A 6987 3856 A287 DE42 665D 5057 056D \ + C589 F16A F59D 5204 F5B4 7B65 1723 0C04 EBA3 D6B2 566D AC81 \ + FAF4 2C87" +INCREMENT nx_nas_bn_basic_dsk ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \ + DUP_GROUP=NONE user_info="Common to NX Design for Industrial \ + Design; Simcenter Structures" ISSUED=20-jun-2025 BORROW=2880 \ + SIGN="05FF 9779 45A2 D31C 53F8 9D51 A54E B39E D362 E0E3 4D2A \ + BD31 52A5 B654 8BFF 1E44 7DD0 2876 8260 B97F 8D90 4AED 5F7E \ + A69C 8D43 117E 7F45 DFCE 36BC BA2E" +INCREMENT nx_nas_nonlin_dsk ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=NONE user_info="Simcenter Structures" \ + ISSUED=20-jun-2025 BORROW=2880 SIGN="02CD E1DC 49D0 4194 5FC2 \ + DF2A 9E9F 6001 6F0D 76E9 21F1 7B09 BA81 CF75 898F 0387 51DE \ + DC70 1240 ED16 28AB 5AF1 6795 A9C7 079C B6D8 F86A 21E1 18E9 \ + 5FB4" +INCREMENT nx_synchronous ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="152E 42DC 20FB 2625 A035 \ + D8F5 72B0 A66E D7E0 CF30 EF6E 2803 1C87 A5A7 EC7D 1A78 3B61 \ + C2BD 3434 5489 8119 67A8 51D7 9E28 FCEB 9120 5C00 937C BBA0 \ + FB02" +INCREMENT ple_diagram ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="07E0 994A BC83 FE41 \ + 324B 8ED2 D82F EF23 478E 2DAA EB4B 3BD2 24A5 737B 8F1A 05FE \ + D1D8 045D A9B2 BB5E B352 EAEC FA5A BAAB 12CF EC7A 1228 7970 \ + FC9A 66E0" +INCREMENT remotesim_plugin ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="0334 936E BC95 4C57 3D0A \ + 01E1 6B30 E07D 6994 AA63 98B7 0646 B711 6B3D 2209 1BC2 C01E \ + 60D5 B074 011B 613F 4D03 87DA 90C3 01B1 9684 C2B5 0FC4 EF13 \ + C3D6" +INCREMENT remotesim_server ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="1465 FF5A 814A CA5F 91CF \ + 261B 794B DF19 BF7A 39A4 9859 27AF 61EE D635 7665 177C 7B09 \ + D386 4CD9 3FEF EFDC 6727 1CB6 99CE 4554 62FF C10E 8867 AD7D \ + BBAB" +INCREMENT sc3d_dsktop_presence ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="018C A0E4 391F 7CC9 9C27 \ + E62F 523D A33A 6403 B550 BF4B 905A 2542 2E2E C96C 102C 2448 \ + CDA0 93A4 E063 7E45 C4F0 5EFE CDB4 E9DC BFEA 387C 8BC9 D99C \ + FD2A" +INCREMENT sc_design_explr_eval ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="0EEF 04F8 AC93 D6DB 096E \ + AD50 C6A4 B9A1 C374 0FA1 C8D9 2CB1 5E77 95EA AD51 1E4F 111E \ + 750E E84D 8162 A758 DE9A 95AF 6BEC 7E52 36ED 4659 49B7 65C8 \ + 6048" +INCREMENT teamcenter_admin ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1279 D52A AD58 8CC7 \ + E5A6 238E F05A 59C3 3747 F531 CD7C F2C0 0D52 8D9B 38EF 1D6A \ + BFCB 9E9A D3C8 E83D A12D 6872 E1B5 CE94 FCC4 368F 69D8 74E9 \ + 3387 3F3C" +INCREMENT teamcenter_author ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="09EA 669C 1772 DCD8 \ + 2AB4 2563 8292 9F75 5690 95E2 2006 606A 8BC3 3076 33BA 1528 \ + EFFC 07F5 0365 F46B 67DE EAC5 1BEC 7765 EF6F 00BF 9A81 A1BC \ + 40CE 01C3" +INCREMENT teamcenter_designer ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1F2A F164 EC4B FECE \ + 3AF5 8CD1 965F B284 EBF9 F53E B7B7 4E88 4630 C304 83B7 09E9 \ + 46B3 7833 227D 7AAD AA1E 3CD7 25AC 2BD6 770E 008D B3F3 3E76 \ + 1733 FA06" +INCREMENT teamcenter_doctor ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="0531 AD8F 0E0C 9B6D \ + AA88 1DA0 1CC7 0A6D CD61 2C3A 910C 6FB1 A739 00D4 A649 0821 \ + 4AD6 26FE 734C 7185 7A26 D9EC 7E0D 2365 080E 90C8 835F 4676 \ + DE82 599B" +INCREMENT teamcenter_tcrs ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1A3C 6C96 77D8 E045 \ + B267 691B C20D 74A3 54B9 CBB8 DB85 F899 B2FD 7433 3472 0D55 \ + CA27 DD19 F33D 5199 AC22 7123 06AA 1057 6072 5BE2 9745 FF5B \ + 884A C519" +INCREMENT ug_scenario ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Simcenter Structures" \ + ISSUED=12-may-2025 BORROW=2880 SIGN="077D 2F9E 5B40 D673 F982 \ + 77F2 D31B 99C8 B639 649B 83B7 83D9 070D 621A 23EF 1361 7027 \ + 4C01 463A DD04 F2C5 FF87 238B 217A 51E6 308C 4A9A 190D 7524 \ + 373E" +INCREMENT vendor_mgt ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1898 1CF5 0443 C3C6 \ + 0DB7 D9C2 C15B D43A ECFF BE0F 1396 8B67 BB8F 70A9 EFED 0BF0 \ + B945 157A DBE8 E2D4 DE4D B60F D98E 331B 5106 993B 97B7 C506 \ + E825 5617" +INCREMENT visview_base ugslmd 2025.06 02-mar-2026 2 SUPERSEDE \ + DUP_GROUP=UHD user_info="Common to Simcenter Structures; Tc \ + Author" ISSUED=12-jun-2025 BORROW=2880 SIGN="1FF9 1BFD C4F7 \ + CD12 F220 9212 2F03 2CB3 510C 6647 27D1 CAFB 963A C91D BF35 \ + 1EA3 0062 54A4 DCF2 1EA5 759D 45DE 3A07 5A45 2C9B AE87 DA98 \ + 86D3 DF40 95DE" +INCREMENT vp_convert ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Tc Author" ISSUED=12-jun-2025 \ + BORROW=2880 SIGN="1BB2 88F5 9AF6 272F 9D7D 290E 6812 7DF5 03FA \ + 79A5 E37C 36D5 4B45 C9D6 0654 1330 D8FF DF3B FC78 0AD8 850E \ + A2BA 4806 CBA2 E594 09AC A9FF 6CDA 5616 E3A8" +INCREMENT vp_print ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD user_info="Tc Author" ISSUED=12-jun-2025 \ + BORROW=2880 SIGN="0495 1DD1 174D 7E8B 7246 C237 BB2C F983 6DCD \ + 2EFF 7900 F1D7 61F7 E2C9 6D32 04EB 6296 42B2 C2F5 DD31 2328 \ + 603E B112 D9D4 39B3 736F 9D4F 7CB5 C8E7 FF15" +INCREMENT xc_nx ugslmd 2025.06 02-mar-2026 1 SUPERSEDE DUP_GROUP=NONE \ + ISSUED=20-jun-2025 SIGN="16D8 5F15 C8A0 66B2 98B5 4B42 D633 \ + F935 7DA1 3CA4 E6F9 239A CF7D 067D 92AA 1715 CDD8 9A32 C0D5 \ + 1318 2BBF 9A51 404E 124A 0AF6 890E 2203 F72A 46FE 7C78" +INCREMENT xc_teamcenter ugslmd 2025.06 02-mar-2026 1 SUPERSEDE \ + DUP_GROUP=UHD ISSUED=12-jun-2025 SIGN="1141 2E9E 78D1 D5B0 \ + 2E28 60E6 1DC5 B4D7 FB7A 819B 072B B519 A675 E550 9287 0E33 \ + 1D7F 8D9C 3A48 D67D 7B81 BE94 964B 79BE CB52 DE5B 7F12 4B4A \ + 6EB5 D507" +INCREMENT xc_vis ugslmd 2025.06 02-mar-2026 1 SUPERSEDE DUP_GROUP=UHD \ + ISSUED=12-jun-2025 SIGN="05F3 DB2B 6439 A748 E1BE DC00 2E5F \ + DE07 DA5F 09E3 054A 72AD 26F7 2839 AB25 0D9F 0154 F4E1 72D3 \ + 98C0 D936 0CEC 3EFA 25FC 5B99 7C1D 81A8 8EBA FBE9 E148" +INCREMENT borrowing ugslmd 2025.06 permanent 1 DUP_GROUP=NONE \ + user_info="License Borrow Option" ISSUED=20-jun-2025 \ + SIGN="1265 429D 66F8 9762 E13E 02EB 29D4 5454 D6A7 FC3A B969 \ + 630E 59C6 E159 1E68 1489 BD44 81AB E20E EFDC C360 B6BA 3CBE \ + FEA1 413B 3AE4 EF85 21F5 4773 2BA4" +INCREMENT gateway_id ugslmd 2025.06 permanent 1000 SUPERSEDE \ + DUP_GROUP=UHD user_info="I-deas gateway" ISSUED=12-may-2025 \ + BORROW=2880 SIGN="0511 54C1 813F C5EC 6500 0B16 8677 0E34 5F0A \ + 0A97 5C65 A684 DF2E 1A20 EED1 0CC7 B8A9 E9D3 7786 807A 1B52 \ + 22BE CD21 C7BB AFF0 3569 0FF1 8FFA C20D 0D2F" +INCREMENT server_id ugslmd 2025.06 permanent 1 \ + VENDOR_STRING="10219284 - Atomaste" user_info=R1FCRAKGPG \ + ISSUER=SIEMENS BORROW=2880 SIGN="112D DE19 ABB0 032F D017 CCBC \ + E4C1 9B2B AC79 EA30 307C 23D0 840F D40C E3E1 1925 C74C BEF7 \ + 16F4 CC87 2E13 2CD6 0916 81AD 7D13 E397 89D7 288F D4ED BDD3" + + + + + +################################################################################ +# # +# SOFTWARE LICENSE TO FEATURE NAME CROSS REFERENCE # +# Version: 2506 Created: 02.12.2025 08:49:02# +# Atomaste Sold-To/Install: 10219284 # +################################################################################ + +# LICENSE PRODUCT QTY DESCRIPTION QTY FEATURE NAME + +# --------------- ----- -------------------- ----- --------------------------- +# NX35050 1 NX Value Based Licensing 50 pack +# 50 nx_design_token +# NX93300 1 NX Design for Industrial Design +# 1 3d_to_2d_flattener +# 1 adv_assemblies +# 1 assemblies +# 1 design_studio +# 1 drafting +# 1 dxf_to_ug +# 1 dxfdwg +# 1 features_modeling +# 1 free_form_modeling +# 1 gateway +# 1 geometric_tol +# 1 grip_execute +# 1 ideas_integration +# 1 iges +# 1 nx_design_explr_eval +# 1 nx_freeform_1 +# 1 nx_freeform_2 +# 1 nx_integration +# 1 nx_ml_region_finder +# 1 nx_ml_sel_pred_std +# 1 nx_ml_show_hide +# 1 nx_multi_scale +# 1 nx_nas_bn_basic_dsk +# 1 nx_nastran_export +# 1 nx_sheet_metal +# 1 nx_spsd_stress +# 1 nx_spsd_vibration +# 1 nx_subdivision +# 1 nx_synchronous +# 1 nx_visual_reporting +# 1 pcf_package_file +# 1 ple_diagram +# 1 pstudio_cons +# 1 pv_ugdatagenerator +# 1 routing_base +# 1 sla_3d_systems +# 1 solid_modeling +# 1 step_ap203 +# 1 step_ap214 +# 1 studio_analyze +# 1 studio_free_form +# 1 studio_render +# 1 studio_visualize +# 1 ug_checkmate +# 1 ug_kf_checker +# 1 ug_kf_execute +# 1 ug_nas_des +# 1 ug_opt_wizard +# 1 ug_prod_des_advisor +# 1 ug_smart_models +# 1 ug_to_dxf +# 1 ug_web_express +# 1 ugopen_menuscript +# 1 usr_defined_features +# 1 wave +# SC13500 1 Simcenter Structures 1 3d_to_2d_flattener +# 1 ansys_meshers +# 1 assemblies +# 1 dxfdwg +# 1 features_modeling +# 1 gateway +# 1 gfem_ansys +# 1 gfem_nastran +# 1 grip_execute +# 1 hds_heeds_dll_nx +# 1 id_ext_fem_beam +# 1 ideas_integration +# 1 iges +# 1 nx_design_explr_eval +# 1 nx_freeform_1 +# 1 nx_freeform_2 +# 1 nx_ftk +# 1 nx_integration +# 1 nx_masterfem +# 1 nx_material_system +# 1 nx_nas_bn_basic_dsk +# 1 nx_nas_nonlin_dsk +# 1 nx_nastran_export +# 1 nx_nastran_import +# 1 nx_spsd_stress +# 1 nx_spsd_vibration +# 1 nx_synchronous +# 1 nx_visual_reporting +# 1 pcf_package_file +# 1 pstudio_cons +# 1 pv_ugdatagenerator +# 1 remotesim_plugin +# 1 remotesim_server +# 1 sc3d_dsktop_presence +# 1 sc_design_explr_eval +# 1 sc_enabled +# 1 sla_3d_systems +# 1 solid_modeling +# 1 step_ap203 +# 1 step_ap214 +# 1 studio_render +# 1 studio_visualize +# 1 teamcenter_designer +# 1 ug_checkmate +# 1 ug_kf_checker +# 1 ug_kf_execute +# 1 ug_nas_bn +# 1 ug_scenario +# 1 ug_smart_models +# 1 ug_struct_pe_solver +# 1 ug_web_express +# 1 ugopen_menuscript +# 1 usr_defined_features +# 1 visview_base +# TC10101 1 Tc Author 1 active_collab +# 1 adv_structure_mgt +# 1 teamcenter_author +# 1 teamcenter_doctor +# 1 vendor_mgt +# 1 visview_base +# 1 vp_convert +# 1 vp_print +# TC50100 1 Teamcenter Rapid Start +# 1 teamcenter_tcrs +# TCADMIN 2 Teamcenter Admin 2 teamcenter_admin + + + + +################################################################################ +# # +# The following products are not included on this file # +# for the respective reason listed # +# # +################################################################################ + +# PRODUCT QTY DESCRIPTION REASON +# ------------------ ----- ----------------------- --------------------- +# TC1DOTC 1 Teamcenter Deployment Deployment Option diff --git a/NX Licenses/SiemensLicenseServer_v5.0.0.0_Lnx64_x86-64.bin b/NX Licenses/SiemensLicenseServer_v5.0.0.0_Lnx64_x86-64.bin new file mode 100644 index 0000000..224f837 Binary files /dev/null and b/NX Licenses/SiemensLicenseServer_v5.0.0.0_Lnx64_x86-64.bin differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..f5edf7e --- /dev/null +++ b/README.md @@ -0,0 +1,159 @@ +# Dalidou Server - Master Documentation + +> **Server:** dalidou (Lenovo W520) +> **Tailscale IP:** 100.80.199.40 +> **Local IP:** 192.168.86.50 + +This folder contains all documentation, scripts, and configuration for the dalidou home server. + +--- + +## Quick Start + +### SSH Access +```bash +ssh papa@192.168.86.50 # Local WiFi +ssh papa@100.80.199.40 # Tailscale (remote) +``` + +### Common Commands +```bash +docker ps # List running services +docker logs # View logs +docker restart # Restart service +df -h /srv # Check disk space +``` + +--- + +## Documentation + +| File | Description | +|------|-------------| +| [docs/DALIDOU-SERVER.md](docs/DALIDOU-SERVER.md) | Complete server documentation - services, credentials, troubleshooting | +| [docs/CLAUDE-ASSISTANT.md](docs/CLAUDE-ASSISTANT.md) | Claude AI Assistant - weather, skiing, git workflow, daily briefings | +| [docs/LICENSE-SERVER-INFO.md](docs/LICENSE-SERVER-INFO.md) | License server Host ID for NX & SolidWorks | +| [docs/thinkpad-setup.md](docs/thinkpad-setup.md) | ThinkPad P16 setup instructions | + +--- + +## Scripts + +| File | Description | +|------|-------------| +| [scripts/server-setup.sh](scripts/server-setup.sh) | Enable Git LFS on Gitea (run on dalidou) | +| [scripts/windows-setup.ps1](scripts/windows-setup.ps1) | Set up Git LFS on Windows | +| [scripts/init-cad-repo.ps1](scripts/init-cad-repo.ps1) | Initialize CAD project folder structure | + +--- + +## Templates + +| File | Description | +|------|-------------| +| [templates/gitattributes-template.txt](templates/gitattributes-template.txt) | Git LFS tracking rules for CAD files | +| [templates/gitignore-template.txt](templates/gitignore-template.txt) | Ignore rules for CAD temp files | + +--- + +## Services Running on Dalidou + +| Service | Port | URL | +|---------|------|-----| +| Gitea (Git) | 3000 | http://192.168.86.50:3000 | +| Seafile (Cloud) | 8083 | http://192.168.86.50:8083 | +| Immich (Photos) | 2283 | http://192.168.86.50:2283 | +| Filebrowser | 8081 | http://192.168.86.50:8081 | +| Paperless (Docs) | 8082 | http://192.168.86.50:8082 | +| Syncthing | 8384 | http://192.168.86.50:8384 | +| Home Assistant | 8080 | http://192.168.86.50:8080 | +| Claude MCP Server | - | via SSH | + +--- + +## Claude AI Assistant + +Interactive assistant available in Claude Code with these capabilities: + +### Slash Commands +- `/morning` - Morning briefing (yesterday recap + today's weather + skiing) +- `/eod` - End of day summary +- `/ski` - Skiing conditions check +- `/weather` - Quick weather check +- `/push` - Push CAD changes to Gitea +- `/pull` - Pull latest from Gitea + +### MCP Tools (on dalidou) +- Weather: current, hourly, daily forecasts +- Skiing: conditions check, best time windows +- Gitea: commits, repos, activity + +### Natural Language +Just talk normally: +- "Hey good morning, let's start my day" +- "When should I go skiing?" +- "Push my CAD work" +- "What did I work on this week?" + +See [docs/CLAUDE-ASSISTANT.md](docs/CLAUDE-ASSISTANT.md) for full details. + +--- + +## CAD Workflow (Git LFS) + +### Push Changes +```powershell +# Use PUSH.bat or ask Claude: "push my cad" +cd C:\Users\Antoine\CADTOMASTE +git add . +git commit -m "description" +git push +``` + +### Pull Latest +```powershell +# Use PULL.bat or ask Claude: "pull latest" +cd C:\Users\Antoine\CADTOMASTE +git pull +``` + +### Lock Files Before Editing +```powershell +git lfs lock "Projects/MyProject/part.prt" +# ... edit in NX/SolidWorks ... +git lfs unlock "Projects/MyProject/part.prt" +``` + +--- + +## Folder Structure + +``` +Server/ +├── README.md # This file +├── docs/ +│ ├── DALIDOU-SERVER.md # Complete server docs +│ ├── CLAUDE-ASSISTANT.md # AI assistant docs +│ ├── LICENSE-SERVER-INFO.md +│ └── thinkpad-setup.md +├── scripts/ +│ ├── server-setup.sh # Dalidou setup +│ ├── windows-setup.ps1 # Windows Git LFS setup +│ └── init-cad-repo.ps1 # New CAD project init +└── templates/ + ├── gitattributes-template.txt + └── gitignore-template.txt +``` + +--- + +## Credentials + +See [docs/DALIDOU-SERVER.md](docs/DALIDOU-SERVER.md#user-accounts) for full credentials list. + +| Service | Username | +|---------|----------| +| SSH | papa | +| Gitea | Antoine | +| Filebrowser | Antoine | +| Seafile | antoine.letarte@gmail.com | diff --git a/docs/CLAUDE-ASSISTANT.md b/docs/CLAUDE-ASSISTANT.md new file mode 100644 index 0000000..26607ff --- /dev/null +++ b/docs/CLAUDE-ASSISTANT.md @@ -0,0 +1,303 @@ +# Claude AI Professional Assistant + +> **Status:** Operational +> **Last Updated:** November 28, 2025 +> **Role:** Professional assistant for Atomaste consulting work + +--- + +## Overview + +Claude is your professional AI assistant for your mechanical/simulation freelance engineering work at **Atomaste**. + +**Primary Functions:** +- **Day Planning** - Prepare priorities, tasks, reminders +- **Work Documentation** - Log activities, summarize accomplishments +- **Daily Notes** - Maintain comprehensive daily records +- **Project Tracking** - Monitor CAD work, commits, progress +- **Work-Life Balance** - Weather/outdoor activity planning + +**Architecture:** MCP server on dalidou + Claude Code on Windows (free with subscription) + +--- + +## Daily Workflow + +### Morning - Start the Day + +Say: **"Hey good morning, let's start my day"** or **"Bonjour, on commence?"** + +Claude will: +1. **Review yesterday** - What was accomplished, commits made +2. **Check priorities** - Outstanding tasks, deadlines +3. **Plan today** - Suggest focus areas and time blocks +4. **Weather check** - Conditions for outdoor breaks (skiing, etc.) +5. **Set the tone** - Energizing briefing to start productive + +### During the Day + +- "What should I focus on next?" +- "Log this: finished FEA analysis for P04-Gigabit" +- "Remind me to follow up with client X" +- "Push my CAD work" +- "What have I done today so far?" + +### Evening - Close the Day + +Say: **"Let's wrap up the day"** or **"On ferme la journée"** + +Claude will: +1. **Summarize work** - All commits, files changed, activities logged +2. **Document achievements** - What was completed +3. **Note blockers** - What's pending or stuck +4. **Plan tomorrow** - Suggested priorities for next day +5. **Update daily note** - Comprehensive record of the day + +--- + +## What Claude Tracks + +### Work Activities +- CAD file changes (NX Siemens, SolidWorks) +- Git commits with descriptions +- Project progress (P04-Gigabit, etc.) +- Client work and deliverables +- FEA/simulation tasks + +### Daily Documentation +- Time spent on tasks +- Accomplishments and milestones +- Blockers and challenges +- Decisions made +- Ideas and notes + +### Personal Balance +- Weather conditions +- Best outdoor activity windows +- Skiing conditions +- Work breaks and energy management + +--- + +## Slash Commands + +| Command | Description | +|---------|-------------| +| `/morning` | Full morning briefing with planning | +| `/eod` | End of day summary and documentation | +| `/ski` | Skiing conditions check | +| `/weather` | Quick weather check | +| `/push` | Push CAD changes to Gitea | +| `/pull` | Pull latest from Gitea | + +--- + +## Natural Language Examples + +### Planning +- "What are my priorities today?" +- "I need to focus on the P04 assembly this morning" +- "Block 2 hours for FEA work" +- "What's pending from yesterday?" + +### Logging Work +- "Log: completed thermal analysis for client X" +- "I just finished the bracket redesign" +- "Note: waiting for client feedback on envelope design" +- "Add to today: reviewed simulation results, found stress concentration issue" + +### Tracking Progress +- "What did I work on this week?" +- "Show me my recent commits" +- "How's the P04-Gigabit project going?" +- "What files did I modify today?" + +### CAD Workflow +- "Push my CAD work" (with commit message) +- "Pull latest files" +- "What's changed in CADTOMASTE?" + +### Breaks & Balance +- "When's good for skiing today?" +- "What's the weather like?" +- "Should I take a break outside?" + +--- + +## Daily Note Structure + +Claude maintains daily documentation with: + +```markdown +# [Date] - Daily Work Log + +## Morning Plan +- Priority 1: ... +- Priority 2: ... +- Scheduled: ... + +## Work Log +- 09:00 - Started FEA analysis for P04-Gigabit +- 11:30 - Completed mesh refinement +- 14:00 - Client call regarding envelope specs +- ... + +## Commits +- a57c45b: "Updated lateral support shoe geometry" +- 8624cdd: "Fixed mesh convergence issue" + +## Accomplishments +- Completed thermal analysis +- Delivered preliminary results to client +- Fixed bracket interference issue + +## Blockers / Pending +- Waiting for client approval on design change +- Need material data for simulation + +## Notes & Ideas +- Consider alternative mounting approach +- Research vibration damping options + +## Tomorrow's Focus +- Finalize P04 assembly +- Start documentation for deliverable +``` + +--- + +## MCP Tools Available + +| Tool | Description | +|------|-------------| +| `get_current_weather` | Current conditions in Rouyn-Noranda | +| `get_hourly_forecast` | Hour-by-hour forecast | +| `get_daily_forecast` | Daily forecast (highs, lows) | +| `find_best_activity_windows` | Best times for skiing, hiking | +| `check_skiing_conditions` | Quick ski conditions check | +| `get_today_commits` | Today's git commits | +| `get_recent_activity` | Recent git activity (7 days) | +| `list_repos` | List Gitea repositories | + +--- + +## Architecture + +``` +┌─────────────────────────────────────────────────────────────┐ +│ DALIDOU SERVER (100.80.199.40) │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ MCP Server (/srv/claude-assistant) │ │ +│ │ ├─ Weather tools (Open-Meteo API) │ │ +│ │ ├─ Gitea tools (commits, repos) │ │ +│ │ └─ Activity analysis │ │ +│ └───────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ + │ + │ SSH + MCP Protocol + │ +┌─────────────────────────────────────────────────────────────┐ +│ WINDOWS WORKSTATION │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ Claude Code (Opus 4.5 - your subscription) │ │ +│ │ ├─ Intelligent planning and analysis │ │ +│ │ ├─ Work documentation and logging │ │ +│ │ ├─ CAD file management (push/pull) │ │ +│ │ └─ Daily note maintenance │ │ +│ └───────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ +``` + +--- + +## Configuration + +### Server Location +``` +/srv/claude-assistant/ +├── .env # API keys and tokens +├── config.yaml # Location, preferences +├── run-mcp.sh # MCP startup script +├── mcp-server/ +│ └── server.js # MCP server +└── tools/ + ├── weather.js # Open-Meteo integration + ├── gitea.js # Gitea API + └── obsidian.js # Daily notes (future) +``` + +### Windows Configuration +``` +C:\Users\Antoine\.claude\ +├── mcp.json # MCP server connection +└── commands/ + ├── morning.md # Morning briefing + ├── eod.md # End of day summary + ├── ski.md # Skiing conditions + ├── weather.md # Weather check + ├── push.md # Push CAD + └── pull.md # Pull CAD +``` + +--- + +## Cost + +| Usage | Cost | +|-------|------| +| Interactive (Claude Code) | **FREE** (your subscription) | +| Automated API (optional) | ~$0.03 per run | + +Current setup = **$0/month** + +--- + +## What's Working + +- [x] MCP server on dalidou +- [x] Weather and skiing tools +- [x] Gitea integration (commits, repos) +- [x] Slash commands +- [x] Push/pull CAD workflow +- [x] Natural language interaction + +--- + +## Future Improvements + +- [ ] Daily notes auto-save to Obsidian vault +- [ ] Calendar integration (meetings, deadlines) +- [ ] Client project tracking +- [ ] Time tracking per project +- [ ] Weekly/monthly summaries +- [ ] Invoice preparation assistance + +--- + +## Troubleshooting + +### MCP not connecting +```bash +ssh root@100.80.199.40 /srv/claude-assistant/run-mcp.sh +``` +Then restart VSCode. + +### Gitea returns empty +Check token in `/srv/claude-assistant/.env` + +### Check MCP status +``` +claude mcp list +``` + +--- + +## Quick Start + +1. Open Claude Code (VSCode) +2. Say "Hey good morning, let's start my day" +3. Claude prepares your briefing +4. Work on your projects +5. Say "Log: [what you did]" to track activities +6. End with "Let's wrap up the day" +7. Claude documents everything diff --git a/docs/DALIDOU-SERVER.md b/docs/DALIDOU-SERVER.md new file mode 100644 index 0000000..388d047 --- /dev/null +++ b/docs/DALIDOU-SERVER.md @@ -0,0 +1,645 @@ +# Dalidou Home Server - Complete Documentation + +> **Last Updated:** December 6, 2025 +> **Server Name:** dalidou +> **Owner:** Antoine Letarte + +--- + +## Table of Contents + +1. [Server Overview](#server-overview) +2. [Network Configuration](#network-configuration) +3. [User Accounts](#user-accounts) +4. [Installed Services](#installed-services) +5. [Service Details & Configuration](#service-details--configuration) +6. [Docker Infrastructure](#docker-infrastructure) +7. [Directory Structure](#directory-structure) +8. [Backup Strategy](#backup-strategy) +9. [Maintenance Commands](#maintenance-commands) +10. [Disaster Recovery](#disaster-recovery) +11. [Troubleshooting](#troubleshooting) + +--- + +## Server Overview + +### Hardware +- **Type:** Home server running Docker containers +- **OS:** Linux (Debian/Ubuntu-based) +- **Location:** Home network + +### Purpose +Self-hosted infrastructure replacing cloud services: +- Google Photos → Immich +- Google Drive → Seafile +- Dropbox → Syncthing +- GitHub → Gitea +- Document management → Paperless-ngx + +--- + +## Network Configuration + +### IP Addresses + +| Network | IP Address | Usage | +|---------|------------|-------| +| WiFi (Primary) | `192.168.86.50` | Main local access | +| Wired | `10.0.0.77` | Backup/alternate | +| Tailscale VPN | `100.80.199.40` | Remote access from anywhere | + +### SSH Access + +```bash +# Local network +ssh papa@192.168.86.50 + +# Via Tailscale (remote) +ssh papa@100.80.199.40 + +# Using hostname (if DNS configured) +ssh papa@dalidou +``` + +### Ports in Use + +| Port | Service | Protocol | +|------|---------|----------| +| 22 | SSH (host) | TCP | +| 80 | Caddy (reverse proxy) | TCP | +| 2222 | Gitea SSH | TCP | +| 2283 | Immich | TCP | +| 3000 | Gitea Web | TCP | +| 3001 | Homepage Dashboard | TCP | +| 8080 | Home Assistant | TCP | +| 8081 | Filebrowser | TCP | +| 8082 | Paperless-ngx | TCP | +| 8083 | Seafile | TCP | +| 8384 | Syncthing Web UI | TCP | +| 21027 | Syncthing Discovery | UDP | +| 22000 | Syncthing Transfer | TCP/UDP | + +--- + +## User Accounts + +### System Users + +| Username | Password | Role | +|----------|----------|------| +| papa | Ladygaga | Admin (SSH, sudo) | + +### Service Accounts + +| Service | Username | Password | Email | +|---------|----------|----------|-------| +| Gitea | Antoine | Ladygaga | antoine.letarte@gmail.com | +| Filebrowser | Antoine | Ladygaga2024 | - | +| Seafile | antoine.letarte@gmail.com | Ladygaga2025 | antoine.letarte@gmail.com | +| Immich | Antoine | (see Bitwarden) | antoine.letarte@gmail.com | +| Paperless | Antoine | (see Bitwarden) | - | + +### Family Accounts + +| Name | Password | Notes | +|------|----------|-------| +| Odile | Adalidou948 | Family member access | + +--- + +## Installed Services + +### Quick Access URLs + +| Service | Local URL | Direct IP URL | +|---------|-----------|---------------| +| **Homepage** (Dashboard) | http://home.dalidou.home | http://192.168.86.50:3001 | +| **Immich** (Photos) | http://photos.dalidou.home | http://192.168.86.50:2283 | +| **Filebrowser** | http://files.dalidou.home | http://192.168.86.50:8081 | +| **Paperless** (Docs) | http://docs.dalidou.home | http://192.168.86.50:8082 | +| **Gitea** (Git) | http://git.dalidou.home | http://192.168.86.50:3000 | +| **Syncthing** | http://sync.dalidou.home | http://192.168.86.50:8384 | +| **Seafile** (Cloud) | http://cloud.dalidou.home | http://192.168.86.50:8083 | +| **Home Assistant** | - | http://192.168.86.50:8080 | + +### Remote Access (Tailscale) + +When away from home, use Tailscale IP: +- Immich: http://100.80.199.40:2283 +- Seafile: http://100.80.199.40:8083 +- Gitea: http://100.80.199.40:3000 +- etc. + +--- + +## Service Details & Configuration + +### 1. Immich - Photo Management + +**Purpose:** Google Photos replacement - backup, organize, and share photos + +**Containers:** +- `immich_server` - Main application +- `immich_postgres` - Database +- `immich_redis` - Cache + +**Data Location:** `/srv/immich/` + +**Features:** +- Mobile app backup (iOS/Android) +- Face recognition +- Location mapping +- Sharing albums + +**Mobile App:** "Immich" on App Store / Play Store +- Server URL: http://192.168.86.50:2283 (local) or http://100.80.199.40:2283 (remote) + +--- + +### 2. Filebrowser - Web File Manager + +**Purpose:** Browse and manage server files via web browser + +**Container:** `filebrowser` + +**Data Location:** +- Config: `/srv/filebrowser/config/` +- Database: `/srv/filebrowser/database/` +- Serves: `/srv/storage/shared/` + +**Login:** Antoine / Ladygaga2024 + +**Use Cases:** +- Quick file access without SSH +- Share files with family +- Upload/download files + +--- + +### 3. Paperless-ngx - Document Management + +**Purpose:** Scan, OCR, organize, and search documents + +**Containers:** +- `paperless` - Main application +- `paperless_postgres` - Database +- `paperless_redis` - Cache + +**Data Location:** `/srv/paperless/` + +**Features:** +- OCR scanning +- Full-text search +- Tagging and categorization +- Correspondent tracking + +**Workflow:** +1. Scan documents to consume folder +2. Paperless auto-processes and OCRs +3. Search and organize in web UI + +--- + +### 4. Gitea - Git Repository Hosting + +**Purpose:** Self-hosted GitHub - version control for code and CAD files + +**Containers:** +- `gitea` - Main application +- `gitea_postgres` - Database + +**Data Location:** `/srv/gitea/` + +**Configuration:** +- Web Port: 3000 +- SSH Port: 2222 +- LFS Enabled: Yes (for large CAD files) +- LFS Path: `/data/git/lfs` + +**Git LFS:** Enabled for large file storage (CAD files, binaries) + +**Clone via HTTPS:** +```bash +git clone http://192.168.86.50:3000/Antoine/CADTOMASTE.git +``` + +**Clone via SSH:** +```bash +git clone ssh://git@192.168.86.50:2222/Antoine/CADTOMASTE.git +``` + +--- + +### 5. Syncthing - File Synchronization + +**Purpose:** Sync files between devices (like Dropbox but self-hosted) + +**Container:** `syncthing` + +**Data Location:** `/srv/syncthing/` + +**Ports:** +- 8384: Web UI +- 22000: Sync (TCP/UDP) +- 21027: Discovery (UDP) + +**Use Cases:** +- Sync folders between laptop and server +- Backup important directories +- Share folders with family + +--- + +### 6. Seafile - Cloud Storage + +**Purpose:** Self-hosted Google Drive / Dropbox alternative + +**Containers:** +- `seafile` - Main application +- `seafile-mysql` - Database (MariaDB) +- `seafile-memcached` - Cache + +**Data Location:** `/srv/seafile/` + +**Configuration:** +- Web Port: 8083 +- Admin: antoine.letarte@gmail.com / Ladygaga2025 +- Timezone: America/Toronto + +**Clients:** +- **SeaDrive (Windows):** Creates virtual drive letter (S:\) +- **Mobile App:** "Seafile" on App Store / Play Store + +**Desktop Client Setup:** +1. Install SeaDrive from https://www.seafile.com/en/download/ +2. Server: http://192.168.86.50:8083 +3. Login with your credentials +4. Choose drive letter (e.g., S:\) + +--- + +### 7. Home Assistant - Smart Home + +**Purpose:** Home automation and smart device control + +**Container:** `homeassistant` + +**Access:** http://192.168.86.50:8080 + +**Additional:** Matter Server (`matter-server`) for Matter/Thread devices + +--- + +### 8. Homepage - Server Dashboard + +**Purpose:** Centralized dashboard to view and access all server services at a glance + +**Container:** `homepage` + +**Image:** `ghcr.io/gethomepage/homepage:latest` + +**Data Location:** `/srv/homepage/` + +**Configuration:** +- Web Port: 3001 +- Theme: Dark (slate color) +- Docker integration enabled (monitors container status) + +**Access:** +- Local: http://192.168.86.50:3001 +- Wired: http://10.0.0.77:3001 +- Tailscale: http://100.80.199.40:3001 + +**Features:** +- Real-time Docker container status monitoring +- Quick links to all services (Immich, Paperless, Gitea, Seafile, etc.) +- Customizable widgets and bookmarks +- Dark theme with clean interface + +**Configuration Files:** +- `services.yaml` - Define services and their icons/links +- `settings.yaml` - Theme, layout, and general settings +- `widgets.yaml` - System widgets (CPU, memory, etc.) +- `bookmarks.yaml` - External bookmarks +- `docker.yaml` - Docker socket configuration + +**Customization:** +```bash +# Edit service definitions +nano /srv/homepage/services.yaml + +# Restart to apply changes +docker restart homepage +``` + +--- + +## Docker Infrastructure + +### View Running Containers + +```bash +ssh papa@192.168.86.50 "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" +``` + +### Container Management + +```bash +# Restart a service +docker restart + +# View logs +docker logs +docker logs -f # Follow logs + +# Stop/Start +docker stop +docker start + +# Check resource usage +docker stats +``` + +### Docker Compose Locations + +| Service | Compose File Location | +|---------|----------------------| +| Seafile | `/srv/seafile/docker-compose.yml` | +| Immich | `/srv/immich/docker-compose.yml` | +| Gitea | `/srv/gitea/docker-compose.yml` | +| Paperless | `/srv/paperless/docker-compose.yml` | +| Homepage | `/home/papa/docker-compose.yml` | + +### Restart All Services + +```bash +cd /srv/ +docker compose down +docker compose up -d +``` + +--- + +## Directory Structure + +``` +/srv/ +├── filebrowser/ +│ ├── config/ +│ └── database/ +│ +├── gitea/ +│ ├── data/ +│ │ └── git/ +│ │ ├── repositories/ +│ │ └── lfs/ +│ └── postgres/ +│ +├── immich/ +│ ├── upload/ +│ ├── library/ +│ └── postgres/ +│ +├── paperless/ +│ ├── consume/ ← Drop documents here +│ ├── data/ +│ ├── media/ +│ └── postgres/ +│ +├── seafile/ +│ ├── data/ +│ │ └── seafile/ +│ │ ├── conf/ +│ │ └── seafile-data/ +│ └── mysql/ +│ +├── syncthing/ +│ └── config/ +│ +├── homepage/ +│ ├── services.yaml ← Service definitions +│ ├── settings.yaml ← Theme and layout +│ ├── widgets.yaml ← Dashboard widgets +│ ├── bookmarks.yaml ← External links +│ └── docker.yaml ← Docker integration +│ +└── storage/ + └── shared/ ← Filebrowser root +``` + +--- + +## Backup Strategy + +### Critical Data Locations + +| Priority | Data | Location | Backup Method | +|----------|------|----------|---------------| +| HIGH | Photos | `/srv/immich/` | External drive + cloud | +| HIGH | Documents | `/srv/paperless/` | External drive | +| HIGH | Git repos | `/srv/gitea/` | Git push to remote | +| MEDIUM | Seafile | `/srv/seafile/` | External drive | +| LOW | Configs | `/srv/*/config/` | Copy to backup | + +### Manual Backup Commands + +```bash +# Backup Immich +tar -czvf immich-backup-$(date +%Y%m%d).tar.gz /srv/immich/ + +# Backup Paperless +tar -czvf paperless-backup-$(date +%Y%m%d).tar.gz /srv/paperless/ + +# Backup Gitea +tar -czvf gitea-backup-$(date +%Y%m%d).tar.gz /srv/gitea/ + +# Backup Seafile (stop first for consistency) +docker compose -f /srv/seafile/docker-compose.yml stop seafile +tar -czvf seafile-backup-$(date +%Y%m%d).tar.gz /srv/seafile/ +docker compose -f /srv/seafile/docker-compose.yml start seafile +``` + +--- + +## Maintenance Commands + +### System Updates + +```bash +# Update system packages +sudo apt update && sudo apt upgrade -y + +# Update Docker images +docker compose pull +docker compose up -d +``` + +### Check Disk Space + +```bash +df -h /srv +du -sh /srv/* +``` + +### View All Container Logs + +```bash +docker logs --tail 50 +``` + +### Restart Docker + +```bash +sudo systemctl restart docker +``` + +--- + +## Disaster Recovery + +### If Server Fails - Rebuild Steps + +1. **Install fresh Linux (Debian/Ubuntu)** + +2. **Install Docker:** +```bash +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker $USER +``` + +3. **Restore /srv from backup:** +```bash +sudo mkdir /srv +sudo tar -xzvf backup.tar.gz -C / +``` + +4. **Start each service:** +```bash +cd /srv/gitea && docker compose up -d +cd /srv/immich && docker compose up -d +cd /srv/paperless && docker compose up -d +cd /srv/seafile && docker compose up -d +# etc. +``` + +5. **Install Tailscale:** +```bash +curl -fsSL https://tailscale.com/install.sh | sh +sudo tailscale up +``` + +### Key Files to Backup + +- All of `/srv/` +- `/etc/caddy/Caddyfile` (if using Caddy) +- Docker compose files (already in /srv/) +- This documentation! + +--- + +## Troubleshooting + +### Service Not Accessible + +```bash +# Check if container is running +docker ps | grep + +# Check container logs +docker logs + +# Restart the service +docker restart +``` + +### Port Already in Use + +```bash +# Find what's using a port +sudo lsof -i : +sudo netstat -tlnp | grep +``` + +### Container Won't Start + +```bash +# Check logs for errors +docker logs + +# Check disk space +df -h + +# Check Docker status +sudo systemctl status docker +``` + +### Database Issues + +```bash +# Enter postgres container +docker exec -it psql -U -d + +# Check database health +docker exec pg_isready +``` + +### Reset Service Password + +**Filebrowser:** +```bash +docker stop filebrowser +docker run --rm -v /srv/filebrowser/database:/database filebrowser/filebrowser \ + users update admin --password newpassword -d /database/filebrowser.db +docker start filebrowser +``` + +**Gitea:** +```bash +docker exec -it gitea gitea admin user change-password --username Antoine --password newpassword +``` + +--- + +## Quick Reference Card + +### SSH Access +```bash +ssh papa@192.168.86.50 # Local +ssh papa@100.80.199.40 # Tailscale +``` + +### Most Used Commands +```bash +# Check all containers +docker ps + +# Restart a service +docker restart + +# View logs +docker logs -f + +# Disk space +df -h /srv +``` + +### Service URLs (Local) +- Dashboard: http://192.168.86.50:3001 +- Photos: http://192.168.86.50:2283 +- Files: http://192.168.86.50:8081 +- Docs: http://192.168.86.50:8082 +- Git: http://192.168.86.50:3000 +- Cloud: http://192.168.86.50:8083 +- Sync: http://192.168.86.50:8384 + +--- + +## Document History + +| Date | Change | +|------|--------| +| 2025-11-27 | Initial documentation created | +| 2025-11-27 | Added Seafile setup | +| 2025-11-27 | Added Git LFS for CAD versioning | +| 2025-12-06 | Added Homepage dashboard documentation | diff --git a/docs/LICENSE-SERVER-INFO.md b/docs/LICENSE-SERVER-INFO.md new file mode 100644 index 0000000..0676eb3 --- /dev/null +++ b/docs/LICENSE-SERVER-INFO.md @@ -0,0 +1,229 @@ +# License Server Host Information + +**Updated:** 2025-12-01 +**Server:** dalidou (ThinkPad W520) +**Status:** OPERATIONAL + +--- + +## Quick Reference - What to Tell Siemens + +For your permanent NX license, provide: + +``` +Hostname: dalidou +CID: COMPOSITE=88F027D30355 +Port: 28000 +``` + +--- + +## Server Details + +| Field | Value | +|-------|-------| +| **Hostname** | `dalidou` | +| **Composite ID (CID)** | `COMPOSITE=88F027D30355` | +| **Ethernet MAC Address** | `f0:de:f1:e6:e4:6a` | +| **Host ID (no colons)** | `f0def1e6e46a` | +| **Local Network IP (Wi-Fi)** | `192.168.86.50` | +| **Tailscale IP** | `100.80.199.40` | +| **NX License Port** | `28000` | + +### All CIDs (from getcid command) +| Interface | CID | MAC | +|-----------|-----|-----| +| **enp0s25 (Ethernet)** | `COMPOSITE=88F027D30355` | F0DEF1E6E46A | +| wlp3s0 (Wi-Fi) | `COMPOSITE=F3B17C78293B` | 2477036FCD80 | + +**Use the Ethernet CID** - it's more stable. + +--- + +## Current License Configuration + +**Permanent license valid until:** March 2, 2026 + +| License | Status | +|---------|--------| +| NX93300 (NX Design for Industrial Design) | 1 seat | +| SC13500 (Simcenter Structures) | 1 seat | +| TC10101 (Tc Author) | 1 seat | +| TC50100 (Teamcenter Rapid Start) | 1 seat | +| NX35050 (NX Value Based Licensing) | 50 tokens | +| + many more features | See license file | + +--- + +## Client Setup (Windows Laptops) + +### Step 1: Set Environment Variable + +1. Open **System Properties** (`Win + R` → `sysdm.cpl`) +2. Click **Advanced** → **Environment Variables** +3. Under **System variables**, click **New** +4. Add: + - **Variable name:** `SPLM_LICENSE_SERVER` + - **Variable value:** `28000@dalidou;28000@100.80.199.40;29000@DESKTOP-PRECISION` + +### Step 2: Verify in Siemens Licensing Tool + +1. Open **Siemens Licensing Tool** +2. Go to **Environment Settings** +3. Confirm all servers show **Connection status: Successful** + +### License Server Priority + +| Priority | Server | Use Case | +|----------|--------|----------| +| 1st | `28000@dalidou` | Local network (fastest) | +| 2nd | `28000@100.80.199.40` | Remote via Tailscale | +| 3rd | `29000@DESKTOP-PRECISION` | Fallback if dalidou down | + +--- + +## Server Installation (Already Done on Dalidou) + +### Location +``` +/opt/Siemens/LicenseServer/ +├── lmgrd # FlexNet license manager +├── saltd # Siemens vendor daemon (v5) +├── ugslmd -> saltd # Symlink for compatibility +├── lmutil # License utilities +├── License_Ugslmd.lic # License file +└── logs/ + └── lmgrd.log # Server log +``` + +### Systemd Service +```bash +# Service file: /etc/systemd/system/siemens-lmgrd.service +sudo systemctl status siemens-lmgrd # Check status +sudo systemctl start siemens-lmgrd # Start +sudo systemctl stop siemens-lmgrd # Stop +sudo systemctl restart siemens-lmgrd # Restart +``` + +### Manual Commands +```bash +cd /opt/Siemens/LicenseServer + +# Check license status +./lmutil lmstat -a + +# Check specific feature +./lmutil lmstat -f NX93300 + +# View log +tail -50 logs/lmgrd.log + +# Start manually (if systemd not working) +./lmgrd -c License_Ugslmd.lic -l logs/lmgrd.log +``` + +### Firewall +```bash +# Port 28000 is open +sudo ufw status | grep 28000 +``` + +--- + +## Updating the License File + +When you receive a new license from Siemens: + +1. **Edit the SERVER line** to match dalidou: + ``` + SERVER dalidou ANY 28000 + VENDOR ugslmd + ``` + +2. **Copy to dalidou:** + ```bash + scp new_license.lic root@dalidou:/opt/Siemens/LicenseServer/License_Ugslmd.lic + ``` + +3. **Restart the service:** + ```bash + ssh root@dalidou "systemctl restart siemens-lmgrd" + ``` + +4. **Verify:** + ```bash + ssh root@dalidou "cd /opt/Siemens/LicenseServer && ./lmutil lmstat -a" + ``` + +--- + +## ThinkPad Setup (When Repaired) + +On your ThinkPad, follow the same **Client Setup** steps above: + +1. Set `SPLM_LICENSE_SERVER` environment variable: + ``` + 28000@dalidou;28000@100.80.199.40 + ``` + +2. Make sure **Tailscale** is installed and connected + +3. Test with Siemens Licensing Tool + +That's it - no license server installation needed on the ThinkPad! + +--- + +## Troubleshooting + +### License server not responding +```bash +# Check if running +ssh root@dalidou "ps aux | grep lmgrd" + +# Check log for errors +ssh root@dalidou "tail -50 /opt/Siemens/LicenseServer/logs/lmgrd.log" + +# Restart +ssh root@dalidou "systemctl restart siemens-lmgrd" +``` + +### Can't connect from laptop +1. Check Tailscale is connected: `tailscale status` +2. Ping dalidou: `ping 100.80.199.40` +3. Check firewall: `ssh root@dalidou "ufw status"` + +### "All licenses in use" error +Only 1 seat per license - close NX on other machines first. + +--- + +## SolidWorks (Future) + +When setting up SolidWorks SNL license: + +| Field | Value | +|-------|-------| +| Server Name | `dalidou` | +| MAC Address | `F0DEF1E6E46A` | +| License Server Port | `25734` | + +--- + +## Port Reference + +| Service | Port | Protocol | +|---------|------|----------| +| Siemens lmgrd (NX) | 28000 | TCP | +| SolidWorks SNL | 25734 | TCP | + +--- + +## History + +| Date | Change | +|------|--------| +| 2025-12-01 | Installed Siemens License Server v5.0.0 on dalidou | +| 2025-12-01 | Configured systemd auto-start service | +| 2025-12-01 | Set up SPLM_LICENSE_SERVER on Precision | +| 2025-12-01 | Temporary license active until Dec 3 | diff --git a/docs/SIEMENS-DOCS-SERVER.md b/docs/SIEMENS-DOCS-SERVER.md new file mode 100644 index 0000000..aaceb4e --- /dev/null +++ b/docs/SIEMENS-DOCS-SERVER.md @@ -0,0 +1,248 @@ +# Siemens Documentation Server on Dalidou + +**Updated:** 2025-12-05 +**Server:** dalidou (ThinkPad W520) +**Status:** OPERATIONAL + +--- + +## Overview + +This setup provides authenticated access to Siemens Support Center documentation (NX Open, Simcenter, Teamcenter) through an MCP server that can be used by Claude in Atomizer. + +### Components + +1. **Siemens Documentation Proxy** (port 5000) - Official Siemens proxy for documentation access +2. **Puppeteer Authentication** - Headless browser that handles Siemens SSO login +3. **MCP Server Tools** - Exposed via the dalidou-assistant MCP server + +--- + +## Quick Start + +### For Claude/Atomizer + +The Siemens docs tools are automatically available through the MCP server. Use these tools: + +| Tool | Description | +|------|-------------| +| `siemens_docs_search` | Search NX Open, Simcenter docs for a topic | +| `siemens_docs_fetch` | Fetch a specific documentation page by URL | +| `siemens_auth_status` | Check if authentication session is active | +| `siemens_login` | Re-login if session expired | +| `siemens_docs_list` | List available documentation categories | + +### Example Usage + +``` +# Search for NX Open Session class +siemens_docs_search(query="NXOpen Session", product="nx") + +# Fetch a specific page +siemens_docs_fetch(url="https://support.sw.siemens.com/en-US/knowledge-base/...") + +# Check auth status +siemens_auth_status() +``` + +--- + +## Server Configuration + +### Documentation Proxy Service + +```bash +# Service status +ssh root@dalidou "systemctl status siemensdocumentationproxyserver" + +# Restart if needed +ssh root@dalidou "systemctl restart siemensdocumentationproxyserver" + +# View logs +ssh root@dalidou "cat /srv/siemens-docs/proxy/logs/*.log | tail -50" +``` + +**Location:** `/srv/siemens-docs/proxy/` +**Port:** 5000 (HTTP, bound to 0.0.0.0) +**API Key:** siemens-docs-2024 + +### MCP Server + +```bash +# Files location +/srv/claude-assistant/ +├── mcp-server/ +│ └── server.js # Main MCP server (v1.2.0) +├── tools/ +│ ├── siemens-auth.js # Puppeteer authentication +│ ├── siemens-docs.js # Documentation fetching +│ ├── weather.js # Weather tools +│ └── gitea.js # Gitea tools +└── vault/ + ├── siemens-creds.json # Siemens login credentials (secured) + └── siemens-cookies.json # Session cookies +``` + +--- + +## Authentication + +The system uses Puppeteer (headless Chrome) to: + +1. Navigate to `https://customer.sw.siemens.com` +2. Accept cookie consent +3. Click "Log In" → redirects to `login.siemens.com` +4. Enter email/username and password +5. Save session cookies for reuse + +### Credentials Storage + +Credentials are stored securely on Dalidou: +```bash +/srv/claude-assistant/vault/siemens-creds.json # chmod 600 +``` + +### Session Management + +- Cookies are saved after successful login +- Session typically lasts several hours +- The tools auto-detect expired sessions and re-login + +--- + +## Troubleshooting + +### "Session expired" or auth errors + +```bash +# Force re-login +ssh root@dalidou "cd /srv/claude-assistant && node -e \"import docs from './tools/siemens-docs.js'; await docs.performLogin(); await docs.closeBrowser();\"" +``` + +### "Page not found" errors + +The Siemens documentation structure changes. Some URLs may be outdated. Use the search function to find current documentation. + +### Browser issues + +```bash +# Kill any stuck Chrome processes +ssh root@dalidou "pkill -f chrome" + +# Clear cookies and re-login +ssh root@dalidou "rm /srv/claude-assistant/vault/siemens-cookies.json" +``` + +### Check all services + +```bash +# Documentation Proxy +ssh root@dalidou "systemctl status siemensdocumentationproxyserver" + +# Test proxy connectivity +ssh root@dalidou "curl -s http://localhost:5000/ | head -5" + +# Test authentication +ssh root@dalidou "cd /srv/claude-assistant && node -e \"import docs from './tools/siemens-docs.js'; const r = await docs.checkAuthStatus(); console.log(r); await docs.closeBrowser();\"" +``` + +--- + +## Updating Credentials + +If your Siemens password changes: + +```bash +ssh root@dalidou "cat > /srv/claude-assistant/vault/siemens-creds.json << EOF +{ + \"username\": \"your.email@example.com\", + \"password\": \"your-new-password\" +} +EOF +chmod 600 /srv/claude-assistant/vault/siemens-creds.json" +``` + +--- + +## Technical Details + +### Why Puppeteer Instead of Direct API? + +Siemens Support Center uses: +- Single Sign-On (SSO) via `login.siemens.com` +- JavaScript-heavy SPA architecture +- Cookie-based session management +- No public API for documentation access + +Puppeteer provides: +- Full browser rendering for SPA content +- Automatic SSO flow handling +- Cookie persistence for session reuse + +### Documentation Proxy Purpose + +The Siemens Documentation Proxy (`DocumentationProxy.3.3.1.aol`) is designed for: +- Serving documentation in air-gapped/offline environments +- Caching documentation locally +- Providing documentation access without individual logins + +However, it still requires valid Siemens credentials for initial setup. + +--- + +## NX Open Python Reference - Validated Access + +**Status: FULLY OPERATIONAL** (Tested 2025-12-05) + +### Base URL +``` +https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/ +``` + +### Verified Working Pages + +| Page | URL | Status | +|------|-----|--------| +| Main Index | `index.html` | ✅ | +| Class Index | `classes.html` | ✅ | +| Class List | `annotated.html` | ✅ | +| Class Hierarchy | `hierarchy.html` | ✅ | +| Functions Index | `functions.html` | ✅ | +| **NXOpen.Session** | `a03318.html` | ✅ | +| **NXOpen.Part** | `a02434.html` | ✅ | +| **NXOpen.BasePart** | `a00266.html` | ✅ | +| NXOpen.PDM.PdmSession | `a50542.html` | ✅ | +| NXOpen.CAE.CaeSession | `a10510.html` | ✅ | + +### Key Classes Quick Reference + +```python +# Main entry points +NXOpen.Session # a03318.html - Main NX session object +NXOpen.Part # a02434.html - Part file object +NXOpen.BasePart # a00266.html - Base part class + +# CAE/CAM +NXOpen.CAE.CaeSession # a10510.html - CAE session +NXOpen.CAM.CAMSession # Via Session.CAMSession() + +# PDM/Teamcenter +NXOpen.PDM.PdmSession # a50542.html - PDM session +``` + +### URL Pattern Notes + +- Class pages use format: `aXXXXX.html` (5-digit ID) +- Function pages: `functions.html`, `functions_a.html` through `functions_z.html` +- Namespace pages may return "Access Denied" when accessed directly +- Navigate through Class List (`annotated.html`) for best results + +--- + +## Version History + +| Date | Version | Changes | +|------|---------|---------| +| 2025-12-05 | 1.2.1 | Validated full NX Open Python Reference access | +| 2025-12-05 | 1.2.0 | Added Puppeteer-based authentication | +| 2025-12-05 | 1.1.0 | Installed Documentation Proxy, initial setup | diff --git a/docs/thinkpad-setup.md b/docs/thinkpad-setup.md new file mode 100644 index 0000000..6e42a01 --- /dev/null +++ b/docs/thinkpad-setup.md @@ -0,0 +1,119 @@ +# ThinkPad P16 Setup - Git LFS for CAD + +When the ThinkPad comes back from repair, follow these steps to set up Git LFS for CAD versioning. + +## Prerequisites + +- Git installed (should already be there) +- Network access to dalidou (192.168.86.50) + +## Setup Steps + +### 1. Open PowerShell as Administrator + +```powershell +cd C:\Users\Antoine\Documents\Dalidou-Server-Setup +``` + +### 2. Run the Setup Script + +```powershell +.\windows-setup.ps1 +``` + +This will: +- Verify Git is installed +- Install Git LFS if needed +- Initialize Git LFS globally +- Configure Git for large file uploads (500MB buffer) + +### 3. Create or Clone CAD Repository + +**Option A: Clone existing repo** +```powershell +git clone http://git.dalidou.home/antoine/cad-projects.git +cd cad-projects +``` + +**Option B: Initialize new repo** +1. Create repo in Gitea: http://git.dalidou.home +2. Clone it: +```powershell +git clone http://git.dalidou.home/antoine/YOUR-REPO-NAME.git +cd YOUR-REPO-NAME +``` + +### 4. Add LFS Configuration Files + +```powershell +Copy-Item "..\Dalidou-Server-Setup\.gitattributes" . +Copy-Item "..\Dalidou-Server-Setup\.gitignore" . +``` + +### 5. Initialize Folder Structure (Optional) + +```powershell +..\Dalidou-Server-Setup\init-cad-repo.ps1 +``` + +### 6. Commit and Push + +```powershell +git add . +git commit -m "Initialize CAD repository with LFS tracking" +git push +``` + +## Verify LFS is Working + +```powershell +# Check tracked patterns +git lfs track + +# Should show: +# *.prt filter=lfs ... +# *.sldprt filter=lfs ... +# etc. +``` + +## Test with a CAD File + +```powershell +# Copy a test part file +Copy-Item "C:\path\to\some\test.prt" . + +# Add and commit +git add test.prt +git commit -m "Test LFS upload" +git push + +# Verify it used LFS +git lfs ls-files +# Should show: test.prt +``` + +## Daily Workflow + +```powershell +# Lock before editing +git lfs lock "NX/Projects/MyProject/part.prt" + +# Edit in NX... + +# Commit +git add . +git commit -m "Updated part geometry" +git push + +# Unlock +git lfs unlock "NX/Projects/MyProject/part.prt" +``` + +## Server Info + +| | | +|---|---| +| Gitea URL | http://git.dalidou.home | +| Gitea IP | http://192.168.86.50:3000 | +| SSH | git@192.168.86.50:2222 | +| LFS Status | ✅ Enabled (Nov 27, 2025) | diff --git a/scripts/init-cad-repo.ps1 b/scripts/init-cad-repo.ps1 new file mode 100644 index 0000000..0d310cf --- /dev/null +++ b/scripts/init-cad-repo.ps1 @@ -0,0 +1,97 @@ +# =========================================== +# Initialize CAD Repository Structure +# Run this inside your cloned repository +# =========================================== + +param( + [string]$RepoPath = "." +) + +Write-Host "=== Initializing CAD Repository Structure ===" -ForegroundColor Cyan +Write-Host "" + +Push-Location $RepoPath + +# Create directory structure +$directories = @( + "NX/Projects/P04-StarSpec" + "NX/Projects/Atomaste-Tools" + "NX/Projects/Client-Projects" + "NX/Templates/part-templates" + "NX/Templates/simulation-templates" + "NX/Libraries/materials" + "NX/Libraries/fasteners" + "SolidWorks/Projects" + "SolidWorks/Templates" + "Exports/STEP" + "Exports/STL" + "Exports/PDF" + "Documentation/specs" + "Documentation/reports" +) + +foreach ($dir in $directories) { + if (!(Test-Path $dir)) { + New-Item -ItemType Directory -Path $dir -Force | Out-Null + # Create .gitkeep to track empty directories + New-Item -ItemType File -Path "$dir/.gitkeep" -Force | Out-Null + Write-Host "Created: $dir" -ForegroundColor Green + } else { + Write-Host "Exists: $dir" -ForegroundColor Yellow + } +} + +# Create README.md +$readmeContent = @" +# CAD Projects Repository + +Version-controlled CAD files using Git LFS on Gitea. + +## Structure + +- **NX/** - NX Siemens projects and files + - **Projects/** - Active project folders + - **Templates/** - Part and simulation templates + - **Libraries/** - Reusable materials and components + +- **SolidWorks/** - SolidWorks projects and files + +- **Exports/** - Exchange format exports (STEP, STL, PDF) + +- **Documentation/** - Specs and reports + +## Quick Commands + +``````bash +# Lock a file before editing +git lfs lock "NX/Projects/P04-StarSpec/main-assembly.prt" + +# Check what's locked +git lfs locks + +# Unlock after committing +git lfs unlock "NX/Projects/P04-StarSpec/main-assembly.prt" + +# See LFS tracked files +git lfs ls-files +`````` + +## Server + +- Gitea: http://git.dalidou.home +- IP: 192.168.86.50:3000 +"@ + +$readmeContent | Out-File -FilePath "README.md" -Encoding utf8 +Write-Host "Created: README.md" -ForegroundColor Green + +Pop-Location + +Write-Host "" +Write-Host "Repository structure initialized!" -ForegroundColor Cyan +Write-Host "" +Write-Host "Next steps:" -ForegroundColor Yellow +Write-Host " cd $RepoPath" +Write-Host " git add ." +Write-Host " git commit -m 'Initialize CAD repository structure'" +Write-Host " git push" diff --git a/scripts/server-setup.sh b/scripts/server-setup.sh new file mode 100644 index 0000000..74fa328 --- /dev/null +++ b/scripts/server-setup.sh @@ -0,0 +1,138 @@ +#!/bin/bash +# =========================================== +# Gitea Git LFS Setup Script for dalidou +# Server: 192.168.86.50 +# =========================================== + +set -e + +echo "=== Gitea Git LFS Setup for dalidou ===" +echo "" + +# ----------------------------------------- +# Step 1: Find Gitea container and config +# ----------------------------------------- +echo "[1/5] Finding Gitea container..." + +GITEA_CONTAINER=$(docker ps --format '{{.Names}}' | grep -i gitea | head -1) + +if [ -z "$GITEA_CONTAINER" ]; then + echo "ERROR: Gitea container not found!" + echo "Make sure Gitea is running: docker ps" + exit 1 +fi + +echo "Found container: $GITEA_CONTAINER" + +# ----------------------------------------- +# Step 2: Find app.ini location +# ----------------------------------------- +echo "" +echo "[2/5] Locating app.ini..." + +# Try common locations +APP_INI_PATHS=( + "/data/gitea/conf/app.ini" + "/etc/gitea/app.ini" + "/app/gitea/conf/app.ini" +) + +APP_INI="" +for path in "${APP_INI_PATHS[@]}"; do + if docker exec "$GITEA_CONTAINER" test -f "$path" 2>/dev/null; then + APP_INI="$path" + break + fi +done + +if [ -z "$APP_INI" ]; then + echo "WARNING: Could not find app.ini automatically." + echo "Searching inside container..." + APP_INI=$(docker exec "$GITEA_CONTAINER" find / -name "app.ini" 2>/dev/null | head -1) +fi + +if [ -z "$APP_INI" ]; then + echo "ERROR: app.ini not found!" + exit 1 +fi + +echo "Found app.ini at: $APP_INI" + +# ----------------------------------------- +# Step 3: Backup current config +# ----------------------------------------- +echo "" +echo "[3/5] Backing up current configuration..." + +BACKUP_NAME="app.ini.backup.$(date +%Y%m%d_%H%M%S)" +docker exec "$GITEA_CONTAINER" cp "$APP_INI" "${APP_INI}.backup" +echo "Backup created: ${APP_INI}.backup" + +# ----------------------------------------- +# Step 4: Check/Enable LFS settings +# ----------------------------------------- +echo "" +echo "[4/5] Checking LFS configuration..." + +# Check if LFS is already configured +if docker exec "$GITEA_CONTAINER" grep -q "LFS_START_SERVER" "$APP_INI"; then + echo "LFS_START_SERVER already exists in config" + docker exec "$GITEA_CONTAINER" grep "LFS_START_SERVER" "$APP_INI" +else + echo "LFS not configured. Adding LFS settings..." + + # Create a temporary script to modify the config + docker exec "$GITEA_CONTAINER" sh -c " + # Add LFS_START_SERVER to [server] section if not present + if grep -q '^\[server\]' '$APP_INI'; then + sed -i '/^\[server\]/a LFS_START_SERVER = true' '$APP_INI' + fi + " + echo "Added LFS_START_SERVER = true to [server] section" +fi + +# Check/add [lfs] section +if docker exec "$GITEA_CONTAINER" grep -q "^\[lfs\]" "$APP_INI"; then + echo "[lfs] section already exists" + docker exec "$GITEA_CONTAINER" grep -A5 "^\[lfs\]" "$APP_INI" +else + echo "Adding [lfs] section..." + docker exec "$GITEA_CONTAINER" sh -c " + echo '' >> '$APP_INI' + echo '[lfs]' >> '$APP_INI' + echo 'PATH = /data/lfs' >> '$APP_INI' + " + echo "Added [lfs] section with PATH = /data/lfs" +fi + +# ----------------------------------------- +# Step 5: Create LFS directory and set permissions +# ----------------------------------------- +echo "" +echo "[5/5] Setting up LFS directory..." + +docker exec "$GITEA_CONTAINER" sh -c " + mkdir -p /data/lfs + chown -R git:git /data/lfs 2>/dev/null || chown -R 1000:1000 /data/lfs + chmod 755 /data/lfs +" +echo "LFS directory created at /data/lfs" + +# ----------------------------------------- +# Show final configuration +# ----------------------------------------- +echo "" +echo "=== Current LFS Configuration ===" +docker exec "$GITEA_CONTAINER" grep -E "(LFS_START_SERVER|^\[lfs\]|^PATH)" "$APP_INI" || true + +echo "" +echo "=== Next Steps ===" +echo "1. Restart Gitea to apply changes:" +echo " docker restart $GITEA_CONTAINER" +echo "" +echo "2. Verify LFS is enabled:" +echo " docker logs $GITEA_CONTAINER 2>&1 | grep -i lfs" +echo "" +echo "3. Test from Windows client (see windows-setup.ps1)" +echo "" +echo "Done!" diff --git a/scripts/windows-setup.ps1 b/scripts/windows-setup.ps1 new file mode 100644 index 0000000..ca0db80 --- /dev/null +++ b/scripts/windows-setup.ps1 @@ -0,0 +1,102 @@ +# =========================================== +# Git LFS Setup for Windows (ThinkPad P16) +# CAD Versioning with Gitea on dalidou +# =========================================== + +Write-Host "=== Git LFS Setup for CAD Versioning ===" -ForegroundColor Cyan +Write-Host "" + +# ----------------------------------------- +# Step 1: Check Git installation +# ----------------------------------------- +Write-Host "[1/5] Checking Git installation..." -ForegroundColor Yellow + +try { + $gitVersion = git --version + Write-Host "Git installed: $gitVersion" -ForegroundColor Green +} catch { + Write-Host "ERROR: Git is not installed!" -ForegroundColor Red + Write-Host "Install Git from: https://git-scm.com/download/win" + Write-Host "Or run: winget install Git.Git" + exit 1 +} + +# ----------------------------------------- +# Step 2: Install Git LFS +# ----------------------------------------- +Write-Host "" +Write-Host "[2/5] Checking/Installing Git LFS..." -ForegroundColor Yellow + +try { + $lfsVersion = git lfs version + Write-Host "Git LFS installed: $lfsVersion" -ForegroundColor Green +} catch { + Write-Host "Git LFS not found. Installing..." -ForegroundColor Yellow + + # Try winget first + $wingetInstalled = Get-Command winget -ErrorAction SilentlyContinue + if ($wingetInstalled) { + Write-Host "Installing via winget..." + winget install GitHub.GitLFS --accept-package-agreements --accept-source-agreements + } else { + Write-Host "ERROR: Please install Git LFS manually from https://git-lfs.github.com/" + exit 1 + } +} + +# ----------------------------------------- +# Step 3: Initialize Git LFS globally +# ----------------------------------------- +Write-Host "" +Write-Host "[3/5] Initializing Git LFS..." -ForegroundColor Yellow + +git lfs install +Write-Host "Git LFS initialized globally" -ForegroundColor Green + +# ----------------------------------------- +# Step 4: Configure Git for large files +# ----------------------------------------- +Write-Host "" +Write-Host "[4/5] Configuring Git for large file uploads..." -ForegroundColor Yellow + +# Increase HTTP buffer for large CAD files +git config --global http.postBuffer 524288000 + +# Configure credentials for Gitea +git config --global credential.helper manager + +Write-Host "HTTP buffer set to 500MB" -ForegroundColor Green +Write-Host "Credential helper configured" -ForegroundColor Green + +# ----------------------------------------- +# Step 5: Display connection info +# ----------------------------------------- +Write-Host "" +Write-Host "[5/5] Setup Complete!" -ForegroundColor Green +Write-Host "" +Write-Host "=== Gitea Server Info ===" -ForegroundColor Cyan +Write-Host "URL: http://git.dalidou.home" -ForegroundColor White +Write-Host "Alt URL: http://192.168.86.50:3000" -ForegroundColor White +Write-Host "SSH: ssh://git@192.168.86.50:2222" -ForegroundColor White +Write-Host "" +Write-Host "=== Next Steps ===" -ForegroundColor Cyan +Write-Host "1. Create a new repository in Gitea web UI" +Write-Host "2. Clone it:" +Write-Host " git clone http://git.dalidou.home/antoine/cad-projects.git" +Write-Host "" +Write-Host "3. Copy .gitattributes and .gitignore to the repo:" +Write-Host " Copy-Item '.\.gitattributes' 'cad-projects\'" +Write-Host " Copy-Item '.\.gitignore' 'cad-projects\'" +Write-Host "" +Write-Host "4. Commit and push:" +Write-Host " cd cad-projects" +Write-Host " git add .gitattributes .gitignore" +Write-Host " git commit -m 'Add LFS tracking for CAD files'" +Write-Host " git push" +Write-Host "" +Write-Host "=== Daily Workflow Commands ===" -ForegroundColor Cyan +Write-Host "Lock file: git lfs lock 'path/to/file.prt'" +Write-Host "View locks: git lfs locks" +Write-Host "Unlock: git lfs unlock 'path/to/file.prt'" +Write-Host "LFS status: git lfs status" +Write-Host "" diff --git a/temp/find-part.js b/temp/find-part.js new file mode 100644 index 0000000..b69e49f --- /dev/null +++ b/temp/find-part.js @@ -0,0 +1,50 @@ +import auth from '../tools/siemens-auth.js'; + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await auth.loadCookies(page); + +// Navigate to annotated.html and find Part class +await page.goto('https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/annotated.html', { waitUntil: 'networkidle2' }); +await new Promise(r => setTimeout(r, 3000)); + +// Find Part class links +const partLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a.el')); + return links + .filter(a => a.innerText && (a.innerText === 'Part' || a.innerText === 'NXOpen::Part')) + .map(a => ({ text: a.innerText.trim(), href: a.href.split('/').pop() })); +}); + +console.log('Part links found:', partLinks); + +// Also search for BasePart +const basePartLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a.el')); + return links + .filter(a => a.innerText && a.innerText.includes('BasePart')) + .map(a => ({ text: a.innerText.trim(), href: a.href.split('/').pop() })) + .slice(0, 5); +}); + +console.log('BasePart links:', basePartLinks); + +// Navigate to Part if found +if (partLinks.length > 0) { + const partUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/' + partLinks[0].href; + console.log('\nNavigating to:', partUrl); + await page.goto(partUrl, { waitUntil: 'networkidle2' }); + await new Promise(r => setTimeout(r, 3000)); + + const content = await page.evaluate(() => ({ + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + preview: document.body.innerText.substring(0, 2000) + })); + + console.log('Title:', content.title); + console.log('Has error:', content.hasError); + console.log('Content:', content.preview); +} + +await auth.closeBrowser(); diff --git a/temp/python-ref-1.png b/temp/python-ref-1.png new file mode 100644 index 0000000..1ca3a83 Binary files /dev/null and b/temp/python-ref-1.png differ diff --git a/temp/python-ref-3.png b/temp/python-ref-3.png new file mode 100644 index 0000000..1ca3a83 Binary files /dev/null and b/temp/python-ref-3.png differ diff --git a/temp/server.js b/temp/server.js new file mode 100644 index 0000000..496f315 --- /dev/null +++ b/temp/server.js @@ -0,0 +1,336 @@ +#!/usr/bin/env node +// MCP Server - exposes dalidou tools to Claude Code on Windows + +import "dotenv/config"; +import { Server } from "@modelcontextprotocol/sdk/server/index.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { + CallToolRequestSchema, + ListToolsRequestSchema, +} from "@modelcontextprotocol/sdk/types.js"; +import weather from "../tools/weather.js"; +import gitea from "../tools/gitea.js"; +import siemensDocs from "../tools/siemens-docs.js"; + +const server = new Server( + { + name: "dalidou-assistant", + version: "1.3.0", + }, + { + capabilities: { + tools: {}, + }, + } +); + +// List available tools +server.setRequestHandler(ListToolsRequestSchema, async () => { + return { + tools: [ + // Weather tools + { + name: "get_current_weather", + description: "Get current weather conditions in Rouyn-Noranda (temperature, wind, conditions)", + inputSchema: { + type: "object", + properties: {}, + required: [] + } + }, + { + name: "get_hourly_forecast", + description: "Get hourly weather forecast for planning activities", + inputSchema: { + type: "object", + properties: { + days: { type: "number", description: "Days to forecast (1-7)" } + } + } + }, + { + name: "get_daily_forecast", + description: "Get daily weather forecast (highs, lows, conditions)", + inputSchema: { + type: "object", + properties: { + days: { type: "number", description: "Days to forecast (1-14)" } + } + } + }, + { + name: "find_best_activity_windows", + description: "Find best time windows for outdoor activities based on weather", + inputSchema: { + type: "object", + properties: { + activity: { + type: "string", + description: "Activity: skiing, cross-country-skiing, hiking, mushroom-hunting" + }, + days: { type: "number", description: "Days to search (1-7)" } + }, + required: ["activity"] + } + }, + { + name: "check_skiing_conditions", + description: "Check if current conditions are good for cross-country skiing", + inputSchema: { + type: "object", + properties: {} + } + }, + // Gitea tools + { + name: "get_today_commits", + description: "Get all git commits made today from Gitea", + inputSchema: { + type: "object", + properties: {} + } + }, + { + name: "get_recent_activity", + description: "Get recent git activity across all Gitea repos", + inputSchema: { + type: "object", + properties: { + days: { type: "number", description: "Days of history (default 7)" } + } + } + }, + { + name: "list_repos", + description: "List all repositories on Gitea", + inputSchema: { + type: "object", + properties: {} + } + }, + // Siemens Documentation tools + { + name: "siemens_docs_list", + description: "List available Siemens documentation categories, NX Open class IDs, and usage info", + inputSchema: { + type: "object", + properties: {} + } + }, + { + name: "siemens_docs_search", + description: "Search Siemens Support Center documentation for a specific topic", + inputSchema: { + type: "object", + properties: { + query: { + type: "string", + description: "Search query (e.g., 'NXOpen Body.GetFaces', 'sketch constraints')" + }, + product: { + type: "string", + description: "Product to search: nx, teamcenter, simcenter, nastran (default: nx)" + } + }, + required: ["query"] + } + }, + { + name: "siemens_docs_fetch", + description: "Fetch a specific Siemens documentation page by URL", + inputSchema: { + type: "object", + properties: { + url: { + type: "string", + description: "Full URL of the documentation page to fetch" + } + }, + required: ["url"] + } + }, + { + name: "siemens_auth_status", + description: "Check Siemens Support Center authentication status", + inputSchema: { + type: "object", + properties: {} + } + }, + { + name: "siemens_login", + description: "Login to Siemens Support Center (use if session expired)", + inputSchema: { + type: "object", + properties: {} + } + }, + // NX Open Python Reference tools + { + name: "nxopen_get_class", + description: "Get NX Open Python class documentation. Known classes: Session, Part, BasePart, PdmSession, CaeSession", + inputSchema: { + type: "object", + properties: { + className: { + type: "string", + description: "Class name (e.g., 'Session', 'Part', 'BasePart')" + } + }, + required: ["className"] + } + }, + { + name: "nxopen_get_index", + description: "Get NX Open Python Reference index pages (class list, functions, hierarchy)", + inputSchema: { + type: "object", + properties: { + indexType: { + type: "string", + description: "Index type: classes, annotated, hierarchy, functions, main (default: classes)" + } + } + } + }, + { + name: "nxopen_fetch_page", + description: "Fetch any NX Open Python Reference page by page ID (e.g., 'a03318.html' for Session)", + inputSchema: { + type: "object", + properties: { + pagePath: { + type: "string", + description: "Page path (e.g., 'a03318.html', 'classes.html', 'functions_s.html')" + } + }, + required: ["pagePath"] + } + } + ] + }; +}); + +// Handle tool calls +server.setRequestHandler(CallToolRequestSchema, async (request) => { + const { name, arguments: args } = request.params; + + try { + let result; + + switch (name) { + // Weather tools + case "get_current_weather": + result = await weather.getCurrentWeather(); + break; + + case "get_hourly_forecast": + result = await weather.getHourlyForecast(args?.days || 2); + break; + + case "get_daily_forecast": + result = await weather.getDailyForecast(args?.days || 7); + break; + + case "find_best_activity_windows": + result = await weather.findBestTimeWindows(args.activity, args?.days || 2); + break; + + case "check_skiing_conditions": + const current = await weather.getCurrentWeather(); + const skiCheck = weather.isGoodForSkiing(current); + result = { + current_weather: current, + good_for_skiing: skiCheck.good, + assessment: skiCheck.reasons + }; + break; + + // Gitea tools + case "get_today_commits": + result = await gitea.getAllTodayCommits(); + break; + + case "get_recent_activity": + result = await gitea.getRepoActivity(args?.days || 7); + break; + + case "list_repos": + result = await gitea.listRepos(); + break; + + // Siemens Documentation tools + case "siemens_docs_list": + result = await siemensDocs.listAvailableDocs(); + break; + + case "siemens_docs_search": + result = await siemensDocs.searchDocs(args.query, args.product || "nx"); + break; + + case "siemens_docs_fetch": + result = await siemensDocs.fetchDocPage(args.url); + break; + + case "siemens_auth_status": + result = await siemensDocs.checkAuthStatus(); + break; + + case "siemens_login": + result = await siemensDocs.performLogin(); + break; + + // NX Open Python Reference tools + case "nxopen_get_class": + result = await siemensDocs.fetchNXOpenClass(args.className); + break; + + case "nxopen_get_index": + result = await siemensDocs.getNXOpenIndex(args?.indexType || "classes"); + break; + + case "nxopen_fetch_page": + result = await siemensDocs.fetchNXOpenPythonRef(args.pagePath); + break; + + default: + return { + content: [{ type: "text", text: `Unknown tool: ${name}` }], + isError: true + }; + } + + return { + content: [{ + type: "text", + text: typeof result === "string" ? result : JSON.stringify(result, null, 2) + }] + }; + + } catch (error) { + return { + content: [{ type: "text", text: `Error: ${error.message}` }], + isError: true + }; + } +}); + +// Cleanup on exit +process.on("SIGINT", async () => { + await siemensDocs.closeBrowser(); + process.exit(0); +}); + +process.on("SIGTERM", async () => { + await siemensDocs.closeBrowser(); + process.exit(0); +}); + +// Start server +async function main() { + const transport = new StdioServerTransport(); + await server.connect(transport); + console.error("Dalidou MCP Server v1.3.0 running on stdio (with NX Open Python Reference)"); +} + +main().catch(console.error); diff --git a/temp/test-classes.js b/temp/test-classes.js new file mode 100644 index 0000000..a6aa10b --- /dev/null +++ b/temp/test-classes.js @@ -0,0 +1,110 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Testing NX Open Class Documentation Access ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +// Navigate to the hierarchy page (which we know works) +const hierarchyUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/a00006.html'; +console.log('Loading hierarchy page:', hierarchyUrl); +await page.goto(hierarchyUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup if present +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Get the page title and content +const pageInfo = await page.evaluate(() => { + return { + title: document.title, + h1: document.querySelector('h1')?.innerText || 'No H1', + bodyText: document.body.innerText.substring(0, 1500) + }; +}); + +console.log('\nPage Title:', pageInfo.title); +console.log('H1:', pageInfo.h1); +console.log('\nPage content preview:'); +console.log(pageInfo.bodyText); + +// Find all class links on the hierarchy page +const classLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.href && a.href.includes('class') && a.innerText) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .filter(l => l.text.length > 0 && l.text.length < 100) + .slice(0, 20); +}); + +console.log('\n=== Found class links:', classLinks.length); +classLinks.forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`)); + +// Try clicking on a class link (NXOpen.Session if available) +const sessionLink = classLinks.find(l => l.text.includes('Session') || l.text.includes('NXOpen')); +if (sessionLink) { + console.log('\n=== Testing click on:', sessionLink.text); + + // Click the link + await page.evaluate((href) => { + const link = document.querySelector(`a[href="${href}"]`) || + Array.from(document.querySelectorAll('a')).find(a => a.href === href); + if (link) link.click(); + }, sessionLink.href); + + await new Promise(r => setTimeout(r, 5000)); + + // Check the new page + const classPageInfo = await page.evaluate(() => { + return { + url: window.location.href, + title: document.title, + h1: document.querySelector('h1')?.innerText || 'No H1', + hasContent: document.body.innerText.length > 500, + bodyPreview: document.body.innerText.substring(0, 1000) + }; + }); + + console.log('\nClass page URL:', classPageInfo.url); + console.log('Class page title:', classPageInfo.title); + console.log('Class page H1:', classPageInfo.h1); + console.log('Has substantial content:', classPageInfo.hasContent); + console.log('\nContent preview:'); + console.log(classPageInfo.bodyPreview); + + await page.screenshot({ path: '/tmp/class-page.png' }); + console.log('\nScreenshot saved to /tmp/class-page.png'); +} + +// Test direct navigation to a known class URL via the iframe +console.log('\n=== Testing direct class URL within iframe context ==='); +const sessionClassUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/classNXOpen_1_1Session.html'; +await page.goto(sessionClassUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +const directAccessInfo = await page.evaluate(() => { + return { + url: window.location.href, + title: document.title, + bodyText: document.body.innerText.substring(0, 1500), + hasError: document.body.innerText.includes('Access Denied') || document.body.innerText.includes('Error') + }; +}); + +console.log('\nDirect URL access result:'); +console.log('Title:', directAccessInfo.title); +console.log('Has error:', directAccessInfo.hasError); +console.log('Content:', directAccessInfo.bodyText); + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-classes2.js b/temp/test-classes2.js new file mode 100644 index 0000000..95457d4 --- /dev/null +++ b/temp/test-classes2.js @@ -0,0 +1,158 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Testing NX Open Class Documentation Navigation ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +// Start from the main index page +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// Navigate to Class Index +const classIndexUrl = baseUrl + 'classes.html'; +console.log('Loading Class Index:', classIndexUrl); +await page.goto(classIndexUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup if present +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +const classIndexInfo = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + bodyPreview: document.body.innerText.substring(0, 2000) + }; +}); + +console.log('Title:', classIndexInfo.title); +console.log('URL:', classIndexInfo.url); +console.log('\nContent preview:'); +console.log(classIndexInfo.bodyPreview); + +// Find all class links +const allClassLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.href && (a.href.includes('class') || a.href.includes('struct'))) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .filter(l => l.text.length > 0) + .slice(0, 50); +}); + +console.log('\n=== Class links found:', allClassLinks.length); +allClassLinks.slice(0, 20).forEach(l => console.log(` - ${l.text}`)); + +// Try clicking on the Session class if found +const sessionLink = allClassLinks.find(l => l.text === 'Session' || l.text.includes('Session')); +if (sessionLink) { + console.log('\n=== Clicking on Session class ==='); + console.log('Link:', sessionLink.href); + + await page.goto(sessionLink.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const sessionInfo = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied') || document.body.innerText.includes('Error'), + bodyPreview: document.body.innerText.substring(0, 2000) + }; + }); + + console.log('\nSession class page:'); + console.log('Title:', sessionInfo.title); + console.log('URL:', sessionInfo.url); + console.log('Has error:', sessionInfo.hasError); + console.log('\nContent:'); + console.log(sessionInfo.bodyPreview); + + await page.screenshot({ path: '/tmp/session-class.png' }); +} else { + // Try any class link + if (allClassLinks.length > 0) { + console.log('\n=== Clicking on first class:', allClassLinks[0].text); + await page.goto(allClassLinks[0].href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const classInfo = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied') || document.body.innerText.includes('Error'), + bodyPreview: document.body.innerText.substring(0, 2000) + }; + }); + + console.log('Title:', classInfo.title); + console.log('Has error:', classInfo.hasError); + console.log('Content:', classInfo.bodyPreview); + } +} + +// Test accessing through the Doxygen wrapper URL +console.log('\n=== Testing via Siemens docs portal wrapper ==='); +const portalUrl = 'https://docs.sw.siemens.com/en-US/doc/209349590/PL20200522120320484.nxopen_python_ref?audience=external'; +await page.goto(portalUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 5000)); + +// Handle any cookie popup +const cookieBtn2 = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn2 && cookieBtn2.asElement()) { + await cookieBtn2.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Look for iframe +const frames = page.frames(); +console.log('Frames found:', frames.length); + +for (const frame of frames) { + const frameUrl = frame.url(); + if (frameUrl.includes('nxopen_python_ref')) { + console.log('Found doc frame:', frameUrl); + + // Try to find and click on Classes menu + const classesMenu = await frame.evaluateHandle(() => { + const elements = Array.from(document.querySelectorAll('a, button, span')); + return elements.find(e => e.innerText && e.innerText.trim() === 'Classes'); + }); + + if (classesMenu && classesMenu.asElement()) { + console.log('Found Classes menu, clicking...'); + await classesMenu.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); + + // Check for dropdown + const dropdown = await frame.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.innerText && a.offsetParent !== null) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .filter(l => l.href.includes('class')) + .slice(0, 10); + }); + + console.log('Dropdown class links:', dropdown); + } + break; + } +} + +await page.screenshot({ path: '/tmp/portal-view.png' }); + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-classes3.js b/temp/test-classes3.js new file mode 100644 index 0000000..b6be0b1 --- /dev/null +++ b/temp/test-classes3.js @@ -0,0 +1,126 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Testing NX Open Class Documentation - Finding Session Class ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +// Navigate to S section of class index +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// First get the classes.html and look for actual clickable class links +const classIndexUrl = baseUrl + 'classes.html'; +console.log('Loading Class Index:', classIndexUrl); +await page.goto(classIndexUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup if present +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Find actual class links (not letter index links) +const classLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .filter(l => l.href.includes('class') && l.href.endsWith('.html') && !l.href.includes('classes.html')) + .slice(0, 100); +}); + +console.log('Found actual class links:', classLinks.length); +classLinks.slice(0, 20).forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`)); + +// Try to find Session class link +const sessionLink = classLinks.find(l => l.text.includes('Session') && !l.text.includes('SessionBuilder')); +console.log('\nSession link found:', sessionLink); + +if (sessionLink) { + console.log('\n=== Navigating to Session class ==='); + await page.goto(sessionLink.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const sessionPage = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied') || + document.body.innerText.includes('') || + document.body.innerText.includes('AccessDenied'), + bodyText: document.body.innerText.substring(0, 3000) + }; + }); + + console.log('Session page title:', sessionPage.title); + console.log('URL:', sessionPage.url); + console.log('Has error:', sessionPage.hasError); + console.log('\n--- Content ---'); + console.log(sessionPage.bodyText); + + await page.screenshot({ path: '/tmp/session-class.png' }); +} + +// If no session link directly, navigate to the NXOpen namespace and look there +if (!sessionLink || classLinks.length === 0) { + console.log('\n=== Trying NXOpen namespace page ==='); + const nxopenUrl = baseUrl + 'namespaceNXOpen.html'; + await page.goto(nxopenUrl, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const nxopenPage = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + bodyText: document.body.innerText.substring(0, 3000) + }; + }); + + console.log('NXOpen namespace page:'); + console.log('Title:', nxopenPage.title); + console.log('Has error:', nxopenPage.hasError); + console.log(nxopenPage.bodyText); + + // Look for Session class link + const sessionInNs = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.innerText.includes('Session')) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .slice(0, 10); + }); + + console.log('\nSession links in NXOpen namespace:', sessionInNs); +} + +// Try the annotated page +console.log('\n=== Testing annotated.html ==='); +const annotatedUrl = baseUrl + 'annotated.html'; +await page.goto(annotatedUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +const annotatedPage = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + bodyText: document.body.innerText.substring(0, 2000), + links: Array.from(document.querySelectorAll('a')) + .filter(a => a.href.includes('class') && a.innerText.includes('Session')) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + }; +}); + +console.log('Annotated page title:', annotatedPage.title); +console.log('Has error:', annotatedPage.hasError); +console.log('Session links:', annotatedPage.links); +console.log('\nContent preview:'); +console.log(annotatedPage.bodyText); + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-classes4.js b/temp/test-classes4.js new file mode 100644 index 0000000..0edd118 --- /dev/null +++ b/temp/test-classes4.js @@ -0,0 +1,166 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Testing NX Open Class List Navigation ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// Navigate to annotated.html (Class List) +const annotatedUrl = baseUrl + 'annotated.html'; +console.log('Loading:', annotatedUrl); +await page.goto(annotatedUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Try to expand the tree view by clicking on detail level indicators +console.log('\n=== Expanding tree view ==='); + +// Look for expand arrows or [+] buttons +const expandButtons = await page.evaluate(() => { + // Look for various expand mechanisms + const results = { + arrows: [], + plusSigns: [], + togglers: [] + }; + + // Doxygen typically uses arrow images or [+] text + const imgs = Array.from(document.querySelectorAll('img')); + imgs.forEach(img => { + if (img.alt && (img.alt.includes('arrow') || img.alt.includes('expand'))) { + results.arrows.push({ src: img.src, alt: img.alt }); + } + }); + + // Look for tree toggle elements + const spans = Array.from(document.querySelectorAll('span')); + spans.forEach(s => { + if (s.className && (s.className.includes('arrow') || s.className.includes('toggle'))) { + results.togglers.push(s.className); + } + }); + + // Look for any clickable elements near NXOpen + const allElements = Array.from(document.querySelectorAll('*')); + const nxopenElements = allElements.filter(e => + e.innerText && e.innerText.includes('NXOpen') && e.innerText.length < 50 + ); + + return { + ...results, + nxopenElements: nxopenElements.map(e => ({ + tag: e.tagName, + text: e.innerText.trim(), + className: e.className + })), + html: document.body.innerHTML.substring(0, 5000) + }; +}); + +console.log('Expand buttons found:', expandButtons.arrows.length, 'arrows,', expandButtons.togglers.length, 'togglers'); +console.log('NXOpen elements:', expandButtons.nxopenElements); + +// Try clicking on the NXOpen row to expand it +const clickResult = await page.evaluate(() => { + // Look for expandable row + const rows = Array.from(document.querySelectorAll('tr')); + for (const row of rows) { + if (row.innerText && row.innerText.includes('NXOpen')) { + // Find the arrow/expand control in this row + const arrow = row.querySelector('span.arrow') || row.querySelector('img') || row.querySelector('[onclick]'); + if (arrow) { + arrow.click(); + return 'Clicked arrow in NXOpen row'; + } + // Try clicking the row itself + row.click(); + return 'Clicked NXOpen row'; + } + } + + // Try the detail level links + const links = Array.from(document.querySelectorAll('a')); + const detailLink = links.find(a => a.innerText && a.innerText.includes('3')); + if (detailLink) { + detailLink.click(); + return 'Clicked detail level 3'; + } + + return 'No expandable element found'; +}); + +console.log('Click result:', clickResult); +await new Promise(r => setTimeout(r, 2000)); + +// Get current state +const pageContent = await page.evaluate(() => { + return { + title: document.title, + text: document.body.innerText.substring(0, 4000), + allLinks: Array.from(document.querySelectorAll('a')) + .filter(a => a.href && a.href.includes('.html')) + .map(a => ({ text: a.innerText.trim().substring(0, 50), href: a.href.split('/').pop() })) + .slice(0, 50) + }; +}); + +console.log('\n=== Page content after click ==='); +console.log(pageContent.text); +console.log('\n=== Links found ==='); +pageContent.allLinks.forEach(l => console.log(` - ${l.text}: ${l.href}`)); + +// Try the search functionality +console.log('\n=== Testing search functionality ==='); +const searchUrl = baseUrl + 'search.html'; +await page.goto(searchUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 2000)); + +const searchPage = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + hasSearchBox: !!document.querySelector('input[type="search"]') || !!document.querySelector('#MSearchBox'), + content: document.body.innerText.substring(0, 1000) + }; +}); + +console.log('Search page title:', searchPage.title); +console.log('Has error:', searchPage.hasError); +console.log('Has search box:', searchPage.hasSearchBox); +console.log('Content:', searchPage.content); + +// Try to access functions list +console.log('\n=== Testing functions list ==='); +const functionsUrl = baseUrl + 'functions.html'; +await page.goto(functionsUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 2000)); + +const functionsPage = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + content: document.body.innerText.substring(0, 2000) + }; +}); + +console.log('Functions page title:', functionsPage.title); +console.log('Has error:', functionsPage.hasError); +console.log('Content preview:', functionsPage.content.substring(0, 500)); + +await page.screenshot({ path: '/tmp/functions-page.png' }); + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-classes5.js b/temp/test-classes5.js new file mode 100644 index 0000000..f503e24 --- /dev/null +++ b/temp/test-classes5.js @@ -0,0 +1,129 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Testing NX Open - Accessing Actual Class Pages ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// Navigate to functions.html which we know works +const functionsUrl = baseUrl + 'functions.html'; +console.log('Loading:', functionsUrl); +await page.goto(functionsUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Find links to actual class pages +const classLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.href && (a.href.includes('classNXOpen') || a.href.includes('class_n_x_open'))) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .filter(l => l.text.length > 0 && l.text.length < 80) + .slice(0, 30); +}); + +console.log('Class links found:', classLinks.length); +classLinks.forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`)); + +// Find Session class link +const sessionLink = classLinks.find(l => + l.text.includes('Session') && !l.text.includes('SessionCollection') && !l.text.includes('SessionBuilder') +); + +// Or try any class link if Session not found +const targetLink = sessionLink || classLinks[0]; + +if (targetLink) { + console.log('\n=== Navigating to:', targetLink.text, '==='); + console.log('URL:', targetLink.href); + + await page.goto(targetLink.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const classPage = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied') || + document.body.innerText.includes('') || + document.body.innerText.includes('AccessDenied'), + bodyText: document.body.innerText.substring(0, 4000) + }; + }); + + console.log('\nClass page result:'); + console.log('Title:', classPage.title); + console.log('URL:', classPage.url); + console.log('Has error:', classPage.hasError); + console.log('\n--- Content ---'); + console.log(classPage.bodyText); + + await page.screenshot({ path: '/tmp/class-access.png' }); +} + +// Let's also test the class list functions_s.html to find Session directly +console.log('\n=== Testing functions_s.html (looking for Session) ==='); +const functionsSUrl = baseUrl + 'functions_s.html'; +await page.goto(functionsSUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +const sessionContent = await page.evaluate(() => { + const text = document.body.innerText; + const sessionLines = text.split('\n').filter(l => l.includes('Session')); + return { + hasError: text.includes('Access Denied'), + sessionLines: sessionLines.slice(0, 20), + sessionLinks: Array.from(document.querySelectorAll('a')) + .filter(a => a.innerText && a.innerText.includes('Session') && a.href) + .map(a => ({ text: a.innerText.trim(), href: a.href })) + .slice(0, 10) + }; +}); + +console.log('Has error:', sessionContent.hasError); +console.log('Session-related lines:'); +sessionContent.sessionLines.forEach(l => console.log(` ${l.substring(0, 100)}`)); +console.log('\nSession links:'); +sessionContent.sessionLinks.forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`)); + +// Try to click on a Session link if found +if (sessionContent.sessionLinks.length > 0) { + const sessionClassLink = sessionContent.sessionLinks.find(l => + l.href.includes('Session') && !l.text.includes('Builder') + ) || sessionContent.sessionLinks[0]; + + console.log('\n=== Clicking on Session link:', sessionClassLink.text, '==='); + await page.goto(sessionClassLink.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const sessionPage = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + content: document.body.innerText.substring(0, 3000) + }; + }); + + console.log('Title:', sessionPage.title); + console.log('Has error:', sessionPage.hasError); + console.log('\n--- Session class content ---'); + console.log(sessionPage.content); + + await page.screenshot({ path: '/tmp/session-page.png' }); +} + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-find-session.js b/temp/test-find-session.js new file mode 100644 index 0000000..489cf27 --- /dev/null +++ b/temp/test-find-session.js @@ -0,0 +1,170 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Finding NXOpen.Session Class Page ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// Navigate to hierarchy.html and look for Session +console.log('Loading hierarchy.html...'); +await page.goto(baseUrl + 'hierarchy.html', { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Find Session links in hierarchy +const hierarchyLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.innerText && a.innerText.trim() === 'Session') + .map(a => ({ text: a.innerText.trim(), href: a.href, file: a.href.split('/').pop() })); +}); + +console.log('Session links in hierarchy:', hierarchyLinks); + +// Try each Session link to find the NXOpen.Session class +for (const link of hierarchyLinks.slice(0, 3)) { + console.log(`\n=== Trying: ${link.file} ===`); + await page.goto(link.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const pageContent = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + firstLines: document.body.innerText.substring(0, 500) + }; + }); + + console.log('Title:', pageContent.title); + console.log('Has error:', pageContent.hasError); + console.log('Content preview:', pageContent.firstLines); + + if (!pageContent.hasError && pageContent.title.includes('Session')) { + // Found a working Session page! + console.log('\n=== FOUND WORKING SESSION PAGE! ==='); + + // Get full content + const fullContent = await page.evaluate(() => { + return { + title: document.title, + content: document.body.innerText.substring(0, 5000) + }; + }); + + console.log(fullContent.content); + await page.screenshot({ path: '/tmp/nxopen-session.png' }); + break; + } +} + +// Also try directly searching in class index page for Session (NXOpen) +console.log('\n=== Looking for Session (NXOpen) specifically ==='); +await page.goto(baseUrl + 'classes.html', { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Get all text and find Session (NXOpen) +const classIndexSearch = await page.evaluate(() => { + const text = document.body.innerText; + // Look for Session followed by (NXOpen) or Session(NXOpen) + const sessionIdx = text.indexOf('Session (NXOpen)'); + if (sessionIdx > -1) { + // Get surrounding context + return { + found: true, + context: text.substring(Math.max(0, sessionIdx - 100), sessionIdx + 200) + }; + } + return { found: false }; +}); + +console.log('Session (NXOpen) in class index:', classIndexSearch); + +// Find the link for Session class under NXOpen namespace +const sessionNXOpenLink = await page.evaluate(() => { + // Get all links + const links = Array.from(document.querySelectorAll('a')); + + // Find links that have "Session" text + const sessionLinks = links + .filter(a => a.innerText && a.innerText.trim() === 'Session') + .map(a => { + // Get parent context to identify namespace + let parentText = a.parentElement?.innerText || ''; + return { + text: a.innerText.trim(), + href: a.href, + file: a.href.split('/').pop(), + parentContext: parentText.substring(0, 100) + }; + }); + + return sessionLinks; +}); + +console.log('\nSession links with context:', sessionNXOpenLink); + +// Try the NXOpen namespace directly to find Session class +console.log('\n=== Trying NXOpen namespace from annotated.html ==='); +await page.goto(baseUrl + 'annotated.html', { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Expand NXOpen namespace and look for Session +const annotatedSessionLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a.el')); + return links + .filter(a => a.innerText && a.innerText.includes('Session')) + .map(a => ({ text: a.innerText.trim(), href: a.href.split('/').pop() })) + .filter(l => !l.text.includes('.') || l.text.startsWith('NXOpen.Session')) + .slice(0, 20); +}); + +console.log('Session links from annotated:', annotatedSessionLinks); + +// Try the pattern a***.html to find Session directly +// Let's try a55186 (common pattern for main classes) +const testUrls = [ + 'a55186.html', // Possible Session + 'a55188.html', + 'a55190.html', + 'a55180.html' +]; + +for (const testUrl of testUrls) { + console.log(`\nTrying ${testUrl}...`); + await page.goto(baseUrl + testUrl, { waitUntil: 'networkidle2', timeout: 30000 }); + await new Promise(r => setTimeout(r, 2000)); + + const testResult = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + isSession: document.title.includes('Session') && document.title.includes('NXOpen') + }; + }); + + console.log(`${testUrl}: ${testResult.title} (error: ${testResult.hasError})`); + + if (!testResult.hasError && testResult.isSession) { + console.log('\n=== FOUND NXOPEN.SESSION! ==='); + const content = await page.evaluate(() => document.body.innerText.substring(0, 4000)); + console.log(content); + await page.screenshot({ path: '/tmp/nxopen-session-found.png' }); + break; + } +} + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-nxopen.js b/temp/test-nxopen.js new file mode 100644 index 0000000..4939fef --- /dev/null +++ b/temp/test-nxopen.js @@ -0,0 +1,111 @@ +import auth from './tools/siemens-auth.js'; + +console.log('=== Testing NX Open Python Reference Access ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +const url = 'https://docs.sw.siemens.com/en-US/doc/209349590/PL20200522120320484.nxopen_python_ref?audience=external'; +console.log('Loading:', url); +await page.goto(url, { waitUntil: 'networkidle2' }); +await new Promise(r => setTimeout(r, 5000)); + +// Handle cookie popup - click multiple times if needed +for (let i = 0; i < 3; i++) { + const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); + }); + if (cookieBtn && cookieBtn.asElement()) { + console.log('Clicking Accept All Cookies...'); + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 1000)); + } +} + +await new Promise(r => setTimeout(r, 3000)); +await page.screenshot({ path: '/tmp/nxopen-1.png' }); + +// Check for iframes +const frames = page.frames(); +console.log('\nFrames found:', frames.length); +frames.forEach((f, i) => console.log(` Frame ${i}: ${f.url().substring(0, 80)}`)); + +// Look for documentation iframe +let docFrame = null; +for (const frame of frames) { + const frameUrl = frame.url(); + if (frameUrl.includes('nxopen') || frameUrl.includes('doxygen') || frameUrl.includes('/doc/')) { + docFrame = frame; + console.log('\nFound doc frame:', frameUrl); + break; + } +} + +// If no iframe, check the main page content +console.log('\n=== Main Page Content ==='); +const mainContent = await page.evaluate(() => { + // Get all text + const text = document.body.innerText; + // Look for specific elements + const title = document.title; + const h1s = Array.from(document.querySelectorAll('h1')).map(h => h.innerText); + const h2s = Array.from(document.querySelectorAll('h2')).map(h => h.innerText); + + return { title, h1s, h2s, text: text.substring(0, 2000) }; +}); + +console.log('Title:', mainContent.title); +console.log('H1s:', mainContent.h1s); +console.log('H2s:', mainContent.h2s); + +// Try clicking on "Classes" tab +console.log('\n=== Trying to click Classes ==='); +const classesTab = await page.evaluateHandle(() => { + const elements = Array.from(document.querySelectorAll('*')); + return elements.find(e => e.innerText === 'Classes' || e.innerText === 'Classes▼'); +}); + +if (classesTab && classesTab.asElement()) { + console.log('Found Classes element, clicking...'); + await classesTab.asElement().click(); + await new Promise(r => setTimeout(r, 3000)); + await page.screenshot({ path: '/tmp/nxopen-2.png' }); + + // Get dropdown content + const dropdownContent = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => a.innerText && a.href) + .map(a => a.innerText.trim()) + .filter(t => t.length > 2 && t.length < 100) + .slice(0, 50); + }); + + console.log('Dropdown links:', dropdownContent.length); + dropdownContent.slice(0, 30).forEach(l => console.log(' -', l)); +} + +// Try to find the embedded documentation content +console.log('\n=== Looking for embedded content ==='); +const embeddedContent = await page.evaluate(() => { + // Look for common documentation containers + const containers = document.querySelectorAll('iframe, .doc-content, .documentation, #content, main'); + const results = []; + containers.forEach(c => { + results.push({ + tag: c.tagName, + id: c.id, + className: c.className, + src: c.src || null + }); + }); + return results; +}); + +console.log('Found containers:', embeddedContent); + +await auth.closeBrowser(); +console.log('\nDone!'); diff --git a/temp/test-session-final.js b/temp/test-session-final.js new file mode 100644 index 0000000..c1d8465 --- /dev/null +++ b/temp/test-session-final.js @@ -0,0 +1,86 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Accessing NXOpen.Session Class (a03318.html) ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// Navigate to NXOpen.Session class page +const sessionUrl = baseUrl + 'a03318.html'; +console.log('Loading:', sessionUrl); +await page.goto(sessionUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Handle cookie popup +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Get page content +const sessionContent = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied'), + fullText: document.body.innerText + }; +}); + +console.log('Title:', sessionContent.title); +console.log('URL:', sessionContent.url); +console.log('Has error:', sessionContent.hasError); + +if (!sessionContent.hasError) { + console.log('\n=== SUCCESS! NXOpen.Session class documentation ===\n'); + console.log(sessionContent.fullText.substring(0, 8000)); + await page.screenshot({ path: '/tmp/nxopen-session-success.png' }); + + // Also test another important class - Part + console.log('\n\n=== Now testing NXOpen.Part class ==='); + + // First find Part class page ID + await page.goto(baseUrl + 'classes.html', { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 2000)); + + const partLink = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + const partLinks = links + .filter(a => a.innerText && a.innerText.trim() === 'Part') + .map(a => ({ text: a.innerText.trim(), href: a.href, parent: a.parentElement?.innerText?.substring(0, 50) || '' })); + return partLinks.find(l => l.parent.includes('NXOpen')) || partLinks[0]; + }); + + if (partLink) { + console.log('Found Part link:', partLink); + await page.goto(partLink.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + const partContent = await page.evaluate(() => { + return { + title: document.title, + hasError: document.body.innerText.includes('Access Denied'), + content: document.body.innerText.substring(0, 3000) + }; + }); + + console.log('Part class title:', partContent.title); + console.log('Has error:', partContent.hasError); + console.log('\nPart class content preview:'); + console.log(partContent.content); + } +} else { + console.log('\n=== ERROR: Could not access Session class ==='); + console.log(sessionContent.fullText); +} + +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-session.js b/temp/test-session.js new file mode 100644 index 0000000..227fe82 --- /dev/null +++ b/temp/test-session.js @@ -0,0 +1,159 @@ +import auth from '../tools/siemens-auth.js'; + +console.log('=== Testing NX Open Session Class Access ===\n'); + +const browser = await auth.getBrowser(); +const page = await browser.newPage(); +await page.setViewport({ width: 1400, height: 900 }); +await auth.loadCookies(page); + +const baseUrl = 'https://docs.sw.siemens.com/documentation/external/PL20200522120320484/en-US/nx_open_python_ref/nx/1980/nx_open_python_ref/en-US/nxopen_python_ref/'; + +// First navigate to the index page to establish session +console.log('Loading index page first...'); +await page.goto(baseUrl + 'index.html', { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 2000)); + +// Handle cookie popup +const cookieBtn = await page.evaluateHandle(() => { + const btns = Array.from(document.querySelectorAll('button')); + return btns.find(b => b.innerText && b.innerText.includes('Accept All Cookies')); +}); +if (cookieBtn && cookieBtn.asElement()) { + await cookieBtn.asElement().click(); + await new Promise(r => setTimeout(r, 2000)); +} + +// Try to navigate to Class Index and find Session +console.log('\n=== Looking for NXOpen.Session class ==='); +const classIndexUrl = baseUrl + 'classes.html'; +await page.goto(classIndexUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +// Get HTML to find the actual Session link +const sessionInfo = await page.evaluate(() => { + const html = document.body.innerHTML; + const text = document.body.innerText; + + // Look for Session (NXOpen) in the class index + const sessionMatch = text.match(/Session\s*\(NXOpen\)/); + + // Look for all links containing Session + const links = Array.from(document.querySelectorAll('a')); + const sessionLinks = links + .filter(a => a.innerText && a.innerText.includes('Session') && a.href) + .map(a => ({ text: a.innerText.trim(), href: a.href })); + + return { + hasSessionInText: sessionMatch ? sessionMatch[0] : null, + sessionLinks: sessionLinks, + // Look for the specific pattern in text + sessionSection: text.split('\n').filter(l => l.includes('Session') && l.includes('NXOpen')).slice(0, 10) + }; +}); + +console.log('Session in text:', sessionInfo.hasSessionInText); +console.log('Session-related lines:', sessionInfo.sessionSection); +console.log('Session links found:', sessionInfo.sessionLinks.length); +sessionInfo.sessionLinks.slice(0, 10).forEach(l => console.log(` - ${l.text}: ${l.href.split('/').pop()}`)); + +// Navigate to the S section of the class index +console.log('\n=== Checking S section of class index ==='); +const sSectionUrl = baseUrl + 'classes.html#letter_s'; +await page.goto(sSectionUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 2000)); + +const sSectionContent = await page.evaluate(() => { + const text = document.body.innerText; + // Find the section starting from S + const sIndex = text.indexOf('\nS\n'); + if (sIndex > -1) { + return text.substring(sIndex, sIndex + 3000); + } + // Try to find Session + const sessionIdx = text.indexOf('Session'); + if (sessionIdx > -1) { + return text.substring(Math.max(0, sessionIdx - 100), sessionIdx + 500); + } + return text.substring(0, 2000); +}); + +console.log('S section content:'); +console.log(sSectionContent); + +// Try to click on Session class from classes page +const sessionClassLinks = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + return links + .filter(a => { + const text = a.innerText.trim(); + // Look for Session class that's under NXOpen namespace + return text === 'Session' || (text.includes('Session') && !text.includes('Builder') && !text.includes('Collection') && text.length < 30); + }) + .map(a => ({ text: a.innerText.trim(), href: a.href, parent: a.parentElement?.innerText?.substring(0, 50) || '' })) + .slice(0, 10); +}); + +console.log('\nSession class candidates:', sessionClassLinks); + +// Try direct access to NXOpen.Session class page using Doxygen naming convention +// Doxygen uses classNXOpen_1_1Session.html format +console.log('\n=== Trying direct Session class URL ==='); +const sessionDirectUrl = baseUrl + 'a55186.html'; // This is likely the Session page based on pattern +await page.goto(sessionDirectUrl, { waitUntil: 'networkidle2', timeout: 60000 }); +await new Promise(r => setTimeout(r, 3000)); + +let sessionPageResult = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied'), + content: document.body.innerText.substring(0, 3000) + }; +}); + +console.log('Direct URL result:'); +console.log('Title:', sessionPageResult.title); +console.log('Has error:', sessionPageResult.hasError); +console.log('Content:', sessionPageResult.content.substring(0, 500)); + +// If error, try to find Session by navigating from hierarchy +if (sessionPageResult.hasError) { + console.log('\n=== Trying via hierarchy.html ==='); + await page.goto(baseUrl + 'hierarchy.html', { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + // Find Session link + const hierarchySession = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + const sessionLink = links.find(a => a.innerText.trim() === 'Session'); + if (sessionLink) { + return { text: sessionLink.innerText, href: sessionLink.href }; + } + return null; + }); + + if (hierarchySession) { + console.log('Found Session in hierarchy:', hierarchySession); + await page.goto(hierarchySession.href, { waitUntil: 'networkidle2', timeout: 60000 }); + await new Promise(r => setTimeout(r, 3000)); + + sessionPageResult = await page.evaluate(() => { + return { + title: document.title, + url: window.location.href, + hasError: document.body.innerText.includes('Access Denied'), + content: document.body.innerText.substring(0, 3000) + }; + }); + + console.log('\nSession page via hierarchy:'); + console.log('Title:', sessionPageResult.title); + console.log('Has error:', sessionPageResult.hasError); + console.log('Content:', sessionPageResult.content); + } +} + +await page.screenshot({ path: '/tmp/session-final.png' }); +await auth.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/temp/test-siemens-docs.js b/temp/test-siemens-docs.js new file mode 100644 index 0000000..ff25e21 --- /dev/null +++ b/temp/test-siemens-docs.js @@ -0,0 +1,25 @@ +import docs from '../tools/siemens-docs.js'; + +console.log('=== Testing updated siemens-docs.js ===\n'); + +// Test listAvailableDocs +console.log('1. listAvailableDocs():'); +const availableDocs = await docs.listAvailableDocs(); +console.log(JSON.stringify(availableDocs, null, 2)); + +// Test fetchNXOpenClass for Session +console.log('\n2. fetchNXOpenClass("Session"):'); +const sessionDocs = await docs.fetchNXOpenClass('Session'); +console.log('Title:', sessionDocs.title); +console.log('Has error:', sessionDocs.error ? 'Yes: ' + sessionDocs.error : 'No'); +console.log('Content preview:', (sessionDocs.content || '').substring(0, 800)); + +// Test getNXOpenIndex +console.log('\n3. getNXOpenIndex("functions"):'); +const functionsIndex = await docs.getNXOpenIndex('functions'); +console.log('Title:', functionsIndex.title); +console.log('Has error:', functionsIndex.error ? 'Yes' : 'No'); +console.log('Content preview:', (functionsIndex.content || '').substring(0, 500)); + +await docs.closeBrowser(); +console.log('\n=== Test Complete ==='); diff --git a/templates/gitattributes-template.txt b/templates/gitattributes-template.txt new file mode 100644 index 0000000..4491ea4 --- /dev/null +++ b/templates/gitattributes-template.txt @@ -0,0 +1,91 @@ +# =========================================== +# Git LFS Configuration for CAD Projects +# NX Siemens + SolidWorks + Simulation Files +# =========================================== + +# ----------------------------------------- +# NX Siemens Files +# ----------------------------------------- +*.prt filter=lfs diff=lfs merge=lfs -text +*.prt.* filter=lfs diff=lfs merge=lfs -text +*.asm filter=lfs diff=lfs merge=lfs -text + +# NX Simulation/Nastran files +*.sim filter=lfs diff=lfs merge=lfs -text +*.fem filter=lfs diff=lfs merge=lfs -text +*.dat filter=lfs diff=lfs merge=lfs -text +*.bdf filter=lfs diff=lfs merge=lfs -text +*.nas filter=lfs diff=lfs merge=lfs -text +*.op2 filter=lfs diff=lfs merge=lfs -text +*.f06 filter=lfs diff=lfs merge=lfs -text +*.f04 filter=lfs diff=lfs merge=lfs -text +*.xdb filter=lfs diff=lfs merge=lfs -text +*.unv filter=lfs diff=lfs merge=lfs -text + +# NX CAM files +*.cls filter=lfs diff=lfs merge=lfs -text + +# ----------------------------------------- +# SolidWorks Files +# ----------------------------------------- +*.sldprt filter=lfs diff=lfs merge=lfs -text +*.sldasm filter=lfs diff=lfs merge=lfs -text +*.slddrw filter=lfs diff=lfs merge=lfs -text +*.sldlfp filter=lfs diff=lfs merge=lfs -text +*.sldmat filter=lfs diff=lfs merge=lfs -text + +# SolidWorks Simulation +*.cwr filter=lfs diff=lfs merge=lfs -text + +# ----------------------------------------- +# Neutral/Exchange Formats +# ----------------------------------------- +*.step filter=lfs diff=lfs merge=lfs -text +*.stp filter=lfs diff=lfs merge=lfs -text +*.iges filter=lfs diff=lfs merge=lfs -text +*.igs filter=lfs diff=lfs merge=lfs -text +*.x_t filter=lfs diff=lfs merge=lfs -text +*.x_b filter=lfs diff=lfs merge=lfs -text +*.sat filter=lfs diff=lfs merge=lfs -text +*.jt filter=lfs diff=lfs merge=lfs -text +*.3mf filter=lfs diff=lfs merge=lfs -text + +# ----------------------------------------- +# Mesh & Visualization +# ----------------------------------------- +*.stl filter=lfs diff=lfs merge=lfs -text +*.obj filter=lfs diff=lfs merge=lfs -text +*.ply filter=lfs diff=lfs merge=lfs -text +*.3ds filter=lfs diff=lfs merge=lfs -text +*.fbx filter=lfs diff=lfs merge=lfs -text +*.dae filter=lfs diff=lfs merge=lfs -text + +# ----------------------------------------- +# Documents & Images (large) +# ----------------------------------------- +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.tif filter=lfs diff=lfs merge=lfs -text +*.tiff filter=lfs diff=lfs merge=lfs -text +*.bmp filter=lfs diff=lfs merge=lfs -text + +# ----------------------------------------- +# Archives +# ----------------------------------------- +*.zip filter=lfs diff=lfs merge=lfs -text +*.7z filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text + +# ----------------------------------------- +# File Locking (prevents merge conflicts) +# Enable for files that cannot be merged +# ----------------------------------------- +*.prt lockable +*.asm lockable +*.sldprt lockable +*.sldasm lockable +*.slddrw lockable +*.sim lockable +*.fem lockable diff --git a/templates/gitignore-template.txt b/templates/gitignore-template.txt new file mode 100644 index 0000000..55dd0ac --- /dev/null +++ b/templates/gitignore-template.txt @@ -0,0 +1,58 @@ +# =========================================== +# Git Ignore for CAD Projects +# =========================================== + +# ----------------------------------------- +# NX Siemens Temporary Files +# ----------------------------------------- +*.log +*.lck +*_i.jt +*_jt*.log +*.prt.*[0-9] +CacheFile*.cac +*.cae_bak + +# NX Journal files (unless you want to track them) +# *.vb +# *.py + +# ----------------------------------------- +# SolidWorks Temporary Files +# ----------------------------------------- +~$*.sldprt +~$*.sldasm +~$*.slddrw +*.swp +*.swo +*.tmp + +# SolidWorks backup files +*.sldprt.bak +*.sldasm.bak + +# ----------------------------------------- +# Nastran/Simulation Temporary +# ----------------------------------------- +*.DBALL +*.MASTER +*.IFPDAT +*.scratch +*.SCR +fort.* + +# ----------------------------------------- +# System Files +# ----------------------------------------- +.DS_Store +Thumbs.db +desktop.ini +*.bak +*~ + +# ----------------------------------------- +# IDE/Editor +# ----------------------------------------- +.vscode/ +.idea/ +*.swp