pi-gitnexus-fork 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/.github/workflows/ci.yml +20 -0
  2. package/.gitnexusignore +11 -0
  3. package/.sg-rules/async-function-must-await-or-return.yml +55 -0
  4. package/.sg-rules/catch-must-log-error.yml +78 -0
  5. package/.sg-rules/class-must-implement-or-extend.yml +61 -0
  6. package/.sg-rules/class-property-must-be-readonly.yml +61 -0
  7. package/.sg-rules/error-must-extend-base.yml +56 -0
  8. package/.sg-rules/generic-must-be-constrained.yml +60 -0
  9. package/.sg-rules/import-reexport-risk.yml +9 -0
  10. package/.sg-rules/missing-session-id-in-api.yml +16 -0
  11. package/.sg-rules/no-any-in-generic-args.yml +57 -0
  12. package/.sg-rules/no-await-in-promise-all.yml +28 -0
  13. package/.sg-rules/no-barrel-export.yml +17 -0
  14. package/.sg-rules/no-bq-write-in-module.yml +65 -0
  15. package/.sg-rules/no-console-except-error.yml +27 -0
  16. package/.sg-rules/no-console-in-server.yml +42 -0
  17. package/.sg-rules/no-empty-catch.yml +20 -0
  18. package/.sg-rules/no-empty-function.yml +24 -0
  19. package/.sg-rules/no-eval.yml +28 -0
  20. package/.sg-rules/no-explicit-any.yml +34 -0
  21. package/.sg-rules/no-hardcoded-placeholder-string.yml +23 -0
  22. package/.sg-rules/no-hardcoded-secrets.yml +32 -0
  23. package/.sg-rules/no-innerHTML.yml +22 -0
  24. package/.sg-rules/no-json-parse-without-trycatch.yml +33 -0
  25. package/.sg-rules/no-magic-numbers.yml +25 -0
  26. package/.sg-rules/no-nested-ternary.yml +21 -0
  27. package/.sg-rules/no-non-null-assertion.yml +25 -0
  28. package/.sg-rules/no-stub-implementation.yml +44 -0
  29. package/.sg-rules/no-throw-literal.yml +50 -0
  30. package/.sg-rules/no-todo-comment.yml +24 -0
  31. package/.sg-rules/no-ts-ignore-comment.yml +48 -0
  32. package/.sg-rules/no-type-assertion-in-jsx.yml +23 -0
  33. package/.sg-rules/no-unguarded-trim.yml +24 -0
  34. package/.sg-rules/no-unknown-without-narrowing.yml +76 -0
  35. package/.sg-rules/no-unsafe-bracket-access.yml +58 -0
  36. package/.sg-rules/no-unsafe-type-assertion.yml +45 -0
  37. package/.sg-rules/switch-must-be-exhaustive.yml +62 -0
  38. package/.sg-rules/zod-async-refine-without-abort.yml +62 -0
  39. package/.sg-rules/zod-enum-unsafe-access.yml +59 -0
  40. package/.sg-rules/zod-nested-object-deep-path.yml +70 -0
  41. package/.sg-rules/zod-optional-without-default-in-route.yml +50 -0
  42. package/.sg-rules/zod-parse-not-safe.yml +42 -0
  43. package/.sg-rules/zod-preprocess-without-fallback.yml +58 -0
  44. package/.sg-rules/zod-refine-no-return-undefined.yml +54 -0
  45. package/.sg-rules/zod-transform-without-output-type.yml +52 -0
  46. package/.sg-sha +1 -0
  47. package/.sgignore +4 -0
  48. package/AGENTS.md +1 -0
  49. package/CHANGELOG.md +99 -0
  50. package/LICENSE +21 -0
  51. package/README.md +113 -0
  52. package/biome.json +25 -0
  53. package/coverage/base.css +224 -0
  54. package/coverage/block-navigation.js +87 -0
  55. package/coverage/clover.xml +890 -0
  56. package/coverage/coverage-final.json +12 -0
  57. package/coverage/favicon.png +0 -0
  58. package/coverage/index.html +131 -0
  59. package/coverage/prettify.css +1 -0
  60. package/coverage/prettify.js +2 -0
  61. package/coverage/sort-arrow-sprite.png +0 -0
  62. package/coverage/sorter.js +210 -0
  63. package/coverage/src/augment-remote.ts.html +274 -0
  64. package/coverage/src/gitnexus.ts.html +1363 -0
  65. package/coverage/src/index.html +236 -0
  66. package/coverage/src/index.ts.html +1561 -0
  67. package/coverage/src/mcp-client-factory.ts.html +367 -0
  68. package/coverage/src/mcp-client-stdio.ts.html +736 -0
  69. package/coverage/src/mcp-client.ts.html +568 -0
  70. package/coverage/src/remote-mcp-client.ts.html +709 -0
  71. package/coverage/src/repo-resolver.ts.html +526 -0
  72. package/coverage/src/tools.ts.html +970 -0
  73. package/coverage/src/ui/index.html +131 -0
  74. package/coverage/src/ui/main-menu.ts.html +502 -0
  75. package/coverage/src/ui/settings-menu.ts.html +460 -0
  76. package/dist/augment-remote.d.ts +11 -0
  77. package/dist/augment-remote.js +55 -0
  78. package/dist/gitnexus.d.ts +103 -0
  79. package/dist/gitnexus.js +410 -0
  80. package/dist/index.d.ts +2 -0
  81. package/dist/index.js +479 -0
  82. package/dist/mcp-client-factory.d.ts +19 -0
  83. package/dist/mcp-client-factory.js +78 -0
  84. package/dist/mcp-client-stdio.d.ts +35 -0
  85. package/dist/mcp-client-stdio.js +186 -0
  86. package/dist/mcp-client.d.ts +45 -0
  87. package/dist/mcp-client.js +145 -0
  88. package/dist/remote-mcp-client.d.ts +43 -0
  89. package/dist/remote-mcp-client.js +181 -0
  90. package/dist/repo-resolver.d.ts +47 -0
  91. package/dist/repo-resolver.js +123 -0
  92. package/dist/tools.d.ts +6 -0
  93. package/dist/tools.js +230 -0
  94. package/dist/ui/main-menu.d.ts +33 -0
  95. package/dist/ui/main-menu.js +102 -0
  96. package/dist/ui/settings-menu.d.ts +16 -0
  97. package/dist/ui/settings-menu.js +95 -0
  98. package/docs/design/remote-mcp-backend.md +153 -0
  99. package/media/screenshot.png +0 -0
  100. package/package.json +61 -0
  101. package/sgconfig.yml +4 -0
  102. package/skills/gitnexus-debugging/SKILL.md +84 -0
  103. package/skills/gitnexus-exploring/SKILL.md +73 -0
  104. package/skills/gitnexus-impact-analysis/SKILL.md +93 -0
  105. package/skills/gitnexus-pr-review/SKILL.md +109 -0
  106. package/skills/gitnexus-refactoring/SKILL.md +85 -0
  107. package/src/augment-remote.ts +63 -0
  108. package/src/gitnexus.ts +426 -0
  109. package/src/index.ts +492 -0
  110. package/src/mcp-client-factory.ts +94 -0
  111. package/src/mcp-client-stdio.ts +217 -0
  112. package/src/mcp-client.ts +208 -0
  113. package/src/remote-mcp-client.ts +250 -0
  114. package/src/repo-resolver.ts +147 -0
  115. package/src/tools.ts +295 -0
  116. package/src/ui/main-menu.ts +139 -0
  117. package/src/ui/settings-menu.ts +125 -0
@@ -0,0 +1,460 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/ui/settings-menu.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/ui</a> settings-menu.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/29</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/20</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/7</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/29</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
192
+ <span class="cline-any cline-neutral">&nbsp;</span>
193
+ <span class="cline-any cline-neutral">&nbsp;</span>
194
+ <span class="cline-any cline-neutral">&nbsp;</span>
195
+ <span class="cline-any cline-neutral">&nbsp;</span>
196
+ <span class="cline-any cline-neutral">&nbsp;</span>
197
+ <span class="cline-any cline-neutral">&nbsp;</span>
198
+ <span class="cline-any cline-neutral">&nbsp;</span>
199
+ <span class="cline-any cline-neutral">&nbsp;</span>
200
+ <span class="cline-any cline-neutral">&nbsp;</span>
201
+ <span class="cline-any cline-neutral">&nbsp;</span>
202
+ <span class="cline-any cline-neutral">&nbsp;</span>
203
+ <span class="cline-any cline-neutral">&nbsp;</span>
204
+ <span class="cline-any cline-neutral">&nbsp;</span>
205
+ <span class="cline-any cline-neutral">&nbsp;</span>
206
+ <span class="cline-any cline-neutral">&nbsp;</span>
207
+ <span class="cline-any cline-neutral">&nbsp;</span>
208
+ <span class="cline-any cline-neutral">&nbsp;</span>
209
+ <span class="cline-any cline-neutral">&nbsp;</span>
210
+ <span class="cline-any cline-neutral">&nbsp;</span>
211
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
+ <span class="cline-any cline-neutral">&nbsp;</span>
213
+ <span class="cline-any cline-neutral">&nbsp;</span>
214
+ <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-neutral">&nbsp;</span>
218
+ <span class="cline-any cline-neutral">&nbsp;</span>
219
+ <span class="cline-any cline-no">&nbsp;</span>
220
+ <span class="cline-any cline-no">&nbsp;</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-neutral">&nbsp;</span>
224
+ <span class="cline-any cline-neutral">&nbsp;</span>
225
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-neutral">&nbsp;</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-neutral">&nbsp;</span>
243
+ <span class="cline-any cline-neutral">&nbsp;</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-no">&nbsp;</span>
278
+ <span class="cline-any cline-no">&nbsp;</span>
279
+ <span class="cline-any cline-no">&nbsp;</span>
280
+ <span class="cline-any cline-no">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-no">&nbsp;</span>
283
+ <span class="cline-any cline-no">&nbsp;</span>
284
+ <span class="cline-any cline-no">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-no">&nbsp;</span>
287
+ <span class="cline-any cline-no">&nbsp;</span>
288
+ <span class="cline-any cline-no">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-no">&nbsp;</span>
291
+ <span class="cline-any cline-no">&nbsp;</span>
292
+ <span class="cline-any cline-no">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-no">&nbsp;</span>
295
+ <span class="cline-any cline-no">&nbsp;</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-no">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-no">&nbsp;</span>
303
+ <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-no">&nbsp;</span>
305
+ <span class="cline-any cline-no">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-no">&nbsp;</span>
308
+ <span class="cline-any cline-no">&nbsp;</span>
309
+ <span class="cline-any cline-no">&nbsp;</span>
310
+ <span class="cline-any cline-no">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
317
+ * settings-menu.ts — Interactive settings panel for /gitnexus settings.
318
+ *
319
+ * Uses ui.custom() + SettingsList for native TUI rendering with keyboard
320
+ * navigation, live toggle, and per-row descriptions.
321
+ */
322
+ &nbsp;
323
+ import { getSettingsListTheme } from "@mariozechner/pi-coding-agent";
324
+ import { Container, type SettingItem, SettingsList, Spacer, Text } from "@mariozechner/pi-tui";
325
+ import { type GitNexusConfig, saveConfig } from "../gitnexus.js";
326
+ &nbsp;
327
+ // ── Types ───────────────────────────────────────────────────────────────────
328
+ &nbsp;
329
+ export type SettingsUI = {
330
+ custom&lt;T&gt;(
331
+ factory: (tui: any, theme: any, keybindings: any, done: (result: T) =&gt; void) =&gt; any,
332
+ options?: { overlay?: boolean; overlayOptions?: any },
333
+ ): Promise&lt;T&gt;;
334
+ };
335
+ &nbsp;
336
+ // ── Settings panel ──────────────────────────────────────────────────────────
337
+ &nbsp;
338
+ export async function <span class="fstat-no" title="function not covered" >openSettingsMenu(</span>
339
+ ui: SettingsUI,
340
+ cfg: GitNexusConfig,
341
+ state: { augmentEnabled: boolean },
342
+ onBack: () =&gt; Promise&lt;void&gt;,
343
+ ): Promise&lt;void&gt; {
344
+ <span class="cstat-no" title="statement not covered" > await ui.<span class="fstat-no" title="function not covered" >custom((_</span>tui, theme, _kb, done) =&gt; {</span>
345
+ const items: SettingItem[] = <span class="cstat-no" title="statement not covered" >[</span>
346
+ {
347
+ id: "autoAugment",
348
+ label: "Auto-augment",
349
+ description:
350
+ "When ON: search results (grep, find, read, bash) are automatically " +
351
+ "enriched with knowledge graph context. When OFF: graph context is " +
352
+ "only available via explicit /gitnexus commands and tools.",
353
+ currentValue: state.augmentEnabled ? "on" : "off",
354
+ values: ["on", "off"],
355
+ },
356
+ {
357
+ id: "augmentTimeout",
358
+ label: "Augment timeout",
359
+ description:
360
+ "Maximum time (in seconds) to wait for a graph augmentation response. " +
361
+ "Increase for large repos with slow I/O, decrease for snappier responses. " +
362
+ "Default: 8s.",
363
+ currentValue: String(cfg.augmentTimeout ?? 8),
364
+ values: ["4", "6", "8", "10", "15", "20"],
365
+ },
366
+ {
367
+ id: "maxAugmentsPerResult",
368
+ label: "Max augments per result",
369
+ description:
370
+ "Maximum number of patterns to augment in parallel per search result. " +
371
+ "Higher values provide more context but use more tokens. Default: 3.",
372
+ currentValue: String(cfg.maxAugmentsPerResult ?? 3),
373
+ values: ["1", "2", "3", "5"],
374
+ },
375
+ {
376
+ id: "maxSecondaryPatterns",
377
+ label: "Max secondary patterns",
378
+ description:
379
+ "Maximum number of secondary file-based patterns extracted from grep/bash " +
380
+ "output. These provide additional context from files mentioned in results. " +
381
+ "Default: 2.",
382
+ currentValue: String(cfg.maxSecondaryPatterns ?? 2),
383
+ values: ["0", "1", "2", "3", "5"],
384
+ },
385
+ {
386
+ id: "cmd",
387
+ label: "GitNexus command",
388
+ description:
389
+ "The shell command used to invoke gitnexus. " +
390
+ "Change if gitnexus is installed in a non-standard location or you want " +
391
+ "to use npx. Default: gitnexus.",
392
+ currentValue: cfg.cmd ?? "gitnexus",
393
+ values: ["gitnexus", "npx gitnexus@latest", "npx -y gitnexus@latest"],
394
+ },
395
+ ];
396
+ &nbsp;
397
+ const list = <span class="cstat-no" title="statement not covered" >new SettingsList(</span>
398
+ items,
399
+ Math.min(items.length + 2, 15),
400
+ getSettingsListTheme(),
401
+ /* onChange */ (<span class="fstat-no" title="function not covered" >id, n</span>ewValue) =&gt; {
402
+ <span class="cstat-no" title="statement not covered" > if (id === "autoAugment") {</span>
403
+ <span class="cstat-no" title="statement not covered" > state.augmentEnabled = newValue === "on";</span>
404
+ <span class="cstat-no" title="statement not covered" > cfg.autoAugment = newValue === "on";</span>
405
+ <span class="cstat-no" title="statement not covered" > saveConfig(cfg);</span>
406
+ }
407
+ <span class="cstat-no" title="statement not covered" > if (id === "augmentTimeout") {</span>
408
+ <span class="cstat-no" title="statement not covered" > cfg.augmentTimeout = parseInt(newValue, 10);</span>
409
+ <span class="cstat-no" title="statement not covered" > saveConfig(cfg);</span>
410
+ }
411
+ <span class="cstat-no" title="statement not covered" > if (id === "maxAugmentsPerResult") {</span>
412
+ <span class="cstat-no" title="statement not covered" > cfg.maxAugmentsPerResult = parseInt(newValue, 10);</span>
413
+ <span class="cstat-no" title="statement not covered" > saveConfig(cfg);</span>
414
+ }
415
+ <span class="cstat-no" title="statement not covered" > if (id === "maxSecondaryPatterns") {</span>
416
+ <span class="cstat-no" title="statement not covered" > cfg.maxSecondaryPatterns = parseInt(newValue, 10);</span>
417
+ <span class="cstat-no" title="statement not covered" > saveConfig(cfg);</span>
418
+ }
419
+ <span class="cstat-no" title="statement not covered" > if (id === "cmd") {</span>
420
+ <span class="cstat-no" title="statement not covered" > cfg.cmd = newValue;</span>
421
+ <span class="cstat-no" title="statement not covered" > saveConfig(cfg);</span>
422
+ }
423
+ },
424
+ /* onCancel */ () =&gt; <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >done(u</span>ndefined),</span>
425
+ );
426
+ &nbsp;
427
+ const container = <span class="cstat-no" title="statement not covered" >new Container();</span>
428
+ <span class="cstat-no" title="statement not covered" > container.addChild(new Text(theme.bold(theme.fg("accent", "⚙ GitNexus Settings")), 0, 0));</span>
429
+ <span class="cstat-no" title="statement not covered" > container.addChild(new Spacer(1));</span>
430
+ <span class="cstat-no" title="statement not covered" > container.addChild(list);</span>
431
+ &nbsp;
432
+ <span class="cstat-no" title="statement not covered" > return {</span>
433
+ <span class="fstat-no" title="function not covered" > render: (w</span>: number) =&gt; <span class="cstat-no" title="statement not covered" >container.render(w),</span>
434
+ <span class="fstat-no" title="function not covered" > invalidate: () =&gt; <span class="cstat-no" title="statement not covered" >c</span>ontainer.invalidate(),</span>
435
+ <span class="fstat-no" title="function not covered" > handleInput: (d</span>ata: string) =&gt; <span class="cstat-no" title="statement not covered" >list.handleInput?.(data),</span>
436
+ };
437
+ });
438
+ &nbsp;
439
+ <span class="cstat-no" title="statement not covered" > return onBack();</span>
440
+ }
441
+ &nbsp;</pre></td></tr></table></pre>
442
+
443
+ <div class='push'></div><!-- for sticky footer -->
444
+ </div><!-- /wrapper -->
445
+ <div class='footer quiet pad2 space-top1 center small'>
446
+ Code coverage generated by
447
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
448
+ at 2026-05-03T18:51:43.670Z
449
+ </div>
450
+ <script src="../../prettify.js"></script>
451
+ <script>
452
+ window.onload = function () {
453
+ prettyPrint();
454
+ };
455
+ </script>
456
+ <script src="../../sorter.js"></script>
457
+ <script src="../../block-navigation.js"></script>
458
+ </body>
459
+ </html>
460
+
@@ -0,0 +1,11 @@
1
+ /** Reset caches. Call on session start. */
2
+ export declare function clearAugmentCache(): void;
3
+ /**
4
+ * Run augment via remote MCP query tool.
5
+ *
6
+ * @param pattern The search pattern to look up
7
+ * @param cwd The host working directory (passed to callTool)
8
+ * @param serverRepo The server-side repo path
9
+ * @returns The augment result text, or empty string on error/empty
10
+ */
11
+ export declare function augmentRemote(pattern: string, cwd: string, serverRepo: string): Promise<string>;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Patterns already augmented this session (with non-empty results).
3
+ * Keys are lowercased for case-insensitive dedup.
4
+ * Uses microsecond-precision timestamps for test isolation.
5
+ */
6
+ const augmentedCache = new Map();
7
+ /**
8
+ * Patterns that returned empty results on first attempt.
9
+ */
10
+ const emptyCache = new Set();
11
+ /** Reset caches. Call on session start. */
12
+ export function clearAugmentCache() {
13
+ augmentedCache.clear();
14
+ emptyCache.clear();
15
+ }
16
+ /**
17
+ * Run augment via remote MCP query tool.
18
+ *
19
+ * @param pattern The search pattern to look up
20
+ * @param cwd The host working directory (passed to callTool)
21
+ * @param serverRepo The server-side repo path
22
+ * @returns The augment result text, or empty string on error/empty
23
+ */
24
+ export async function augmentRemote(pattern, cwd, serverRepo) {
25
+ const key = pattern.toLowerCase();
26
+ const now = performance.now();
27
+ // Check augmented cache — return cached result if recent
28
+ const cached = augmentedCache.get(key);
29
+ if (cached && (now - cached.ts) < 0.5) {
30
+ return cached.result;
31
+ }
32
+ // Check empty cache — skip early
33
+ if (emptyCache.has(key)) {
34
+ return '';
35
+ }
36
+ try {
37
+ // Dynamic import to avoid vi.mock hoisting issues with mcp-client-factory
38
+ const { McpClientFactory } = await import('./mcp-client-factory');
39
+ const config = McpClientFactory.loadConfig();
40
+ const client = await McpClientFactory.createClient(config);
41
+ const result = await client.callTool('query', { query: pattern, repo: serverRepo }, cwd);
42
+ if (result) {
43
+ augmentedCache.set(key, { result, ts: performance.now() });
44
+ return result;
45
+ }
46
+ else {
47
+ emptyCache.add(key);
48
+ return '';
49
+ }
50
+ }
51
+ catch {
52
+ emptyCache.add(key);
53
+ return '';
54
+ }
55
+ }
@@ -0,0 +1,103 @@
1
+ /** Max output chars returned to the LLM. Prevents context flooding. JS strings are UTF-16 chars, not bytes. */
2
+ export declare const MAX_OUTPUT_CHARS: number;
3
+ /**
4
+ * Environment passed to all child processes.
5
+ * On session_start, the agent's PATH is merged with the login shell's PATH
6
+ * (via resolveShellPath) so that nvm/fnm/volta paths are picked up while
7
+ * preserving any directories the agent already had (e.g. ~/.local/share/nvm/…).
8
+ */
9
+ export declare let spawnEnv: NodeJS.ProcessEnv;
10
+ export declare function updateSpawnEnv(env: NodeJS.ProcessEnv): void;
11
+ /**
12
+ * Resolved command prefix for invoking gitnexus.
13
+ * Defaults to ['gitnexus']; session_start may override it from the flag or saved config.
14
+ */
15
+ export declare let gitnexusCmd: string[];
16
+ export declare function setGitnexusCmd(cmd: string[]): void;
17
+ /** Supported MCP transport modes. */
18
+ export type McpMode = 'auto' | 'local' | 'remote';
19
+ /** Persisted configuration for pi-gitnexus. Loaded from ~/.pi/pi-gitnexus.json. */
20
+ export interface GitNexusConfig {
21
+ /** Transport mode: 'auto' probes local binary first, 'local' forces stdio, 'remote' forces HTTP. */
22
+ mode?: McpMode;
23
+ /** Remote MCP server URL (StreamableHTTP). Only used when mode is 'remote' or 'auto' fallback. */
24
+ serverUrl?: string;
25
+ /** Local gitnexus command override, e.g. 'npx gitnexus@latest'. */
26
+ cmd?: string;
27
+ /** Whether the tool_result hook auto-appends graph context. Default: true. */
28
+ autoAugment?: boolean;
29
+ /** Augment subprocess timeout in seconds. Default: 8. */
30
+ augmentTimeout?: number;
31
+ /** Maximum number of augment calls per tool_result event. Default: 3. */
32
+ maxAugmentsPerResult?: number;
33
+ /** Maximum secondary file patterns extracted from grep output. Default: 2. */
34
+ maxSecondaryPatterns?: number;
35
+ }
36
+ /** Validate and normalize a McpMode value. Returns 'auto' for invalid values. */
37
+ export declare function validateMcpMode(mode: unknown): McpMode;
38
+ /** Default remote MCP server URL. */
39
+ export declare const DEFAULT_SERVER_URL = "http://100.114.135.99:4747/api/mcp";
40
+ export declare function loadSavedConfig(): GitNexusConfig;
41
+ export declare function saveConfig(config: GitNexusConfig): void;
42
+ export declare function resolveGitNexusCmd(flag: string | undefined, saved: string | undefined): string[];
43
+ export declare function normalizePathArg(path: string): string;
44
+ export declare function expandUserPath(path: string): string;
45
+ export declare function setAugmentTimeout(seconds: number): void;
46
+ /** Walk up ancestors looking for a .gitnexus/ directory. Result is cached per cwd. */
47
+ export declare function findGitNexusRoot(cwd: string): string | null;
48
+ export declare function findGitNexusIndex(cwd: string): boolean;
49
+ /** Clear the index cache. Call on session_start when cwd may have changed. */
50
+ export declare function clearIndexCache(): void;
51
+ /**
52
+ * Extract the longest identifier-like literal from a regex pattern.
53
+ * Splits on metacharacters, returns the longest segment that looks like
54
+ * a code identifier (>= 3 chars, starts with letter/underscore).
55
+ */
56
+ export declare function extractLiteralFromRegex(raw: string): string | null;
57
+ /**
58
+ * Extract the primary search pattern from a tool's input object.
59
+ *
60
+ * grep → input.pattern
61
+ * find → basename of the glob pattern (e.g. "**\/foo.ts" → "foo")
62
+ * bash → grep/rg pattern, find -name value, or cat/head/tail filename
63
+ * read → basename of the file path (code files only)
64
+ *
65
+ * Returns null if pattern is missing or shorter than 3 chars.
66
+ */
67
+ export declare function extractPattern(toolName: string, input: Record<string, unknown>): string | null;
68
+ /**
69
+ * Extract { path, pattern } pairs from a read_many tool input.
70
+ * read_many input is { files: Array<{ path: string, ... }> }.
71
+ * Falls back to scanning content for @path lines if input lacks a files array.
72
+ * Returns code files only, deduplicated by basename pattern.
73
+ */
74
+ export declare function extractFilesFromReadMany(input: Record<string, unknown>, content: {
75
+ type: string;
76
+ text?: string;
77
+ }[]): Array<{
78
+ path: string;
79
+ pattern: string;
80
+ }>;
81
+ /**
82
+ * Extract up to `limit` unique file basenames (without extension) from
83
+ * grep-style output lines of the form "path/to/file.ext:lineno:content".
84
+ * Used to augment secondary context from search results.
85
+ */
86
+ export declare function extractFilePatternsFromContent(content: {
87
+ type: string;
88
+ text?: string;
89
+ }[], limit?: number): string[];
90
+ /**
91
+ * Validate that a file path stays within cwd (path traversal guard).
92
+ * Returns the resolved absolute path, or null if it escapes cwd.
93
+ */
94
+ export declare function safeResolvePath(file: string, cwd: string): string | null;
95
+ export declare function toRepoRelativePath(file: string, repoRoot: string): string | null;
96
+ export declare function validateRepoRelativePath(file: string): string | null;
97
+ /**
98
+ * Spawn `gitnexus augment <pattern>` and return its output.
99
+ * gitnexus augment writes results to stderr (not stdout).
100
+ * Used by the tool_result hook — not by registered tools (those use mcp-client).
101
+ * Returns output trimmed and truncated to MAX_OUTPUT_CHARS, or "" on any error.
102
+ */
103
+ export declare function runAugment(pattern: string, cwd: string): Promise<string>;