@sentry/warden 0.31.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/.oxlintrc.json +4 -3
  2. package/CHANGELOG.md +20 -0
  3. package/README.md +1 -1
  4. package/dist/output/renderer.js +3 -3
  5. package/dist/output/renderer.js.map +1 -1
  6. package/dist/sdk/analyze.js +1 -0
  7. package/dist/sdk/analyze.js.map +1 -1
  8. package/dist/sdk/prompt-sections.d.ts +2 -0
  9. package/dist/sdk/prompt-sections.d.ts.map +1 -1
  10. package/dist/sdk/prompt-sections.js +8 -2
  11. package/dist/sdk/prompt-sections.js.map +1 -1
  12. package/dist/sdk/prompt.d.ts.map +1 -1
  13. package/dist/sdk/prompt.js +8 -6
  14. package/dist/sdk/prompt.js.map +1 -1
  15. package/dist/sdk/verify.d.ts.map +1 -1
  16. package/dist/sdk/verify.js +5 -1
  17. package/dist/sdk/verify.js.map +1 -1
  18. package/package.json +16 -8
  19. package/src/builtin-skills/code-review/SKILL.md +1 -1
  20. package/src/builtin-skills/security-review/SKILL.md +1 -1
  21. package/test-results.junit.xml +2330 -2297
  22. package/.cursor/mcp.json +0 -7
  23. package/coverage/lcov-report/base.css +0 -224
  24. package/coverage/lcov-report/block-navigation.js +0 -87
  25. package/coverage/lcov-report/favicon.png +0 -0
  26. package/coverage/lcov-report/index.html +0 -446
  27. package/coverage/lcov-report/prettify.css +0 -1
  28. package/coverage/lcov-report/prettify.js +0 -2
  29. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  30. package/coverage/lcov-report/sorter.js +0 -210
  31. package/coverage/lcov-report/src/action/checks/index.html +0 -116
  32. package/coverage/lcov-report/src/action/checks/manager.ts.html +0 -499
  33. package/coverage/lcov-report/src/action/error-reporting.ts.html +0 -181
  34. package/coverage/lcov-report/src/action/fix-evaluation/github.ts.html +0 -508
  35. package/coverage/lcov-report/src/action/fix-evaluation/index.html +0 -161
  36. package/coverage/lcov-report/src/action/fix-evaluation/index.ts.html +0 -1243
  37. package/coverage/lcov-report/src/action/fix-evaluation/judge.ts.html +0 -817
  38. package/coverage/lcov-report/src/action/fix-evaluation/types.ts.html +0 -274
  39. package/coverage/lcov-report/src/action/index.html +0 -161
  40. package/coverage/lcov-report/src/action/inputs.ts.html +0 -529
  41. package/coverage/lcov-report/src/action/pi-ncc-compat.ts.html +0 -292
  42. package/coverage/lcov-report/src/action/review/coordination.ts.html +0 -208
  43. package/coverage/lcov-report/src/action/review/index.html +0 -131
  44. package/coverage/lcov-report/src/action/review/poster.ts.html +0 -1051
  45. package/coverage/lcov-report/src/action/review-state.ts.html +0 -280
  46. package/coverage/lcov-report/src/action/triggers/executor.ts.html +0 -856
  47. package/coverage/lcov-report/src/action/triggers/index.html +0 -116
  48. package/coverage/lcov-report/src/action/workflow/base.ts.html +0 -1135
  49. package/coverage/lcov-report/src/action/workflow/index.html +0 -146
  50. package/coverage/lcov-report/src/action/workflow/pr-workflow.ts.html +0 -2713
  51. package/coverage/lcov-report/src/action/workflow/schedule.ts.html +0 -1027
  52. package/coverage/lcov-report/src/cli/args.ts.html +0 -1657
  53. package/coverage/lcov-report/src/cli/commands/add.ts.html +0 -1567
  54. package/coverage/lcov-report/src/cli/commands/build.ts.html +0 -1618
  55. package/coverage/lcov-report/src/cli/commands/index.html +0 -191
  56. package/coverage/lcov-report/src/cli/commands/init.ts.html +0 -1357
  57. package/coverage/lcov-report/src/cli/commands/runs.ts.html +0 -2560
  58. package/coverage/lcov-report/src/cli/commands/setup-app/browser.ts.html +0 -214
  59. package/coverage/lcov-report/src/cli/commands/setup-app/credentials.ts.html +0 -220
  60. package/coverage/lcov-report/src/cli/commands/setup-app/index.html +0 -161
  61. package/coverage/lcov-report/src/cli/commands/setup-app/manifest.ts.html +0 -235
  62. package/coverage/lcov-report/src/cli/commands/setup-app/server.ts.html +0 -601
  63. package/coverage/lcov-report/src/cli/commands/setup-app.ts.html +0 -571
  64. package/coverage/lcov-report/src/cli/commands/sync.ts.html +0 -475
  65. package/coverage/lcov-report/src/cli/context.ts.html +0 -532
  66. package/coverage/lcov-report/src/cli/diff-apply.ts.html +0 -334
  67. package/coverage/lcov-report/src/cli/files.ts.html +0 -904
  68. package/coverage/lcov-report/src/cli/fix.ts.html +0 -1060
  69. package/coverage/lcov-report/src/cli/git.ts.html +0 -1201
  70. package/coverage/lcov-report/src/cli/help.ts.html +0 -1696
  71. package/coverage/lcov-report/src/cli/index.html +0 -281
  72. package/coverage/lcov-report/src/cli/input.ts.html +0 -397
  73. package/coverage/lcov-report/src/cli/log-cleanup.ts.html +0 -337
  74. package/coverage/lcov-report/src/cli/main.ts.html +0 -5107
  75. package/coverage/lcov-report/src/cli/output/box.ts.html +0 -790
  76. package/coverage/lcov-report/src/cli/output/formatters.ts.html +0 -1099
  77. package/coverage/lcov-report/src/cli/output/icons.ts.html +0 -142
  78. package/coverage/lcov-report/src/cli/output/index.html +0 -281
  79. package/coverage/lcov-report/src/cli/output/index.ts.html +0 -295
  80. package/coverage/lcov-report/src/cli/output/ink-runner.tsx.html +0 -1597
  81. package/coverage/lcov-report/src/cli/output/jsonl-schema-gen.ts.html +0 -355
  82. package/coverage/lcov-report/src/cli/output/jsonl.ts.html +0 -2137
  83. package/coverage/lcov-report/src/cli/output/live-status.tsx.html +0 -916
  84. package/coverage/lcov-report/src/cli/output/reporter.ts.html +0 -1630
  85. package/coverage/lcov-report/src/cli/output/tasks.ts.html +0 -3193
  86. package/coverage/lcov-report/src/cli/output/tty.ts.html +0 -310
  87. package/coverage/lcov-report/src/cli/output/verbosity.ts.html +0 -181
  88. package/coverage/lcov-report/src/cli/signals.ts.html +0 -199
  89. package/coverage/lcov-report/src/cli/terminal.ts.html +0 -1060
  90. package/coverage/lcov-report/src/config/index.html +0 -161
  91. package/coverage/lcov-report/src/config/index.ts.html +0 -94
  92. package/coverage/lcov-report/src/config/loader.ts.html +0 -1753
  93. package/coverage/lcov-report/src/config/schema.ts.html +0 -910
  94. package/coverage/lcov-report/src/config/writer.ts.html +0 -538
  95. package/coverage/lcov-report/src/diff/apply.ts.html +0 -241
  96. package/coverage/lcov-report/src/diff/classify.ts.html +0 -361
  97. package/coverage/lcov-report/src/diff/coalesce.ts.html +0 -1123
  98. package/coverage/lcov-report/src/diff/context.ts.html +0 -952
  99. package/coverage/lcov-report/src/diff/index.html +0 -191
  100. package/coverage/lcov-report/src/diff/index.ts.html +0 -100
  101. package/coverage/lcov-report/src/diff/parser.ts.html +0 -532
  102. package/coverage/lcov-report/src/evals/harness.ts.html +0 -700
  103. package/coverage/lcov-report/src/evals/index.html +0 -221
  104. package/coverage/lcov-report/src/evals/index.ts.html +0 -955
  105. package/coverage/lcov-report/src/evals/names.ts.html +0 -121
  106. package/coverage/lcov-report/src/evals/runner.ts.html +0 -664
  107. package/coverage/lcov-report/src/evals/scaffold.ts.html +0 -970
  108. package/coverage/lcov-report/src/evals/types.ts.html +0 -661
  109. package/coverage/lcov-report/src/evals/usage.ts.html +0 -178
  110. package/coverage/lcov-report/src/evals/verify.ts.html +0 -1054
  111. package/coverage/lcov-report/src/event/context.ts.html +0 -490
  112. package/coverage/lcov-report/src/event/index.html +0 -116
  113. package/coverage/lcov-report/src/index.html +0 -116
  114. package/coverage/lcov-report/src/output/dedup.ts.html +0 -2950
  115. package/coverage/lcov-report/src/output/github-checks.ts.html +0 -1579
  116. package/coverage/lcov-report/src/output/index.html +0 -161
  117. package/coverage/lcov-report/src/output/renderer.ts.html +0 -988
  118. package/coverage/lcov-report/src/output/stale.ts.html +0 -640
  119. package/coverage/lcov-report/src/sdk/analyze.ts.html +0 -3010
  120. package/coverage/lcov-report/src/sdk/auth.ts.html +0 -217
  121. package/coverage/lcov-report/src/sdk/circuit-breaker.ts.html +0 -304
  122. package/coverage/lcov-report/src/sdk/errors.ts.html +0 -658
  123. package/coverage/lcov-report/src/sdk/extract.ts.html +0 -1810
  124. package/coverage/lcov-report/src/sdk/fix-quality.ts.html +0 -841
  125. package/coverage/lcov-report/src/sdk/haiku.ts.html +0 -1456
  126. package/coverage/lcov-report/src/sdk/index.html +0 -416
  127. package/coverage/lcov-report/src/sdk/json-output.ts.html +0 -508
  128. package/coverage/lcov-report/src/sdk/model-pricing.json.html +0 -499
  129. package/coverage/lcov-report/src/sdk/otel.ts.html +0 -433
  130. package/coverage/lcov-report/src/sdk/post-process.ts.html +0 -412
  131. package/coverage/lcov-report/src/sdk/prepare.ts.html +0 -400
  132. package/coverage/lcov-report/src/sdk/pricing.ts.html +0 -778
  133. package/coverage/lcov-report/src/sdk/prompt-sections.ts.html +0 -595
  134. package/coverage/lcov-report/src/sdk/prompt.ts.html +0 -451
  135. package/coverage/lcov-report/src/sdk/report-files.ts.html +0 -166
  136. package/coverage/lcov-report/src/sdk/retry.ts.html +0 -202
  137. package/coverage/lcov-report/src/sdk/runner.ts.html +0 -400
  138. package/coverage/lcov-report/src/sdk/runtimes/claude.ts.html +0 -1693
  139. package/coverage/lcov-report/src/sdk/runtimes/index.html +0 -176
  140. package/coverage/lcov-report/src/sdk/runtimes/index.ts.html +0 -244
  141. package/coverage/lcov-report/src/sdk/runtimes/model-selectors.ts.html +0 -328
  142. package/coverage/lcov-report/src/sdk/runtimes/pi.ts.html +0 -2104
  143. package/coverage/lcov-report/src/sdk/runtimes/types.ts.html +0 -508
  144. package/coverage/lcov-report/src/sdk/types.ts.html +0 -730
  145. package/coverage/lcov-report/src/sdk/usage.ts.html +0 -502
  146. package/coverage/lcov-report/src/sdk/verify.ts.html +0 -1027
  147. package/coverage/lcov-report/src/sentry.ts.html +0 -994
  148. package/coverage/lcov-report/src/skill-builder/agentic.ts.html +0 -1063
  149. package/coverage/lcov-report/src/skill-builder/authoring-provider.ts.html +0 -334
  150. package/coverage/lcov-report/src/skill-builder/definition.ts.html +0 -748
  151. package/coverage/lcov-report/src/skill-builder/index.html +0 -236
  152. package/coverage/lcov-report/src/skill-builder/outline-contract.ts.html +0 -400
  153. package/coverage/lcov-report/src/skill-builder/outline-state.ts.html +0 -382
  154. package/coverage/lcov-report/src/skill-builder/outline.ts.html +0 -1402
  155. package/coverage/lcov-report/src/skill-builder/skill-contract.ts.html +0 -382
  156. package/coverage/lcov-report/src/skill-builder/skill-prompts.ts.html +0 -1180
  157. package/coverage/lcov-report/src/skill-builder/skill.ts.html +0 -2398
  158. package/coverage/lcov-report/src/skills/index.html +0 -131
  159. package/coverage/lcov-report/src/skills/loader.ts.html +0 -1693
  160. package/coverage/lcov-report/src/skills/remote.ts.html +0 -1909
  161. package/coverage/lcov-report/src/triggers/index.html +0 -116
  162. package/coverage/lcov-report/src/triggers/matcher.ts.html +0 -841
  163. package/coverage/lcov-report/src/types/index.html +0 -116
  164. package/coverage/lcov-report/src/types/index.ts.html +0 -1240
  165. package/coverage/lcov-report/src/utils/async.ts.html +0 -331
  166. package/coverage/lcov-report/src/utils/exec.ts.html +0 -496
  167. package/coverage/lcov-report/src/utils/index.html +0 -176
  168. package/coverage/lcov-report/src/utils/index.ts.html +0 -313
  169. package/coverage/lcov-report/src/utils/path.ts.html +0 -202
  170. package/coverage/lcov-report/src/utils/version.ts.html +0 -136
  171. package/coverage/lcov.info +0 -19134
@@ -1,1135 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/action/workflow/base.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/action/workflow</a> base.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">57.64% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>49/85</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">42.85% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>18/42</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">81.48% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>22/27</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">58.53% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>48/82</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 medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-neutral">&nbsp;</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-neutral">&nbsp;</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-neutral">&nbsp;</span>
436
- <span class="cline-any cline-neutral">&nbsp;</span>
437
- <span class="cline-any cline-neutral">&nbsp;</span>
438
- <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-yes">1x</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-neutral">&nbsp;</span>
446
- <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-neutral">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-yes">185x</span>
454
- <span class="cline-any cline-yes">185x</span>
455
- <span class="cline-any cline-yes">185x</span>
456
- <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-yes">185x</span>
459
- <span class="cline-any cline-yes">7x</span>
460
- <span class="cline-any cline-yes">7x</span>
461
- <span class="cline-any cline-neutral">&nbsp;</span>
462
- <span class="cline-any cline-yes">178x</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-neutral">&nbsp;</span>
467
- <span class="cline-any cline-neutral">&nbsp;</span>
468
- <span class="cline-any cline-neutral">&nbsp;</span>
469
- <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-neutral">&nbsp;</span>
472
- <span class="cline-any cline-yes">1x</span>
473
- <span class="cline-any cline-neutral">&nbsp;</span>
474
- <span class="cline-any cline-neutral">&nbsp;</span>
475
- <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-no">&nbsp;</span>
478
- <span class="cline-any cline-no">&nbsp;</span>
479
- <span class="cline-any cline-neutral">&nbsp;</span>
480
- <span class="cline-any cline-no">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-neutral">&nbsp;</span>
487
- <span class="cline-any cline-neutral">&nbsp;</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-yes">207x</span>
491
- <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-neutral">&nbsp;</span>
495
- <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-yes">207x</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-neutral">&nbsp;</span>
508
- <span class="cline-any cline-no">&nbsp;</span>
509
- <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-no">&nbsp;</span>
511
- <span class="cline-any cline-neutral">&nbsp;</span>
512
- <span class="cline-any cline-no">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-neutral">&nbsp;</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-no">&nbsp;</span>
523
- <span class="cline-any cline-no">&nbsp;</span>
524
- <span class="cline-any cline-no">&nbsp;</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-no">&nbsp;</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-no">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-neutral">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-yes">24x</span>
561
- <span class="cline-any cline-yes">23x</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-yes">1x</span>
565
- <span class="cline-any cline-yes">1x</span>
566
- <span class="cline-any cline-yes">1x</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-yes">1x</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">1x</span>
572
- <span class="cline-any cline-yes">1x</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">24x</span>
581
- <span class="cline-any cline-yes">27x</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-yes">1x</span>
584
- <span class="cline-any cline-yes">1x</span>
585
- <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-yes">23x</span>
603
- <span class="cline-any cline-yes">26x</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-yes">26x</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-yes">23x</span>
614
- <span class="cline-any cline-yes">23x</span>
615
- <span class="cline-any cline-yes">23x</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-yes">47x</span>
680
- <span class="cline-any cline-yes">47x</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-neutral">&nbsp;</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-yes">48x</span>
692
- <span class="cline-any cline-yes">47x</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">1x</span>
696
- <span class="cline-any cline-yes">48x</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-neutral">&nbsp;</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-yes">47x</span>
711
- <span class="cline-any cline-yes">47x</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-yes">47x</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-yes">16x</span>
737
- <span class="cline-any cline-yes">16x</span>
738
- <span class="cline-any cline-yes">16x</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-yes">44x</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-neutral">&nbsp;</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-yes">16x</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-yes">47x</span>
762
- <span class="cline-any cline-yes">47x</span>
763
- <span class="cline-any cline-yes">47x</span>
764
- <span class="cline-any cline-yes">47x</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
767
- * Workflow Base
768
- *
769
- * Shared infrastructure for PR and schedule workflows.
770
- */
771
- &nbsp;
772
- import { appendFileSync, mkdirSync, writeFileSync } from 'node:fs';
773
- import { tmpdir } from 'node:os';
774
- import { dirname, join, relative } from 'node:path';
775
- import { randomUUID } from 'node:crypto';
776
- import type { Octokit } from '@octokit/rest';
777
- import { execFileNonInteractive } from '../../utils/exec.js';
778
- import { isRepoRelativePath, normalizePath } from '../../utils/path.js';
779
- import type { EventContext, SkillReport } from '../../types/index.js';
780
- import { countSeverity } from '../../triggers/matcher.js';
781
- import type { TriggerResult } from '../triggers/executor.js';
782
- import type { ActionInputs } from '../inputs.js';
783
- &nbsp;
784
- /**
785
- * Sentinel error thrown by setFailed() so the top-level catch handler
786
- * can distinguish expected failures from unexpected crashes.
787
- */
788
- export class ActionFailedError extends Error {
789
- constructor(message: string) {
790
- super(message);
791
- this.name = 'ActionFailedError';
792
- }
793
- }
794
- &nbsp;
795
- // -----------------------------------------------------------------------------
796
- // GitHub Actions Helpers
797
- // -----------------------------------------------------------------------------
798
- &nbsp;
799
- /**
800
- * Set a GitHub Actions output variable.
801
- */
802
- export function setOutput(name: string, value: string | number): void {
803
- const outputFile = process.env['GITHUB_OUTPUT'];
804
- <span class="missing-if-branch" title="else path not taken" >E</span>if (outputFile) {
805
- const stringValue = String(value);
806
- // Use heredoc format with random delimiter for multiline values
807
- // Random delimiter prevents injection if value contains the delimiter
808
- if (stringValue.includes('\n')) {
809
- const delimiter = `ghadelim_${randomUUID()}`;
810
- appendFileSync(outputFile, `${name}&lt;&lt;${delimiter}\n${stringValue}\n${delimiter}\n`);
811
- } else {
812
- appendFileSync(outputFile, `${name}=${stringValue}\n`);
813
- }
814
- }
815
- }
816
- &nbsp;
817
- /**
818
- * Fail the GitHub Action with an error message.
819
- * Throws ActionFailedError so spans end cleanly before the process exits.
820
- */
821
- export function setFailed(message: string): never {
822
- throw new ActionFailedError(message);
823
- }
824
- &nbsp;
825
- /** Validate Claude runtime auth before invoking the Claude Code SDK. */
826
- export function <span class="fstat-no" title="function not covered" >ensureClaudeAuth(i</span>nputs: ActionInputs): void {
827
- <span class="cstat-no" title="statement not covered" > if (inputs.anthropicApiKey || inputs.oauthToken) {</span>
828
- <span class="cstat-no" title="statement not covered" > return;</span>
829
- }
830
- <span class="cstat-no" title="statement not covered" > setFailed(</span>
831
- 'Authentication not found. Provide an API key via anthropic-api-key input, ' +
832
- 'WARDEN_ANTHROPIC_API_KEY env var, or OAuth token via CLAUDE_CODE_OAUTH_TOKEN env var.'
833
- );
834
- }
835
- &nbsp;
836
- /**
837
- * Start a collapsible log group.
838
- */
839
- export function logGroup(name: string): void {
840
- console.log(`::group::${name}`);
841
- }
842
- &nbsp;
843
- /**
844
- * End a collapsible log group.
845
- */
846
- export function logGroupEnd(): void {
847
- console.log('::endgroup::');
848
- }
849
- &nbsp;
850
- // -----------------------------------------------------------------------------
851
- // Claude Code CLI
852
- // -----------------------------------------------------------------------------
853
- &nbsp;
854
- /**
855
- * Test whether a path is an executable file.
856
- */
857
- function <span class="fstat-no" title="function not covered" >isExecutable(p</span>ath: string): boolean {
858
- <span class="cstat-no" title="statement not covered" > try {</span>
859
- <span class="cstat-no" title="statement not covered" > execFileNonInteractive('test', ['-x', path]);</span>
860
- <span class="cstat-no" title="statement not covered" > return true;</span>
861
- } catch {
862
- <span class="cstat-no" title="statement not covered" > return false;</span>
863
- }
864
- }
865
- &nbsp;
866
- /**
867
- * Find the Claude Code CLI executable path.
868
- * Required in CI environments where the SDK can't auto-detect the CLI location.
869
- */
870
- export async function <span class="fstat-no" title="function not covered" >findClaudeCodeExecutable(): Promise&lt;string&gt; {</span>
871
- // Check environment variable first (set by action.yml)
872
- const envPath = <span class="cstat-no" title="statement not covered" >process.env['CLAUDE_CODE_PATH'];</span>
873
- <span class="cstat-no" title="statement not covered" > if (envPath &amp;&amp; isExecutable(envPath)) {</span>
874
- <span class="cstat-no" title="statement not covered" > return envPath;</span>
875
- }
876
- &nbsp;
877
- // Standard install location from claude.ai/install.sh
878
- const homeLocalBin = <span class="cstat-no" title="statement not covered" >`${process.env['HOME']}/.local/bin/claude`;</span>
879
- <span class="cstat-no" title="statement not covered" > if (isExecutable(homeLocalBin)) {</span>
880
- <span class="cstat-no" title="statement not covered" > return homeLocalBin;</span>
881
- }
882
- &nbsp;
883
- // Try which command
884
- <span class="cstat-no" title="statement not covered" > try {</span>
885
- const <span class="cstat-no" title="statement not covered" >path = execFileNonInteractive('which', ['claude']);</span>
886
- <span class="cstat-no" title="statement not covered" > if (path) <span class="cstat-no" title="statement not covered" >return path;</span></span>
887
- } catch {
888
- // which command failed
889
- }
890
- &nbsp;
891
- // Other common installation paths as fallback
892
- const commonPaths = <span class="cstat-no" title="statement not covered" >['/usr/local/bin/claude', '/usr/bin/claude'];</span>
893
- <span class="cstat-no" title="statement not covered" > for (const p of commonPaths) {</span>
894
- <span class="cstat-no" title="statement not covered" > if (isExecutable(p)) <span class="cstat-no" title="statement not covered" >return p;</span></span>
895
- }
896
- &nbsp;
897
- <span class="cstat-no" title="statement not covered" > setFailed(</span>
898
- 'Claude Code CLI not found. Ensure Claude Code is installed via https://claude.ai/install.sh'
899
- );
900
- }
901
- &nbsp;
902
- // -----------------------------------------------------------------------------
903
- // Trigger Error Handling
904
- // -----------------------------------------------------------------------------
905
- &nbsp;
906
- /**
907
- * Log trigger error summary and fail if all triggers failed.
908
- */
909
- export function handleTriggerErrors(triggerErrors: string[], totalTriggers: number): void {
910
- if (triggerErrors.length === 0) {
911
- return;
912
- }
913
- &nbsp;
914
- logGroup('Trigger Errors Summary');
915
- for (const err of triggerErrors) {
916
- console.error(` - ${err}`);
917
- }
918
- logGroupEnd();
919
- &nbsp;
920
- // Fail if ALL triggers failed (no successful analysis was performed)
921
- <span class="missing-if-branch" title="else path not taken" >E</span>if (triggerErrors.length === totalTriggers &amp;&amp; totalTriggers &gt; 0) {
922
- setFailed(`All ${totalTriggers} trigger(s) failed: ${triggerErrors.join('; ')}`);
923
- }
924
- }
925
- &nbsp;
926
- /**
927
- * Collect error messages from trigger results.
928
- */
929
- export function collectTriggerErrors(results: TriggerResult[]): string[] {
930
- return results
931
- .filter((r) =&gt; r.error)
932
- .map((r) =&gt; {
933
- const errorMessage = r.error instanceof Error ? r.error.message : <span class="branch-1 cbranch-no" title="branch not covered" >String(r.error);</span>
934
- return `${r.triggerName}: ${errorMessage}`;
935
- });
936
- }
937
- &nbsp;
938
- // -----------------------------------------------------------------------------
939
- // Output Aggregation
940
- // -----------------------------------------------------------------------------
941
- &nbsp;
942
- export interface WorkflowOutputs {
943
- findingsCount: number;
944
- highCount: number;
945
- summary: string;
946
- }
947
- &nbsp;
948
- /**
949
- * Compute workflow outputs from reports.
950
- */
951
- export function computeWorkflowOutputs(reports: SkillReport[]): WorkflowOutputs {
952
- return {
953
- findingsCount: reports.reduce((sum, r) =&gt; sum + r.findings.length, 0),
954
- highCount: countSeverity(reports, 'high'),
955
- summary: reports.map((r) =&gt; r.summary).join('\n'),
956
- };
957
- }
958
- &nbsp;
959
- /**
960
- * Set workflow output variables.
961
- */
962
- export function setWorkflowOutputs(outputs: WorkflowOutputs): void {
963
- setOutput('findings-count', outputs.findingsCount);
964
- setOutput('high-count', outputs.highCount);
965
- setOutput('summary', outputs.summary);
966
- }
967
- &nbsp;
968
- // -----------------------------------------------------------------------------
969
- // GitHub API Helpers
970
- // -----------------------------------------------------------------------------
971
- &nbsp;
972
- /**
973
- * Get the authenticated bot's login name.
974
- *
975
- * Tries three strategies in order:
976
- * 1. GraphQL `viewer` query (works for both installation tokens and PATs)
977
- * 2. `octokit.apps.getAuthenticated()` → `${slug}[bot]` (GitHub App JWT fallback)
978
- * 3. `octokit.users.getAuthenticated()` (PAT fallback)
979
- */
980
- export async function <span class="fstat-no" title="function not covered" >getAuthenticatedBotLogin(o</span>ctokit: Octokit): Promise&lt;string | null&gt; {
981
- // Strategy 1: GraphQL viewer (works for installation tokens and PATs)
982
- <span class="cstat-no" title="statement not covered" > try {</span>
983
- const result: { viewer: { login: string } } = <span class="cstat-no" title="statement not covered" >await octokit.graphql('query { viewer { login } }');</span>
984
- <span class="cstat-no" title="statement not covered" > if (result.viewer?.login) {</span>
985
- <span class="cstat-no" title="statement not covered" > return result.viewer.login;</span>
986
- }
987
- } catch {
988
- // GraphQL may not be available or may fail for certain token types
989
- }
990
- &nbsp;
991
- // Strategy 2: GitHub App JWT endpoint
992
- <span class="cstat-no" title="statement not covered" > try {</span>
993
- const { data: app } = <span class="cstat-no" title="statement not covered" >await octokit.apps.getAuthenticated();</span>
994
- <span class="cstat-no" title="statement not covered" > if (app?.slug) {</span>
995
- <span class="cstat-no" title="statement not covered" > return `${app.slug}[bot]`;</span>
996
- }
997
- } catch {
998
- // Not a GitHub App token
999
- }
1000
- &nbsp;
1001
- // Strategy 3: PAT user endpoint
1002
- <span class="cstat-no" title="statement not covered" > try {</span>
1003
- const { data: user } = <span class="cstat-no" title="statement not covered" >await octokit.users.getAuthenticated();</span>
1004
- <span class="cstat-no" title="statement not covered" > return user.login;</span>
1005
- } catch {
1006
- // Token doesn't have user scope
1007
- }
1008
- &nbsp;
1009
- <span class="cstat-no" title="statement not covered" > return null;</span>
1010
- }
1011
- &nbsp;
1012
- /**
1013
- * Get the default branch for a repository from the GitHub API.
1014
- */
1015
- export async function <span class="fstat-no" title="function not covered" >getDefaultBranchFromAPI(</span>
1016
- octokit: Octokit,
1017
- owner: string,
1018
- repo: string
1019
- ): Promise&lt;string&gt; {
1020
- const { data } = <span class="cstat-no" title="statement not covered" >await octokit.repos.get({ owner, repo });</span>
1021
- <span class="cstat-no" title="statement not covered" > return data.default_branch;</span>
1022
- }
1023
- &nbsp;
1024
- // -----------------------------------------------------------------------------
1025
- // Findings Output File
1026
- // -----------------------------------------------------------------------------
1027
- &nbsp;
1028
- function getFindingsOutputValue(filePath: string, repoPath: string): string {
1029
- const relativePath = normalizePath(relative(repoPath, filePath));
1030
- return isRepoRelativePath(relativePath) ? relativePath : <span class="branch-1 cbranch-no" title="branch not covered" >filePath;</span>
1031
- }
1032
- &nbsp;
1033
- /**
1034
- * Get the path for the findings output file.
1035
- *
1036
- * Uses the GitHub Actions workspace when available so action consumers can pass
1037
- * the output to upload actions that expect repo-relative paths. Falls back to
1038
- * RUNNER_TEMP for local callers and tests.
1039
- */
1040
- export function getFindingsOutputPath(repoPath?: string): string {
1041
- if (repoPath &amp;&amp; process.env['GITHUB_WORKSPACE']) {
1042
- return join(repoPath, 'warden-findings.json');
1043
- }
1044
- &nbsp;
1045
- const tmpDir = process.env['RUNNER_TEMP'<span class="branch-1 cbranch-no" title="branch not covered" >] ?? tmpdir();</span>
1046
- return join(tmpDir, 'warden-findings.json');
1047
- }
1048
- &nbsp;
1049
- /**
1050
- * Write structured findings data to a JSON file for external export (GCS, S3, etc.).
1051
- *
1052
- * Sets `findings-file` to a repo-relative path when possible so downstream
1053
- * steps can reference the path without tripping ignore processors on absolute
1054
- * runner temp paths.
1055
- */
1056
- export function writeFindingsOutput(
1057
- reports: SkillReport[],
1058
- context: EventContext
1059
- ): string {
1060
- const filePath = getFindingsOutputPath(context.repoPath);
1061
- const allFindings = reports.flatMap((r) =&gt; r.findings);
1062
- &nbsp;
1063
- const output = {
1064
- version: '1',
1065
- timestamp: new Date().toISOString(),
1066
- repository: {
1067
- owner: context.repository.owner,
1068
- name: context.repository.name,
1069
- fullName: context.repository.fullName,
1070
- },
1071
- event: context.eventType,
1072
- ...(context.pullRequest &amp;&amp; {
1073
- pullRequest: {
1074
- number: context.pullRequest.number,
1075
- author: context.pullRequest.author,
1076
- title: context.pullRequest.title,
1077
- baseBranch: context.pullRequest.baseBranch,
1078
- headBranch: context.pullRequest.headBranch,
1079
- headSha: context.pullRequest.headSha,
1080
- },
1081
- }),
1082
- runId: process.env['GITHUB_RUN_ID'] ?? <span class="branch-1 cbranch-no" title="branch not covered" >'',</span>
1083
- summary: {
1084
- totalFindings: allFindings.length,
1085
- findingsBySeverity: {
1086
- high: allFindings.filter((f) =&gt; f.severity === 'high').length,
1087
- medium: allFindings.filter((f) =&gt; f.severity === 'medium').length,
1088
- low: allFindings.filter((f) =&gt; f.severity === 'low').length,
1089
- },
1090
- totalSkills: reports.length,
1091
- },
1092
- skills: reports.map((r) =&gt; ({
1093
- name: r.skill,
1094
- summary: r.summary,
1095
- model: r.model,
1096
- durationMs: r.durationMs,
1097
- usage: r.usage,
1098
- findings: r.findings.map((f) =&gt; ({
1099
- id: f.id,
1100
- severity: f.severity,
1101
- confidence: f.confidence,
1102
- title: f.title,
1103
- description: f.description,
1104
- location: f.location,
1105
- additionalLocations: f.additionalLocations,
1106
- suggestedFix: f.suggestedFix,
1107
- })),
1108
- })),
1109
- };
1110
- &nbsp;
1111
- mkdirSync(dirname(filePath), { recursive: true });
1112
- writeFileSync(filePath, JSON.stringify(output, null, 2));
1113
- setOutput('findings-file', getFindingsOutputValue(filePath, context.repoPath));
1114
- return filePath;
1115
- }
1116
- &nbsp;</pre></td></tr></table></pre>
1117
-
1118
- <div class='push'></div><!-- for sticky footer -->
1119
- </div><!-- /wrapper -->
1120
- <div class='footer quiet pad2 space-top1 center small'>
1121
- Code coverage generated by
1122
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1123
- at 2026-05-17T04:35:52.381Z
1124
- </div>
1125
- <script src="../../../prettify.js"></script>
1126
- <script>
1127
- window.onload = function () {
1128
- prettyPrint();
1129
- };
1130
- </script>
1131
- <script src="../../../sorter.js"></script>
1132
- <script src="../../../block-navigation.js"></script>
1133
- </body>
1134
- </html>
1135
-