claude-flow-novice 2.15.6 → 2.15.7

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 (113) hide show
  1. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
  2. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
  3. package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +87 -0
  4. package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
  5. package/.claude/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
  6. package/.claude/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
  7. package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +199 -0
  8. package/.claude/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
  9. package/.claude/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
  10. package/.claude/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
  11. package/.claude/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
  12. package/.claude/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
  13. package/.claude/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
  14. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
  15. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
  16. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
  17. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
  18. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
  19. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
  20. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
  21. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
  22. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
  23. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
  24. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
  25. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
  26. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
  27. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  28. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
  29. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
  30. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
  31. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
  32. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
  33. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
  34. package/.claude/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
  35. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
  36. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
  37. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
  38. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +13 -72
  39. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +5 -65
  40. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +465 -508
  41. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +733 -743
  42. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +13 -79
  43. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +13 -18
  44. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +13 -18
  45. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +13 -18
  46. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +15 -17
  47. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +15 -17
  48. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +15 -14
  49. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -17
  50. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -17
  51. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +15 -17
  52. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +23 -30
  53. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +13 -18
  54. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +13 -18
  55. package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +312 -317
  56. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +23 -20
  57. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +23 -20
  58. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +23 -20
  59. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +23 -20
  60. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +15 -20
  61. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +15 -20
  62. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +718 -737
  63. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +817 -828
  64. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +15 -20
  65. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +8 -9
  66. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +668 -684
  67. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +15 -20
  68. package/claude-assets/agents/cfn-dev-team/testers/tester.md +248 -253
  69. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +13 -18
  70. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +13 -18
  71. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +13 -18
  72. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
  73. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
  74. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
  75. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
  76. package/claude-assets/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
  77. package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +199 -0
  78. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
  79. package/claude-assets/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
  80. package/claude-assets/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
  81. package/claude-assets/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
  82. package/claude-assets/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
  83. package/claude-assets/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
  84. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
  85. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
  86. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
  87. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
  88. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
  89. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
  90. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
  91. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
  92. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
  93. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
  94. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
  95. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
  96. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
  97. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  98. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
  99. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
  100. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
  101. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
  102. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
  103. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
  104. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
  105. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
  106. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
  107. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
  108. package/dist/agents/agent-loader.js +165 -146
  109. package/dist/agents/agent-loader.js.map +1 -1
  110. package/dist/cli/config-manager.js +91 -109
  111. package/dist/cli/config-manager.js.map +1 -1
  112. package/package.json +1 -1
  113. package/scripts/clean-agent-profiles.sh +112 -0
@@ -0,0 +1,1297 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for task-analyzer.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> task-analyzer.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">64.7% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>77/119</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">45.94% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>34/74</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">75% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>6/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">64.4% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>76/118</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>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&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-yes">1x</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-neutral">&nbsp;</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-neutral">&nbsp;</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-yes">1x</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-yes">9x</span>
510
+ <span class="cline-any cline-yes">9x</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&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-yes">7x</span>
521
+ <span class="cline-any cline-yes">2x</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&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-yes">5x</span>
528
+ <span class="cline-any cline-yes">5x</span>
529
+ <span class="cline-any cline-yes">5x</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-yes">5x</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-yes">5x</span>
535
+ <span class="cline-any cline-yes">5x</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-yes">5x</span>
538
+ <span class="cline-any cline-yes">3x</span>
539
+ <span class="cline-any cline-yes">2x</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-yes">2x</span>
542
+ <span class="cline-any cline-yes">2x</span>
543
+ <span class="cline-any cline-neutral">&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-yes">5x</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-yes">5x</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-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-yes">5x</span>
564
+ <span class="cline-any cline-yes">50x</span>
565
+ <span class="cline-any cline-yes">10x</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-yes">5x</span>
570
+ <span class="cline-any cline-yes">5x</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-yes">5x</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-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-yes">5x</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">5x</span>
595
+ <span class="cline-any cline-yes">50x</span>
596
+ <span class="cline-any cline-yes">1x</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-yes">5x</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-yes">5x</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-yes">5x</span>
607
+ <span class="cline-any cline-yes">5x</span>
608
+ <span class="cline-any cline-yes">3x</span>
609
+ <span class="cline-any cline-yes">2x</span>
610
+ <span class="cline-any cline-no">&nbsp;</span>
611
+ <span class="cline-any cline-yes">2x</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-yes">2x</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">5x</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-yes">5x</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-yes">5x</span>
629
+ <span class="cline-any cline-yes">2x</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-yes">5x</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-yes">5x</span>
637
+ <span class="cline-any cline-yes">2x</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-yes">42x</span>
641
+ <span class="cline-any cline-yes">1x</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-yes">5x</span>
645
+ <span class="cline-any cline-neutral">&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-yes">5x</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-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&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-yes">5x</span>
659
+ <span class="cline-any cline-neutral">&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-yes">5x</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-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-neutral">&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">5x</span>
680
+ <span class="cline-any cline-yes">5x</span>
681
+ <span class="cline-any cline-yes">5x</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-yes">5x</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-yes">3x</span>
687
+ <span class="cline-any cline-yes">3x</span>
688
+ <span class="cline-any cline-yes">3x</span>
689
+ <span class="cline-any cline-yes">3x</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-yes">2x</span>
702
+ <span class="cline-any cline-yes">2x</span>
703
+ <span class="cline-any cline-yes">2x</span>
704
+ <span class="cline-any cline-yes">2x</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-yes">5x</span>
709
+ <span class="cline-any cline-yes">2x</span>
710
+ <span class="cline-any cline-yes">2x</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-yes">5x</span>
715
+ <span class="cline-any cline-no">&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-yes">5x</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-yes">1x</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-yes">1x</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-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-yes">1x</span>
741
+ <span class="cline-any cline-yes">1x</span>
742
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-yes">1x</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-no">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-no">&nbsp;</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-yes">2x</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-yes">2x</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
875
+ * Task Analyzer
876
+ *
877
+ * Analyzes task complexity to determine optimal agent configuration.
878
+ *
879
+ * Migrated from:
880
+ * - analyze-task-complexity.sh (277 lines)
881
+ */
882
+ &nbsp;
883
+ import type {
884
+ TaskId,
885
+ Logger
886
+ } from './types';
887
+ import {
888
+ CoordinationError,
889
+ CoordinationErrorType,
890
+ isValidTaskId
891
+ } from './types';
892
+ import { RedisCoordinator } from './redis-client';
893
+ &nbsp;
894
+ export type DifficultyLevel = 'simple' | 'standard' | 'complex' | 'enterprise';
895
+ &nbsp;
896
+ export interface ComplexityAnalysis {
897
+ taskId?: TaskId;
898
+ taskDescription: string;
899
+ complexityScore: number;
900
+ difficulty: DifficultyLevel;
901
+ domains: string[];
902
+ suggestedAgents: {
903
+ loop3Count: number;
904
+ loop2Count: number;
905
+ estimatedDurationMinutes: number;
906
+ };
907
+ reasoning: string;
908
+ timestamp: string;
909
+ }
910
+ &nbsp;
911
+ export class TaskAnalyzer {
912
+ constructor(
913
+ private redis: RedisCoordinator,
914
+ private logger: Logger
915
+ ) {}
916
+ &nbsp;
917
+ /**
918
+ * Analyze task complexity and suggest agent configuration
919
+ */
920
+ analyzeComplexity(
921
+ taskDescription: string,
922
+ difficulty?: DifficultyLevel
923
+ ): ComplexityAnalysis {
924
+ if (!taskDescription || taskDescription.trim().length === 0) {
925
+ throw new CoordinationError(
926
+ CoordinationErrorType.VALIDATION_ERROR,
927
+ 'Task description cannot be empty'
928
+ );
929
+ }
930
+ &nbsp;
931
+ let complexityScore = 0;
932
+ const detectedDomains: Set&lt;string&gt; = new Set();
933
+ let reasoning = '';
934
+ &nbsp;
935
+ const lowerDescription = taskDescription.toLowerCase();
936
+ &nbsp;
937
+ // 1. Word count analysis
938
+ const wordCount = taskDescription.split(/\s+/).length;
939
+ let wordScore = 0;
940
+ &nbsp;
941
+ if (wordCount &lt; 5) {
942
+ wordScore = 1;
943
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (wordCount &lt; 10) {
944
+ <span class="cstat-no" title="statement not covered" > wordScore = 2;</span>
945
+ } else if (wordCount &lt; 20) {
946
+ wordScore = 3;
947
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>{
948
+ <span class="cstat-no" title="statement not covered" > wordScore = 4;</span>
949
+ }
950
+ &nbsp;
951
+ complexityScore += wordScore;
952
+ &nbsp;
953
+ // 2. Domain detection
954
+ const domainPatterns: Record&lt;string, RegExp&gt; = {
955
+ frontend: /react|frontend|ui|component|dashboard|vue|angular|html|css/i,
956
+ backend: /api|backend|server|endpoint|rest|graphql|service/i,
957
+ database: /database|db|sql|postgres|mongo|redis|cache/i,
958
+ infrastructure: /deploy|infra|docker|k8s|kubernetes|aws|cloud|gcp|azure/i,
959
+ security: /auth|security|encrypt|permission|rbac|oauth|jwt|ssl/i,
960
+ testing: /test|unit|integration|e2e|coverage|mock|stub/i,
961
+ devops: /ci|cd|pipeline|jenkins|github|gitlab|build|release/i,
962
+ machine_learning: /ml|ai|model|predict|train|neural|algorithm/i,
963
+ performance: /performance|optimize|cache|speed|latency|throughput/i,
964
+ migration: /migrate|upgrade|refactor|legacy|deprecat/i
965
+ };
966
+ &nbsp;
967
+ for (const [domain, pattern] of Object.entries(domainPatterns)) {
968
+ if (pattern.test(lowerDescription)) {
969
+ detectedDomains.add(domain);
970
+ }
971
+ }
972
+ &nbsp;
973
+ const domainCount = detectedDomains.size;
974
+ complexityScore += Math.min(domainCount * 2, 10);
975
+ &nbsp;
976
+ // 3. Difficulty keywords
977
+ const difficultyKeywords: Record&lt;DifficultyLevel, RegExp&gt; = {
978
+ simple: /simple|basic|easy|trivial|straightforward|minor|patch/i,
979
+ standard: /implement|add|create|build|update|modify|fix/i,
980
+ complex: /complex|sophisticated|intricate|critical|major|rewrite|redesign/i,
981
+ enterprise: /enterprise|scalability|distributed|fault.?tolerant|multi.?tenant|compliance/i
982
+ };
983
+ &nbsp;
984
+ // 4. Complexity phrases
985
+ const complexPhrases: Record&lt;string, number&gt; = {
986
+ 'multiple components': 3,
987
+ 'distributed system': 4,
988
+ 'real-time': 2,
989
+ 'batch process': 1,
990
+ 'high performance': 3,
991
+ 'high availability': 3,
992
+ 'disaster recovery': 3,
993
+ 'zero downtime': 3,
994
+ 'multi-region': 4,
995
+ 'async': 2
996
+ };
997
+ &nbsp;
998
+ for (const [phrase, score] of Object.entries(complexPhrases)) {
999
+ if (lowerDescription.includes(phrase)) {
1000
+ complexityScore += score;
1001
+ }
1002
+ }
1003
+ &nbsp;
1004
+ // Cap score at 20
1005
+ complexityScore = Math.min(complexityScore, 20);
1006
+ &nbsp;
1007
+ // 5. Determine difficulty level
1008
+ let finalDifficulty: DifficultyLevel = difficulty || 'standard';
1009
+ &nbsp;
1010
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!difficulty) {
1011
+ if (complexityScore &lt;= 4) {
1012
+ finalDifficulty = 'simple';
1013
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (complexityScore &lt;= 9) {
1014
+ <span class="cstat-no" title="statement not covered" > finalDifficulty = 'standard';</span>
1015
+ } else <span class="missing-if-branch" title="if path not taken" >I</span>if (complexityScore &lt;= 12) {
1016
+ <span class="cstat-no" title="statement not covered" > finalDifficulty = 'complex';</span>
1017
+ } else {
1018
+ finalDifficulty = 'enterprise';
1019
+ }
1020
+ }
1021
+ &nbsp;
1022
+ // 6. Suggest agent counts and duration
1023
+ const agentConfig = this.suggestAgentConfiguration(
1024
+ finalDifficulty,
1025
+ domainCount,
1026
+ wordCount
1027
+ );
1028
+ &nbsp;
1029
+ // 7. Build reasoning
1030
+ const reasons: string[] = [];
1031
+ &nbsp;
1032
+ if (domainCount &gt; 1) {
1033
+ reasons.push(`Multi-domain task (${Array.from(detectedDomains).join(', ')})`);
1034
+ }
1035
+ &nbsp;
1036
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (wordCount &gt; 20) {
1037
+ <span class="cstat-no" title="statement not covered" > reasons.push('Long description suggests complex scope');</span>
1038
+ }
1039
+ &nbsp;
1040
+ if (complexityScore &gt;= 10) {
1041
+ reasons.push('High complexity score indicates sophisticated implementation');
1042
+ }
1043
+ &nbsp;
1044
+ if (complexPhrases[Object.keys(complexPhrases).find(phrase =&gt; lowerDescription.includes(phrase)) as string]) {
1045
+ reasons.push('Contains complex architectural patterns');
1046
+ }
1047
+ &nbsp;
1048
+ reasoning = reasons.length &gt; 0
1049
+ ? reasons.join('; ')
1050
+ : `Determined to be ${finalDifficulty} complexity`;
1051
+ &nbsp;
1052
+ const analysis: ComplexityAnalysis = {
1053
+ taskDescription,
1054
+ complexityScore,
1055
+ difficulty: finalDifficulty,
1056
+ domains: Array.from(detectedDomains),
1057
+ suggestedAgents: agentConfig,
1058
+ reasoning,
1059
+ timestamp: new Date().toISOString()
1060
+ };
1061
+ &nbsp;
1062
+ this.logger.info(
1063
+ `📊 Task Analysis: ${finalDifficulty} (score: ${complexityScore}/20), ` +
1064
+ `Domains: ${Array.from(detectedDomains).join(', ')} or 'none'}, ` +
1065
+ `Suggested: ${agentConfig.loop3Count} Loop3 + ${agentConfig.loop2Count} Loop2 agents`
1066
+ );
1067
+ &nbsp;
1068
+ return analysis;
1069
+ }
1070
+ &nbsp;
1071
+ /**
1072
+ * Suggest agent counts based on difficulty and domains
1073
+ */
1074
+ suggestAgentConfiguration(
1075
+ difficulty: DifficultyLevel,
1076
+ domainCount: number,
1077
+ wordCount: number
1078
+ ): {
1079
+ loop3Count: number;
1080
+ loop2Count: number;
1081
+ estimatedDurationMinutes: number;
1082
+ } {
1083
+ let loop3Count = 1;
1084
+ let loop2Count = 1;
1085
+ let duration = 5;
1086
+ &nbsp;
1087
+ // Base counts by difficulty
1088
+ switch (difficulty) {
1089
+ case 'simple':
1090
+ loop3Count = 1;
1091
+ loop2Count = 1;
1092
+ duration = 5;
1093
+ break;
1094
+ <span class="branch-1 cbranch-no" title="branch not covered" > case 'standard':</span>
1095
+ <span class="cstat-no" title="statement not covered" > loop3Count = 2;</span>
1096
+ <span class="cstat-no" title="statement not covered" > loop2Count = 2;</span>
1097
+ <span class="cstat-no" title="statement not covered" > duration = 15;</span>
1098
+ <span class="cstat-no" title="statement not covered" > break;</span>
1099
+ <span class="branch-2 cbranch-no" title="branch not covered" > case 'complex':</span>
1100
+ <span class="cstat-no" title="statement not covered" > loop3Count = 3;</span>
1101
+ <span class="cstat-no" title="statement not covered" > loop2Count = 3;</span>
1102
+ <span class="cstat-no" title="statement not covered" > duration = 30;</span>
1103
+ <span class="cstat-no" title="statement not covered" > break;</span>
1104
+ case 'enterprise':
1105
+ loop3Count = 5;
1106
+ loop2Count = 4;
1107
+ duration = 60;
1108
+ break;
1109
+ }
1110
+ &nbsp;
1111
+ // Adjust for domain count
1112
+ if (domainCount &gt; 1) {
1113
+ loop3Count = Math.min(loop3Count + domainCount - 1, 7);
1114
+ loop2Count = Math.min(loop2Count + 1, 5);
1115
+ }
1116
+ &nbsp;
1117
+ // Adjust for description length
1118
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (wordCount &gt; 50) {
1119
+ <span class="cstat-no" title="statement not covered" > duration += 15;</span>
1120
+ }
1121
+ &nbsp;
1122
+ return {
1123
+ loop3Count,
1124
+ loop2Count,
1125
+ estimatedDurationMinutes: duration
1126
+ };
1127
+ }
1128
+ &nbsp;
1129
+ /**
1130
+ * Calculate priority/score for task scheduling
1131
+ */
1132
+ calculatePriority(analysis: ComplexityAnalysis): number {
1133
+ // Higher complexity = higher priority
1134
+ const baseScore = analysis.complexityScore;
1135
+ &nbsp;
1136
+ // Boost for specific domain combinations
1137
+ const domainBoosts: Record&lt;string, number&gt; = {
1138
+ 'security': 2,
1139
+ 'infrastructure': 1.5,
1140
+ 'machine_learning': 1.5,
1141
+ 'database': 1
1142
+ };
1143
+ &nbsp;
1144
+ let boost = 0;
1145
+ for (const domain of analysis.domains) {
1146
+ boost += domainBoosts[domain] || <span class="branch-1 cbranch-no" title="branch not covered" >0;</span>
1147
+ }
1148
+ &nbsp;
1149
+ const priority = baseScore + boost;
1150
+ &nbsp;
1151
+ return priority;
1152
+ }
1153
+ &nbsp;
1154
+ /**
1155
+ * Store analysis in Redis
1156
+ *
1157
+ * In Task Mode: Logs and returns gracefully
1158
+ * In CLI Mode: Stores in Redis
1159
+ */
1160
+ <span class="fstat-no" title="function not covered" > async </span>storeAnalysis(
1161
+ taskId: TaskId,
1162
+ analysis: ComplexityAnalysis
1163
+ ): Promise&lt;void&gt; {
1164
+ // Validate input
1165
+ <span class="cstat-no" title="statement not covered" > if (!isValidTaskId(taskId)) {</span>
1166
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1167
+ CoordinationErrorType.VALIDATION_ERROR,
1168
+ `Invalid task ID: ${taskId}`
1169
+ );
1170
+ }
1171
+ &nbsp;
1172
+ // Graceful no-op in Task Mode
1173
+ <span class="cstat-no" title="statement not covered" > if (!this.redis.canUseRedis) {</span>
1174
+ <span class="cstat-no" title="statement not covered" > this.logger.info('Task Mode: Task analysis not stored (no Redis)');</span>
1175
+ <span class="cstat-no" title="statement not covered" > return;</span>
1176
+ }
1177
+ &nbsp;
1178
+ // CLI Mode: Store in Redis
1179
+ const key = <span class="cstat-no" title="statement not covered" >`swarm:${taskId}:analysis`;</span>
1180
+ &nbsp;
1181
+ <span class="cstat-no" title="statement not covered" > try {</span>
1182
+ const data: Record&lt;string, string&gt; = <span class="cstat-no" title="statement not covered" >{</span>
1183
+ taskDescription: analysis.taskDescription,
1184
+ complexityScore: String(analysis.complexityScore),
1185
+ difficulty: analysis.difficulty,
1186
+ domains: JSON.stringify(analysis.domains),
1187
+ loop3Count: String(analysis.suggestedAgents.loop3Count),
1188
+ loop2Count: String(analysis.suggestedAgents.loop2Count),
1189
+ estimatedDuration: String(analysis.suggestedAgents.estimatedDurationMinutes),
1190
+ reasoning: analysis.reasoning,
1191
+ timestamp: analysis.timestamp
1192
+ };
1193
+ &nbsp;
1194
+ <span class="cstat-no" title="statement not covered" > await this.redis.hset(key, ...Object.entries(data).flat());</span>
1195
+ &nbsp;
1196
+ // Set TTL (24 hours)
1197
+ <span class="cstat-no" title="statement not covered" > await this.redis.expire(key, 86400);</span>
1198
+ &nbsp;
1199
+ <span class="cstat-no" title="statement not covered" > this.logger.info(`✅ Task analysis stored for: ${taskId}`);</span>
1200
+ } catch (error) {
1201
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to store task analysis', error as Error);</span>
1202
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1203
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1204
+ `Failed to store task analysis: ${(error as Error).message}`
1205
+ );
1206
+ }
1207
+ }
1208
+ &nbsp;
1209
+ /**
1210
+ * Get stored analysis from Redis
1211
+ */
1212
+ <span class="fstat-no" title="function not covered" > async </span>getAnalysis(taskId: TaskId): Promise&lt;ComplexityAnalysis | null&gt; {
1213
+ // Validate input
1214
+ <span class="cstat-no" title="statement not covered" > if (!isValidTaskId(taskId)) {</span>
1215
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1216
+ CoordinationErrorType.VALIDATION_ERROR,
1217
+ `Invalid task ID: ${taskId}`
1218
+ );
1219
+ }
1220
+ &nbsp;
1221
+ // Graceful no-op in Task Mode
1222
+ <span class="cstat-no" title="statement not covered" > if (!this.redis.canUseRedis) {</span>
1223
+ <span class="cstat-no" title="statement not covered" > this.logger.info('Task Mode: No task analysis available in Redis');</span>
1224
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1225
+ }
1226
+ &nbsp;
1227
+ // CLI Mode: Retrieve from Redis
1228
+ const key = <span class="cstat-no" title="statement not covered" >`swarm:${taskId}:analysis`;</span>
1229
+ &nbsp;
1230
+ <span class="cstat-no" title="statement not covered" > try {</span>
1231
+ const data = <span class="cstat-no" title="statement not covered" >await this.redis.hgetall(key);</span>
1232
+ &nbsp;
1233
+ <span class="cstat-no" title="statement not covered" > if (!data || Object.keys(data).length === 0) {</span>
1234
+ <span class="cstat-no" title="statement not covered" > this.logger.warn(`No task analysis found: ${taskId}`);</span>
1235
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1236
+ }
1237
+ &nbsp;
1238
+ const analysis: ComplexityAnalysis = <span class="cstat-no" title="statement not covered" >{</span>
1239
+ taskId,
1240
+ taskDescription: data.taskDescription || '',
1241
+ complexityScore: parseFloat(data.complexityScore || '0'),
1242
+ difficulty: (data.difficulty as DifficultyLevel) || 'standard',
1243
+ domains: data.domains ? JSON.parse(data.domains) : [],
1244
+ suggestedAgents: {
1245
+ loop3Count: parseInt(data.loop3Count || '1', 10),
1246
+ loop2Count: parseInt(data.loop2Count || '1', 10),
1247
+ estimatedDurationMinutes: parseInt(data.estimatedDuration || '15', 10)
1248
+ },
1249
+ reasoning: data.reasoning || '',
1250
+ timestamp: data.timestamp || new Date().toISOString()
1251
+ };
1252
+ &nbsp;
1253
+ <span class="cstat-no" title="statement not covered" > return analysis;</span>
1254
+ } catch (error) {
1255
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to get task analysis', error as Error);</span>
1256
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1257
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1258
+ `Failed to retrieve task analysis: ${(error as Error).message}`
1259
+ );
1260
+ }
1261
+ }
1262
+ &nbsp;
1263
+ /**
1264
+ * Suggest execution mode based on analysis
1265
+ */
1266
+ suggestMode(analysis: ComplexityAnalysis): 'mvp' | 'standard' | 'enterprise' {
1267
+ // Map difficulty to execution mode
1268
+ const modeMap: Record&lt;DifficultyLevel, 'mvp' | 'standard' | 'enterprise'&gt; = {
1269
+ simple: 'mvp',
1270
+ standard: 'standard',
1271
+ complex: 'standard',
1272
+ enterprise: 'enterprise'
1273
+ };
1274
+ &nbsp;
1275
+ return modeMap[analysis.difficulty];
1276
+ }
1277
+ }
1278
+ &nbsp;</pre></td></tr></table></pre>
1279
+
1280
+ <div class='push'></div><!-- for sticky footer -->
1281
+ </div><!-- /wrapper -->
1282
+ <div class='footer quiet pad2 space-top1 center small'>
1283
+ Code coverage generated by
1284
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1285
+ at 2025-11-19T18:59:08.684Z
1286
+ </div>
1287
+ <script src="prettify.js"></script>
1288
+ <script>
1289
+ window.onload = function () {
1290
+ prettyPrint();
1291
+ };
1292
+ </script>
1293
+ <script src="sorter.js"></script>
1294
+ <script src="block-navigation.js"></script>
1295
+ </body>
1296
+ </html>
1297
+