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.
- package/.github/workflows/ci.yml +20 -0
- package/.gitnexusignore +11 -0
- package/.sg-rules/async-function-must-await-or-return.yml +55 -0
- package/.sg-rules/catch-must-log-error.yml +78 -0
- package/.sg-rules/class-must-implement-or-extend.yml +61 -0
- package/.sg-rules/class-property-must-be-readonly.yml +61 -0
- package/.sg-rules/error-must-extend-base.yml +56 -0
- package/.sg-rules/generic-must-be-constrained.yml +60 -0
- package/.sg-rules/import-reexport-risk.yml +9 -0
- package/.sg-rules/missing-session-id-in-api.yml +16 -0
- package/.sg-rules/no-any-in-generic-args.yml +57 -0
- package/.sg-rules/no-await-in-promise-all.yml +28 -0
- package/.sg-rules/no-barrel-export.yml +17 -0
- package/.sg-rules/no-bq-write-in-module.yml +65 -0
- package/.sg-rules/no-console-except-error.yml +27 -0
- package/.sg-rules/no-console-in-server.yml +42 -0
- package/.sg-rules/no-empty-catch.yml +20 -0
- package/.sg-rules/no-empty-function.yml +24 -0
- package/.sg-rules/no-eval.yml +28 -0
- package/.sg-rules/no-explicit-any.yml +34 -0
- package/.sg-rules/no-hardcoded-placeholder-string.yml +23 -0
- package/.sg-rules/no-hardcoded-secrets.yml +32 -0
- package/.sg-rules/no-innerHTML.yml +22 -0
- package/.sg-rules/no-json-parse-without-trycatch.yml +33 -0
- package/.sg-rules/no-magic-numbers.yml +25 -0
- package/.sg-rules/no-nested-ternary.yml +21 -0
- package/.sg-rules/no-non-null-assertion.yml +25 -0
- package/.sg-rules/no-stub-implementation.yml +44 -0
- package/.sg-rules/no-throw-literal.yml +50 -0
- package/.sg-rules/no-todo-comment.yml +24 -0
- package/.sg-rules/no-ts-ignore-comment.yml +48 -0
- package/.sg-rules/no-type-assertion-in-jsx.yml +23 -0
- package/.sg-rules/no-unguarded-trim.yml +24 -0
- package/.sg-rules/no-unknown-without-narrowing.yml +76 -0
- package/.sg-rules/no-unsafe-bracket-access.yml +58 -0
- package/.sg-rules/no-unsafe-type-assertion.yml +45 -0
- package/.sg-rules/switch-must-be-exhaustive.yml +62 -0
- package/.sg-rules/zod-async-refine-without-abort.yml +62 -0
- package/.sg-rules/zod-enum-unsafe-access.yml +59 -0
- package/.sg-rules/zod-nested-object-deep-path.yml +70 -0
- package/.sg-rules/zod-optional-without-default-in-route.yml +50 -0
- package/.sg-rules/zod-parse-not-safe.yml +42 -0
- package/.sg-rules/zod-preprocess-without-fallback.yml +58 -0
- package/.sg-rules/zod-refine-no-return-undefined.yml +54 -0
- package/.sg-rules/zod-transform-without-output-type.yml +52 -0
- package/.sg-sha +1 -0
- package/.sgignore +4 -0
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +99 -0
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/biome.json +25 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +890 -0
- package/coverage/coverage-final.json +12 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +131 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/augment-remote.ts.html +274 -0
- package/coverage/src/gitnexus.ts.html +1363 -0
- package/coverage/src/index.html +236 -0
- package/coverage/src/index.ts.html +1561 -0
- package/coverage/src/mcp-client-factory.ts.html +367 -0
- package/coverage/src/mcp-client-stdio.ts.html +736 -0
- package/coverage/src/mcp-client.ts.html +568 -0
- package/coverage/src/remote-mcp-client.ts.html +709 -0
- package/coverage/src/repo-resolver.ts.html +526 -0
- package/coverage/src/tools.ts.html +970 -0
- package/coverage/src/ui/index.html +131 -0
- package/coverage/src/ui/main-menu.ts.html +502 -0
- package/coverage/src/ui/settings-menu.ts.html +460 -0
- package/dist/augment-remote.d.ts +11 -0
- package/dist/augment-remote.js +55 -0
- package/dist/gitnexus.d.ts +103 -0
- package/dist/gitnexus.js +410 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +479 -0
- package/dist/mcp-client-factory.d.ts +19 -0
- package/dist/mcp-client-factory.js +78 -0
- package/dist/mcp-client-stdio.d.ts +35 -0
- package/dist/mcp-client-stdio.js +186 -0
- package/dist/mcp-client.d.ts +45 -0
- package/dist/mcp-client.js +145 -0
- package/dist/remote-mcp-client.d.ts +43 -0
- package/dist/remote-mcp-client.js +181 -0
- package/dist/repo-resolver.d.ts +47 -0
- package/dist/repo-resolver.js +123 -0
- package/dist/tools.d.ts +6 -0
- package/dist/tools.js +230 -0
- package/dist/ui/main-menu.d.ts +33 -0
- package/dist/ui/main-menu.js +102 -0
- package/dist/ui/settings-menu.d.ts +16 -0
- package/dist/ui/settings-menu.js +95 -0
- package/docs/design/remote-mcp-backend.md +153 -0
- package/media/screenshot.png +0 -0
- package/package.json +61 -0
- package/sgconfig.yml +4 -0
- package/skills/gitnexus-debugging/SKILL.md +84 -0
- package/skills/gitnexus-exploring/SKILL.md +73 -0
- package/skills/gitnexus-impact-analysis/SKILL.md +93 -0
- package/skills/gitnexus-pr-review/SKILL.md +109 -0
- package/skills/gitnexus-refactoring/SKILL.md +85 -0
- package/src/augment-remote.ts +63 -0
- package/src/gitnexus.ts +426 -0
- package/src/index.ts +492 -0
- package/src/mcp-client-factory.ts +94 -0
- package/src/mcp-client-stdio.ts +217 -0
- package/src/mcp-client.ts +208 -0
- package/src/remote-mcp-client.ts +250 -0
- package/src/repo-resolver.ts +147 -0
- package/src/tools.ts +295 -0
- package/src/ui/main-menu.ts +139 -0
- package/src/ui/settings-menu.ts +125 -0
|
@@ -0,0 +1,1561 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/index.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</a> index.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">34.78% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>96/276</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">37.57% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>62/165</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">30.43% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>14/46</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">35.58% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>79/222</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>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
566
|
+
<span class="cline-any cline-yes">14x</span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
573
|
+
<span class="cline-any cline-no"> </span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
583
|
+
<span class="cline-any cline-neutral"> </span>
|
|
584
|
+
<span class="cline-any cline-yes">14x</span>
|
|
585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
596
|
+
<span class="cline-any cline-no"> </span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-no"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-no"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
626
|
+
<span class="cline-any cline-no"> </span>
|
|
627
|
+
<span class="cline-any cline-no"> </span>
|
|
628
|
+
<span class="cline-any cline-no"> </span>
|
|
629
|
+
<span class="cline-any cline-no"> </span>
|
|
630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
631
|
+
<span class="cline-any cline-no"> </span>
|
|
632
|
+
<span class="cline-any cline-no"> </span>
|
|
633
|
+
<span class="cline-any cline-no"> </span>
|
|
634
|
+
<span class="cline-any cline-no"> </span>
|
|
635
|
+
<span class="cline-any cline-no"> </span>
|
|
636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-no"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-no"> </span>
|
|
643
|
+
<span class="cline-any cline-no"> </span>
|
|
644
|
+
<span class="cline-any cline-no"> </span>
|
|
645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-no"> </span>
|
|
648
|
+
<span class="cline-any cline-no"> </span>
|
|
649
|
+
<span class="cline-any cline-no"> </span>
|
|
650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
652
|
+
<span class="cline-any cline-no"> </span>
|
|
653
|
+
<span class="cline-any cline-no"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-no"> </span>
|
|
658
|
+
<span class="cline-any cline-no"> </span>
|
|
659
|
+
<span class="cline-any cline-no"> </span>
|
|
660
|
+
<span class="cline-any cline-no"> </span>
|
|
661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-no"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-yes">14x</span>
|
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-yes">14x</span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-yes">14x</span>
|
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-yes">14x</span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-yes">14x</span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-yes">14x</span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-yes">14x</span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-yes">14x</span>
|
|
693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
699
|
+
<span class="cline-any cline-yes">14x</span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-yes">14x</span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-yes">22x</span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-yes">22x</span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-yes">22x</span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-yes">22x</span>
|
|
733
|
+
<span class="cline-any cline-yes">14x</span>
|
|
734
|
+
<span class="cline-any cline-yes">14x</span>
|
|
735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
736
|
+
<span class="cline-any cline-yes">13x</span>
|
|
737
|
+
<span class="cline-any cline-yes">13x</span>
|
|
738
|
+
<span class="cline-any cline-yes">13x</span>
|
|
739
|
+
<span class="cline-any cline-yes">14x</span>
|
|
740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
742
|
+
<span class="cline-any cline-yes">12x</span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-no"> </span>
|
|
753
|
+
<span class="cline-any cline-no"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-neutral"> </span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
775
|
+
<span class="cline-any cline-yes">12x</span>
|
|
776
|
+
<span class="cline-any cline-yes">12x</span>
|
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-yes">11x</span>
|
|
780
|
+
<span class="cline-any cline-yes">11x</span>
|
|
781
|
+
<span class="cline-any cline-yes">14x</span>
|
|
782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-yes">16x</span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-yes">14x</span>
|
|
788
|
+
<span class="cline-any cline-yes">16x</span>
|
|
789
|
+
<span class="cline-any cline-yes">16x</span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-yes">14x</span>
|
|
792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
794
|
+
<span class="cline-any cline-yes">9x</span>
|
|
795
|
+
<span class="cline-any cline-yes">14x</span>
|
|
796
|
+
<span class="cline-any cline-yes">14x</span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-yes">9x</span>
|
|
799
|
+
<span class="cline-any cline-yes">14x</span>
|
|
800
|
+
<span class="cline-any cline-yes">14x</span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-yes">14x</span>
|
|
803
|
+
<span class="cline-any cline-yes">9x</span>
|
|
804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
805
|
+
<span class="cline-any cline-yes">7x</span>
|
|
806
|
+
<span class="cline-any cline-yes">7x</span>
|
|
807
|
+
<span class="cline-any cline-yes">14x</span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-no"> </span>
|
|
818
|
+
<span class="cline-any cline-no"> </span>
|
|
819
|
+
<span class="cline-any cline-no"> </span>
|
|
820
|
+
<span class="cline-any cline-no"> </span>
|
|
821
|
+
<span class="cline-any cline-no"> </span>
|
|
822
|
+
<span class="cline-any cline-no"> </span>
|
|
823
|
+
<span class="cline-any cline-no"> </span>
|
|
824
|
+
<span class="cline-any cline-no"> </span>
|
|
825
|
+
<span class="cline-any cline-no"> </span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-no"> </span>
|
|
830
|
+
<span class="cline-any cline-no"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-no"> </span>
|
|
835
|
+
<span class="cline-any cline-no"> </span>
|
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-no"> </span>
|
|
838
|
+
<span class="cline-any cline-no"> </span>
|
|
839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
841
|
+
<span class="cline-any cline-no"> </span>
|
|
842
|
+
<span class="cline-any cline-no"> </span>
|
|
843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
844
|
+
<span class="cline-any cline-no"> </span>
|
|
845
|
+
<span class="cline-any cline-no"> </span>
|
|
846
|
+
<span class="cline-any cline-no"> </span>
|
|
847
|
+
<span class="cline-any cline-no"> </span>
|
|
848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
864
|
+
<span class="cline-any cline-yes">22x</span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-yes">22x</span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-yes">22x</span>
|
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
|
+
<span class="cline-any cline-yes">7x</span>
|
|
876
|
+
<span class="cline-any cline-yes">63x</span>
|
|
877
|
+
<span class="cline-any cline-yes">15x</span>
|
|
878
|
+
<span class="cline-any cline-yes">7x</span>
|
|
879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-yes">7x</span>
|
|
882
|
+
<span class="cline-any cline-yes">7x</span>
|
|
883
|
+
<span class="cline-any cline-yes">7x</span>
|
|
884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
886
|
+
<span class="cline-any cline-yes">7x</span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-no"> </span>
|
|
890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-no"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-no"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
907
|
+
<span class="cline-any cline-no"> </span>
|
|
908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
910
|
+
<span class="cline-any cline-no"> </span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
915
|
+
<span class="cline-any cline-yes">7x</span>
|
|
916
|
+
<span class="cline-any cline-yes">1x</span>
|
|
917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-yes">1x</span>
|
|
936
|
+
<span class="cline-any cline-neutral"> </span>
|
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
939
|
+
<span class="cline-any cline-yes">6x</span>
|
|
940
|
+
<span class="cline-any cline-yes">2x</span>
|
|
941
|
+
<span class="cline-any cline-yes">2x</span>
|
|
942
|
+
<span class="cline-any cline-yes">2x</span>
|
|
943
|
+
<span class="cline-any cline-neutral"> </span>
|
|
944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
946
|
+
<span class="cline-any cline-yes">4x</span>
|
|
947
|
+
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-no"> </span>
|
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
953
|
+
<span class="cline-any cline-neutral"> </span>
|
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-no"> </span>
|
|
957
|
+
<span class="cline-any cline-no"> </span>
|
|
958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
963
|
+
<span class="cline-any cline-no"> </span>
|
|
964
|
+
<span class="cline-any cline-no"> </span>
|
|
965
|
+
<span class="cline-any cline-no"> </span>
|
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
968
|
+
<span class="cline-any cline-no"> </span>
|
|
969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
971
|
+
<span class="cline-any cline-neutral"> </span>
|
|
972
|
+
<span class="cline-any cline-yes">4x</span>
|
|
973
|
+
<span class="cline-any cline-no"> </span>
|
|
974
|
+
<span class="cline-any cline-no"> </span>
|
|
975
|
+
<span class="cline-any cline-no"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-no"> </span>
|
|
978
|
+
<span class="cline-any cline-no"> </span>
|
|
979
|
+
<span class="cline-any cline-no"> </span>
|
|
980
|
+
<span class="cline-any cline-no"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-no"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-no"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-no"> </span>
|
|
993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
994
|
+
<span class="cline-any cline-no"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
997
|
+
<span class="cline-any cline-no"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1005
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1006
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1012
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-no"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-no"> </span>
|
|
1022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-no"> </span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-no"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-no"> </span>
|
|
1035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1043
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1044
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1050
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { delimiter } from 'node:path';
|
|
1051
|
+
import type { ExtensionAPI, ExtensionContext } from '@mariozechner/pi-coding-agent';
|
|
1052
|
+
import spawn from 'cross-spawn';
|
|
1053
|
+
import { clearIndexCache, DEFAULT_SERVER_URL, extractFilePatternsFromContent, extractFilesFromReadMany, extractPattern, findGitNexusIndex, findGitNexusRoot, type GitNexusConfig, gitnexusCmd, loadSavedConfig, type McpMode, resolveGitNexusCmd, runAugment, setAugmentTimeout, setGitnexusCmd, spawnEnv, updateSpawnEnv, validateMcpMode } from './gitnexus';
|
|
1054
|
+
import { createMcpClient, type McpClient, mcpClient } from './mcp-client';
|
|
1055
|
+
import { registerTools } from './tools';
|
|
1056
|
+
import { openMainMenu } from './ui/main-menu';
|
|
1057
|
+
|
|
1058
|
+
const SEARCH_TOOLS = new Set(['grep', 'find', 'bash', 'read', 'read_many']);
|
|
1059
|
+
|
|
1060
|
+
/**
|
|
1061
|
+
* Run augment via remote MCP query tool instead of local subprocess.
|
|
1062
|
+
* Falls back to empty string on any error (graceful degradation).
|
|
1063
|
+
*/
|
|
1064
|
+
async function <span class="fstat-no" title="function not covered" >remoteAugment(p</span>attern: string, cwd: string): Promise<string> {
|
|
1065
|
+
<span class="cstat-no" title="statement not covered" > if (!augmentMcpClient) <span class="cstat-no" title="statement not covered" >return '';</span></span>
|
|
1066
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1067
|
+
const <span class="cstat-no" title="statement not covered" >repo = findGitNexusRoot(cwd) ?? cwd;</span>
|
|
1068
|
+
<span class="cstat-no" title="statement not covered" > return await augmentMcpClient.callTool('query', { query: pattern, repo, limit: 3 }, cwd);</span>
|
|
1069
|
+
} catch {
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > return '';</span>
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
/** Run augment: local subprocess or remote MCP depending on mode. */
|
|
1075
|
+
function augment(pattern: string, cwd: string): Promise<string> {
|
|
1076
|
+
return isRemoteMode ? <span class="branch-0 cbranch-no" title="branch not covered" >remoteAugment(pattern, cwd) </span>: runAugment(pattern, cwd);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
/**
|
|
1080
|
+
* Merge two PATH values, preferring the agent's PATH over the login shell's PATH
|
|
1081
|
+
* while preserving order. Any shell-only directories (e.g. nvm/fnm/volta paths
|
|
1082
|
+
* that the agent didn't inherit) are appended at the end so they are still found.
|
|
1083
|
+
*
|
|
1084
|
+
* This prevents the agent's existing PATH entries (such as ~/.local/share/nvm/…)
|
|
1085
|
+
* from being silently dropped when the login shell reports a different PATH.
|
|
1086
|
+
*/
|
|
1087
|
+
function <span class="fstat-no" title="function not covered" >mergePaths(a</span>gent: string, shell: string): string {
|
|
1088
|
+
const seen = <span class="cstat-no" title="statement not covered" >new Set<string>();</span>
|
|
1089
|
+
const out: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1090
|
+
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > for (const dir of [...agent.split(delimiter), ...shell.split(delimiter)]) {</span>
|
|
1092
|
+
<span class="cstat-no" title="statement not covered" > if (!dir) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
1093
|
+
const key = <span class="cstat-no" title="statement not covered" >process.platform === 'win32' ? dir.toLowerCase() : dir;</span>
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" > if (seen.has(key)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" > seen.add(key);</span>
|
|
1096
|
+
<span class="cstat-no" title="statement not covered" > out.push(dir);</span>
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
<span class="cstat-no" title="statement not covered" > return out.join(delimiter);</span>
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
/**
|
|
1103
|
+
* Resolve PATH from a login shell so nvm/fnm/volta binaries are visible.
|
|
1104
|
+
* Merges with the agent's current PATH so directories already present
|
|
1105
|
+
* (e.g. ~/.local/share/nvm/…) are never lost.
|
|
1106
|
+
*
|
|
1107
|
+
* On Windows the agent's PATH is already correct so we skip the probe entirely.
|
|
1108
|
+
* On macOS/Linux we use the user's login shell ($SHELL) to read login startup
|
|
1109
|
+
* files (.zprofile, .bash_profile, .profile), which is where most package
|
|
1110
|
+
* managers place their PATH setup.
|
|
1111
|
+
*
|
|
1112
|
+
* The probe is bounded by a timeout to prevent a slow or broken startup file
|
|
1113
|
+
* from stalling session initialization.
|
|
1114
|
+
*/
|
|
1115
|
+
async function <span class="fstat-no" title="function not covered" >resolveShellPath(): Promise<void> {</span>
|
|
1116
|
+
<span class="cstat-no" title="statement not covered" > if (process.platform === 'win32') <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1117
|
+
|
|
1118
|
+
const loginShell = <span class="cstat-no" title="statement not covered" >process.env.SHELL ?? '/bin/sh';</span>
|
|
1119
|
+
const shellPath = <span class="cstat-no" title="statement not covered" >await new <span class="fstat-no" title="function not covered" >Promise<string>((r</span>esolve_) => {</span>
|
|
1120
|
+
let out = <span class="cstat-no" title="statement not covered" >'';</span>
|
|
1121
|
+
let done = <span class="cstat-no" title="statement not covered" >false;</span>
|
|
1122
|
+
|
|
1123
|
+
const <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >finish = (v</span>alue: string) => {</span>
|
|
1124
|
+
<span class="cstat-no" title="statement not covered" > if (done) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1125
|
+
<span class="cstat-no" title="statement not covered" > done = true;</span>
|
|
1126
|
+
<span class="cstat-no" title="statement not covered" > clearTimeout(timer);</span>
|
|
1127
|
+
<span class="cstat-no" title="statement not covered" > resolve_(value);</span>
|
|
1128
|
+
};
|
|
1129
|
+
|
|
1130
|
+
const <span class="cstat-no" title="statement not covered" >proc = spawn(loginShell, ['-lc', 'printf %s "$PATH"'], {</span>
|
|
1131
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
1132
|
+
});
|
|
1133
|
+
|
|
1134
|
+
const timer = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >setTimeout(() => {</span></span>
|
|
1135
|
+
<span class="cstat-no" title="statement not covered" > proc.kill();</span>
|
|
1136
|
+
<span class="cstat-no" title="statement not covered" > finish(process.env.PATH ?? '');</span>
|
|
1137
|
+
}, 3_000);
|
|
1138
|
+
|
|
1139
|
+
<span class="cstat-no" title="statement not covered" > proc.stdout!.on(<span class="fstat-no" title="function not covered" >'data', (d</span>: { toString(): string }) => { <span class="cstat-no" title="statement not covered" >out += d.toString(); });</span></span>
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'close', () => <span class="cstat-no" title="statement not covered" >f</span>inish(out.trim() || (process.env.PATH ?? '')))</span>;</span>
|
|
1141
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'error', () => <span class="cstat-no" title="statement not covered" >f</span>inish(process.env.PATH ?? ''))</span>;</span>
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1144
|
+
const merged = <span class="cstat-no" title="statement not covered" >mergePaths(process.env.PATH ?? '', shellPath);</span>
|
|
1145
|
+
<span class="cstat-no" title="statement not covered" > updateSpawnEnv({ ...process.env, PATH: merged });</span>
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
function <span class="fstat-no" title="function not covered" >trySpawn(b</span>in: string, args: string[]): Promise<boolean> {
|
|
1149
|
+
<span class="cstat-no" title="statement not covered" > return new <span class="fstat-no" title="function not covered" >Promise((r</span>esolve_) => {</span>
|
|
1150
|
+
const <span class="cstat-no" title="statement not covered" >proc = spawn(bin, args, { stdio: 'ignore', env: spawnEnv });</span>
|
|
1151
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'close', (c</span>ode: number | null) => <span class="cstat-no" title="statement not covered" >resolve_(code === 0))</span>;</span>
|
|
1152
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'error', () => <span class="cstat-no" title="statement not covered" >r</span>esolve_(false))</span>;</span>
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
/** Probe for gitnexus using the configured command. */
|
|
1157
|
+
async function <span class="fstat-no" title="function not covered" >probeGitNexusBinary(): Promise<boolean> {</span>
|
|
1158
|
+
const [bin, ...args] = <span class="cstat-no" title="statement not covered" >gitnexusCmd;</span>
|
|
1159
|
+
<span class="cstat-no" title="statement not covered" > return trySpawn(bin, [...args, '--version']);</span>
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
/** Cached from session_start/session_switch — avoids re-probing on every /gitnexus status. */
|
|
1163
|
+
let binaryAvailable = false;
|
|
1164
|
+
|
|
1165
|
+
/** Working directory of the current session — ctx.cwd in tool_result events may differ. */
|
|
1166
|
+
let sessionCwd = '';
|
|
1167
|
+
|
|
1168
|
+
/** Persisted config — loaded on session_start, mutated by the settings menu. */
|
|
1169
|
+
let cfg: GitNexusConfig = {};
|
|
1170
|
+
|
|
1171
|
+
/** The active MCP client for augment hooks — may be remote or stdio. */
|
|
1172
|
+
let augmentMcpClient: McpClient | null = null;
|
|
1173
|
+
|
|
1174
|
+
/** Whether the augment hook should use remote MCP instead of local runAugment. */
|
|
1175
|
+
let isRemoteMode = false;
|
|
1176
|
+
|
|
1177
|
+
/** Controls whether the tool_result hook auto-appends graph context. Tools are unaffected. */
|
|
1178
|
+
let augmentEnabled = true;
|
|
1179
|
+
|
|
1180
|
+
/** Number of successful augmentations this session. Shown in /gitnexus status. */
|
|
1181
|
+
let augmentHits = 0;
|
|
1182
|
+
|
|
1183
|
+
/** Number of times the tool_result hook intercepted a search tool result this session. */
|
|
1184
|
+
let hookFires = 0;
|
|
1185
|
+
|
|
1186
|
+
/**
|
|
1187
|
+
* Patterns already augmented this session (with non-empty results).
|
|
1188
|
+
* Prevents the same symbol/file from being looked up repeatedly.
|
|
1189
|
+
* Keys are lowercased for case-insensitive dedup.
|
|
1190
|
+
*/
|
|
1191
|
+
const augmentedCache = new Set<string>();
|
|
1192
|
+
|
|
1193
|
+
/**
|
|
1194
|
+
* Patterns that returned empty results on first attempt.
|
|
1195
|
+
* Prevents unbounded retries. Cleared on session reset (index rebuild).
|
|
1196
|
+
*/
|
|
1197
|
+
const emptyCache = new Set<string>();
|
|
1198
|
+
|
|
1199
|
+
export default function(pi: ExtensionAPI) {
|
|
1200
|
+
registerTools(pi);
|
|
1201
|
+
|
|
1202
|
+
pi.registerFlag('gitnexus-cmd', {
|
|
1203
|
+
type: 'string',
|
|
1204
|
+
default: '',
|
|
1205
|
+
description: 'Command used to invoke gitnexus, e.g. "npx gitnexus@latest". Empty uses saved config or plain "gitnexus".',
|
|
1206
|
+
});
|
|
1207
|
+
|
|
1208
|
+
// Append a one-liner so the agent understands graph context in search results.
|
|
1209
|
+
pi.on('before_agent_start', <span class="fstat-no" title="function not covered" >async (e</span>vent: { systemPrompt?: string }, ctx: ExtensionContext) => {
|
|
1210
|
+
<span class="cstat-no" title="statement not covered" > if (!findGitNexusIndex(ctx.cwd)) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1211
|
+
<span class="cstat-no" title="statement not covered" > if (event.systemPrompt == null) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1212
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1213
|
+
systemPrompt:
|
|
1214
|
+
event.systemPrompt +
|
|
1215
|
+
'\n\n[GitNexus active] Graph context will appear after search results. ' +
|
|
1216
|
+
'Use gitnexus_query, gitnexus_context, gitnexus_impact, gitnexus_detect_changes, ' +
|
|
1217
|
+
'gitnexus_list_repos, gitnexus_rename, and gitnexus_cypher for deeper analysis. ' +
|
|
1218
|
+
'If the index is stale after code changes, run /gitnexus analyze to rebuild it.',
|
|
1219
|
+
};
|
|
1220
|
+
});
|
|
1221
|
+
|
|
1222
|
+
// Core hook: mirrors the Claude Code PreToolUse integration.
|
|
1223
|
+
// Intercepts grep/find/bash/read results, appends knowledge graph context.
|
|
1224
|
+
pi.on('tool_result', async (event, ctx) => {
|
|
1225
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!augmentEnabled) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
1226
|
+
if (!SEARCH_TOOLS.has(event.toolName)) return;
|
|
1227
|
+
// Guard: event.content may be undefined for error results.
|
|
1228
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!event.content || !Array.isArray(event.content)) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
1229
|
+
hookFires++;
|
|
1230
|
+
const cwd = sessionCwd || ctx.cwd;
|
|
1231
|
+
if (!findGitNexusIndex(cwd)) return;
|
|
1232
|
+
|
|
1233
|
+
// read_many: per-file labeled context so the agent knows which context belongs to which file.
|
|
1234
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (event.toolName === 'read_many') {
|
|
1235
|
+
const <span class="cstat-no" title="statement not covered" >files = extractFilesFromReadMany(event.input, event.content);</span>
|
|
1236
|
+
const fresh = <span class="cstat-no" title="statement not covered" >files.<span class="fstat-no" title="function not covered" >filter(f</span> => {</span>
|
|
1237
|
+
const key = <span class="cstat-no" title="statement not covered" >f.pattern.toLowerCase();</span>
|
|
1238
|
+
<span class="cstat-no" title="statement not covered" > return !augmentedCache.has(key) && !emptyCache.has(key);</span>
|
|
1239
|
+
}).slice(0, 5);
|
|
1240
|
+
<span class="cstat-no" title="statement not covered" > if (fresh.length === 0) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1241
|
+
const results = <span class="cstat-no" title="statement not covered" >await Promise.all(fresh.<span class="fstat-no" title="function not covered" >map(f</span> => <span class="cstat-no" title="statement not covered" >augment(f.pattern, cwd).<span class="fstat-no" title="function not covered" >then(o</span>ut => (<span class="cstat-no" title="statement not covered" >{ f, out })))</span></span>);</span>
|
|
1242
|
+
// Cache based on results: successful → augmentedCache, empty → emptyCache
|
|
1243
|
+
<span class="cstat-no" title="statement not covered" > for (const r of results) {</span>
|
|
1244
|
+
const key = <span class="cstat-no" title="statement not covered" >r.f.pattern.toLowerCase();</span>
|
|
1245
|
+
<span class="cstat-no" title="statement not covered" > if (r.out) { <span class="cstat-no" title="statement not covered" >augmentedCache.add(key); } else {</span> <span class="cstat-no" title="statement not covered" >emptyCache.add(key); }</span></span>
|
|
1246
|
+
}
|
|
1247
|
+
const sections = <span class="cstat-no" title="statement not covered" >results.<span class="fstat-no" title="function not covered" >filter(r</span> => <span class="cstat-no" title="statement not covered" >r.out);</span></span>
|
|
1248
|
+
<span class="cstat-no" title="statement not covered" > if (sections.length === 0) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1249
|
+
<span class="cstat-no" title="statement not covered" > augmentHits++;</span>
|
|
1250
|
+
const body = <span class="cstat-no" title="statement not covered" >sections.length === 1</span>
|
|
1251
|
+
? sections[0].out
|
|
1252
|
+
: sections.<span class="fstat-no" title="function not covered" >map(({</span> f, out }) => <span class="cstat-no" title="statement not covered" >`### ${f.path.split('/').pop()}\n${out}`).</span>join('\n\n');
|
|
1253
|
+
const label = <span class="cstat-no" title="statement not covered" >body.startsWith('[GitNexus]') ? '' : (</span>
|
|
1254
|
+
sections.length === 1
|
|
1255
|
+
? `[GitNexus: ${sections[0].f.path.split('/').pop()}]\n`
|
|
1256
|
+
: '[GitNexus]\n'
|
|
1257
|
+
);
|
|
1258
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1259
|
+
content: [
|
|
1260
|
+
...event.content,
|
|
1261
|
+
{ type: 'text' as const, text: `\n\n---\n${label}${body}\n---` },
|
|
1262
|
+
],
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
// Early-exit: skip enrichment when the tool returned no meaningful content.
|
|
1267
|
+
const contentText = event.content.map((c: { type: string; text?: string }) => c.text ?? <span class="branch-1 cbranch-no" title="branch not covered" >'').</span>join('');
|
|
1268
|
+
if (contentText.length < 10) return;
|
|
1269
|
+
|
|
1270
|
+
// Collect patterns: primary from input, secondary filenames from result content.
|
|
1271
|
+
const primary = extractPattern(event.toolName, event.input);
|
|
1272
|
+
const secondaryLimit = cfg.maxSecondaryPatterns ?? 2;
|
|
1273
|
+
const secondary = (event.toolName === 'grep' || event.toolName === 'bash')
|
|
1274
|
+
? extractFilePatternsFromContent(event.content, secondaryLimit)
|
|
1275
|
+
: [];
|
|
1276
|
+
const candidates = [...new Set([primary, ...secondary].filter((p): p is string => !!p))];
|
|
1277
|
+
|
|
1278
|
+
// Filter patterns already augmented or known-empty this session (case-insensitive).
|
|
1279
|
+
const fresh = candidates.filter(p => {
|
|
1280
|
+
const key = p.toLowerCase();
|
|
1281
|
+
return !augmentedCache.has(key) && !emptyCache.has(key);
|
|
1282
|
+
});
|
|
1283
|
+
if (fresh.length === 0) return;
|
|
1284
|
+
|
|
1285
|
+
// Run augments in parallel, merge results.
|
|
1286
|
+
const maxAugments = cfg.maxAugmentsPerResult ?? 3;
|
|
1287
|
+
const toRun = fresh.slice(0, maxAugments);
|
|
1288
|
+
const results = await Promise.all(toRun.map(p => augment(p, cwd).then(out => ({ p, out }))));
|
|
1289
|
+
// Cache based on results: successful → augmentedCache, empty → emptyCache
|
|
1290
|
+
for (const r of results) {
|
|
1291
|
+
const key = r.p.toLowerCase();
|
|
1292
|
+
if (r.out) { augmentedCache.add(key); } else { emptyCache.add(key); }
|
|
1293
|
+
}
|
|
1294
|
+
const combined = results.filter(r => r.out).map(r => r.out).join('\n\n');
|
|
1295
|
+
if (!combined) return;
|
|
1296
|
+
|
|
1297
|
+
augmentHits++;
|
|
1298
|
+
const label = combined.startsWith('[GitNexus]') ? <span class="branch-0 cbranch-no" title="branch not covered" >'' : `</span>[GitNexus: ${toRun.join(', ')}]\n`;
|
|
1299
|
+
return {
|
|
1300
|
+
content: [
|
|
1301
|
+
...event.content,
|
|
1302
|
+
{ type: 'text' as const, text: `\n\n---\n${label}${combined}\n---` },
|
|
1303
|
+
],
|
|
1304
|
+
};
|
|
1305
|
+
});
|
|
1306
|
+
|
|
1307
|
+
async function <span class="fstat-no" title="function not covered" >onSession(c</span>tx: ExtensionContext) {
|
|
1308
|
+
<span class="cstat-no" title="statement not covered" > mcpClient.stop();</span>
|
|
1309
|
+
<span class="cstat-no" title="statement not covered" > augmentMcpClient?.stop();</span>
|
|
1310
|
+
<span class="cstat-no" title="statement not covered" > augmentMcpClient = null;</span>
|
|
1311
|
+
<span class="cstat-no" title="statement not covered" > isRemoteMode = false;</span>
|
|
1312
|
+
<span class="cstat-no" title="statement not covered" > clearIndexCache();</span>
|
|
1313
|
+
<span class="cstat-no" title="statement not covered" > augmentHits = 0;</span>
|
|
1314
|
+
<span class="cstat-no" title="statement not covered" > hookFires = 0;</span>
|
|
1315
|
+
<span class="cstat-no" title="statement not covered" > augmentedCache.clear();</span>
|
|
1316
|
+
<span class="cstat-no" title="statement not covered" > emptyCache.clear();</span>
|
|
1317
|
+
<span class="cstat-no" title="statement not covered" > sessionCwd = ctx.cwd;</span>
|
|
1318
|
+
<span class="cstat-no" title="statement not covered" > await resolveShellPath();</span>
|
|
1319
|
+
|
|
1320
|
+
// Load persisted config
|
|
1321
|
+
<span class="cstat-no" title="statement not covered" > cfg = loadSavedConfig();</span>
|
|
1322
|
+
<span class="cstat-no" title="statement not covered" > augmentEnabled = cfg.autoAugment !== false;</span>
|
|
1323
|
+
<span class="cstat-no" title="statement not covered" > if (cfg.augmentTimeout) <span class="cstat-no" title="statement not covered" >setAugmentTimeout(cfg.augmentTimeout);</span></span>
|
|
1324
|
+
|
|
1325
|
+
// Resolve command: default → saved config → CLI flag (highest precedence)
|
|
1326
|
+
const flag = <span class="cstat-no" title="statement not covered" >pi.getFlag('gitnexus-cmd') </span>as string | undefined;
|
|
1327
|
+
<span class="cstat-no" title="statement not covered" > setGitnexusCmd(resolveGitNexusCmd(flag, cfg.cmd));</span>
|
|
1328
|
+
|
|
1329
|
+
<span class="cstat-no" title="statement not covered" > binaryAvailable = await probeGitNexusBinary();</span>
|
|
1330
|
+
<span class="cstat-no" title="statement not covered" > if (!findGitNexusIndex(ctx.cwd)) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1331
|
+
|
|
1332
|
+
// Determine transport mode for augment hook
|
|
1333
|
+
const mode: McpMode = <span class="cstat-no" title="statement not covered" >cfg.mode ?? 'auto';</span>
|
|
1334
|
+
const serverUrl = <span class="cstat-no" title="statement not covered" >cfg.serverUrl || DEFAULT_SERVER_URL;</span>
|
|
1335
|
+
|
|
1336
|
+
<span class="cstat-no" title="statement not covered" > if (mode === 'remote' || (mode === 'auto' && !binaryAvailable)) {</span>
|
|
1337
|
+
<span class="cstat-no" title="statement not covered" > isRemoteMode = true;</span>
|
|
1338
|
+
<span class="cstat-no" title="statement not covered" > augmentMcpClient = createMcpClient('remote', serverUrl);</span>
|
|
1339
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify(</span>
|
|
1340
|
+
`GitNexus: using remote MCP backend (${serverUrl}).`,
|
|
1341
|
+
'info',
|
|
1342
|
+
);
|
|
1343
|
+
} else if (<span class="cstat-no" title="statement not covered" >binaryAvailable) {</span>
|
|
1344
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify(</span>
|
|
1345
|
+
'GitNexus: knowledge graph active — searches will be enriched automatically.',
|
|
1346
|
+
'info',
|
|
1347
|
+
);
|
|
1348
|
+
} else {
|
|
1349
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify(</span>
|
|
1350
|
+
'GitNexus index found but gitnexus is not on PATH. Install: npm i -g gitnexus',
|
|
1351
|
+
'warning',
|
|
1352
|
+
);
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
pi.on(<span class="fstat-no" title="function not covered" >'session_start', (_</span>event: unknown, ctx: ExtensionContext) => {
|
|
1357
|
+
<span class="cstat-no" title="statement not covered" > void onSession(ctx).<span class="fstat-no" title="function not covered" >catch(e</span>rr => {</span>
|
|
1358
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify(`GitNexus session init failed: ${err.message}`, 'error');</span>
|
|
1359
|
+
});
|
|
1360
|
+
});
|
|
1361
|
+
|
|
1362
|
+
const subcommands = ['status', 'analyze', 'on', 'off', 'settings', 'query', 'context', 'impact', 'help'];
|
|
1363
|
+
|
|
1364
|
+
pi.registerCommand('gitnexus', {
|
|
1365
|
+
description: 'GitNexus knowledge graph. Type /gitnexus help for usage.',
|
|
1366
|
+
getArgumentCompletions: (prefix: string) => {
|
|
1367
|
+
const items = subcommands
|
|
1368
|
+
.filter(s => s.startsWith(prefix))
|
|
1369
|
+
.map(s => ({ value: s, label: s }));
|
|
1370
|
+
return items.length > 0 ? items : null;
|
|
1371
|
+
},
|
|
1372
|
+
handler: async (args: string, ctx: ExtensionContext) => {
|
|
1373
|
+
const parts = args.trim().split(/\s+/);
|
|
1374
|
+
const sub = parts[0] ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
|
|
1375
|
+
const rest = parts.slice(1).join(' ');
|
|
1376
|
+
|
|
1377
|
+
// /gitnexus status
|
|
1378
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (sub === 'status') {
|
|
1379
|
+
<span class="cstat-no" title="statement not covered" > if (!binaryAvailable) {</span>
|
|
1380
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify('gitnexus is not installed. Install: npm i -g gitnexus', 'warning');</span>
|
|
1381
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1382
|
+
}
|
|
1383
|
+
<span class="cstat-no" title="statement not covered" > if (!findGitNexusIndex(ctx.cwd)) {</span>
|
|
1384
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify('No GitNexus index found. Run: /gitnexus analyze', 'info');</span>
|
|
1385
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1386
|
+
}
|
|
1387
|
+
const out = <span class="cstat-no" title="statement not covered" >await new <span class="fstat-no" title="function not covered" >Promise<string>((r</span>esolve_) => {</span>
|
|
1388
|
+
let stdout = <span class="cstat-no" title="statement not covered" >'';</span>
|
|
1389
|
+
const [bin, ...baseArgs] = <span class="cstat-no" title="statement not covered" >gitnexusCmd;</span>
|
|
1390
|
+
const <span class="cstat-no" title="statement not covered" >proc = spawn(bin, [...baseArgs, 'status'], {</span>
|
|
1391
|
+
cwd: ctx.cwd,
|
|
1392
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
1393
|
+
env: spawnEnv,
|
|
1394
|
+
});
|
|
1395
|
+
<span class="cstat-no" title="statement not covered" > proc.stdout!.on(<span class="fstat-no" title="function not covered" >'data', (c</span>hunk: { toString(): string }) => { <span class="cstat-no" title="statement not covered" >stdout += chunk.toString(); });</span></span>
|
|
1396
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'close', () => <span class="cstat-no" title="statement not covered" >r</span>esolve_(stdout.trim()))</span>;</span>
|
|
1397
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'error', () => <span class="cstat-no" title="statement not covered" >r</span>esolve_(''))</span>;</span>
|
|
1398
|
+
});
|
|
1399
|
+
const augmentLine = <span class="cstat-no" title="statement not covered" >augmentEnabled</span>
|
|
1400
|
+
? `Auto-augment: on (${hookFires} intercepted, ${augmentHits} enriched this session)`
|
|
1401
|
+
: 'Auto-augment: off';
|
|
1402
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify((out ? out + '\n' : '') + augmentLine, 'info');</span>
|
|
1403
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
// /gitnexus help
|
|
1407
|
+
if (sub === 'help') {
|
|
1408
|
+
ctx.ui.notify(
|
|
1409
|
+
'/gitnexus — GitNexus knowledge graph\n' +
|
|
1410
|
+
'\n' +
|
|
1411
|
+
'Commands:\n' +
|
|
1412
|
+
' /gitnexus — interactive menu (status & settings)\n' +
|
|
1413
|
+
' /gitnexus status — show status\n' +
|
|
1414
|
+
' /gitnexus analyze — index the codebase\n' +
|
|
1415
|
+
' /gitnexus on|off — enable/disable auto-augment on searches\n' +
|
|
1416
|
+
' /gitnexus <pattern> — manual graph lookup\n' +
|
|
1417
|
+
' /gitnexus query <q> — search execution flows\n' +
|
|
1418
|
+
' /gitnexus context <n> — callers/callees of a symbol\n' +
|
|
1419
|
+
' /gitnexus impact <n> — blast radius of a change\n' +
|
|
1420
|
+
'\n' +
|
|
1421
|
+
'Tools (always available to the agent):\n' +
|
|
1422
|
+
' gitnexus_list_repos, gitnexus_query, gitnexus_context,\n' +
|
|
1423
|
+
' gitnexus_impact, gitnexus_detect_changes,\n' +
|
|
1424
|
+
' gitnexus_rename, gitnexus_cypher',
|
|
1425
|
+
'info',
|
|
1426
|
+
);
|
|
1427
|
+
return;
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
// /gitnexus on | off
|
|
1431
|
+
if (sub === 'on' || sub === 'off') {
|
|
1432
|
+
augmentEnabled = sub === 'on';
|
|
1433
|
+
ctx.ui.notify(`GitNexus auto-augment ${augmentEnabled ? 'enabled' : 'disabled'}.`, 'info');
|
|
1434
|
+
return;
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
// /gitnexus or /gitnexus config | settings — main menu
|
|
1438
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!sub || sub === 'config' || sub === 'settings') {
|
|
1439
|
+
const state = <span class="cstat-no" title="statement not covered" >{ augmentEnabled };</span>
|
|
1440
|
+
<span class="cstat-no" title="statement not covered" > await openMainMenu({</span>
|
|
1441
|
+
ui: ctx.ui,
|
|
1442
|
+
cwd: ctx.cwd,
|
|
1443
|
+
cfg,
|
|
1444
|
+
state,
|
|
1445
|
+
binaryAvailable,
|
|
1446
|
+
gitnexusCmd,
|
|
1447
|
+
spawnEnv,
|
|
1448
|
+
<span class="fstat-no" title="function not covered" > getHookFires: () => <span class="cstat-no" title="statement not covered" >h</span>ookFires,</span>
|
|
1449
|
+
<span class="fstat-no" title="function not covered" > getAugmentHits: () => <span class="cstat-no" title="statement not covered" >a</span>ugmentHits,</span>
|
|
1450
|
+
findGitNexusIndex,
|
|
1451
|
+
clearIndexCache,
|
|
1452
|
+
setGitnexusCmd,
|
|
1453
|
+
setAugmentTimeout,
|
|
1454
|
+
<span class="fstat-no" title="function not covered" > syncState: () => {</span>
|
|
1455
|
+
<span class="cstat-no" title="statement not covered" > augmentEnabled = state.augmentEnabled;</span>
|
|
1456
|
+
<span class="cstat-no" title="statement not covered" > if (cfg.cmd) <span class="cstat-no" title="statement not covered" >setGitnexusCmd(cfg.cmd.trim().split(/\s+/));</span></span>
|
|
1457
|
+
<span class="cstat-no" title="statement not covered" > if (cfg.augmentTimeout) <span class="cstat-no" title="statement not covered" >setAugmentTimeout(cfg.augmentTimeout);</span></span>
|
|
1458
|
+
},
|
|
1459
|
+
});
|
|
1460
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
// /gitnexus analyze
|
|
1464
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (sub === 'analyze') {
|
|
1465
|
+
<span class="cstat-no" title="statement not covered" > if (!binaryAvailable) {</span>
|
|
1466
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify('gitnexus is not installed. Install: npm i -g gitnexus', 'warning');</span>
|
|
1467
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1468
|
+
}
|
|
1469
|
+
<span class="cstat-no" title="statement not covered" > augmentEnabled = false;</span>
|
|
1470
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify('GitNexus: analyzing codebase, this may take a while…', 'info');</span>
|
|
1471
|
+
const exitCode = <span class="cstat-no" title="statement not covered" >await new <span class="fstat-no" title="function not covered" >Promise<number | null>((r</span>esolve_) => {</span>
|
|
1472
|
+
const [bin, ...baseArgs] = <span class="cstat-no" title="statement not covered" >gitnexusCmd;</span>
|
|
1473
|
+
const <span class="cstat-no" title="statement not covered" >proc = spawn(bin, [...baseArgs, 'analyze'], {</span>
|
|
1474
|
+
cwd: ctx.cwd,
|
|
1475
|
+
stdio: 'ignore',
|
|
1476
|
+
env: spawnEnv,
|
|
1477
|
+
});
|
|
1478
|
+
<span class="cstat-no" title="statement not covered" > proc.on('close', resolve_);</span>
|
|
1479
|
+
<span class="cstat-no" title="statement not covered" > proc.on(<span class="fstat-no" title="function not covered" >'error', () => <span class="cstat-no" title="statement not covered" >r</span>esolve_(null))</span>;</span>
|
|
1480
|
+
});
|
|
1481
|
+
<span class="cstat-no" title="statement not covered" > if (exitCode === 0) {</span>
|
|
1482
|
+
<span class="cstat-no" title="statement not covered" > clearIndexCache();</span>
|
|
1483
|
+
<span class="cstat-no" title="statement not covered" > augmentEnabled = true;</span>
|
|
1484
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify('GitNexus: analysis complete. Knowledge graph ready.', 'info');</span>
|
|
1485
|
+
} else {
|
|
1486
|
+
<span class="cstat-no" title="statement not covered" > augmentEnabled = true;</span>
|
|
1487
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify('GitNexus: analysis failed. Check the terminal for details.', 'error');</span>
|
|
1488
|
+
}
|
|
1489
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
const repo = findGitNexusRoot(ctx.cwd) ?? <span class="branch-1 cbranch-no" title="branch not covered" >ctx.cwd;</span>
|
|
1493
|
+
|
|
1494
|
+
// /gitnexus query <text>
|
|
1495
|
+
if (sub === 'query') {
|
|
1496
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!rest) { <span class="cstat-no" title="statement not covered" >ctx.ui.notify('Usage: /gitnexus query <text>', 'info'); <span class="cstat-no" title="statement not covered" >r</span>eturn; }</span>
|
|
1497
|
+
try {
|
|
1498
|
+
const out = await mcpClient.callTool('query', { query: rest, repo }, ctx.cwd);
|
|
1499
|
+
<span class="cstat-no" title="statement not covered" > if (out) <span class="cstat-no" title="statement not covered" >pi.sendUserMessage(out, { deliverAs: 'followUp' });</span></span>
|
|
1500
|
+
else <span class="cstat-no" title="statement not covered" >ctx.ui.notify('No results.', 'info');</span>
|
|
1501
|
+
} catch (error) {
|
|
1502
|
+
ctx.ui.notify(error instanceof Error ? error.message : <span class="branch-1 cbranch-no" title="branch not covered" >'GitNexus query failed.', '</span>error');
|
|
1503
|
+
}
|
|
1504
|
+
return;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
// /gitnexus context <name>
|
|
1508
|
+
if (sub === 'context') {
|
|
1509
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (!rest) { ctx.ui.notify('Usage: /gitnexus context <name>', 'info'); return; }
|
|
1510
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1511
|
+
const out = <span class="cstat-no" title="statement not covered" >await mcpClient.callTool('context', { name: rest, repo }, ctx.cwd);</span>
|
|
1512
|
+
<span class="cstat-no" title="statement not covered" > if (out) <span class="cstat-no" title="statement not covered" >pi.sendUserMessage(out, { deliverAs: 'followUp' });</span></span>
|
|
1513
|
+
else <span class="cstat-no" title="statement not covered" >ctx.ui.notify('No results.', 'info');</span>
|
|
1514
|
+
} catch (error) {
|
|
1515
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify(error instanceof Error ? error.message : 'GitNexus context lookup failed.', 'error');</span>
|
|
1516
|
+
}
|
|
1517
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
// /gitnexus impact <name>
|
|
1521
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (sub === 'impact') {
|
|
1522
|
+
<span class="cstat-no" title="statement not covered" > if (!rest) { <span class="cstat-no" title="statement not covered" >ctx.ui.notify('Usage: /gitnexus impact <name>', 'info'); <span class="cstat-no" title="statement not covered" >r</span>eturn; }</span></span>
|
|
1523
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1524
|
+
const out = <span class="cstat-no" title="statement not covered" >await mcpClient.callTool('impact', { target: rest, direction: 'upstream', repo }, ctx.cwd);</span>
|
|
1525
|
+
<span class="cstat-no" title="statement not covered" > if (out) <span class="cstat-no" title="statement not covered" >pi.sendUserMessage(out, { deliverAs: 'followUp' });</span></span>
|
|
1526
|
+
else <span class="cstat-no" title="statement not covered" >ctx.ui.notify('No results.', 'info');</span>
|
|
1527
|
+
} catch (error) {
|
|
1528
|
+
<span class="cstat-no" title="statement not covered" > ctx.ui.notify(error instanceof Error ? error.message : 'GitNexus impact analysis failed.', 'error');</span>
|
|
1529
|
+
}
|
|
1530
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
// /gitnexus <pattern> — manual augment lookup
|
|
1534
|
+
const pattern = sub + (rest ? <span class="branch-0 cbranch-no" title="branch not covered" >' ' + rest : '</span>');
|
|
1535
|
+
if (pattern.length < 3) { ctx.ui.notify('Pattern too short (min 3 chars).', 'info'); return; }
|
|
1536
|
+
const out = await runAugment(pattern, ctx.cwd);
|
|
1537
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (out) <span class="cstat-no" title="statement not covered" >pi.sendUserMessage('[GitNexus]\n' + out, { deliverAs: 'followUp' });</span>
|
|
1538
|
+
else ctx.ui.notify('No graph context found for: ' + pattern, 'info');
|
|
1539
|
+
},
|
|
1540
|
+
});
|
|
1541
|
+
}
|
|
1542
|
+
</pre></td></tr></table></pre>
|
|
1543
|
+
|
|
1544
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1545
|
+
</div><!-- /wrapper -->
|
|
1546
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1547
|
+
Code coverage generated by
|
|
1548
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1549
|
+
at 2026-05-03T18:51:43.670Z
|
|
1550
|
+
</div>
|
|
1551
|
+
<script src="../prettify.js"></script>
|
|
1552
|
+
<script>
|
|
1553
|
+
window.onload = function () {
|
|
1554
|
+
prettyPrint();
|
|
1555
|
+
};
|
|
1556
|
+
</script>
|
|
1557
|
+
<script src="../sorter.js"></script>
|
|
1558
|
+
<script src="../block-navigation.js"></script>
|
|
1559
|
+
</body>
|
|
1560
|
+
</html>
|
|
1561
|
+
|