golf-mcp 0.1.20__py3-none-any.whl → 0.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of golf-mcp might be problematic. Click here for more details.

Files changed (123) hide show
  1. golf/__init__.py +9 -1
  2. golf/_endpoints.py +6 -0
  3. golf/_endpoints_fallback.py +10 -0
  4. golf/auth/__init__.py +235 -83
  5. golf/auth/api_key.py +6 -14
  6. golf/auth/factory.py +358 -0
  7. golf/auth/helpers.py +12 -42
  8. golf/auth/providers.py +446 -0
  9. golf/auth/registry.py +256 -0
  10. golf/cli/branding.py +192 -0
  11. golf/cli/main.py +28 -69
  12. golf/commands/__init__.py +2 -0
  13. golf/commands/build.py +4 -7
  14. golf/commands/init.py +30 -53
  15. golf/commands/run.py +50 -20
  16. golf/core/builder.py +355 -414
  17. golf/core/builder_auth.py +63 -144
  18. golf/core/builder_telemetry.py +26 -3
  19. golf/core/config.py +38 -59
  20. golf/core/parser.py +132 -139
  21. golf/core/platform.py +12 -10
  22. golf/core/telemetry.py +11 -19
  23. golf/core/transformer.py +38 -15
  24. golf/examples/__pycache__/__init__.cpython-311.pyc +0 -0
  25. golf/examples/basic/.coverage +0 -0
  26. golf/examples/basic/.env.example +8 -4
  27. golf/examples/basic/README.md +117 -45
  28. golf/examples/basic/__pycache__/auth.cpython-311.pyc +0 -0
  29. golf/examples/basic/auth.py +76 -0
  30. golf/examples/basic/golf.json +2 -5
  31. golf/examples/basic/htmlcov/.gitignore +2 -0
  32. golf/examples/basic/htmlcov/class_index.html +547 -0
  33. golf/examples/basic/htmlcov/coverage_html_cb_6fb7b396.js +733 -0
  34. golf/examples/basic/htmlcov/favicon_32_cb_58284776.png +0 -0
  35. golf/examples/basic/htmlcov/function_index.html +2091 -0
  36. golf/examples/basic/htmlcov/index.html +349 -0
  37. golf/examples/basic/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  38. golf/examples/basic/htmlcov/status.json +1 -0
  39. golf/examples/basic/htmlcov/style_cb_8e611ae1.css +337 -0
  40. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496___init___py.html +323 -0
  41. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_api_key_py.html +170 -0
  42. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_factory_py.html +430 -0
  43. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_helpers_py.html +288 -0
  44. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_providers_py.html +493 -0
  45. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_registry_py.html +353 -0
  46. golf/examples/basic/htmlcov/z_3ec3b3f490dc0950___init___py.html +120 -0
  47. golf/examples/basic/htmlcov/z_3ec3b3f490dc0950_instrumentation_py.html +1535 -0
  48. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db___init___py.html +98 -0
  49. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db_branding_py.html +289 -0
  50. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db_main_py.html +476 -0
  51. golf/examples/basic/htmlcov/z_5a6c4e6bcc86fb2f___init___py.html +97 -0
  52. golf/examples/basic/htmlcov/z_6cadab9ec0df475d___init___py.html +102 -0
  53. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_build_py.html +178 -0
  54. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_init_py.html +387 -0
  55. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_run_py.html +222 -0
  56. golf/examples/basic/htmlcov/z_6fcdee0582ba84e4___init___py.html +106 -0
  57. golf/examples/basic/htmlcov/z_6fcdee0582ba84e4__endpoints_fallback_py.html +107 -0
  58. golf/examples/basic/htmlcov/z_7ba499ed22986217___init___py.html +98 -0
  59. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_auth_py.html +306 -0
  60. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_metrics_py.html +329 -0
  61. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_py.html +1471 -0
  62. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_telemetry_py.html +186 -0
  63. golf/examples/basic/htmlcov/z_7ba499ed22986217_config_py.html +315 -0
  64. golf/examples/basic/htmlcov/z_7ba499ed22986217_parser_py.html +1149 -0
  65. golf/examples/basic/htmlcov/z_7ba499ed22986217_platform_py.html +279 -0
  66. golf/examples/basic/htmlcov/z_7ba499ed22986217_telemetry_py.html +589 -0
  67. golf/examples/basic/htmlcov/z_7ba499ed22986217_transformer_py.html +286 -0
  68. golf/examples/basic/htmlcov/z_7d7da37693a43688___init___py.html +107 -0
  69. golf/examples/basic/htmlcov/z_7d7da37693a43688_collector_py.html +417 -0
  70. golf/examples/basic/htmlcov/z_7d7da37693a43688_registry_py.html +109 -0
  71. golf/examples/basic/htmlcov/z_abe733142b40ad4e___init___py.html +109 -0
  72. golf/examples/basic/htmlcov/z_abe733142b40ad4e_context_py.html +150 -0
  73. golf/examples/basic/htmlcov/z_abe733142b40ad4e_elicitation_py.html +267 -0
  74. golf/examples/basic/htmlcov/z_abe733142b40ad4e_sampling_py.html +318 -0
  75. golf/examples/basic/prompts/__pycache__/welcome.cpython-311.pyc +0 -0
  76. golf/examples/basic/prompts/welcome.py +3 -5
  77. golf/examples/basic/resources/__pycache__/current_time.cpython-311.pyc +0 -0
  78. golf/examples/basic/resources/__pycache__/info.cpython-311.pyc +0 -0
  79. golf/examples/basic/resources/current_time.py +5 -13
  80. golf/examples/basic/resources/weather/__pycache__/common.cpython-311.pyc +0 -0
  81. golf/examples/basic/resources/weather/__pycache__/current.cpython-311.pyc +0 -0
  82. golf/examples/basic/resources/weather/__pycache__/forecast.cpython-311.pyc +0 -0
  83. golf/examples/basic/resources/weather/city.py +46 -0
  84. golf/examples/basic/resources/weather/common.py +4 -11
  85. golf/examples/basic/resources/weather/current.py +5 -5
  86. golf/examples/basic/resources/weather/forecast.py +5 -5
  87. golf/examples/basic/tools/__pycache__/calculator.cpython-311.pyc +0 -0
  88. golf/examples/basic/tools/calculator.py +94 -0
  89. golf/examples/basic/tools/say/__pycache__/hello.cpython-311.pyc +0 -0
  90. golf/examples/basic/tools/say/hello.py +65 -0
  91. golf/metrics/collector.py +100 -19
  92. golf/telemetry/__init__.py +4 -0
  93. golf/telemetry/instrumentation.py +484 -178
  94. golf/utilities/__init__.py +12 -0
  95. golf/utilities/context.py +53 -0
  96. golf/utilities/elicitation.py +170 -0
  97. golf/utilities/sampling.py +221 -0
  98. {golf_mcp-0.1.20.dist-info → golf_mcp-0.2.1.dist-info}/METADATA +51 -104
  99. golf_mcp-0.2.1.dist-info/RECORD +110 -0
  100. golf/auth/oauth.py +0 -861
  101. golf/auth/provider.py +0 -115
  102. golf/examples/api_key/.env +0 -2
  103. golf/examples/api_key/.env.example +0 -1
  104. golf/examples/api_key/README.md +0 -84
  105. golf/examples/api_key/golf.json +0 -8
  106. golf/examples/api_key/pre_build.py +0 -11
  107. golf/examples/api_key/tools/issues/create.py +0 -93
  108. golf/examples/api_key/tools/issues/list.py +0 -92
  109. golf/examples/api_key/tools/repos/list.py +0 -111
  110. golf/examples/api_key/tools/search/code.py +0 -106
  111. golf/examples/api_key/tools/users/get.py +0 -82
  112. golf/examples/basic/.env +0 -5
  113. golf/examples/basic/pre_build.py +0 -28
  114. golf/examples/basic/tools/github_user.py +0 -65
  115. golf/examples/basic/tools/hello.py +0 -34
  116. golf/examples/basic/tools/payments/charge.py +0 -70
  117. golf/examples/basic/tools/payments/common.py +0 -36
  118. golf/examples/basic/tools/payments/refund.py +0 -61
  119. golf_mcp-0.1.20.dist-info/RECORD +0 -60
  120. {golf_mcp-0.1.20.dist-info → golf_mcp-0.2.1.dist-info}/WHEEL +0 -0
  121. {golf_mcp-0.1.20.dist-info → golf_mcp-0.2.1.dist-info}/entry_points.txt +0 -0
  122. {golf_mcp-0.1.20.dist-info → golf_mcp-0.2.1.dist-info}/licenses/LICENSE +0 -0
  123. {golf_mcp-0.1.20.dist-info → golf_mcp-0.2.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,476 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for /Users/antonigmitruk/golf/src/golf/cli/main.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_58284776.png">
7
+ <link rel="stylesheet" href="style_cb_8e611ae1.css" type="text/css">
8
+ <script src="coverage_html_cb_6fb7b396.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>/Users/antonigmitruk/golf/src/golf/cli/main.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_ce680311.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">124 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">124<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b8b9dd4ccccc5db_branding_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_6cadab9ec0df475d___init___py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.6.12">coverage.py v7.6.12</a>,
68
+ created at 2025-08-16 18:46 +0200
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""CLI entry points for GolfMCP."""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">atexit</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">pathlib</span> <span class="key">import</span> <span class="nam">Path</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">import</span> <span class="nam">typer</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">rich</span><span class="op">.</span><span class="nam">console</span> <span class="key">import</span> <span class="nam">Console</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">golf</span> <span class="key">import</span> <span class="nam">__version__</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">cli</span><span class="op">.</span><span class="nam">branding</span> <span class="key">import</span> <span class="nam">create_welcome_banner</span><span class="op">,</span> <span class="nam">create_command_header</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">core</span><span class="op">.</span><span class="nam">config</span> <span class="key">import</span> <span class="nam">find_project_root</span><span class="op">,</span> <span class="nam">load_settings</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">core</span><span class="op">.</span><span class="nam">telemetry</span> <span class="key">import</span> <span class="op">(</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="nam">is_telemetry_enabled</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="nam">set_telemetry_enabled</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="nam">shutdown</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">track_event</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">track_detailed_error</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="com"># Create console for rich output</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="nam">console</span> <span class="op">=</span> <span class="nam">Console</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="com"># Create the typer app instance</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="nam">app</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Typer</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="str">"golf"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">help</span><span class="op">=</span><span class="str">"GolfMCP: A Pythonic framework for building MCP servers with zero boilerplate"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">add_completion</span><span class="op">=</span><span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="com"># Register telemetry shutdown on exit</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="nam">atexit</span><span class="op">.</span><span class="nam">register</span><span class="op">(</span><span class="nam">shutdown</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"><span class="key">def</span> <span class="nam">_version_callback</span><span class="op">(</span><span class="nam">value</span><span class="op">:</span> <span class="nam">bool</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="str">"""Print version and exit if --version flag is used."""</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">if</span> <span class="nam">value</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">create_welcome_banner</span><span class="op">(</span><span class="nam">__version__</span><span class="op">,</span> <span class="nam">console</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="op">@</span><span class="nam">app</span><span class="op">.</span><span class="nam">callback</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="key">def</span> <span class="nam">callback</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">version</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="str">"--version"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="str">"-V"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">help</span><span class="op">=</span><span class="str">"Show the version and exit."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">callback</span><span class="op">=</span><span class="nam">_version_callback</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">is_eager</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">verbose</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">False</span><span class="op">,</span> <span class="str">"--verbose"</span><span class="op">,</span> <span class="str">"-v"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Increase verbosity of output."</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">no_telemetry</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="str">"--no-telemetry"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">help</span><span class="op">=</span><span class="str">"Disable telemetry collection (persists for future commands)."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">test</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="str">"--test"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">hidden</span><span class="op">=</span><span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">help</span><span class="op">=</span><span class="str">"Run in test mode (disables telemetry for this execution only)."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="str">"""GolfMCP: A Pythonic framework for building MCP servers with zero boilerplate."""</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="com"># Set verbosity in environment for other components to access</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">environ</span><span class="op">[</span><span class="str">"GOLF_VERBOSE"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"1"</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="com"># Set test mode if flag is used (temporary, just for this execution)</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">if</span> <span class="nam">test</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">set_telemetry_enabled</span><span class="op">(</span><span class="key">False</span><span class="op">,</span> <span class="nam">persist</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">environ</span><span class="op">[</span><span class="str">"GOLF_TEST_MODE"</span><span class="op">]</span> <span class="op">=</span> <span class="str">"1"</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="com"># Set telemetry preference if flag is used (permanent)</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="key">if</span> <span class="nam">no_telemetry</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">set_telemetry_enabled</span><span class="op">(</span><span class="key">False</span><span class="op">,</span> <span class="nam">persist</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"[dim]Telemetry has been disabled. You can re-enable it with: golf telemetry enable[/dim]"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
163
+ <p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="op">@</span><span class="nam">app</span><span class="op">.</span><span class="nam">command</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="key">def</span> <span class="nam">init</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">project_name</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Argument</span><span class="op">(</span><span class="op">...</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Name of the project to create"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="nam">output_dir</span><span class="op">:</span> <span class="nam">Path</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="str">"--output-dir"</span><span class="op">,</span> <span class="str">"-o"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Directory to create the project in"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="str">"""Initialize a new GolfMCP project.</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="str"> Creates a new directory with the project scaffold, including</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"><span class="str"> examples for tools, resources, and prompts.</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="com"># Show the Golf logo for project initialization</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">create_welcome_banner</span><span class="op">(</span><span class="nam">__version__</span><span class="op">,</span> <span class="nam">console</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">create_command_header</span><span class="op">(</span><span class="str">"Initialize Project"</span><span class="op">,</span> <span class="str">f"Creating {project_name}"</span><span class="op">,</span> <span class="nam">console</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
178
+ <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="com"># Import here to avoid circular imports</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">commands</span><span class="op">.</span><span class="nam">init</span> <span class="key">import</span> <span class="nam">initialize_project</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="com"># Use the current directory if no output directory is specified</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">if</span> <span class="nam">output_dir</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">output_dir</span> <span class="op">=</span> <span class="nam">Path</span><span class="op">.</span><span class="nam">cwd</span><span class="op">(</span><span class="op">)</span> <span class="op">/</span> <span class="nam">project_name</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
185
+ <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="com"># Execute the initialization command (it handles its own tracking)</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">initialize_project</span><span class="op">(</span><span class="nam">project_name</span><span class="op">=</span><span class="nam">project_name</span><span class="op">,</span> <span class="nam">output_dir</span><span class="op">=</span><span class="nam">output_dir</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
189
+ <p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"><span class="com"># Create a build group with subcommands</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"><span class="nam">build_app</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Typer</span><span class="op">(</span><span class="nam">help</span><span class="op">=</span><span class="str">"Build a standalone FastMCP application"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"><span class="nam">app</span><span class="op">.</span><span class="nam">add_typer</span><span class="op">(</span><span class="nam">build_app</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="str">"build"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
193
+ <p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
194
+ <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"><span class="op">@</span><span class="nam">build_app</span><span class="op">.</span><span class="nam">command</span><span class="op">(</span><span class="str">"dev"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"><span class="key">def</span> <span class="nam">build_dev</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">output_dir</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="str">"--output-dir"</span><span class="op">,</span> <span class="str">"-o"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Directory to output the built project"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="str">"""Build a development version with app environment variables copied.</span>&nbsp;</span><span class="r"></span></p>
199
+ <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
200
+ <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"><span class="str"> Golf credentials (GOLF_*) are always loaded from .env for build operations.</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"><span class="str"> All environment variables are copied to the built project for development.</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
203
+ <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="com"># Find project root directory</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="nam">project_root</span><span class="op">,</span> <span class="nam">config_path</span> <span class="op">=</span> <span class="nam">find_project_root</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
206
+ <p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">project_root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="str">"[bold red]Error: No GolfMCP project found in the current directory or any parent directory.[/bold red]"</span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"Run 'golf init &lt;project_name>' to create a new project."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="mis show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="str">"cli_build_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
214
+ <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="str">"environment"</span><span class="op">:</span> <span class="str">"dev"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">:</span> <span class="str">"NoProjectFound"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">:</span> <span class="str">"No GolfMCP project found"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="mis show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="nam">code</span><span class="op">=</span><span class="num">1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
222
+ <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="com"># Load settings from the found project</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">settings</span> <span class="op">=</span> <span class="nam">load_settings</span><span class="op">(</span><span class="nam">project_root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
225
+ <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="com"># Set default output directory if not specified</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">output_dir</span> <span class="op">=</span> <span class="nam">project_root</span> <span class="op">/</span> <span class="str">"dist"</span> <span class="key">if</span> <span class="nam">output_dir</span> <span class="key">is</span> <span class="key">None</span> <span class="key">else</span> <span class="nam">Path</span><span class="op">(</span><span class="nam">output_dir</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
228
+ <p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="com"># Build the project with environment variables copied</span>&nbsp;</span><span class="r"></span></p>
230
+ <p class="mis show_mis"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">commands</span><span class="op">.</span><span class="nam">build</span> <span class="key">import</span> <span class="nam">build_project</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
232
+ <p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">build_project</span><span class="op">(</span><span class="nam">project_root</span><span class="op">,</span> <span class="nam">settings</span><span class="op">,</span> <span class="nam">output_dir</span><span class="op">,</span> <span class="nam">build_env</span><span class="op">=</span><span class="str">"dev"</span><span class="op">,</span> <span class="nam">copy_env</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="com"># Track successful build with environment</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span><span class="str">"cli_build_success"</span><span class="op">,</span> <span class="op">{</span><span class="str">"success"</span><span class="op">:</span> <span class="key">True</span><span class="op">,</span> <span class="str">"environment"</span><span class="op">:</span> <span class="str">"dev"</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
235
+ <p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
236
+ <p class="mis show_mis"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="nam">track_detailed_error</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
237
+ <p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="str">"cli_build_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="nam">e</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
239
+ <p class="pln"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="nam">context</span><span class="op">=</span><span class="str">"Development build with environment variables"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="nam">operation</span><span class="op">=</span><span class="str">"build_dev"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="nam">additional_props</span><span class="op">=</span><span class="op">{</span><span class="str">"environment"</span><span class="op">:</span> <span class="str">"dev"</span><span class="op">,</span> <span class="str">"copy_env"</span><span class="op">:</span> <span class="key">True</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
243
+ <p class="mis show_mis"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="key">raise</span>&nbsp;</span><span class="r"></span></p>
244
+ <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
245
+ <p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
246
+ <p class="mis show_mis"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"><span class="op">@</span><span class="nam">build_app</span><span class="op">.</span><span class="nam">command</span><span class="op">(</span><span class="str">"prod"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
247
+ <p class="mis show_mis"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"><span class="key">def</span> <span class="nam">build_prod</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"> <span class="nam">output_dir</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="str">"--output-dir"</span><span class="op">,</span> <span class="str">"-o"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Directory to output the built project"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
249
+ <p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="str">"""Build a production version for deployment.</span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
252
+ <p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"><span class="str"> Golf credentials (GOLF_*) are always loaded from .env for build operations</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"><span class="str"> (platform registration, resource updates). App environment variables are</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"><span class="str"> NOT copied for security - provide them in your deployment environment.</span>&nbsp;</span><span class="r"></span></p>
255
+ <p class="pln"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
256
+ <p class="pln"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"><span class="str"> Your production deployment must include GOLF_* vars for runtime telemetry.</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="pln"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
258
+ <p class="pln"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="com"># Find project root directory</span>&nbsp;</span><span class="r"></span></p>
259
+ <p class="mis show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="nam">project_root</span><span class="op">,</span> <span class="nam">config_path</span> <span class="op">=</span> <span class="nam">find_project_root</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="pln"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
261
+ <p class="mis show_mis"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">project_root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
262
+ <p class="mis show_mis"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
263
+ <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="str">"[bold red]Error: No GolfMCP project found in the current directory or any parent directory.[/bold red]"</span>&nbsp;</span><span class="r"></span></p>
264
+ <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
265
+ <p class="mis show_mis"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"Run 'golf init &lt;project_name>' to create a new project."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="mis show_mis"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
267
+ <p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"> <span class="str">"cli_build_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
268
+ <p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
269
+ <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
270
+ <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="str">"environment"</span><span class="op">:</span> <span class="str">"prod"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
271
+ <p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">:</span> <span class="str">"NoProjectFound"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">:</span> <span class="str">"No GolfMCP project found"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
273
+ <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
274
+ <p class="pln"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
275
+ <p class="mis show_mis"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="nam">code</span><span class="op">=</span><span class="num">1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
276
+ <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
277
+ <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"> <span class="com"># Load settings from the found project</span>&nbsp;</span><span class="r"></span></p>
278
+ <p class="mis show_mis"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"> <span class="nam">settings</span> <span class="op">=</span> <span class="nam">load_settings</span><span class="op">(</span><span class="nam">project_root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="pln"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
280
+ <p class="pln"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"> <span class="com"># Set default output directory if not specified</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="mis show_mis"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"> <span class="nam">output_dir</span> <span class="op">=</span> <span class="nam">project_root</span> <span class="op">/</span> <span class="str">"dist"</span> <span class="key">if</span> <span class="nam">output_dir</span> <span class="key">is</span> <span class="key">None</span> <span class="key">else</span> <span class="nam">Path</span><span class="op">(</span><span class="nam">output_dir</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
282
+ <p class="pln"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
283
+ <p class="mis show_mis"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
284
+ <p class="pln"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"> <span class="com"># Build the project without copying environment variables</span>&nbsp;</span><span class="r"></span></p>
285
+ <p class="mis show_mis"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">commands</span><span class="op">.</span><span class="nam">build</span> <span class="key">import</span> <span class="nam">build_project</span>&nbsp;</span><span class="r"></span></p>
286
+ <p class="pln"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
287
+ <p class="mis show_mis"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="nam">build_project</span><span class="op">(</span><span class="nam">project_root</span><span class="op">,</span> <span class="nam">settings</span><span class="op">,</span> <span class="nam">output_dir</span><span class="op">,</span> <span class="nam">build_env</span><span class="op">=</span><span class="str">"prod"</span><span class="op">,</span> <span class="nam">copy_env</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
288
+ <p class="pln"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"> <span class="com"># Track successful build with environment</span>&nbsp;</span><span class="r"></span></p>
289
+ <p class="mis show_mis"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span><span class="str">"cli_build_success"</span><span class="op">,</span> <span class="op">{</span><span class="str">"success"</span><span class="op">:</span> <span class="key">True</span><span class="op">,</span> <span class="str">"environment"</span><span class="op">:</span> <span class="str">"prod"</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="mis show_mis"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
291
+ <p class="mis show_mis"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="nam">track_detailed_error</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
292
+ <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="str">"cli_build_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
293
+ <p class="pln"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="nam">e</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="nam">context</span><span class="op">=</span><span class="str">"Production build without environment variables"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
295
+ <p class="pln"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="nam">operation</span><span class="op">=</span><span class="str">"build_prod"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"> <span class="nam">additional_props</span><span class="op">=</span><span class="op">{</span><span class="str">"environment"</span><span class="op">:</span> <span class="str">"prod"</span><span class="op">,</span> <span class="str">"copy_env"</span><span class="op">:</span> <span class="key">False</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
297
+ <p class="pln"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="mis show_mis"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="key">raise</span>&nbsp;</span><span class="r"></span></p>
299
+ <p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
300
+ <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
301
+ <p class="mis show_mis"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"><span class="op">@</span><span class="nam">app</span><span class="op">.</span><span class="nam">command</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
302
+ <p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="key">def</span> <span class="nam">run</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="nam">dist_dir</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="str">"--dist-dir"</span><span class="op">,</span> <span class="str">"-d"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Directory containing the built server"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
304
+ <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"> <span class="nam">host</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="str">"--host"</span><span class="op">,</span> <span class="str">"-h"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Host to bind to (overrides settings)"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
305
+ <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="nam">port</span><span class="op">:</span> <span class="nam">int</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">None</span><span class="op">,</span> <span class="str">"--port"</span><span class="op">,</span> <span class="str">"-p"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Port to bind to (overrides settings)"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
306
+ <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="nam">build_first</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Option</span><span class="op">(</span><span class="key">True</span><span class="op">,</span> <span class="str">"--build/--no-build"</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Build the project before running"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
307
+ <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
308
+ <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="str">"""Run the built FastMCP server.</span>&nbsp;</span><span class="r"></span></p>
309
+ <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
310
+ <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"><span class="str"> This command runs the built server from the dist directory.</span>&nbsp;</span><span class="r"></span></p>
311
+ <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="str"> By default, it will build the project first if needed.</span>&nbsp;</span><span class="r"></span></p>
312
+ <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
313
+ <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"> <span class="com"># Find project root directory</span>&nbsp;</span><span class="r"></span></p>
314
+ <p class="mis show_mis"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"> <span class="nam">project_root</span><span class="op">,</span> <span class="nam">config_path</span> <span class="op">=</span> <span class="nam">find_project_root</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
315
+ <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
316
+ <p class="mis show_mis"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">project_root</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
317
+ <p class="mis show_mis"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
318
+ <p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"> <span class="str">"[bold red]Error: No GolfMCP project found in the current directory or any parent directory.[/bold red]"</span>&nbsp;</span><span class="r"></span></p>
319
+ <p class="pln"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
320
+ <p class="mis show_mis"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"Run 'golf init &lt;project_name>' to create a new project."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
321
+ <p class="mis show_mis"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
322
+ <p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"> <span class="str">"cli_run_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
323
+ <p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
324
+ <p class="pln"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
325
+ <p class="pln"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">:</span> <span class="str">"NoProjectFound"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
326
+ <p class="pln"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">:</span> <span class="str">"No GolfMCP project found"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
327
+ <p class="pln"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
328
+ <p class="pln"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
329
+ <p class="mis show_mis"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="nam">code</span><span class="op">=</span><span class="num">1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
330
+ <p class="pln"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
331
+ <p class="pln"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="com"># Load settings from the found project</span>&nbsp;</span><span class="r"></span></p>
332
+ <p class="mis show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="nam">settings</span> <span class="op">=</span> <span class="nam">load_settings</span><span class="op">(</span><span class="nam">project_root</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
333
+ <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
334
+ <p class="pln"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="com"># Set default dist directory if not specified</span>&nbsp;</span><span class="r"></span></p>
335
+ <p class="mis show_mis"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"> <span class="nam">dist_dir</span> <span class="op">=</span> <span class="nam">project_root</span> <span class="op">/</span> <span class="str">"dist"</span> <span class="key">if</span> <span class="nam">dist_dir</span> <span class="key">is</span> <span class="key">None</span> <span class="key">else</span> <span class="nam">Path</span><span class="op">(</span><span class="nam">dist_dir</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
336
+ <p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
337
+ <p class="pln"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"> <span class="com"># Check if dist directory exists</span>&nbsp;</span><span class="r"></span></p>
338
+ <p class="mis show_mis"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">dist_dir</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
339
+ <p class="mis show_mis"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"> <span class="key">if</span> <span class="nam">build_first</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
340
+ <p class="mis show_mis"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">f"[yellow]Dist directory {dist_dir} not found. Building first...[/yellow]"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
341
+ <p class="mis show_mis"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
342
+ <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"> <span class="com"># Build the project</span>&nbsp;</span><span class="r"></span></p>
343
+ <p class="mis show_mis"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> <span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">commands</span><span class="op">.</span><span class="nam">build</span> <span class="key">import</span> <span class="nam">build_project</span>&nbsp;</span><span class="r"></span></p>
344
+ <p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
345
+ <p class="mis show_mis"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"> <span class="nam">build_project</span><span class="op">(</span><span class="nam">project_root</span><span class="op">,</span> <span class="nam">settings</span><span class="op">,</span> <span class="nam">dist_dir</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
346
+ <p class="mis show_mis"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
347
+ <p class="mis show_mis"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">f"[bold red]Error building project:[/bold red] {str(e)}"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
348
+ <p class="mis show_mis"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"> <span class="nam">track_detailed_error</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
349
+ <p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"> <span class="str">"cli_run_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
350
+ <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t"> <span class="nam">e</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
351
+ <p class="pln"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t"> <span class="nam">context</span><span class="op">=</span><span class="str">"Auto-build before running server"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
352
+ <p class="pln"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t"> <span class="nam">operation</span><span class="op">=</span><span class="str">"auto_build_before_run"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
353
+ <p class="pln"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t"> <span class="nam">additional_props</span><span class="op">=</span><span class="op">{</span><span class="str">"auto_build"</span><span class="op">:</span> <span class="key">True</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
354
+ <p class="pln"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
355
+ <p class="mis show_mis"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t"> <span class="key">raise</span>&nbsp;</span><span class="r"></span></p>
356
+ <p class="pln"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
357
+ <p class="mis show_mis"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">f"[bold red]Error: Dist directory {dist_dir} not found.[/bold red]"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
358
+ <p class="mis show_mis"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"Run 'golf build' first or use --build to build automatically."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
359
+ <p class="mis show_mis"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
360
+ <p class="pln"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t"> <span class="str">"cli_run_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
361
+ <p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
362
+ <p class="pln"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
363
+ <p class="pln"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">:</span> <span class="str">"DistNotFound"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
364
+ <p class="pln"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">:</span> <span class="str">"Dist directory not found"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
365
+ <p class="pln"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
366
+ <p class="pln"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
367
+ <p class="mis show_mis"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="nam">code</span><span class="op">=</span><span class="num">1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
368
+ <p class="pln"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
369
+ <p class="mis show_mis"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
370
+ <p class="pln"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t"> <span class="com"># Import and run the server</span>&nbsp;</span><span class="r"></span></p>
371
+ <p class="mis show_mis"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t"> <span class="key">from</span> <span class="nam">golf</span><span class="op">.</span><span class="nam">commands</span><span class="op">.</span><span class="nam">run</span> <span class="key">import</span> <span class="nam">run_server</span>&nbsp;</span><span class="r"></span></p>
372
+ <p class="pln"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
373
+ <p class="mis show_mis"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t"> <span class="nam">return_code</span> <span class="op">=</span> <span class="nam">run_server</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
374
+ <p class="pln"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"> <span class="nam">project_path</span><span class="op">=</span><span class="nam">project_root</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
375
+ <p class="pln"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t"> <span class="nam">settings</span><span class="op">=</span><span class="nam">settings</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
376
+ <p class="pln"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t"> <span class="nam">dist_dir</span><span class="op">=</span><span class="nam">dist_dir</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
377
+ <p class="pln"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t"> <span class="nam">host</span><span class="op">=</span><span class="nam">host</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
378
+ <p class="pln"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t"> <span class="nam">port</span><span class="op">=</span><span class="nam">port</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
379
+ <p class="pln"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
380
+ <p class="pln"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
381
+ <p class="pln"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t"> <span class="com"># Track based on return code with better categorization</span>&nbsp;</span><span class="r"></span></p>
382
+ <p class="mis show_mis"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t"> <span class="key">if</span> <span class="nam">return_code</span> <span class="op">==</span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
383
+ <p class="mis show_mis"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span><span class="str">"cli_run_success"</span><span class="op">,</span> <span class="op">{</span><span class="str">"success"</span><span class="op">:</span> <span class="key">True</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
384
+ <p class="mis show_mis"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t"> <span class="key">elif</span> <span class="nam">return_code</span> <span class="key">in</span> <span class="op">[</span><span class="num">130</span><span class="op">,</span> <span class="num">143</span><span class="op">,</span> <span class="num">137</span><span class="op">,</span> <span class="num">2</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
385
+ <p class="pln"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t"> <span class="com"># Intentional shutdowns (not errors):</span>&nbsp;</span><span class="r"></span></p>
386
+ <p class="pln"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t"> <span class="com"># 130: Ctrl+C (SIGINT)</span>&nbsp;</span><span class="r"></span></p>
387
+ <p class="pln"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t"> <span class="com"># 143: SIGTERM (graceful shutdown, e.g., Kubernetes, Docker)</span>&nbsp;</span><span class="r"></span></p>
388
+ <p class="pln"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"> <span class="com"># 137: SIGKILL (forced shutdown)</span>&nbsp;</span><span class="r"></span></p>
389
+ <p class="pln"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t"> <span class="com"># 2: General interrupt/graceful shutdown</span>&nbsp;</span><span class="r"></span></p>
390
+ <p class="mis show_mis"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"> <span class="nam">shutdown_type</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
391
+ <p class="pln"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"> <span class="num">130</span><span class="op">:</span> <span class="str">"UserInterrupt"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
392
+ <p class="pln"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t"> <span class="num">143</span><span class="op">:</span> <span class="str">"GracefulShutdown"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
393
+ <p class="pln"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t"> <span class="num">137</span><span class="op">:</span> <span class="str">"ForcedShutdown"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
394
+ <p class="pln"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t"> <span class="num">2</span><span class="op">:</span> <span class="str">"Interrupt"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
395
+ <p class="pln"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t"> <span class="op">}</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">return_code</span><span class="op">,</span> <span class="str">"GracefulShutdown"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
396
+ <p class="pln"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
397
+ <p class="mis show_mis"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
398
+ <p class="pln"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t"> <span class="str">"cli_run_shutdown"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
399
+ <p class="pln"><span class="n"><a id="t317" href="#t317">317</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
400
+ <p class="pln"><span class="n"><a id="t318" href="#t318">318</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">True</span><span class="op">,</span> <span class="com"># Not an error</span>&nbsp;</span><span class="r"></span></p>
401
+ <p class="pln"><span class="n"><a id="t319" href="#t319">319</a></span><span class="t"> <span class="str">"shutdown_type"</span><span class="op">:</span> <span class="nam">shutdown_type</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
402
+ <p class="pln"><span class="n"><a id="t320" href="#t320">320</a></span><span class="t"> <span class="str">"exit_code"</span><span class="op">:</span> <span class="nam">return_code</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
403
+ <p class="pln"><span class="n"><a id="t321" href="#t321">321</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
404
+ <p class="pln"><span class="n"><a id="t322" href="#t322">322</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
405
+ <p class="pln"><span class="n"><a id="t323" href="#t323">323</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
406
+ <p class="pln"><span class="n"><a id="t324" href="#t324">324</a></span><span class="t"> <span class="com"># Actual errors (unexpected exit codes)</span>&nbsp;</span><span class="r"></span></p>
407
+ <p class="mis show_mis"><span class="n"><a id="t325" href="#t325">325</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
408
+ <p class="pln"><span class="n"><a id="t326" href="#t326">326</a></span><span class="t"> <span class="str">"cli_run_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
409
+ <p class="pln"><span class="n"><a id="t327" href="#t327">327</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
410
+ <p class="pln"><span class="n"><a id="t328" href="#t328">328</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
411
+ <p class="pln"><span class="n"><a id="t329" href="#t329">329</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">:</span> <span class="str">"UnexpectedExit"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
412
+ <p class="pln"><span class="n"><a id="t330" href="#t330">330</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">:</span> <span class="op">(</span><span class="str">f"Server process exited unexpectedly with code {return_code}"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
413
+ <p class="pln"><span class="n"><a id="t331" href="#t331">331</a></span><span class="t"> <span class="str">"exit_code"</span><span class="op">:</span> <span class="nam">return_code</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
414
+ <p class="pln"><span class="n"><a id="t332" href="#t332">332</a></span><span class="t"> <span class="str">"operation"</span><span class="op">:</span> <span class="str">"server_process_execution"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
415
+ <p class="pln"><span class="n"><a id="t333" href="#t333">333</a></span><span class="t"> <span class="str">"context"</span><span class="op">:</span> <span class="str">"Server process terminated with unexpected exit code"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
416
+ <p class="pln"><span class="n"><a id="t334" href="#t334">334</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
417
+ <p class="pln"><span class="n"><a id="t335" href="#t335">335</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
418
+ <p class="pln"><span class="n"><a id="t336" href="#t336">336</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
419
+ <p class="pln"><span class="n"><a id="t337" href="#t337">337</a></span><span class="t"> <span class="com"># Exit with the same code as the server</span>&nbsp;</span><span class="r"></span></p>
420
+ <p class="mis show_mis"><span class="n"><a id="t338" href="#t338">338</a></span><span class="t"> <span class="key">if</span> <span class="nam">return_code</span> <span class="op">!=</span> <span class="num">0</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
421
+ <p class="mis show_mis"><span class="n"><a id="t339" href="#t339">339</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="nam">code</span><span class="op">=</span><span class="nam">return_code</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
422
+ <p class="mis show_mis"><span class="n"><a id="t340" href="#t340">340</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
423
+ <p class="mis show_mis"><span class="n"><a id="t341" href="#t341">341</a></span><span class="t"> <span class="nam">track_detailed_error</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
424
+ <p class="pln"><span class="n"><a id="t342" href="#t342">342</a></span><span class="t"> <span class="str">"cli_run_failed"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
425
+ <p class="pln"><span class="n"><a id="t343" href="#t343">343</a></span><span class="t"> <span class="nam">e</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
426
+ <p class="pln"><span class="n"><a id="t344" href="#t344">344</a></span><span class="t"> <span class="nam">context</span><span class="op">=</span><span class="str">"Server execution or startup failure"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
427
+ <p class="pln"><span class="n"><a id="t345" href="#t345">345</a></span><span class="t"> <span class="nam">operation</span><span class="op">=</span><span class="str">"run_server_execution"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
428
+ <p class="pln"><span class="n"><a id="t346" href="#t346">346</a></span><span class="t"> <span class="nam">additional_props</span><span class="op">=</span><span class="op">{</span><span class="str">"has_dist_dir"</span><span class="op">:</span> <span class="nam">dist_dir</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span> <span class="key">if</span> <span class="nam">dist_dir</span> <span class="key">else</span> <span class="key">False</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
429
+ <p class="pln"><span class="n"><a id="t347" href="#t347">347</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
430
+ <p class="mis show_mis"><span class="n"><a id="t348" href="#t348">348</a></span><span class="t"> <span class="key">raise</span>&nbsp;</span><span class="r"></span></p>
431
+ <p class="pln"><span class="n"><a id="t349" href="#t349">349</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
432
+ <p class="pln"><span class="n"><a id="t350" href="#t350">350</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
433
+ <p class="pln"><span class="n"><a id="t351" href="#t351">351</a></span><span class="t"><span class="com"># Add telemetry command group</span>&nbsp;</span><span class="r"></span></p>
434
+ <p class="mis show_mis"><span class="n"><a id="t352" href="#t352">352</a></span><span class="t"><span class="op">@</span><span class="nam">app</span><span class="op">.</span><span class="nam">command</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
435
+ <p class="mis show_mis"><span class="n"><a id="t353" href="#t353">353</a></span><span class="t"><span class="key">def</span> <span class="nam">telemetry</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
436
+ <p class="pln"><span class="n"><a id="t354" href="#t354">354</a></span><span class="t"> <span class="nam">action</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Argument</span><span class="op">(</span><span class="op">...</span><span class="op">,</span> <span class="nam">help</span><span class="op">=</span><span class="str">"Action to perform: 'enable' or 'disable'"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
437
+ <p class="pln"><span class="n"><a id="t355" href="#t355">355</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
438
+ <p class="pln"><span class="n"><a id="t356" href="#t356">356</a></span><span class="t"> <span class="str">"""Manage telemetry settings."""</span>&nbsp;</span><span class="r"></span></p>
439
+ <p class="mis show_mis"><span class="n"><a id="t357" href="#t357">357</a></span><span class="t"> <span class="key">if</span> <span class="nam">action</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="str">"enable"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
440
+ <p class="mis show_mis"><span class="n"><a id="t358" href="#t358">358</a></span><span class="t"> <span class="nam">set_telemetry_enabled</span><span class="op">(</span><span class="key">True</span><span class="op">,</span> <span class="nam">persist</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
441
+ <p class="mis show_mis"><span class="n"><a id="t359" href="#t359">359</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"[green]&#10003;[/green] Telemetry enabled. Thank you for helping improve Golf!"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
442
+ <p class="mis show_mis"><span class="n"><a id="t360" href="#t360">360</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="op">==</span> <span class="str">"disable"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
443
+ <p class="mis show_mis"><span class="n"><a id="t361" href="#t361">361</a></span><span class="t"> <span class="nam">set_telemetry_enabled</span><span class="op">(</span><span class="key">False</span><span class="op">,</span> <span class="nam">persist</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
444
+ <p class="mis show_mis"><span class="n"><a id="t362" href="#t362">362</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">"[yellow]Telemetry disabled.[/yellow] You can re-enable it anytime with: golf telemetry enable"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
445
+ <p class="pln"><span class="n"><a id="t363" href="#t363">363</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
446
+ <p class="mis show_mis"><span class="n"><a id="t364" href="#t364">364</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span><span class="str">f"[red]Unknown action '{action}'. Use 'enable' or 'disable'.[/red]"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
447
+ <p class="mis show_mis"><span class="n"><a id="t365" href="#t365">365</a></span><span class="t"> <span class="key">raise</span> <span class="nam">typer</span><span class="op">.</span><span class="nam">Exit</span><span class="op">(</span><span class="nam">code</span><span class="op">=</span><span class="num">1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
448
+ <p class="pln"><span class="n"><a id="t366" href="#t366">366</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
449
+ <p class="pln"><span class="n"><a id="t367" href="#t367">367</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
450
+ <p class="mis show_mis"><span class="n"><a id="t368" href="#t368">368</a></span><span class="t"><span class="key">if</span> <span class="nam">__name__</span> <span class="op">==</span> <span class="str">"__main__"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
451
+ <p class="pln"><span class="n"><a id="t369" href="#t369">369</a></span><span class="t"> <span class="com"># Show welcome banner when run directly</span>&nbsp;</span><span class="r"></span></p>
452
+ <p class="mis show_mis"><span class="n"><a id="t370" href="#t370">370</a></span><span class="t"> <span class="nam">create_welcome_banner</span><span class="op">(</span><span class="nam">__version__</span><span class="op">,</span> <span class="nam">console</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
453
+ <p class="pln"><span class="n"><a id="t371" href="#t371">371</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
454
+ <p class="pln"><span class="n"><a id="t372" href="#t372">372</a></span><span class="t"> <span class="com"># Add telemetry notice if enabled</span>&nbsp;</span><span class="r"></span></p>
455
+ <p class="mis show_mis"><span class="n"><a id="t373" href="#t373">373</a></span><span class="t"> <span class="key">if</span> <span class="nam">is_telemetry_enabled</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
456
+ <p class="mis show_mis"><span class="n"><a id="t374" href="#t374">374</a></span><span class="t"> <span class="nam">console</span><span class="op">.</span><span class="nam">print</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
457
+ <p class="pln"><span class="n"><a id="t375" href="#t375">375</a></span><span class="t"> <span class="str">"[dim]&#128202; Anonymous usage data is collected to improve Golf. Disable with: golf telemetry disable[/dim]\n"</span>&nbsp;</span><span class="r"></span></p>
458
+ <p class="pln"><span class="n"><a id="t376" href="#t376">376</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
459
+ <p class="pln"><span class="n"><a id="t377" href="#t377">377</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
460
+ <p class="pln"><span class="n"><a id="t378" href="#t378">378</a></span><span class="t"> <span class="com"># Run the CLI app</span>&nbsp;</span><span class="r"></span></p>
461
+ <p class="mis show_mis"><span class="n"><a id="t379" href="#t379">379</a></span><span class="t"> <span class="nam">app</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
462
+ </main>
463
+ <footer>
464
+ <div class="content">
465
+ <p>
466
+ <a class="nav" href="z_4b8b9dd4ccccc5db_branding_py.html">&#xab; prev</a> &nbsp; &nbsp;
467
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
468
+ <a class="nav" href="z_6cadab9ec0df475d___init___py.html">&#xbb; next</a>
469
+ &nbsp; &nbsp; &nbsp;
470
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.6.12">coverage.py v7.6.12</a>,
471
+ created at 2025-08-16 18:46 +0200
472
+ </p>
473
+ </div>
474
+ </footer>
475
+ </body>
476
+ </html>