@witty-ai/skill-insight 0.5.0-beta โ†’ 0.7.0-beta

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 (303) hide show
  1. package/.env.example +6 -0
  2. package/.next/standalone/.next/BUILD_ID +1 -1
  3. package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/.next/routes-manifest.json +24 -0
  7. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  8. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +4 -4
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  19. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  24. package/.next/standalone/.next/server/app/api/config/create/route.js +4 -3
  25. package/.next/standalone/.next/server/app/api/config/create/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/config/route.js +5 -4
  27. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/data/route.js +6 -5
  29. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/evaluation/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/otel/v1/logs/route.js +6 -5
  32. package/.next/standalone/.next/server/app/api/otel/v1/logs/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/otel/v1/traces/route.js +4 -3
  34. package/.next/standalone/.next/server/app/api/otel/v1/traces/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/proxy/[taskId]/[...path]/route.js +1 -1
  36. package/.next/standalone/.next/server/app/api/proxy/[taskId]/end/route.js +4 -3
  37. package/.next/standalone/.next/server/app/api/proxy/[taskId]/end/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/rejudge/route.js +6 -5
  39. package/.next/standalone/.next/server/app/api/rejudge/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/session/route.js +4 -4
  41. package/.next/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route/app-paths-manifest.json +3 -0
  43. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route/build-manifest.json +11 -0
  44. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route/server-reference-manifest.json +4 -0
  45. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route.js +6 -0
  46. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route.js.map +5 -0
  47. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route.js.nft.json +1 -0
  48. package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route_client-reference-manifest.js +2 -0
  49. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route/app-paths-manifest.json +3 -0
  50. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route/build-manifest.json +11 -0
  51. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route/server-reference-manifest.json +4 -0
  52. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route.js +6 -0
  53. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route.js.map +5 -0
  54. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route.js.nft.json +1 -0
  55. package/.next/standalone/.next/server/app/api/setup/opencode-tui/route_client-reference-manifest.js +2 -0
  56. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/download/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/route.js +3 -2
  58. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/skills/[id]/versions/route.js +5 -2
  60. package/.next/standalone/.next/server/app/api/skills/[id]/versions/route.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/api/skills/automation/import/route.js +5 -2
  62. package/.next/standalone/.next/server/app/api/skills/automation/import/route.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/api/skills/logs/route.js +6 -5
  64. package/.next/standalone/.next/server/app/api/skills/logs/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/skills/route.js +3 -2
  66. package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route/app-paths-manifest.json +3 -0
  68. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route/build-manifest.json +11 -0
  69. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route/server-reference-manifest.json +4 -0
  70. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js +8 -0
  71. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js.map +5 -0
  72. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js.nft.json +1 -0
  73. package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route_client-reference-manifest.js +2 -0
  74. package/.next/standalone/.next/server/app/api/skills/upload/route.js +5 -2
  75. package/.next/standalone/.next/server/app/api/skills/upload/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/task-stats/route/app-paths-manifest.json +3 -0
  77. package/.next/standalone/.next/server/app/api/task-stats/route/build-manifest.json +11 -0
  78. package/.next/standalone/.next/server/app/api/task-stats/route/server-reference-manifest.json +4 -0
  79. package/.next/standalone/.next/server/app/api/task-stats/route.js +12 -0
  80. package/.next/standalone/.next/server/app/api/task-stats/route.js.map +5 -0
  81. package/.next/standalone/.next/server/app/api/task-stats/route.js.nft.json +1 -0
  82. package/.next/standalone/.next/server/app/api/task-stats/route_client-reference-manifest.js +2 -0
  83. package/.next/standalone/.next/server/app/api/upload/route.js +5 -4
  84. package/.next/standalone/.next/server/app/api/upload/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/details/page/react-loadable-manifest.json +2 -2
  86. package/.next/standalone/.next/server/app/details/page.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/details/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/details.html +1 -1
  89. package/.next/standalone/.next/server/app/details.rsc +5 -5
  90. package/.next/standalone/.next/server/app/details.segments/_full.segment.rsc +5 -5
  91. package/.next/standalone/.next/server/app/details.segments/_head.segment.rsc +1 -1
  92. package/.next/standalone/.next/server/app/details.segments/_index.segment.rsc +3 -3
  93. package/.next/standalone/.next/server/app/details.segments/_tree.segment.rsc +2 -2
  94. package/.next/standalone/.next/server/app/details.segments/details/__PAGE__.segment.rsc +2 -2
  95. package/.next/standalone/.next/server/app/details.segments/details.segment.rsc +1 -1
  96. package/.next/standalone/.next/server/app/index.html +1 -1
  97. package/.next/standalone/.next/server/app/index.rsc +5 -5
  98. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  99. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  100. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  101. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  102. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  103. package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/login.html +1 -1
  106. package/.next/standalone/.next/server/app/login.rsc +5 -5
  107. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +5 -5
  108. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  109. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +3 -3
  110. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  111. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  112. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  113. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/skills/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/skills.html +1 -1
  118. package/.next/standalone/.next/server/app/skills.rsc +5 -5
  119. package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +5 -5
  120. package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  121. package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +3 -3
  122. package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
  123. package/.next/standalone/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +2 -2
  124. package/.next/standalone/.next/server/app/skills.segments/skills.segment.rsc +1 -1
  125. package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
  126. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02ddba88._.js +1 -1
  127. package/.next/standalone/.next/server/chunks/[root-of-the-server]__15dbd1f2._.js +3 -0
  128. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1c95bcde._.js +1 -1
  129. package/.next/standalone/.next/server/chunks/[root-of-the-server]__23efcd78._.js +3 -0
  130. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4a6d443b._.js +1 -1
  131. package/.next/standalone/.next/server/chunks/[root-of-the-server]__53775b48._.js +1 -1
  132. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5444db55._.js +1 -1
  133. package/.next/standalone/.next/server/chunks/[root-of-the-server]__591248f3._.js +1 -1
  134. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5d8178f6._.js +1 -1
  135. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6261d672._.js +3 -0
  136. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6923eecf._.js +1 -1
  137. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6fc12878._.js +1 -1
  138. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8402dfd1._.js +3 -0
  139. package/.next/standalone/.next/server/chunks/[root-of-the-server]__863cf6de._.js +1 -1
  140. package/.next/standalone/.next/server/chunks/[root-of-the-server]__89404730._.js +3 -0
  141. package/.next/standalone/.next/server/chunks/[root-of-the-server]__98b3de5e._.js +1 -1
  142. package/.next/standalone/.next/server/chunks/[root-of-the-server]__9d551ea2._.js +1 -1
  143. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a4d3d791._.js +1 -1
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__aa3d72e3._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__aa5c8858._.js +2 -2
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b11acc79._.js +1 -1
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ba01f286._.js +1 -1
  148. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bd91659b._.js +1 -1
  149. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c200214a._.js +1 -1
  150. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c20da96a._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c602c518._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d7fab946._.js +1 -1
  153. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d8c1808b._.js +1 -1
  154. package/.next/standalone/.next/server/chunks/[root-of-the-server]__d9b9fecc._.js +1 -1
  155. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ddf63a21._.js +3 -0
  156. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e280561d._.js +1 -1
  157. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e550423c._.js +1 -1
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f9e66e02._.js +3 -0
  159. package/.next/standalone/.next/server/chunks/_33c0c729._.js +1 -1
  160. package/.next/standalone/.next/server/chunks/_3e8b4d8c._.js +1 -1
  161. package/.next/standalone/.next/server/chunks/_46f10554._.js +3 -0
  162. package/.next/standalone/.next/server/chunks/_4c806e26._.js +3 -0
  163. package/.next/standalone/.next/server/chunks/_cd3d20ca._.js +1 -1
  164. package/.next/standalone/.next/server/chunks/_ddffef3e._.js +1 -1
  165. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_setup_opencode-tui_route_actions_fc8ae29f.js +3 -0
  166. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_skills_sync-enterprise_route_actions_0ca45899.js +3 -0
  167. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_task-stats_route_actions_983505cd.js +3 -0
  168. package/.next/standalone/.next/server/chunks/ce889_server_app_api_setup_opencode-commands_si-optimizer_route_actions_fcde30ef.js +3 -0
  169. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_c33286ed.js +47 -4
  170. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f42faeee.js +1 -1
  171. package/.next/standalone/.next/server/chunks/src_98433cb8._.js +237 -0
  172. package/.next/standalone/.next/server/chunks/src_c8971a2d._.js +57 -8
  173. package/.next/standalone/.next/server/chunks/src_lib_119f6c7b._.js +3 -0
  174. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__9ab7cc4a._.js โ†’ [root-of-the-server]__082c32a2._.js} +2 -2
  175. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__51073007._.js +1 -1
  176. package/.next/standalone/.next/server/chunks/ssr/_049876f0._.js +1 -1
  177. package/.next/standalone/.next/server/chunks/ssr/_09546b95._.js +1 -1
  178. package/.next/standalone/.next/server/chunks/ssr/_8f5379ab._.js +1 -1
  179. package/.next/standalone/.next/server/chunks/ssr/_c8c8c083._.js +9 -9
  180. package/.next/standalone/.next/server/chunks/ssr/{_b121f1ae._.js โ†’ _e2faf4f5._.js} +2 -2
  181. package/.next/standalone/.next/server/chunks/ssr/_fd46f439._.js +2 -1
  182. package/.next/standalone/.next/server/chunks/ssr/node_modules_dagre-d3-es_src_dagre_index_3582f3d0.js +1 -1
  183. package/.next/standalone/.next/server/chunks/ssr/node_modules_lodash-es_a1341fea._.js +1 -1
  184. package/.next/standalone/.next/server/chunks/ssr/node_modules_lodash-es_e1de6ed8._.js +1 -1
  185. package/.next/standalone/.next/server/chunks/ssr/src_66a70595._.js +1 -1
  186. package/.next/standalone/.next/server/chunks/ssr/src_app_login_page_tsx_72f58654._.js +1 -1
  187. package/.next/standalone/.next/server/pages/404.html +1 -1
  188. package/.next/standalone/.next/server/pages/500.html +2 -2
  189. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  191. package/.next/standalone/.next/static/chunks/{737b8cff3c6a4e30.js โ†’ 015467355d3866a3.js} +1 -1
  192. package/.next/standalone/.next/static/chunks/09f192c9b0609ad8.js +1 -0
  193. package/.next/standalone/.next/static/chunks/1945a5514fbc393c.css +1 -0
  194. package/.next/{static/chunks/07c9f28a269c701a.js โ†’ standalone/.next/static/chunks/361e4cf1e9a71ccb.js} +1 -1
  195. package/.next/{static/chunks/5432ce4a494bc74d.js โ†’ standalone/.next/static/chunks/60bc50374fd32f20.js} +3 -3
  196. package/.next/standalone/.next/static/chunks/{251551dcdf74a60d.js โ†’ 65bac0880a87bff3.js} +1 -1
  197. package/.next/standalone/.next/static/chunks/961f7fa606dd26a8.js +1 -0
  198. package/.next/standalone/.next/static/chunks/bab2ffd4f527acfb.js +1 -0
  199. package/.next/standalone/.next/static/chunks/c513373e5cfedd5b.js +2 -0
  200. package/.next/standalone/.next/static/chunks/ca3017e51e817855.js +1 -0
  201. package/.next/{static/chunks/7e35f4cf2e266022.js โ†’ standalone/.next/static/chunks/cb104c3cb4c52833.js} +1 -1
  202. package/.next/{static/chunks/ff6357067630b168.js โ†’ standalone/.next/static/chunks/e13d208072a48316.js} +1 -1
  203. package/.next/standalone/.next/static/chunks/{e09d9ee16fe90255.js โ†’ f786bb68e17b12b4.js} +1 -1
  204. package/.next/standalone/.next/static/chunks/fc61b990c5ec4ef4.js +109 -0
  205. package/.next/standalone/node_modules/.prisma/client/edge.js +7 -3
  206. package/.next/standalone/node_modules/.prisma/client/index-browser.js +4 -0
  207. package/.next/standalone/node_modules/.prisma/client/index.js +7 -3
  208. package/.next/standalone/node_modules/.prisma/client/package.json +1 -1
  209. package/.next/standalone/node_modules/.prisma/client/schema.prisma +26 -22
  210. package/.next/standalone/node_modules/.prisma/client/wasm.js +4 -0
  211. package/.next/standalone/node_modules/adm-zip/util/constants.js +142 -0
  212. package/.next/standalone/node_modules/adm-zip/util/decoder.js +5 -0
  213. package/.next/standalone/node_modules/adm-zip/util/errors.js +63 -0
  214. package/.next/standalone/node_modules/adm-zip/util/fattr.js +76 -0
  215. package/.next/standalone/node_modules/adm-zip/util/index.js +5 -0
  216. package/.next/standalone/node_modules/adm-zip/util/utils.js +339 -0
  217. package/.next/standalone/package.json +6 -2
  218. package/.next/standalone/prisma/schema.prisma +7 -3
  219. package/.next/standalone/scripts/opencode_plugin.ts +158 -50
  220. package/.next/standalone/scripts/opencode_tui_plugin.tsx +308 -0
  221. package/.next/standalone/scripts/si-optimizer.md +5 -0
  222. package/.next/static/chunks/{737b8cff3c6a4e30.js โ†’ 015467355d3866a3.js} +1 -1
  223. package/.next/static/chunks/09f192c9b0609ad8.js +1 -0
  224. package/.next/static/chunks/1945a5514fbc393c.css +1 -0
  225. package/.next/{standalone/.next/static/chunks/07c9f28a269c701a.js โ†’ static/chunks/361e4cf1e9a71ccb.js} +1 -1
  226. package/.next/{standalone/.next/static/chunks/5432ce4a494bc74d.js โ†’ static/chunks/60bc50374fd32f20.js} +3 -3
  227. package/.next/static/chunks/{251551dcdf74a60d.js โ†’ 65bac0880a87bff3.js} +1 -1
  228. package/.next/static/chunks/961f7fa606dd26a8.js +1 -0
  229. package/.next/static/chunks/bab2ffd4f527acfb.js +1 -0
  230. package/.next/static/chunks/c513373e5cfedd5b.js +2 -0
  231. package/.next/static/chunks/ca3017e51e817855.js +1 -0
  232. package/.next/{standalone/.next/static/chunks/7e35f4cf2e266022.js โ†’ static/chunks/cb104c3cb4c52833.js} +1 -1
  233. package/.next/{standalone/.next/static/chunks/ff6357067630b168.js โ†’ static/chunks/e13d208072a48316.js} +1 -1
  234. package/.next/static/chunks/{e09d9ee16fe90255.js โ†’ f786bb68e17b12b4.js} +1 -1
  235. package/.next/static/chunks/fc61b990c5ec4ef4.js +109 -0
  236. package/package.json +6 -2
  237. package/prisma/schema.prisma +7 -3
  238. package/scripts/activate_telemetry.sh +44 -1
  239. package/scripts/opencode_plugin.ts +158 -50
  240. package/scripts/opencode_tui_plugin.tsx +308 -0
  241. package/scripts/si-optimizer.md +5 -0
  242. package/scripts/utils.js +0 -1
  243. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1013b265._.js +0 -3
  244. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ce5e3b8._.js +0 -3
  245. package/.next/standalone/.next/server/chunks/[root-of-the-server]__6d8053e2._.js +0 -3
  246. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b835ea7f._.js +0 -3
  247. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e2f0baee._.js +0 -3
  248. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fc05579d._.js +0 -3
  249. package/.next/standalone/.next/server/chunks/_41a98bd8._.js +0 -3
  250. package/.next/standalone/.next/server/chunks/src_497d2ad2._.js +0 -175
  251. package/.next/standalone/.next/server/chunks/src_lib_12408140._.js +0 -3
  252. package/.next/standalone/.next/static/chunks/01eddf501c574a44.js +0 -1
  253. package/.next/standalone/.next/static/chunks/1e782a49beaf489c.js +0 -1
  254. package/.next/standalone/.next/static/chunks/4071dbec4cf7e72e.js +0 -109
  255. package/.next/standalone/.next/static/chunks/67bd1a5de2195779.js +0 -1
  256. package/.next/standalone/.next/static/chunks/a87b5e84254095a5.js +0 -1
  257. package/.next/standalone/.next/static/chunks/c6bd2818656b1f20.css +0 -1
  258. package/.next/standalone/.next/static/chunks/dc59a07a8f327b40.js +0 -1
  259. package/.next/standalone/LICENSE +0 -21
  260. package/.next/standalone/bin/cli.js +0 -106
  261. package/.next/standalone/custom-models.example.json +0 -21
  262. package/.next/standalone/eslint.config.mjs +0 -18
  263. package/.next/standalone/features/feature-skill-used-jump-link/design/2026-03-18-skill-used-jump-link-design.md +0 -126
  264. package/.next/standalone/features/feature-skill-used-jump-link/feature.json +0 -32
  265. package/.next/standalone/features/feature-skill-used-jump-link/issue.md +0 -32
  266. package/.next/standalone/features/feature-skill-used-jump-link/plans/2026-03-18-skill-used-jump-link.md +0 -528
  267. package/.next/standalone/next.config.ts +0 -41
  268. package/.next/standalone/scripts/activate_telemetry.sh +0 -159
  269. package/.next/standalone/scripts/create_migration_package.sh +0 -124
  270. package/.next/standalone/scripts/fix_models.js +0 -66
  271. package/.next/standalone/scripts/init_opengauss.py +0 -284
  272. package/.next/standalone/scripts/install.js +0 -273
  273. package/.next/standalone/scripts/logs.js +0 -38
  274. package/.next/standalone/scripts/otel_data/logs.jsonl +0 -12
  275. package/.next/standalone/scripts/otel_data/metrics.jsonl +0 -21
  276. package/.next/standalone/scripts/otel_data/raw_requests.jsonl +0 -8
  277. package/.next/standalone/scripts/otel_data/raw_requests.jsonl.bak +0 -6
  278. package/.next/standalone/scripts/otel_receiver.py +0 -580
  279. package/.next/standalone/scripts/postinstall.js +0 -192
  280. package/.next/standalone/scripts/publish-npm.js +0 -401
  281. package/.next/standalone/scripts/restart.js +0 -26
  282. package/.next/standalone/scripts/restart.sh +0 -138
  283. package/.next/standalone/scripts/restart_dev.sh +0 -132
  284. package/.next/standalone/scripts/start.js +0 -291
  285. package/.next/standalone/scripts/status.js +0 -41
  286. package/.next/standalone/scripts/stop.js +0 -90
  287. package/.next/standalone/scripts/sync_skills.js +0 -216
  288. package/.next/standalone/scripts/utils.js +0 -235
  289. package/.next/standalone/tests/setup_skill_optimizer.sh +0 -118
  290. package/.next/standalone/tsconfig.json +0 -34
  291. package/.next/static/chunks/01eddf501c574a44.js +0 -1
  292. package/.next/static/chunks/1e782a49beaf489c.js +0 -1
  293. package/.next/static/chunks/4071dbec4cf7e72e.js +0 -109
  294. package/.next/static/chunks/67bd1a5de2195779.js +0 -1
  295. package/.next/static/chunks/a87b5e84254095a5.js +0 -1
  296. package/.next/static/chunks/c6bd2818656b1f20.css +0 -1
  297. package/.next/static/chunks/dc59a07a8f327b40.js +0 -1
  298. /package/.next/standalone/.next/static/{H581Rok68JtPV4bAVVH3l โ†’ iKG72t8Hpebb09DcIpKUJ}/_buildManifest.js +0 -0
  299. /package/.next/standalone/.next/static/{H581Rok68JtPV4bAVVH3l โ†’ iKG72t8Hpebb09DcIpKUJ}/_clientMiddlewareManifest.json +0 -0
  300. /package/.next/standalone/.next/static/{H581Rok68JtPV4bAVVH3l โ†’ iKG72t8Hpebb09DcIpKUJ}/_ssgManifest.js +0 -0
  301. /package/.next/static/{H581Rok68JtPV4bAVVH3l โ†’ iKG72t8Hpebb09DcIpKUJ}/_buildManifest.js +0 -0
  302. /package/.next/static/{H581Rok68JtPV4bAVVH3l โ†’ iKG72t8Hpebb09DcIpKUJ}/_clientMiddlewareManifest.json +0 -0
  303. /package/.next/static/{H581Rok68JtPV4bAVVH3l โ†’ iKG72t8Hpebb09DcIpKUJ}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- module.exports=[81176,e=>{"use strict";var t=e.i(47909),n=e.i(74017),i=e.i(60476),s=e.i(59756),o=e.i(61916),r=e.i(74677),l=e.i(69741),a=e.i(16795),c=e.i(87718),h=e.i(95169),p=e.i(47587),S=e.i(66012),d=e.i(70101),_=e.i(26937),u=e.i(10372),E=e.i(93695);e.i(52474);var L=e.i(220),I=e.i(89171);async function w(e){var t,n,i;let s,o,r,l,{searchParams:a}=new URL(e.url),c=a.get("apiKey"),h=a.get("host");if(!c||!h)return new I.NextResponse("Missing required parameters: apiKey and host",{status:400,headers:{"Content-Type":"text/plain"}});let p=e.headers.get("host")||"127.0.0.1:3000",S=e.headers.get("x-forwarded-proto")||"http",d=new URL(e.url).pathname.replace(/\/api\/setup\/auto\/?$/,""),_=`${S}://${p}${d}`;return"windows"==(r=e.headers.get("user-agent")||"",(l=e.headers.get("x-platform")||"")?"windows"===l.toLowerCase()?"windows":"unix":/windows|win32|win64/i.test(r)?"windows":"unix")?(s=["# =============================================================================\n# Skill-insight Auto Setup (Non-Interactive) - PowerShell\n# =============================================================================\n",'$SKILL_INSIGHT_HOST = "'+h+'"','$SKILL_INSIGHT_BASE_URL = "'+_+'"','$SKILL_INSIGHT_API_KEY = "'+c+'"','\nWrite-Host "๐Ÿš€ Fetching Skill-insight telemetry components from $SKILL_INSIGHT_BASE_URL..."\n\n# 1. Setup Directories\n$skillInsightDir = Join-Path $env:USERPROFILE ".skill-insight"\n$skillInsightLogsDir = Join-Path $skillInsightDir "logs"\n$opencodePluginsDir = Join-Path $env:USERPROFILE ".opencode\\plugins"\n$opencodeSkillsDir = Join-Path $env:USERPROFILE ".opencode\\skills"\n$claudeProjectsDir = Join-Path $env:USERPROFILE ".claude\\projects"\n$openclawAgentsDir = Join-Path $env:USERPROFILE ".openclaw\\agents"\n\nNew-Item -ItemType Directory -Force -Path $skillInsightDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $skillInsightLogsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $opencodePluginsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $opencodeSkillsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $claudeProjectsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $openclawAgentsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path ".opencode\\skills" | Out-Null\nWrite-Host "๐Ÿ“‚ Created necessary directories"\n\n# 2. Interactive Framework Selection with inquirer\nWrite-Host ""\n\n$SELECTOR_SCRIPT = Join-Path $skillInsightDir "framework_selector.mjs"\n$SELECTOR_RESULT = Join-Path $skillInsightDir ".selector_result"\n\n# Install inquirer if not already installed\nSet-Location $skillInsightDir\nif (-not (Test-Path "node_modules\\inquirer")) {\n Write-Host "๐Ÿ“ฆ Installing inquirer for interactive selection..."\n npm install inquirer --save 2>$null\n}\n\n$selectorLines = @(\n "import inquirer from \'inquirer\';"\n "import fs from \'fs\';"\n ""\n "const frameworks = ["\n " { name: \'OpenCode\', value: \'opencode\' },"\n " { name: \'Claude Code\', value: \'claude\' },"\n " { name: \'OpenClaw\', value: \'openclaw\' }"\n "];"\n ""\n "async function select() {"\n " console.log(\'\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');"\n " console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'โ•‘ โœจ Skill-insight โœจ โ•‘\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\');"\n " console.log(\'\');"\n " console.log(\'\\x1b[90m%s\\x1b[0m\', \' ๆ็คบ: โ†‘โ†“ ็งปๅŠจ | ็ฉบๆ ผ ้€‰ๆ‹ฉ | a ๅ…จ้€‰ | i ๅ้€‰ | Enter ็กฎ่ฎค\');"\n " console.log(\'\');"\n ""\n " const answers = await inquirer.prompt(["\n " {"\n " type: \'checkbox\',"\n " name: \'frameworks\',"\n " message: \'้›†ๆˆๅˆฐ๏ผš\',"\n " choices: frameworks,"\n " pageSize: 10,"\n " loop: false"\n " }"\n " ]);"\n ""\n " const selected = answers.frameworks;"\n " "\n " if (selected.length > 0) {"\n " console.log(\'\');"\n " console.log(\'\\x1b[32m%s\\x1b[0m\', \'โœ… ๅฐ†ๅฎ‰่ฃ…ไปฅไธ‹็ป„ไปถ:\');"\n " selected.forEach(fw => {"\n " const name = frameworks.find(f => f.value === fw)?.name || fw;"\n " console.log(\'\\x1b[32m%s\\x1b[0m\', \' โ€ข \' + name);"\n " });"\n " console.log(\'\');"\n " } else {"\n " console.log(\'\');"\n " console.log(\'\\x1b[33m%s\\x1b[0m\', \'โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•็ป„ไปถ๏ผŒๅฐ†ไธ่ฟ›่กŒๅฎ‰่ฃ…ใ€‚\');"\n " console.log(\'\');"\n " }"\n ""\n " // Write result to file for PowerShell to read"\n " const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.USERPROFILE + \'\\\\.skill-insight\\\\.selector_result\';"\n " fs.writeFileSync(resultFile, selected.join(\',\'));"\n "}"\n ""\n "select().catch(err => {"\n " console.error(\'Error:\', err);"\n " process.exit(1);"\n "});"\n)\n$selectorContent = $selectorLines -join [char]10\nSet-Content -Path $SELECTOR_SCRIPT -Value $selectorContent -Encoding UTF8\n\n# Run the selector interactively\n$env:SELECTOR_RESULT_FILE = $SELECTOR_RESULT\nSet-Location $skillInsightDir\nnpx -y tsx $SELECTOR_SCRIPT\n\n# Read the selection result from file\nif (Test-Path $SELECTOR_RESULT) {\n $SELECTED_FRAMEWORKS = Get-Content $SELECTOR_RESULT\n Remove-Item $SELECTOR_RESULT -Force\n} else {\n $SELECTED_FRAMEWORKS = ""\n}\n\n# Set installation flags based on selection\n$INSTALL_OPENCODE = $false\n$INSTALL_CLAUDE = $false\n$INSTALL_OPENCLAW = $false\n\nif ($SELECTED_FRAMEWORKS -match "opencode") {\n $INSTALL_OPENCODE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "claude") {\n $INSTALL_CLAUDE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "openclaw") {\n $INSTALL_OPENCLAW = $true\n}\n\n# Exit if nothing selected\nif (-not $INSTALL_OPENCODE -and -not $INSTALL_CLAUDE -and -not $INSTALL_OPENCLAW) {\n Write-Host "โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•ๆก†ๆžถ็ป„ไปถ๏ผŒๅฐ†่ทณ่ฟ‡ๆ’ไปถๅฎ‰่ฃ…ใ€‚"\n Write-Host " ็ปง็ปญๆ‰ง่กŒ้…็ฝฎๆญฅ้ชค..."\n Write-Host ""\n}\n\n# 3. Download Components\nif ($INSTALL_OPENCODE) {\n Write-Host "โฌ Downloading OpenCode Plugin..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -OutFile (Join-Path $opencodePluginsDir "Witty-Skill-Insight.ts")\n}\n\nif ($INSTALL_CLAUDE) {\n Write-Host "โฌ Downloading Claude Code Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/claude-watcher" -OutFile (Join-Path $skillInsightDir "claude_watcher_client.ts")\n}\n\nif ($INSTALL_OPENCLAW) {\n Write-Host "โฌ Downloading OpenClaw Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/openclaw-watcher" -OutFile (Join-Path $skillInsightDir "openclaw_watcher_client.ts")\n}\n\n# 4. Configure ~/.skill-insight/.env (Auto mode - no interaction)\n$SKILL_INSIGHT_CONFIG_FILE = Join-Path $skillInsightDir ".env"\n\nWrite-Host "โš™๏ธ Updating configuration..."\nif (Test-Path $SKILL_INSIGHT_CONFIG_FILE) {\n $existingContent = Get-Content $SKILL_INSIGHT_CONFIG_FILE\n $filteredContent = $existingContent | Where-Object { $_ -notmatch "^SKILL_INSIGHT_HOST=" -and $_ -notmatch "^SKILL_INSIGHT_API_KEY=" }\n Set-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value $filteredContent\n} else {\n New-Item -ItemType File -Path $SKILL_INSIGHT_CONFIG_FILE -Force | Out-Null\n}\nAdd-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value "SKILL_INSIGHT_HOST=$SKILL_INSIGHT_HOST"\nAdd-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value "SKILL_INSIGHT_API_KEY=$SKILL_INSIGHT_API_KEY"\nWrite-Host "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"\nWrite-Host " SKILL_INSIGHT_HOST=$SKILL_INSIGHT_HOST"\nWrite-Host " SKILL_INSIGHT_API_KEY=********"\n\n# 6. Install Watcher Dependencies (only if any watcher is selected)\nif ($INSTALL_CLAUDE -or $INSTALL_OPENCLAW) {\n Write-Host ""\n Write-Host "๐Ÿ“ฆ Installing watcher dependencies..."\n if (Get-Command npm -ErrorAction SilentlyContinue) {\n Set-Location $skillInsightDir\n if (-not (Test-Path "package.json")) {\n \'{"name": "skill-insight-watcher", "version": "1.0.0", "type": "module", "dependencies": {}}\' | Out-File -FilePath "package.json" -Encoding utf8\n }\n npm install chokidar --save 2>$null\n Write-Host "โœ… Dependencies installed"\n } else {\n Write-Host "โš ๏ธ npm not found. Skipping dependency installation."\n }\n}\n\n# 7. Create Watcher Startup/Stop Scripts\n$NEEDS_WATCHER_SCRIPTS = $INSTALL_CLAUDE -or $INSTALL_OPENCLAW\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿ“ Creating watcher management scripts..."\n\n # Claude Watcher Start Script\n if ($INSTALL_CLAUDE) {\n $startClaudeScript = @\'\n# Stop existing watcher if running\nGet-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\n\n# Start watcher in background\n$skillInsightDir = Join-Path $env:USERPROFILE ".skill-insight"\n$logFile = Join-Path $skillInsightDir "logs\\claude_watcher.log"\n$scriptPath = Join-Path $skillInsightDir "claude_watcher_client.ts"\n\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", $scriptPath -NoNewWindow -RedirectStandardOutput $logFile -RedirectStandardError $logFile\nWrite-Host "Claude watcher started"\n\'@\n $startClaudePath = Join-Path $skillInsightDir "start_claude_watcher.ps1"\n Set-Content -Path $startClaudePath -Value $startClaudeScript -Encoding UTF8\n Write-Host "โœ… Claude watcher start script created"\n\n # Claude Watcher Stop Script\n $stopClaudeScript = @\'\nWrite-Host "Stopping Claude watcher..."\nGet-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nWrite-Host "Claude watcher stopped"\n\'@\n $stopClaudePath = Join-Path $skillInsightDir "stop_claude_watcher.ps1"\n Set-Content -Path $stopClaudePath -Value $stopClaudeScript -Encoding UTF8\n Write-Host "โœ… Claude watcher stop script created"\n }\n\n # OpenClaw Watcher Start Script\n if ($INSTALL_OPENCLAW) {\n $startOpenclawScript = @\'\n# Stop existing watcher if running\nGet-Process | Where-Object { $_.CommandLine -like "*openclaw_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\n\n# Start watcher in background\n$skillInsightDir = Join-Path $env:USERPROFILE ".skill-insight"\n$logFile = Join-Path $skillInsightDir "logs\\openclaw_watcher.log"\n$scriptPath = Join-Path $skillInsightDir "openclaw_watcher_client.ts"\n\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", $scriptPath -NoNewWindow -RedirectStandardOutput $logFile -RedirectStandardError $logFile\nWrite-Host "OpenClaw watcher started"\n\'@\n $startOpenclawPath = Join-Path $skillInsightDir "start_openclaw_watcher.ps1"\n Set-Content -Path $startOpenclawPath -Value $startOpenclawScript -Encoding UTF8\n Write-Host "โœ… OpenClaw watcher start script created"\n\n # OpenClaw Watcher Stop Script\n $stopOpenclawScript = @\'\nWrite-Host "Stopping OpenClaw watcher..."\nGet-Process | Where-Object { $_.CommandLine -like "*openclaw_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nWrite-Host "OpenClaw watcher stopped"\n\'@\n $stopOpenclawPath = Join-Path $skillInsightDir "stop_openclaw_watcher.ps1"\n Set-Content -Path $stopOpenclawPath -Value $stopOpenclawScript -Encoding UTF8\n Write-Host "โœ… OpenClaw watcher stop script created"\n }\n\n # Combined Start Script\n $startLines = @()\n $startLines += \'Write-Host "Starting Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) {\n $startLines += \'powershell -File "\' + $skillInsightDir + \'\\start_claude_watcher.ps1"\'\n }\n if ($INSTALL_OPENCLAW) {\n $startLines += \'powershell -File "\' + $skillInsightDir + \'\\start_openclaw_watcher.ps1"\'\n }\n $startLines += \'Write-Host "All watchers started!"\'\n $startLines -join [char]10 | Set-Content -Path (Join-Path $skillInsightDir "start_watchers.ps1") -Encoding UTF8\n Write-Host "โœ… Combined start script created"\n\n # Combined Stop Script\n $stopLines = @()\n $stopLines += \'Write-Host "Stopping Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) {\n $stopLines += \'powershell -File "\' + $skillInsightDir + \'\\stop_claude_watcher.ps1"\'\n }\n if ($INSTALL_OPENCLAW) {\n $stopLines += \'powershell -File "\' + $skillInsightDir + \'\\stop_openclaw_watcher.ps1"\'\n }\n $stopLines += \'Write-Host "All watchers stopped!"\'\n $stopLines -join [char]10 | Set-Content -Path (Join-Path $skillInsightDir "stop_watchers.ps1") -Encoding UTF8\n Write-Host "โœ… Combined stop script created"\n}\n\n# 8. Start Watchers Now\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿš€ Starting telemetry watchers..."\n if (Get-Command npx -ErrorAction SilentlyContinue) {\n & (Join-Path $skillInsightDir "start_watchers.ps1")\n } else {\n Write-Host "โš ๏ธ Node.js (npx) not found. Skipping watcher startup."\n }\n}\n\n# 10. Final Summary\nWrite-Host ""\nWrite-Host "๐ŸŒŸ Skill-Insight Telemetry: READY"\nWrite-Host "------------------------------------------------"\nWrite-Host "Installed Components:"\nif ($INSTALL_OPENCODE) {\n Write-Host " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts"\n}\nif ($INSTALL_CLAUDE) {\n Write-Host " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts"\n}\nif ($INSTALL_OPENCLAW) {\n Write-Host " โœ… OpenClaw Watcher: ~/.skill-insight/openclaw_watcher_client.ts"\n}\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "Watcher Management:"\n Write-Host " Start all: ~/.skill-insight/start_watchers.ps1"\n Write-Host " Stop all: ~/.skill-insight/stop_watchers.ps1"\n if ($INSTALL_CLAUDE) {\n Write-Host " Start Claude: ~/.skill-insight/start_claude_watcher.ps1"\n Write-Host " Stop Claude: ~/.skill-insight/stop_claude_watcher.ps1"\n }\n if ($INSTALL_OPENCLAW) {\n Write-Host " Start OpenClaw: ~/.skill-insight/start_openclaw_watcher.ps1"\n Write-Host " Stop OpenClaw: ~/.skill-insight/stop_openclaw_watcher.ps1"\n }\n Write-Host " Logs: ~/.skill-insight/logs/"\n}\n\nWrite-Host ""\nWrite-Host "Usage:"\nif ($INSTALL_OPENCODE) {\n Write-Host " 1. Run: opencode run \'hello\'"\n}\nif ($INSTALL_CLAUDE) {\n Write-Host " 2. Run: claude (restart terminal first)"\n}\nif ($INSTALL_OPENCLAW) {\n Write-Host " 3. OpenClaw will automatically monitor and upload telemetry"\n}\nWrite-Host "------------------------------------------------"'].join("\n"),new I.NextResponse("\uFEFF"+s,{headers:{"Content-Type":"application/x-powershell; charset=utf-8"}})):(t=_,n=h,i=c,o=`#!/bin/bash
1
+ module.exports=[81176,e=>{"use strict";var t=e.i(47909),n=e.i(74017),i=e.i(60476),s=e.i(59756),o=e.i(61916),l=e.i(74677),a=e.i(69741),r=e.i(16795),c=e.i(87718),h=e.i(95169),p=e.i(47587),S=e.i(66012),_=e.i(70101),d=e.i(26937),u=e.i(10372),I=e.i(93695);e.i(52474);var E=e.i(220),L=e.i(89171);async function g(e){var t,n,i;let s,o,l,a,{searchParams:r}=new URL(e.url),c=r.get("apiKey"),h=r.get("host");if(!c||!h)return new L.NextResponse("Missing required parameters: apiKey and host",{status:400,headers:{"Content-Type":"text/plain"}});let p=e.headers.get("host")||"127.0.0.1:3000",S=e.headers.get("x-forwarded-proto")||"http",_=new URL(e.url).pathname.replace(/\/api\/setup\/auto\/?$/,""),d=`${S}://${p}${_}`;return"windows"==(l=e.headers.get("user-agent")||"",(a=e.headers.get("x-platform")||"")?"windows"===a.toLowerCase()?"windows":"unix":/windows|win32|win64/i.test(l)?"windows":"unix")?(s=["# =============================================================================\n# Skill-insight Auto Setup (Non-Interactive) - PowerShell\n# =============================================================================\n",'$SKILL_INSIGHT_HOST = "'+h+'"','$SKILL_INSIGHT_BASE_URL = "'+d+'"','$SKILL_INSIGHT_API_KEY = "'+c+'"','\nWrite-Host "๐Ÿš€ Fetching Skill-insight telemetry components from $SKILL_INSIGHT_BASE_URL..."\n\n# 1. Setup Directories\n$skillInsightDir = Join-Path $env:USERPROFILE ".skill-insight"\n$skillInsightLogsDir = Join-Path $skillInsightDir "logs"\n$opencodePluginsDir = Join-Path $env:USERPROFILE ".opencode\\plugins"\n$opencodeSkillsDir = Join-Path $env:USERPROFILE ".opencode\\skills"\n$claudeProjectsDir = Join-Path $env:USERPROFILE ".claude\\projects"\n$openclawAgentsDir = Join-Path $env:USERPROFILE ".openclaw\\agents"\n\nNew-Item -ItemType Directory -Force -Path $skillInsightDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $skillInsightLogsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $opencodePluginsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $opencodeSkillsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $claudeProjectsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $openclawAgentsDir | Out-Null\nNew-Item -ItemType Directory -Force -Path ".opencode\\skills" | Out-Null\nWrite-Host "๐Ÿ“‚ Created necessary directories"\n\n# 2. Interactive Framework Selection with inquirer\nWrite-Host ""\n\n$SELECTOR_SCRIPT = Join-Path $skillInsightDir "framework_selector.mjs"\n$SELECTOR_RESULT = Join-Path $skillInsightDir ".selector_result"\n\n# Install inquirer if not already installed\nSet-Location $skillInsightDir\nif (-not (Test-Path "node_modules\\inquirer")) {\n Write-Host "๐Ÿ“ฆ Installing inquirer for interactive selection..."\n npm install inquirer --save 2>$null\n}\n\n$selectorLines = @(\n "import inquirer from \'inquirer\';"\n "import fs from \'fs\';"\n ""\n "const frameworks = ["\n " { name: \'OpenCode\', value: \'opencode\' },"\n " { name: \'Claude Code\', value: \'claude\' },"\n " { name: \'OpenClaw\', value: \'openclaw\' }"\n "];"\n ""\n "async function select() {"\n " console.log(\'\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');"\n " console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'โ•‘ โœจ Skill-insight โœจ โ•‘\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');"\n " console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\');"\n " console.log(\'\');"\n " console.log(\'\\x1b[90m%s\\x1b[0m\', \' ๆ็คบ: โ†‘โ†“ ็งปๅŠจ | ็ฉบๆ ผ ้€‰ๆ‹ฉ | a ๅ…จ้€‰ | i ๅ้€‰ | Enter ็กฎ่ฎค\');"\n " console.log(\'\');"\n ""\n " const answers = await inquirer.prompt(["\n " {"\n " type: \'checkbox\',"\n " name: \'frameworks\',"\n " message: \'้›†ๆˆๅˆฐ๏ผš\',"\n " choices: frameworks,"\n " pageSize: 10,"\n " loop: false"\n " }"\n " ]);"\n ""\n " const selected = answers.frameworks;"\n " "\n " if (selected.length > 0) {"\n " console.log(\'\');"\n " console.log(\'\\x1b[32m%s\\x1b[0m\', \'โœ… ๅฐ†ๅฎ‰่ฃ…ไปฅไธ‹็ป„ไปถ:\');"\n " selected.forEach(fw => {"\n " const name = frameworks.find(f => f.value === fw)?.name || fw;"\n " console.log(\'\\x1b[32m%s\\x1b[0m\', \' โ€ข \' + name);"\n " });"\n " console.log(\'\');"\n " } else {"\n " console.log(\'\');"\n " console.log(\'\\x1b[33m%s\\x1b[0m\', \'โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•็ป„ไปถ๏ผŒๅฐ†ไธ่ฟ›่กŒๅฎ‰่ฃ…ใ€‚\');"\n " console.log(\'\');"\n " }"\n ""\n " // Write result to file for PowerShell to read"\n " const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.USERPROFILE + \'\\\\.skill-insight\\\\.selector_result\';"\n " fs.writeFileSync(resultFile, selected.join(\',\'));"\n "}"\n ""\n "select().catch(err => {"\n " console.error(\'Error:\', err);"\n " process.exit(1);"\n "});"\n)\n$selectorContent = $selectorLines -join [char]10\nSet-Content -Path $SELECTOR_SCRIPT -Value $selectorContent -Encoding UTF8\n\n# Run the selector interactively\n$env:SELECTOR_RESULT_FILE = $SELECTOR_RESULT\nSet-Location $skillInsightDir\nnpx -y tsx $SELECTOR_SCRIPT\n\n# Read the selection result from file\nif (Test-Path $SELECTOR_RESULT) {\n $SELECTED_FRAMEWORKS = Get-Content $SELECTOR_RESULT\n Remove-Item $SELECTOR_RESULT -Force\n} else {\n $SELECTED_FRAMEWORKS = ""\n}\n\n# Set installation flags based on selection\n$INSTALL_OPENCODE = $false\n$INSTALL_CLAUDE = $false\n$INSTALL_OPENCLAW = $false\n\nif ($SELECTED_FRAMEWORKS -match "opencode") {\n $INSTALL_OPENCODE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "claude") {\n $INSTALL_CLAUDE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "openclaw") {\n $INSTALL_OPENCLAW = $true\n}\n\n# Exit if nothing selected\nif (-not $INSTALL_OPENCODE -and -not $INSTALL_CLAUDE -and -not $INSTALL_OPENCLAW) {\n Write-Host "โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•ๆก†ๆžถ็ป„ไปถ๏ผŒๅฐ†่ทณ่ฟ‡ๆ’ไปถๅฎ‰่ฃ…ใ€‚"\n Write-Host " ็ปง็ปญๆ‰ง่กŒ้…็ฝฎๆญฅ้ชค..."\n Write-Host ""\n}\n\n# 3. Download Components\nif ($INSTALL_OPENCODE) {\n Write-Host "โฌ Downloading OpenCode Plugin..."\n $opencodeConfigDir = if ($env:XDG_CONFIG_HOME) { Join-Path $env:XDG_CONFIG_HOME "opencode" } elseif ($env:APPDATA) { Join-Path $env:APPDATA "opencode" } else { Join-Path $homeDir ".config\\opencode" }\n New-Item -ItemType Directory -Path (Join-Path $opencodeConfigDir "plugins") -Force | Out-Null\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -OutFile (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts")\n Copy-Item (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts") (Join-Path $opencodePluginsDir "Witty-Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Write-Host "โฌ Downloading OpenCode TUI Plugin..."\n $tuiPluginPath = Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.tui.tsx"\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/opencode-tui" -OutFile $tuiPluginPath\n Copy-Item $tuiPluginPath (Join-Path $opencodePluginsDir "Witty-Skill-Insight.tui.tsx") -Force -ErrorAction SilentlyContinue\n $tuiConfigFile = Join-Path $opencodeConfigDir "tui.json"\n try {\n $data = @{}\n if (Test-Path $tuiConfigFile) {\n $raw = Get-Content $tuiConfigFile -Raw\n if ($raw -and $raw.Trim()) { $data = $raw | ConvertFrom-Json }\n }\n if (-not $data.plugin) { $data | Add-Member -MemberType NoteProperty -Name plugin -Value @() -Force }\n if ($data.plugin -notcontains $tuiPluginPath) { $data.plugin += $tuiPluginPath }\n $data | ConvertTo-Json -Depth 10 | Set-Content -Path $tuiConfigFile -Encoding UTF8\n } catch {\n Write-Host "โš ๏ธ Failed to patch tui.json for TUI plugin."\n }\n}\n\nif ($INSTALL_CLAUDE) {\n Write-Host "โฌ Downloading Claude Code Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/claude-watcher" -OutFile (Join-Path $skillInsightDir "claude_watcher_client.ts")\n}\n\nif ($INSTALL_OPENCLAW) {\n Write-Host "โฌ Downloading OpenClaw Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/openclaw-watcher" -OutFile (Join-Path $skillInsightDir "openclaw_watcher_client.ts")\n}\n\n# 4. Configure ~/.skill-insight/.env (Auto mode - no interaction)\n$SKILL_INSIGHT_CONFIG_FILE = Join-Path $skillInsightDir ".env"\n\nWrite-Host "โš™๏ธ Updating configuration..."\nif (Test-Path $SKILL_INSIGHT_CONFIG_FILE) {\n $existingContent = Get-Content $SKILL_INSIGHT_CONFIG_FILE\n $existingShow = ($existingContent | Where-Object { $_ -match "^SKILL_INSIGHT_SHOW_TASK_STATS=" } | Select-Object -First 1)\n $showValue = "true"\n if ($existingShow) { $showValue = ($existingShow -split "=", 2)[1] }\n $filteredContent = $existingContent | Where-Object { $_ -notmatch "^SKILL_INSIGHT_HOST=" -and $_ -notmatch "^SKILL_INSIGHT_API_KEY=" -and $_ -notmatch "^SKILL_INSIGHT_SHOW_TASK_STATS=" }\n Set-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value $filteredContent\n} else {\n New-Item -ItemType File -Path $SKILL_INSIGHT_CONFIG_FILE -Force | Out-Null\n $showValue = "true"\n}\nAdd-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value "SKILL_INSIGHT_HOST=$SKILL_INSIGHT_HOST"\nAdd-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value "SKILL_INSIGHT_API_KEY=$SKILL_INSIGHT_API_KEY"\nAdd-Content -Path $SKILL_INSIGHT_CONFIG_FILE -Value "SKILL_INSIGHT_SHOW_TASK_STATS=$showValue"\nWrite-Host "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"\nWrite-Host " SKILL_INSIGHT_HOST=$SKILL_INSIGHT_HOST"\nWrite-Host " SKILL_INSIGHT_API_KEY=********"\n\n# 6. Install Watcher Dependencies (only if any watcher is selected)\nif ($INSTALL_CLAUDE -or $INSTALL_OPENCLAW) {\n Write-Host ""\n Write-Host "๐Ÿ“ฆ Installing watcher dependencies..."\n if (Get-Command npm -ErrorAction SilentlyContinue) {\n Set-Location $skillInsightDir\n if (-not (Test-Path "package.json")) {\n \'{"name": "skill-insight-watcher", "version": "1.0.0", "type": "module", "dependencies": {}}\' | Out-File -FilePath "package.json" -Encoding utf8\n }\n npm install chokidar --save 2>$null\n Write-Host "โœ… Dependencies installed"\n } else {\n Write-Host "โš ๏ธ npm not found. Skipping dependency installation."\n }\n}\n\n# 7. Create Watcher Startup/Stop Scripts\n$NEEDS_WATCHER_SCRIPTS = $INSTALL_CLAUDE -or $INSTALL_OPENCLAW\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿ“ Creating watcher management scripts..."\n\n # Claude Watcher Start Script\n if ($INSTALL_CLAUDE) {\n $startClaudeScript = @\'\n# Stop existing watcher if running\nGet-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\n\n# Start watcher in background\n$skillInsightDir = Join-Path $env:USERPROFILE ".skill-insight"\n$logFile = Join-Path $skillInsightDir "logs\\claude_watcher.log"\n$scriptPath = Join-Path $skillInsightDir "claude_watcher_client.ts"\n\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", $scriptPath -NoNewWindow -RedirectStandardOutput $logFile -RedirectStandardError $logFile\nWrite-Host "Claude watcher started"\n\'@\n $startClaudePath = Join-Path $skillInsightDir "start_claude_watcher.ps1"\n Set-Content -Path $startClaudePath -Value $startClaudeScript -Encoding UTF8\n Write-Host "โœ… Claude watcher start script created"\n\n # Claude Watcher Stop Script\n $stopClaudeScript = @\'\nWrite-Host "Stopping Claude watcher..."\nGet-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nWrite-Host "Claude watcher stopped"\n\'@\n $stopClaudePath = Join-Path $skillInsightDir "stop_claude_watcher.ps1"\n Set-Content -Path $stopClaudePath -Value $stopClaudeScript -Encoding UTF8\n Write-Host "โœ… Claude watcher stop script created"\n }\n\n # OpenClaw Watcher Start Script\n if ($INSTALL_OPENCLAW) {\n $startOpenclawScript = @\'\n# Stop existing watcher if running\nGet-Process | Where-Object { $_.CommandLine -like "*openclaw_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\n\n# Start watcher in background\n$skillInsightDir = Join-Path $env:USERPROFILE ".skill-insight"\n$logFile = Join-Path $skillInsightDir "logs\\openclaw_watcher.log"\n$scriptPath = Join-Path $skillInsightDir "openclaw_watcher_client.ts"\n\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", $scriptPath -NoNewWindow -RedirectStandardOutput $logFile -RedirectStandardError $logFile\nWrite-Host "OpenClaw watcher started"\n\'@\n $startOpenclawPath = Join-Path $skillInsightDir "start_openclaw_watcher.ps1"\n Set-Content -Path $startOpenclawPath -Value $startOpenclawScript -Encoding UTF8\n Write-Host "โœ… OpenClaw watcher start script created"\n\n # OpenClaw Watcher Stop Script\n $stopOpenclawScript = @\'\nWrite-Host "Stopping OpenClaw watcher..."\nGet-Process | Where-Object { $_.CommandLine -like "*openclaw_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nWrite-Host "OpenClaw watcher stopped"\n\'@\n $stopOpenclawPath = Join-Path $skillInsightDir "stop_openclaw_watcher.ps1"\n Set-Content -Path $stopOpenclawPath -Value $stopOpenclawScript -Encoding UTF8\n Write-Host "โœ… OpenClaw watcher stop script created"\n }\n\n # Combined Start Script\n $startLines = @()\n $startLines += \'Write-Host "Starting Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) {\n $startLines += \'powershell -File "\' + $skillInsightDir + \'\\start_claude_watcher.ps1"\'\n }\n if ($INSTALL_OPENCLAW) {\n $startLines += \'powershell -File "\' + $skillInsightDir + \'\\start_openclaw_watcher.ps1"\'\n }\n $startLines += \'Write-Host "All watchers started!"\'\n $startLines -join [char]10 | Set-Content -Path (Join-Path $skillInsightDir "start_watchers.ps1") -Encoding UTF8\n Write-Host "โœ… Combined start script created"\n\n # Combined Stop Script\n $stopLines = @()\n $stopLines += \'Write-Host "Stopping Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) {\n $stopLines += \'powershell -File "\' + $skillInsightDir + \'\\stop_claude_watcher.ps1"\'\n }\n if ($INSTALL_OPENCLAW) {\n $stopLines += \'powershell -File "\' + $skillInsightDir + \'\\stop_openclaw_watcher.ps1"\'\n }\n $stopLines += \'Write-Host "All watchers stopped!"\'\n $stopLines -join [char]10 | Set-Content -Path (Join-Path $skillInsightDir "stop_watchers.ps1") -Encoding UTF8\n Write-Host "โœ… Combined stop script created"\n}\n\n# 8. Start Watchers Now\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿš€ Starting telemetry watchers..."\n if (Get-Command npx -ErrorAction SilentlyContinue) {\n & (Join-Path $skillInsightDir "start_watchers.ps1")\n } else {\n Write-Host "โš ๏ธ Node.js (npx) not found. Skipping watcher startup."\n }\n}\n\n# 10. Final Summary\nWrite-Host ""\nWrite-Host "๐ŸŒŸ Skill-Insight Telemetry: READY"\nWrite-Host "------------------------------------------------"\nWrite-Host "Installed Components:"\nif ($INSTALL_OPENCODE) {\n Write-Host " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts"\n}\nif ($INSTALL_CLAUDE) {\n Write-Host " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts"\n}\nif ($INSTALL_OPENCLAW) {\n Write-Host " โœ… OpenClaw Watcher: ~/.skill-insight/openclaw_watcher_client.ts"\n}\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "Watcher Management:"\n Write-Host " Start all: ~/.skill-insight/start_watchers.ps1"\n Write-Host " Stop all: ~/.skill-insight/stop_watchers.ps1"\n if ($INSTALL_CLAUDE) {\n Write-Host " Start Claude: ~/.skill-insight/start_claude_watcher.ps1"\n Write-Host " Stop Claude: ~/.skill-insight/stop_claude_watcher.ps1"\n }\n if ($INSTALL_OPENCLAW) {\n Write-Host " Start OpenClaw: ~/.skill-insight/start_openclaw_watcher.ps1"\n Write-Host " Stop OpenClaw: ~/.skill-insight/stop_openclaw_watcher.ps1"\n }\n Write-Host " Logs: ~/.skill-insight/logs/"\n}\n\nWrite-Host ""\nWrite-Host "Usage:"\nif ($INSTALL_OPENCODE) {\n Write-Host " 1. Run: opencode run \'hello\'"\n}\nif ($INSTALL_CLAUDE) {\n Write-Host " 2. Run: claude (restart terminal first)"\n}\nif ($INSTALL_OPENCLAW) {\n Write-Host " 3. OpenClaw will automatically monitor and upload telemetry"\n}\nWrite-Host "------------------------------------------------"'].join("\n"),new L.NextResponse("\uFEFF"+s,{headers:{"Content-Type":"application/x-powershell; charset=utf-8"}})):(t=d,n=h,i=c,o=`#!/bin/bash
2
2
  # =============================================================================
3
3
  # Skill-insight Auto Setup (Non-Interactive)
4
4
  # =============================================================================
@@ -128,8 +128,42 @@ fi
128
128
 
129
129
  # 3. Download Components
130
130
  if [ "$INSTALL_OPENCODE" = "true" ]; then
131
+ OPENCODE_CONFIG_DIR="\${XDG_CONFIG_HOME:-$HOME/.config}/opencode"
132
+ mkdir -p "$OPENCODE_CONFIG_DIR/plugins"
131
133
  echo "โฌ Downloading OpenCode Plugin..."
132
- curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -o "$HOME/.opencode/plugins/Witty-Skill-Insight.ts"
134
+ curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts"
135
+ cp "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts" "$HOME/.opencode/plugins/Witty-Skill-Insight.ts" 2>/dev/null || true
136
+ echo "โฌ Installing OpenCode commands..."
137
+ mkdir -p "$OPENCODE_CONFIG_DIR/commands"
138
+ curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode-commands/si-optimizer" -o "$OPENCODE_CONFIG_DIR/commands/si-optimizer.md"
139
+ echo "โฌ Downloading OpenCode TUI Plugin..."
140
+ curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode-tui" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"
141
+ cp "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx" "$HOME/.opencode/plugins/Witty-Skill-Insight.tui.tsx" 2>/dev/null || true
142
+ export TUI_PLUGIN_PATH="$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"
143
+ export TUI_CONFIG_FILE="$OPENCODE_CONFIG_DIR/tui.json"
144
+ if command -v node &> /dev/null; then
145
+ node - <<'NODE'
146
+ const fs = require("fs");
147
+ const path = require("path");
148
+ const file = process.env.TUI_CONFIG_FILE;
149
+ const pluginPath = process.env.TUI_PLUGIN_PATH;
150
+ let data = {};
151
+ try {
152
+ if (fs.existsSync(file)) {
153
+ const text = fs.readFileSync(file, "utf8");
154
+ data = text && text.trim() ? JSON.parse(text) : {};
155
+ }
156
+ } catch {}
157
+ if (!data || typeof data !== "object") data = {};
158
+ const list = Array.isArray(data.plugin) ? data.plugin.slice() : [];
159
+ if (pluginPath && !list.includes(pluginPath)) list.push(pluginPath);
160
+ data.plugin = list;
161
+ fs.mkdirSync(path.dirname(file), { recursive: true });
162
+ fs.writeFileSync(file, JSON.stringify(data, null, 2));
163
+ NODE
164
+ else
165
+ echo "โš ๏ธ node not found; skip TUI plugin config patch."
166
+ fi
133
167
  fi
134
168
 
135
169
  if [ "$INSTALL_CLAUDE" = "true" ]; then
@@ -144,16 +178,24 @@ fi
144
178
 
145
179
  # 4. Configure ~/.skill-insight/.env (Auto mode - no interaction)
146
180
  SKILL_INSIGHT_CONFIG_FILE="$HOME/.skill-insight/.env"
181
+ FINAL_SHOW_TASK_STATS="true"
182
+ if [ -f "$SKILL_INSIGHT_CONFIG_FILE" ]; then
183
+ EXISTING_SHOW_TASK_STATS=$(grep '^SKILL_INSIGHT_SHOW_TASK_STATS=' "$SKILL_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d'=' -f2-)
184
+ if [ -n "$EXISTING_SHOW_TASK_STATS" ]; then
185
+ FINAL_SHOW_TASK_STATS="$EXISTING_SHOW_TASK_STATS"
186
+ fi
187
+ fi
147
188
 
148
189
  echo "โš™๏ธ Updating configuration..."
149
190
  touch "$SKILL_INSIGHT_CONFIG_FILE"
150
191
  if [ -f "$SKILL_INSIGHT_CONFIG_FILE" ]; then
151
192
  cp "$SKILL_INSIGHT_CONFIG_FILE" "\${SKILL_INSIGHT_CONFIG_FILE}.bak"
152
- grep -v "^SKILL_INSIGHT_HOST=" "\${SKILL_INSIGHT_CONFIG_FILE}.bak" | grep -v "^SKILL_INSIGHT_API_KEY=" > "$SKILL_INSIGHT_CONFIG_FILE"
193
+ grep -v "^SKILL_INSIGHT_HOST=" "\${SKILL_INSIGHT_CONFIG_FILE}.bak" | grep -v "^SKILL_INSIGHT_API_KEY=" | grep -v "^SKILL_INSIGHT_SHOW_TASK_STATS=" > "$SKILL_INSIGHT_CONFIG_FILE"
153
194
  rm "\${SKILL_INSIGHT_CONFIG_FILE}.bak"
154
195
  fi
155
196
  echo "SKILL_INSIGHT_HOST=$SKILL_INSIGHT_HOST" >> "$SKILL_INSIGHT_CONFIG_FILE"
156
197
  echo "SKILL_INSIGHT_API_KEY=$SKILL_INSIGHT_API_KEY" >> "$SKILL_INSIGHT_CONFIG_FILE"
198
+ echo "SKILL_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS" >> "$SKILL_INSIGHT_CONFIG_FILE"
157
199
  echo "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"
158
200
  echo " SKILL_INSIGHT_HOST=$SKILL_INSIGHT_HOST"
159
201
  echo " SKILL_INSIGHT_API_KEY=********"
@@ -291,6 +333,7 @@ echo "------------------------------------------------"
291
333
  echo "Installed Components:"
292
334
  if [ "$INSTALL_OPENCODE" = "true" ]; then
293
335
  echo " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts"
336
+ echo " โœ… OpenCode Command: ~/.config/opencode/commands/si-optimizer.md"
294
337
  fi
295
338
  if [ "$INSTALL_CLAUDE" = "true" ]; then
296
339
  echo " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts"
@@ -327,6 +370,6 @@ if [ "$INSTALL_OPENCLAW" = "true" ]; then
327
370
  echo " 3. OpenClaw will automatically monitor and upload telemetry"
328
371
  fi
329
372
  echo "------------------------------------------------"
330
- `,new I.NextResponse(o,{headers:{"Content-Type":"text/x-shellscript"}}))}e.s(["GET",()=>w],87745);var g=e.i(87745);let C=new t.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/setup/auto/route",pathname:"/api/setup/auto",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/setup/auto/route.ts",nextConfigOutput:"standalone",userland:g}),{workAsyncStorage:$,workUnitAsyncStorage:O,serverHooks:T}=C;function f(){return(0,i.patchFetch)({workAsyncStorage:$,workUnitAsyncStorage:O})}async function m(e,t,i){C.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let I="/api/setup/auto/route";I=I.replace(/\/index$/,"")||"/";let w=await C.prepare(e,t,{srcPage:I,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:g,params:$,nextConfig:O,parsedUrl:T,isDraftMode:f,prerenderManifest:m,routerServerContext:N,isOnDemandRevalidate:A,revalidateOnlyGenerated:H,resolvedPathname:R,clientReferenceManifest:k,serverActionsManifest:P}=w,W=(0,l.normalizeAppPath)(I),D=!!(m.dynamicRoutes[W]||m.routes[R]),F=async()=>((null==N?void 0:N.render404)?await N.render404(e,t,T,!1):t.end("This page could not be found"),null);if(D&&!f){let e=!!m.routes[R],t=m.dynamicRoutes[W];if(t&&!1===t.fallback&&!e){if(O.experimental.adapterPath)return await F();throw new E.NoFallbackError}}let x=null;!D||C.isDev||f||(x="/index"===(x=R)?"/":x);let v=!0===C.isDev||!D,b=D&&!v;P&&k&&(0,r.setManifestsSingleton)({page:I,clientReferenceManifest:k,serverActionsManifest:P});let y=e.method||"GET",U=(0,o.getTracer)(),G=U.getActiveScopeSpan(),K={params:$,prerenderManifest:m,renderOpts:{experimental:{authInterrupts:!!O.experimental.authInterrupts},cacheComponents:!!O.cacheComponents,supportsDynamicResponse:v,incrementalCache:(0,s.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:O.cacheLife,waitUntil:i.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,n,i,s)=>C.onRequestError(e,t,i,s,N)},sharedContext:{buildId:g}},M=new a.NodeNextRequest(e),q=new a.NodeNextResponse(t),j=c.NextRequestAdapter.fromNodeNextRequest(M,(0,c.signalFromNodeResponse)(t));try{let r=async e=>C.handle(j,K).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let n=U.getRootSpanAttributes();if(!n)return;if(n.get("next.span_type")!==h.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${n.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=n.get("next.route");if(i){let t=`${y} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":t}),e.updateName(t)}else e.updateName(`${y} ${I}`)}),l=!!(0,s.getRequestMeta)(e,"minimalMode"),a=async s=>{var o,a;let c=async({previousCacheEntry:n})=>{try{if(!l&&A&&H&&!n)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let o=await r(s);e.fetchMetrics=K.renderOpts.fetchMetrics;let a=K.renderOpts.pendingWaitUntil;a&&i.waitUntil&&(i.waitUntil(a),a=void 0);let c=K.renderOpts.collectedTags;if(!D)return await (0,S.sendResponse)(M,q,o,K.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),t=(0,d.toNodeOutgoingHttpHeaders)(o.headers);c&&(t[u.NEXT_CACHE_TAGS_HEADER]=c),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let n=void 0!==K.renderOpts.collectedRevalidate&&!(K.renderOpts.collectedRevalidate>=u.INFINITE_CACHE)&&K.renderOpts.collectedRevalidate,i=void 0===K.renderOpts.collectedExpire||K.renderOpts.collectedExpire>=u.INFINITE_CACHE?void 0:K.renderOpts.collectedExpire;return{value:{kind:L.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:n,expire:i}}}}catch(t){throw(null==n?void 0:n.isStale)&&await C.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:b,isOnDemandRevalidate:A})},!1,N),t}},h=await C.handleResponse({req:e,nextConfig:O,cacheKey:x,routeKind:n.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:m,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:H,responseGenerator:c,waitUntil:i.waitUntil,isMinimalMode:l});if(!D)return null;if((null==h||null==(o=h.value)?void 0:o.kind)!==L.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==h||null==(a=h.value)?void 0:a.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});l||t.setHeader("x-nextjs-cache",A?"REVALIDATED":h.isMiss?"MISS":h.isStale?"STALE":"HIT"),f&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let E=(0,d.fromNodeOutgoingHttpHeaders)(h.value.headers);return l&&D||E.delete(u.NEXT_CACHE_TAGS_HEADER),!h.cacheControl||t.getHeader("Cache-Control")||E.get("Cache-Control")||E.set("Cache-Control",(0,_.getCacheControlHeader)(h.cacheControl)),await (0,S.sendResponse)(M,q,new Response(h.value.body,{headers:E,status:h.value.status||200})),null};G?await a(G):await U.withPropagatedContext(e.headers,()=>U.trace(h.BaseServerSpan.handleRequest,{spanName:`${y} ${I}`,kind:o.SpanKind.SERVER,attributes:{"http.method":y,"http.target":e.url}},a))}catch(t){if(t instanceof E.NoFallbackError||await C.onRequestError(e,t,{routerKind:"App Router",routePath:W,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:b,isOnDemandRevalidate:A})},!1,N),D)throw t;return await (0,S.sendResponse)(M,q,new Response(null,{status:500})),null}}e.s(["handler",()=>m,"patchFetch",()=>f,"routeModule",()=>C,"serverHooks",()=>T,"workAsyncStorage",()=>$,"workUnitAsyncStorage",()=>O],81176)}];
373
+ `,new L.NextResponse(o,{headers:{"Content-Type":"text/x-shellscript"}}))}e.s(["GET",()=>g],87745);var $=e.i(87745);let C=new t.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/setup/auto/route",pathname:"/api/setup/auto",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/setup/auto/route.ts",nextConfigOutput:"standalone",userland:$}),{workAsyncStorage:w,workUnitAsyncStorage:O,serverHooks:T}=C;function f(){return(0,i.patchFetch)({workAsyncStorage:w,workUnitAsyncStorage:O})}async function N(e,t,i){C.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let L="/api/setup/auto/route";L=L.replace(/\/index$/,"")||"/";let g=await C.prepare(e,t,{srcPage:L,multiZoneDraftMode:!1});if(!g)return t.statusCode=400,t.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:$,params:w,nextConfig:O,parsedUrl:T,isDraftMode:f,prerenderManifest:N,routerServerContext:m,isOnDemandRevalidate:A,revalidateOnlyGenerated:H,resolvedPathname:P,clientReferenceManifest:R,serverActionsManifest:k}=g,W=(0,a.normalizeAppPath)(L),D=!!(N.dynamicRoutes[W]||N.routes[P]),F=async()=>((null==m?void 0:m.render404)?await m.render404(e,t,T,!1):t.end("This page could not be found"),null);if(D&&!f){let e=!!N.routes[P],t=N.dynamicRoutes[W];if(t&&!1===t.fallback&&!e){if(O.experimental.adapterPath)return await F();throw new I.NoFallbackError}}let x=null;!D||C.isDev||f||(x="/index"===(x=P)?"/":x);let y=!0===C.isDev||!D,G=D&&!y;k&&R&&(0,l.setManifestsSingleton)({page:L,clientReferenceManifest:R,serverActionsManifest:k});let v=e.method||"GET",b=(0,o.getTracer)(),K=b.getActiveScopeSpan(),U={params:w,prerenderManifest:N,renderOpts:{experimental:{authInterrupts:!!O.experimental.authInterrupts},cacheComponents:!!O.cacheComponents,supportsDynamicResponse:y,incrementalCache:(0,s.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:O.cacheLife,waitUntil:i.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,n,i,s)=>C.onRequestError(e,t,i,s,m)},sharedContext:{buildId:$}},M=new r.NodeNextRequest(e),J=new r.NodeNextResponse(t),q=c.NextRequestAdapter.fromNodeNextRequest(M,(0,c.signalFromNodeResponse)(t));try{let l=async e=>C.handle(q,U).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let n=b.getRootSpanAttributes();if(!n)return;if(n.get("next.span_type")!==h.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${n.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=n.get("next.route");if(i){let t=`${v} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":t}),e.updateName(t)}else e.updateName(`${v} ${L}`)}),a=!!(0,s.getRequestMeta)(e,"minimalMode"),r=async s=>{var o,r;let c=async({previousCacheEntry:n})=>{try{if(!a&&A&&H&&!n)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let o=await l(s);e.fetchMetrics=U.renderOpts.fetchMetrics;let r=U.renderOpts.pendingWaitUntil;r&&i.waitUntil&&(i.waitUntil(r),r=void 0);let c=U.renderOpts.collectedTags;if(!D)return await (0,S.sendResponse)(M,J,o,U.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),t=(0,_.toNodeOutgoingHttpHeaders)(o.headers);c&&(t[u.NEXT_CACHE_TAGS_HEADER]=c),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let n=void 0!==U.renderOpts.collectedRevalidate&&!(U.renderOpts.collectedRevalidate>=u.INFINITE_CACHE)&&U.renderOpts.collectedRevalidate,i=void 0===U.renderOpts.collectedExpire||U.renderOpts.collectedExpire>=u.INFINITE_CACHE?void 0:U.renderOpts.collectedExpire;return{value:{kind:E.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:n,expire:i}}}}catch(t){throw(null==n?void 0:n.isStale)&&await C.onRequestError(e,t,{routerKind:"App Router",routePath:L,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:G,isOnDemandRevalidate:A})},!1,m),t}},h=await C.handleResponse({req:e,nextConfig:O,cacheKey:x,routeKind:n.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:H,responseGenerator:c,waitUntil:i.waitUntil,isMinimalMode:a});if(!D)return null;if((null==h||null==(o=h.value)?void 0:o.kind)!==E.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==h||null==(r=h.value)?void 0:r.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});a||t.setHeader("x-nextjs-cache",A?"REVALIDATED":h.isMiss?"MISS":h.isStale?"STALE":"HIT"),f&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let I=(0,_.fromNodeOutgoingHttpHeaders)(h.value.headers);return a&&D||I.delete(u.NEXT_CACHE_TAGS_HEADER),!h.cacheControl||t.getHeader("Cache-Control")||I.get("Cache-Control")||I.set("Cache-Control",(0,d.getCacheControlHeader)(h.cacheControl)),await (0,S.sendResponse)(M,J,new Response(h.value.body,{headers:I,status:h.value.status||200})),null};K?await r(K):await b.withPropagatedContext(e.headers,()=>b.trace(h.BaseServerSpan.handleRequest,{spanName:`${v} ${L}`,kind:o.SpanKind.SERVER,attributes:{"http.method":v,"http.target":e.url}},r))}catch(t){if(t instanceof I.NoFallbackError||await C.onRequestError(e,t,{routerKind:"App Router",routePath:W,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:G,isOnDemandRevalidate:A})},!1,m),D)throw t;return await (0,S.sendResponse)(M,J,new Response(null,{status:500})),null}}e.s(["handler",()=>N,"patchFetch",()=>f,"routeModule",()=>C,"serverHooks",()=>T,"workAsyncStorage",()=>w,"workUnitAsyncStorage",()=>O],81176)}];
331
374
 
332
375
  //# sourceMappingURL=node_modules_next_dist_esm_build_templates_app-route_c33286ed.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[26984,e=>{"use strict";var n=e.i(47909),t=e.i(74017),i=e.i(60476),s=e.i(59756),o=e.i(61916),l=e.i(74677),r=e.i(69741),a=e.i(16795),c=e.i(87718),h=e.i(95169),S=e.i(47587),_=e.i(66012),I=e.i(70101),E=e.i(26937),L=e.i(10372),d=e.i(93695);e.i(52474);var p=e.i(220),u=e.i(89171);async function T(e){let n,t,i=e.headers.get("x-forwarded-host")||e.headers.get("host")||"127.0.0.1:3000",s=e.headers.get("x-forwarded-proto")||"https";new URL(e.url).pathname.replace(/\/api\/setup\/?$/,"");let o=`${s}://${i}`;if("windows"==(n=e.headers.get("user-agent")||"",(t=e.headers.get("x-platform")||"")?"windows"===t.toLowerCase()?"windows":"unix":n.toLowerCase().includes("windows")?"windows":"unix")){let e=["# =============================================================================\n# Skill-insight One-Click Setup (PowerShell)\n# =============================================================================\n",'$SKILL_INSIGHT_HOST = "'+o+'"','$SKILL_INSIGHT_BASE_URL = "'+o+'"','\nWrite-Host "๐Ÿš€ Fetching Skill-insight telemetry components from $SKILL_INSIGHT_BASE_URL..."\n\n# 1. Setup Directories\n$homeDir = $env:USERPROFILE\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.skill-insight" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.skill-insight\\logs" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.opencode\\plugins" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.opencode\\skills" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.claude\\projects" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.openclaw\\agents" | Out-Null\nNew-Item -ItemType Directory -Force -Path ".opencode\\skills" | Out-Null\nWrite-Host "๐Ÿ“‚ Created necessary directories"\n\n# 2. Interactive Framework Selection with inquirer\nWrite-Host ""\n\n$SELECTOR_SCRIPT = "$homeDir\\.skill-insight\\framework_selector.mjs"\n$SELECTOR_RESULT = "$homeDir\\.skill-insight\\.selector_result"\n\n# Install inquirer if not already installed\nSet-Location "$homeDir\\.skill-insight"\nif (-not (Test-Path "node_modules\\inquirer")) {\n Write-Host "๐Ÿ“ฆ Installing inquirer for interactive selection..."\n npm install inquirer --save 2>$null\n}\n\n$selectorContent = @\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'OpenClaw\', value: \'openclaw\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'โ•‘ โœจ Skill-insight โœจ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' ๆ็คบ: โ†‘โ†“ ็งปๅŠจ | ็ฉบๆ ผ ้€‰ๆ‹ฉ | a ๅ…จ้€‰ | i ๅ้€‰ | Enter ็กฎ่ฎค\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'้›†ๆˆๅˆฐ๏ผš\',\n choices: frameworks,\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'โœ… ๅฐ†ๅฎ‰่ฃ…ไปฅไธ‹็ป„ไปถ:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' โ€ข \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•็ป„ไปถ๏ผŒๅฐ†ไธ่ฟ›่กŒๅฎ‰่ฃ…ใ€‚\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.USERPROFILE + \'\\\\.skill-insight\\\\.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\n\'@\n\nSet-Content -Path $SELECTOR_SCRIPT -Value $selectorContent -Encoding UTF8\n\n# Run the selector interactively\n$env:SELECTOR_RESULT_FILE = $SELECTOR_RESULT\nSet-Location "$homeDir\\.skill-insight"\nnpx -y tsx $SELECTOR_SCRIPT\n\n# Read the selection result from file\nif (Test-Path $SELECTOR_RESULT) {\n $SELECTED_FRAMEWORKS = Get-Content $SELECTOR_RESULT\n Remove-Item $SELECTOR_RESULT -Force\n} else {\n $SELECTED_FRAMEWORKS = ""\n}\n\n# Set installation flags based on selection\n$INSTALL_OPENCODE = $false\n$INSTALL_CLAUDE = $false\n$INSTALL_OPENCLAW = $false\n\nif ($SELECTED_FRAMEWORKS -match "opencode") {\n $INSTALL_OPENCODE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "claude") {\n $INSTALL_CLAUDE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "openclaw") {\n $INSTALL_OPENCLAW = $true\n}\n\n# Exit if nothing selected\nif (-not $INSTALL_OPENCODE -and -not $INSTALL_CLAUDE -and -not $INSTALL_OPENCLAW) {\n Write-Host "โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•ๆก†ๆžถ็ป„ไปถ๏ผŒๅฐ†่ทณ่ฟ‡ๆ’ไปถๅฎ‰่ฃ…ใ€‚"\n Write-Host " ็ปง็ปญๆ‰ง่กŒ้…็ฝฎๆญฅ้ชค..."\n Write-Host ""\n}\n\n# 3. Download Components\nif ($INSTALL_OPENCODE) {\n Write-Host "โฌ Downloading OpenCode Plugin..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -OutFile "$homeDir\\.opencode\\plugins\\Witty-Skill-Insight.ts"\n}\n\nif ($INSTALL_CLAUDE) {\n Write-Host "โฌ Downloading Claude Code Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/claude-watcher" -OutFile "$homeDir\\.skill-insight\\claude_watcher_client.ts"\n}\n\nif ($INSTALL_OPENCLAW) {\n Write-Host "โฌ Downloading OpenClaw Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/openclaw-watcher" -OutFile "$homeDir\\.skill-insight\\openclaw_watcher_client.ts"\n}\n\n# 4. Configure ~/.skill-insight/.env\n$SKILL_INSIGHT_CONFIG_FILE = "$homeDir\\.skill-insight\\.env"\n$EXISTING_KEY = ""\n$EXISTING_HOST = ""\nif (Test-Path $SKILL_INSIGHT_CONFIG_FILE) {\n $content = Get-Content $SKILL_INSIGHT_CONFIG_FILE\n $keyLine = $content | Select-String \'^SKILL_INSIGHT_API_KEY=\' | Select-Object -First 1\n $hostLine = $content | Select-String \'^SKILL_INSIGHT_HOST=\' | Select-Object -First 1\n if ($keyLine) {\n $EXISTING_KEY = $keyLine.Line.Substring(\'SKILL_INSIGHT_API_KEY=\'.Length)\n }\n if ($hostLine) {\n $EXISTING_HOST = $hostLine.Line.Substring(\'SKILL_INSIGHT_HOST=\'.Length)\n }\n}\n\n# -- API Key Logic --\n$FINAL_KEY = $EXISTING_KEY\nif ($EXISTING_KEY) {\n Write-Host "๐Ÿ”‘ Found existing API Key."\n $USE_EXISTING = Read-Host "๐Ÿ‘‰ Use existing key? (y/N, Default: y)"\n if ($USE_EXISTING -match \'^[Nn]$\') {\n $FINAL_KEY = Read-Host "๐Ÿ‘‰ Please enter your NEW API Key"\n }\n} else {\n Write-Host "๐Ÿ”‘ SKILL_INSIGHT_API_KEY is not set."\n $FINAL_KEY = Read-Host "๐Ÿ‘‰ Please enter your API Key"\n}\n\n# -- Host Logic --\n$FINAL_HOST = $SKILL_INSIGHT_HOST\nif ($EXISTING_HOST -and ($EXISTING_HOST -ne $SKILL_INSIGHT_HOST)) {\n Write-Host "๐ŸŒ Current Host in config: $EXISTING_HOST"\n Write-Host "๐ŸŒ New Host detected: $SKILL_INSIGHT_HOST"\n $CHANGE_HOST = Read-Host "๐Ÿ‘‰ Change to new Host? (y/N, Default: y)"\n if ($CHANGE_HOST -match \'^[Nn]$\') {\n $FINAL_HOST = $EXISTING_HOST\n }\n} elseif (-not $EXISTING_HOST) {\n $FINAL_HOST = $SKILL_INSIGHT_HOST\n}\n\nif (-not $FINAL_KEY) {\n Write-Host "โš ๏ธ Warning: No API Key provided. Telemetry upload will fail until you set it in $SKILL_INSIGHT_CONFIG_FILE"\n}\n\nWrite-Host "โš™๏ธ Updating configuration..."\nNew-Item -ItemType File -Path $SKILL_INSIGHT_CONFIG_FILE -Force | Out-Null\nCopy-Item $SKILL_INSIGHT_CONFIG_FILE "$SKILL_INSIGHT_CONFIG_FILE.bak"\n$content = Get-Content "$SKILL_INSIGHT_CONFIG_FILE.bak"\n$content | Where-Object { $_ -notmatch \'^SKILL_INSIGHT_HOST=\' -and $_ -notmatch \'^SKILL_INSIGHT_API_KEY=\' } | Set-Content $SKILL_INSIGHT_CONFIG_FILE\nAdd-Content $SKILL_INSIGHT_CONFIG_FILE "SKILL_INSIGHT_HOST=$FINAL_HOST"\nAdd-Content $SKILL_INSIGHT_CONFIG_FILE "SKILL_INSIGHT_API_KEY=$FINAL_KEY"\nRemove-Item "$SKILL_INSIGHT_CONFIG_FILE.bak" -Force\nWrite-Host "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"\n\n# 6. Install Watcher Dependencies\nif ($INSTALL_CLAUDE -or $INSTALL_OPENCLAW) {\n Write-Host ""\n Write-Host "๐Ÿ“ฆ Installing watcher dependencies..."\n if (Get-Command npm -ErrorAction SilentlyContinue) {\n Set-Location "$homeDir\\.skill-insight"\n if (-not (Test-Path "package.json")) {\n \'{"name": "skill-insight-watcher", "version": "1.0.0", "type": "module", "dependencies": {}}\' | Out-File -FilePath "package.json" -Encoding utf8\n }\n npm install chokidar --save 2>$null\n Write-Host "โœ… Dependencies installed"\n } else {\n Write-Host "โš ๏ธ npm not found. Skipping dependency installation."\n }\n}\n\n# 7. Create Watcher Startup/Stop Scripts\n$NEEDS_WATCHER_SCRIPTS = $false\nif ($INSTALL_CLAUDE -or $INSTALL_OPENCLAW) {\n $NEEDS_WATCHER_SCRIPTS = $true\n}\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿ“ Creating watcher management scripts..."\n\n if ($INSTALL_CLAUDE) {\n $startScript = @\'\npkill -f "claude_watcher_client.ts" 2>/dev/null\nSet-Location "$env:USERPROFILE\\.skill-insight"\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", "$env:USERPROFILE\\.skill-insight\\claude_watcher_client.ts" -RedirectStandardOutput "$env:USERPROFILE\\.skill-insight\\logs\\claude_watcher.log" -RedirectStandardError "$env:USERPROFILE\\.skill-insight\\logs\\claude_watcher_error.log" -NoNewWindow\nWrite-Host "Claude watcher started"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\start_claude_watcher.ps1" -Value $startScript -Encoding UTF8\n\n $stopScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nRemove-Item "$env:USERPROFILE\\.skill-insight\\claude_watcher.pid" -Force -ErrorAction SilentlyContinue\nWrite-Host "Claude watcher stopped"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\stop_claude_watcher.ps1" -Value $stopScript -Encoding UTF8\n }\n\n if ($INSTALL_OPENCLAW) {\n $startScript = @\'\npkill -f "openclaw_watcher_client.ts" 2>/dev/null\nSet-Location "$env:USERPROFILE\\.skill-insight"\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", "$env:USERPROFILE\\.skill-insight\\openclaw_watcher_client.ts" -RedirectStandardOutput "$env:USERPROFILE\\.skill-insight\\logs\\openclaw_watcher.log" -RedirectStandardError "$env:USERPROFILE\\.skill-insight\\logs\\openclaw_watcher_error.log" -NoNewWindow\nWrite-Host "OpenClaw watcher started"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\start_openclaw_watcher.ps1" -Value $startScript -Encoding UTF8\n\n $stopScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*openclaw_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nRemove-Item "$env:USERPROFILE\\.skill-insight\\openclaw_watcher.pid" -Force -ErrorAction SilentlyContinue\nWrite-Host "OpenClaw watcher stopped"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\stop_openclaw_watcher.ps1" -Value $stopScript -Encoding UTF8\n }\n\n $combinedStart = \'Write-Host "Starting Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) { $combinedStart += [char]10 + "& `"$homeDir\\.skill-insight\\start_claude_watcher.ps1`"" }\n if ($INSTALL_OPENCLAW) { $combinedStart += [char]10 + "& `"$homeDir\\.skill-insight\\start_openclaw_watcher.ps1`"" }\n $combinedStart += [char]10 + \'Write-Host "All watchers started!"\'\n Set-Content -Path "$homeDir\\.skill-insight\\start_watchers.ps1" -Value $combinedStart -Encoding UTF8\n\n $combinedStop = \'Write-Host "Stopping Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) { $combinedStop += [char]10 + "& `"$homeDir\\.skill-insight\\stop_claude_watcher.ps1`"" }\n if ($INSTALL_OPENCLAW) { $combinedStop += [char]10 + "& `"$homeDir\\.skill-insight\\stop_openclaw_watcher.ps1`"" }\n $combinedStop += [char]10 + \'Write-Host "All watchers stopped!"\'\n Set-Content -Path "$homeDir\\.skill-insight\\stop_watchers.ps1" -Value $combinedStop -Encoding UTF8\n}\n\n# 8. Start Watchers Now\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿš€ Starting telemetry watchers..."\n if (Get-Command npx -ErrorAction SilentlyContinue) {\n & "$homeDir\\.skill-insight\\start_watchers.ps1"\n } else {\n Write-Host "โš ๏ธ Node.js (npx) not found. Skipping watcher startup."\n }\n}\n\n# 10. Final Summary\nWrite-Host ""\nWrite-Host "๐ŸŒŸ Skill-Insight Telemetry: READY"\nWrite-Host "------------------------------------------------"\nWrite-Host "Installed Components:"\nif ($INSTALL_OPENCODE) { Write-Host " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts" }\nif ($INSTALL_CLAUDE) { Write-Host " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts" }\nif ($INSTALL_OPENCLAW) { Write-Host " โœ… OpenClaw Watcher: ~/.skill-insight/openclaw_watcher_client.ts" }\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "Watcher Management:"\n Write-Host " Start all: ~/.skill-insight/start_watchers.ps1"\n Write-Host " Stop all: ~/.skill-insight/stop_watchers.ps1"\n Write-Host " Logs: ~/.skill-insight/logs/"\n}\n\nWrite-Host ""\nWrite-Host "Usage:"\nif ($INSTALL_OPENCODE) { Write-Host " 1. Run: opencode run \'hello\'" }\nif ($INSTALL_CLAUDE) { Write-Host " 2. Run: claude (restart terminal first)" }\nif ($INSTALL_OPENCLAW) { Write-Host " 3. OpenClaw will automatically monitor and upload telemetry" }\nWrite-Host "------------------------------------------------"'].join("\n");return new u.NextResponse(e,{headers:{"Content-Type":"text/plain; charset=utf-8"}})}{let e=["#!/bin/bash\n# =============================================================================\n# Skill-insight One-Click Setup\n# =============================================================================\n",'SKILL_INSIGHT_HOST="'+o+'"','SKILL_INSIGHT_BASE_URL="'+o+'"','\necho "๐Ÿš€ Fetching Skill-insight telemetry components from $SKILL_INSIGHT_BASE_URL..."\n\n# 1. Setup Directories\nmkdir -p "$HOME/.skill-insight"\nmkdir -p "$HOME/.skill-insight/logs"\nmkdir -p "$HOME/.opencode/plugins"\nmkdir -p "$HOME/.opencode/skills"\nmkdir -p "$HOME/.claude/projects"\nmkdir -p "$HOME/.openclaw/agents"\nmkdir -p ".opencode/skills"\necho "๐Ÿ“‚ Created necessary directories"\n\n# 2. Interactive Framework Selection with inquirer\necho ""\n\nSELECTOR_SCRIPT="$HOME/.skill-insight/framework_selector.mjs"\nSELECTOR_RESULT="$HOME/.skill-insight/.selector_result"\n\n# Install inquirer if not already installed\ncd "$HOME/.skill-insight"\nif [ ! -d "node_modules/inquirer" ]; then\n echo "๐Ÿ“ฆ Installing inquirer for interactive selection..."\n npm install inquirer --save 2>/dev/null\nfi\n\ncat > "$SELECTOR_SCRIPT" << \'SELECTOR_EOF\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'OpenClaw\', value: \'openclaw\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'โ•‘ โœจ Skill-insight โœจ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' ๆ็คบ: โ†‘โ†“ ็งปๅŠจ | ็ฉบๆ ผ ้€‰ๆ‹ฉ | a ๅ…จ้€‰ | i ๅ้€‰ | Enter ็กฎ่ฎค\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'้›†ๆˆๅˆฐ๏ผš\',\n choices: frameworks,\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'โœ… ๅฐ†ๅฎ‰่ฃ…ไปฅไธ‹็ป„ไปถ:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' โ€ข \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•็ป„ไปถ๏ผŒๅฐ†ไธ่ฟ›่กŒๅฎ‰่ฃ…ใ€‚\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.HOME + \'/.skill-insight/.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\nSELECTOR_EOF\n\n# Run the selector interactively from /dev/tty\nexport SELECTOR_RESULT_FILE="$SELECTOR_RESULT"\ncd "$HOME/.skill-insight" && npx -y tsx "$SELECTOR_SCRIPT" < /dev/tty\n\n# Read the selection result from file\nif [ -f "$SELECTOR_RESULT" ]; then\n SELECTED_FRAMEWORKS=$(cat "$SELECTOR_RESULT")\n rm -f "$SELECTOR_RESULT"\nelse\n SELECTED_FRAMEWORKS=""\nfi\n\n# Set installation flags based on selection\nINSTALL_OPENCODE=false\nINSTALL_CLAUDE=false\nINSTALL_OPENCLAW=false\n\nif [[ "$SELECTED_FRAMEWORKS" == *"opencode"* ]]; then\n INSTALL_OPENCODE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"claude"* ]]; then\n INSTALL_CLAUDE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"openclaw"* ]]; then\n INSTALL_OPENCLAW=true\nfi\n\n# Exit if nothing selected\nif [ "$INSTALL_OPENCODE" = "false" ] && [ "$INSTALL_CLAUDE" = "false" ] && [ "$INSTALL_OPENCLAW" = "false" ]; then\n echo "โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•ๆก†ๆžถ็ป„ไปถ๏ผŒๅฐ†่ทณ่ฟ‡ๆ’ไปถๅฎ‰่ฃ…ใ€‚"\n echo " ็ปง็ปญๆ‰ง่กŒ้…็ฝฎๆญฅ้ชค..."\n echo ""\nfi\n\n# 3. Download Components\nif [ "$INSTALL_OPENCODE" = "true" ]; then\n echo "โฌ Downloading OpenCode Plugin..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -o "$HOME/.opencode/plugins/Witty-Skill-Insight.ts"\nfi\n\nif [ "$INSTALL_CLAUDE" = "true" ]; then\n echo "โฌ Downloading Claude Code Watcher..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/claude-watcher" -o "$HOME/.skill-insight/claude_watcher_client.ts"\nfi\n\nif [ "$INSTALL_OPENCLAW" = "true" ]; then\n echo "โฌ Downloading OpenClaw Watcher..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/openclaw-watcher" -o "$HOME/.skill-insight/openclaw_watcher_client.ts"\nfi\n\n# 4. Configure ~/.skill-insight/.env\nSKILL_INSIGHT_CONFIG_FILE="$HOME/.skill-insight/.env"\nEXISTING_KEY=""\nEXISTING_HOST=""\nif [ -f "$SKILL_INSIGHT_CONFIG_FILE" ]; then\n EXISTING_KEY=$(grep \'^SKILL_INSIGHT_API_KEY=\' "$SKILL_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_HOST=$(grep \'^SKILL_INSIGHT_HOST=\' "$SKILL_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\nfi\n\n# -- API Key Logic --\nFINAL_KEY="$EXISTING_KEY"\nif [ -n "$EXISTING_KEY" ]; then\n echo "๐Ÿ”‘ Found existing API Key."\n read -p "๐Ÿ‘‰ Use existing key? (y/N, Default: y): " USE_EXISTING < /dev/tty\n if [[ "$USE_EXISTING" =~ ^[Nn]$ ]]; then\n read -p "๐Ÿ‘‰ Please enter your NEW API Key: " FINAL_KEY < /dev/tty\n fi\nelse\n echo "๐Ÿ”‘ SKILL_INSIGHT_API_KEY is not set."\n read -p "๐Ÿ‘‰ Please enter your API Key: " FINAL_KEY < /dev/tty\nfi\n\n# -- Host Logic --\nFINAL_HOST="$SKILL_INSIGHT_HOST"\nif [ -n "$EXISTING_HOST" ] && [ "$EXISTING_HOST" != "$SKILL_INSIGHT_HOST" ]; then\n echo "๐ŸŒ Current Host in config: $EXISTING_HOST"\n echo "๐ŸŒ New Host detected: $SKILL_INSIGHT_HOST"\n read -p "๐Ÿ‘‰ Change to new Host? (y/N, Default: y): " CHANGE_HOST < /dev/tty\n if [[ "$CHANGE_HOST" =~ ^[Nn]$ ]]; then\n FINAL_HOST="$EXISTING_HOST"\n fi\nelif [ -z "$EXISTING_HOST" ]; then\n FINAL_HOST="$SKILL_INSIGHT_HOST"\nfi\n\nif [ -z "$FINAL_KEY" ]; then\n echo "โš ๏ธ Warning: No API Key provided. Telemetry upload will fail until you set it in $SKILL_INSIGHT_CONFIG_FILE"\nfi\n\necho "โš™๏ธ Updating configuration..."\ntouch "$SKILL_INSIGHT_CONFIG_FILE"\ncp "$SKILL_INSIGHT_CONFIG_FILE" "${SKILL_INSIGHT_CONFIG_FILE}.bak"\ngrep -v "^SKILL_INSIGHT_HOST=" "${SKILL_INSIGHT_CONFIG_FILE}.bak" | grep -v "^SKILL_INSIGHT_API_KEY=" > "$SKILL_INSIGHT_CONFIG_FILE"\necho "SKILL_INSIGHT_HOST=$FINAL_HOST" >> "$SKILL_INSIGHT_CONFIG_FILE"\necho "SKILL_INSIGHT_API_KEY=$FINAL_KEY" >> "$SKILL_INSIGHT_CONFIG_FILE"\nrm "${SKILL_INSIGHT_CONFIG_FILE}.bak"\necho "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"\n\n# 6. Install Watcher Dependencies\nif [ "$INSTALL_CLAUDE" = "true" ] || [ "$INSTALL_OPENCLAW" = "true" ]; then\n echo ""\n echo "๐Ÿ“ฆ Installing watcher dependencies..."\n if command -v npm &> /dev/null; then\n cd "$HOME/.skill-insight"\n if [ ! -f "package.json" ]; then\n echo \'{"name": "skill-insight-watcher", "version": "1.0.0", "type": "module", "dependencies": {}}\' > package.json\n fi\n npm install chokidar --save 2>/dev/null\n echo "โœ… Dependencies installed"\n else\n echo "โš ๏ธ npm not found. Skipping dependency installation."\n fi\nfi\n\n# 7. Create Watcher Startup/Stop Scripts\nNEEDS_WATCHER_SCRIPTS=false\nif [ "$INSTALL_CLAUDE" = "true" ] || [ "$INSTALL_OPENCLAW" = "true" ]; then\n NEEDS_WATCHER_SCRIPTS=true\nfi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "๐Ÿ“ Creating watcher management scripts..."\n\n if [ "$INSTALL_CLAUDE" = "true" ]; then\n cat > "$HOME/.skill-insight/start_claude_watcher.sh" << \'WATCHER_EOF\'\n#!/bin/bash\npkill -f "claude_watcher_client.ts" 2>/dev/null\ncd "$HOME/.skill-insight" && nohup npx -y tsx "$HOME/.skill-insight/claude_watcher_client.ts" > "$HOME/.skill-insight/logs/claude_watcher.log" 2>&1 &\necho $! > "$HOME/.skill-insight/claude_watcher.pid"\necho "Claude watcher started with PID $(cat $HOME/.skill-insight/claude_watcher.pid)"\nWATCHER_EOF\n chmod +x "$HOME/.skill-insight/start_claude_watcher.sh"\n\n cat > "$HOME/.skill-insight/stop_claude_watcher.sh" << \'STOP_CLAUDE_EOF\'\n#!/bin/bash\npkill -f "claude_watcher_client.ts" 2>/dev/null\nrm -f "$HOME/.skill-insight/claude_watcher.pid"\necho "Claude watcher stopped"\nSTOP_CLAUDE_EOF\n chmod +x "$HOME/.skill-insight/stop_claude_watcher.sh"\n fi\n\n if [ "$INSTALL_OPENCLAW" = "true" ]; then\n cat > "$HOME/.skill-insight/start_openclaw_watcher.sh" << \'WATCHER_EOF\'\n#!/bin/bash\npkill -f "openclaw_watcher_client.ts" 2>/dev/null\ncd "$HOME/.skill-insight" && nohup npx -y tsx "$HOME/.skill-insight/openclaw_watcher_client.ts" > "$HOME/.skill-insight/logs/openclaw_watcher.log" 2>&1 &\necho $! > "$HOME/.skill-insight/openclaw_watcher.pid"\necho "OpenClaw watcher started with PID $(cat $HOME/.skill-insight/openclaw_watcher.pid)"\nWATCHER_EOF\n chmod +x "$HOME/.skill-insight/start_openclaw_watcher.sh"\n\n cat > "$HOME/.skill-insight/stop_openclaw_watcher.sh" << \'STOP_OPENCLAW_EOF\'\n#!/bin/bash\npkill -f "openclaw_watcher_client.ts" 2>/dev/null\nrm -f "$HOME/.skill-insight/openclaw_watcher.pid"\necho "OpenClaw watcher stopped"\nSTOP_OPENCLAW_EOF\n chmod +x "$HOME/.skill-insight/stop_openclaw_watcher.sh"\n fi\n\n cat > "$HOME/.skill-insight/start_watchers.sh" << \'WATCHER_HEADER\'\n#!/bin/bash\necho "Starting Skill-Insight watchers..."\nWATCHER_HEADER\n if [ "$INSTALL_CLAUDE" = "true" ]; then echo \'"$HOME/.skill-insight/start_claude_watcher.sh"\' >> "$HOME/.skill-insight/start_watchers.sh"; fi\n if [ "$INSTALL_OPENCLAW" = "true" ]; then echo \'"$HOME/.skill-insight/start_openclaw_watcher.sh"\' >> "$HOME/.skill-insight/start_watchers.sh"; fi\n echo \'echo "All watchers started!"\' >> "$HOME/.skill-insight/start_watchers.sh"\n chmod +x "$HOME/.skill-insight/start_watchers.sh"\n\n cat > "$HOME/.skill-insight/stop_watchers.sh" << \'STOP_HEADER\'\n#!/bin/bash\necho "Stopping Skill-Insight watchers..."\nSTOP_HEADER\n if [ "$INSTALL_CLAUDE" = "true" ]; then echo \'"$HOME/.skill-insight/stop_claude_watcher.sh"\' >> "$HOME/.skill-insight/stop_watchers.sh"; fi\n if [ "$INSTALL_OPENCLAW" = "true" ]; then echo \'"$HOME/.skill-insight/stop_openclaw_watcher.sh"\' >> "$HOME/.skill-insight/stop_watchers.sh"; fi\n echo \'echo "All watchers stopped!"\' >> "$HOME/.skill-insight/stop_watchers.sh"\n chmod +x "$HOME/.skill-insight/stop_watchers.sh"\nfi\n\n# 8. Start Watchers Now\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "๐Ÿš€ Starting telemetry watchers..."\n if command -v npx &> /dev/null; then\n "$HOME/.skill-insight/start_watchers.sh"\n else\n echo "โš ๏ธ Node.js (npx) not found. Skipping watcher startup."\n fi\nfi\n\n# 10. Final Summary\necho ""\necho "๐ŸŒŸ Skill-Insight Telemetry: READY"\necho "------------------------------------------------"\necho "Installed Components:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts"; fi\nif [ "$INSTALL_OPENCLAW" = "true" ]; then echo " โœ… OpenClaw Watcher: ~/.skill-insight/openclaw_watcher_client.ts"; fi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "Watcher Management:"\n echo " Start all: ~/.skill-insight/start_watchers.sh"\n echo " Stop all: ~/.skill-insight/stop_watchers.sh"\n echo " Logs: ~/.skill-insight/logs/"\nfi\n\necho ""\necho "Usage:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " 1. Run: opencode run \'hello\'"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " 2. Run: claude (restart terminal first)"; fi\nif [ "$INSTALL_OPENCLAW" = "true" ]; then echo " 3. OpenClaw will automatically monitor and upload telemetry"; fi\necho "------------------------------------------------"'].join("\n");return new u.NextResponse(e,{headers:{"Content-Type":"text/x-shellscript"}})}}e.s(["GET",()=>T],21965);var $=e.i(21965);let N=new n.AppRouteRouteModule({definition:{kind:t.RouteKind.APP_ROUTE,page:"/api/setup/route",pathname:"/api/setup",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/setup/route.ts",nextConfigOutput:"standalone",userland:$}),{workAsyncStorage:g,workUnitAsyncStorage:O,serverHooks:C}=N;function m(){return(0,i.patchFetch)({workAsyncStorage:g,workUnitAsyncStorage:O})}async function w(e,n,i){N.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let u="/api/setup/route";u=u.replace(/\/index$/,"")||"/";let T=await N.prepare(e,n,{srcPage:u,multiZoneDraftMode:!1});if(!T)return n.statusCode=400,n.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:$,params:g,nextConfig:O,parsedUrl:C,isDraftMode:m,prerenderManifest:w,routerServerContext:H,isOnDemandRevalidate:f,revalidateOnlyGenerated:A,resolvedPathname:R,clientReferenceManifest:k,serverActionsManifest:F}=T,P=(0,r.normalizeAppPath)(u),W=!!(w.dynamicRoutes[P]||w.routes[R]),G=async()=>((null==H?void 0:H.render404)?await H.render404(e,n,C,!1):n.end("This page could not be found"),null);if(W&&!m){let e=!!w.routes[R],n=w.dynamicRoutes[P];if(n&&!1===n.fallback&&!e){if(O.experimental.adapterPath)return await G();throw new d.NoFallbackError}}let D=null;!W||N.isDev||m||(D="/index"===(D=R)?"/":D);let y=!0===N.isDev||!W,K=W&&!y;F&&k&&(0,l.setManifestsSingleton)({page:u,clientReferenceManifest:k,serverActionsManifest:F});let v=e.method||"GET",x=(0,o.getTracer)(),b=x.getActiveScopeSpan(),U={params:g,prerenderManifest:w,renderOpts:{experimental:{authInterrupts:!!O.experimental.authInterrupts},cacheComponents:!!O.cacheComponents,supportsDynamicResponse:y,incrementalCache:(0,s.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:O.cacheLife,waitUntil:i.waitUntil,onClose:e=>{n.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(n,t,i,s)=>N.onRequestError(e,n,i,s,H)},sharedContext:{buildId:$}},M=new a.NodeNextRequest(e),q=new a.NodeNextResponse(n),X=c.NextRequestAdapter.fromNodeNextRequest(M,(0,c.signalFromNodeResponse)(n));try{let l=async e=>N.handle(X,U).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":n.statusCode,"next.rsc":!1});let t=x.getRootSpanAttributes();if(!t)return;if(t.get("next.span_type")!==h.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${t.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=t.get("next.route");if(i){let n=`${v} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":n}),e.updateName(n)}else e.updateName(`${v} ${u}`)}),r=!!(0,s.getRequestMeta)(e,"minimalMode"),a=async s=>{var o,a;let c=async({previousCacheEntry:t})=>{try{if(!r&&f&&A&&!t)return n.statusCode=404,n.setHeader("x-nextjs-cache","REVALIDATED"),n.end("This page could not be found"),null;let o=await l(s);e.fetchMetrics=U.renderOpts.fetchMetrics;let a=U.renderOpts.pendingWaitUntil;a&&i.waitUntil&&(i.waitUntil(a),a=void 0);let c=U.renderOpts.collectedTags;if(!W)return await (0,_.sendResponse)(M,q,o,U.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),n=(0,I.toNodeOutgoingHttpHeaders)(o.headers);c&&(n[L.NEXT_CACHE_TAGS_HEADER]=c),!n["content-type"]&&e.type&&(n["content-type"]=e.type);let t=void 0!==U.renderOpts.collectedRevalidate&&!(U.renderOpts.collectedRevalidate>=L.INFINITE_CACHE)&&U.renderOpts.collectedRevalidate,i=void 0===U.renderOpts.collectedExpire||U.renderOpts.collectedExpire>=L.INFINITE_CACHE?void 0:U.renderOpts.collectedExpire;return{value:{kind:p.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:n},cacheControl:{revalidate:t,expire:i}}}}catch(n){throw(null==t?void 0:t.isStale)&&await N.onRequestError(e,n,{routerKind:"App Router",routePath:u,routeType:"route",revalidateReason:(0,S.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:f})},!1,H),n}},h=await N.handleResponse({req:e,nextConfig:O,cacheKey:D,routeKind:t.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:w,isRoutePPREnabled:!1,isOnDemandRevalidate:f,revalidateOnlyGenerated:A,responseGenerator:c,waitUntil:i.waitUntil,isMinimalMode:r});if(!W)return null;if((null==h||null==(o=h.value)?void 0:o.kind)!==p.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==h||null==(a=h.value)?void 0:a.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});r||n.setHeader("x-nextjs-cache",f?"REVALIDATED":h.isMiss?"MISS":h.isStale?"STALE":"HIT"),m&&n.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,I.fromNodeOutgoingHttpHeaders)(h.value.headers);return r&&W||d.delete(L.NEXT_CACHE_TAGS_HEADER),!h.cacheControl||n.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,E.getCacheControlHeader)(h.cacheControl)),await (0,_.sendResponse)(M,q,new Response(h.value.body,{headers:d,status:h.value.status||200})),null};b?await a(b):await x.withPropagatedContext(e.headers,()=>x.trace(h.BaseServerSpan.handleRequest,{spanName:`${v} ${u}`,kind:o.SpanKind.SERVER,attributes:{"http.method":v,"http.target":e.url}},a))}catch(n){if(n instanceof d.NoFallbackError||await N.onRequestError(e,n,{routerKind:"App Router",routePath:P,routeType:"route",revalidateReason:(0,S.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:f})},!1,H),W)throw n;return await (0,_.sendResponse)(M,q,new Response(null,{status:500})),null}}e.s(["handler",()=>w,"patchFetch",()=>m,"routeModule",()=>N,"serverHooks",()=>C,"workAsyncStorage",()=>g,"workUnitAsyncStorage",()=>O],26984)}];
1
+ module.exports=[26984,e=>{"use strict";var n=e.i(47909),t=e.i(74017),i=e.i(60476),o=e.i(59756),s=e.i(61916),l=e.i(74677),r=e.i(69741),a=e.i(16795),c=e.i(87718),S=e.i(95169),_=e.i(47587),I=e.i(66012),h=e.i(70101),E=e.i(26937),d=e.i(10372),p=e.i(93695);e.i(52474);var L=e.i(220),u=e.i(89171);async function T(e){let n,t,i=e.headers.get("x-forwarded-host")||e.headers.get("host")||"127.0.0.1:3000",o=e.headers.get("x-forwarded-proto")||"https";new URL(e.url).pathname.replace(/\/api\/setup\/?$/,"");let s=`${o}://${i}`;if("windows"==(n=e.headers.get("user-agent")||"",(t=e.headers.get("x-platform")||"")?"windows"===t.toLowerCase()?"windows":"unix":n.toLowerCase().includes("windows")?"windows":"unix")){let e=["# =============================================================================\n# Skill-insight One-Click Setup (PowerShell)\n# =============================================================================\n",'$SKILL_INSIGHT_HOST = "'+s+'"','$SKILL_INSIGHT_BASE_URL = "'+s+'"','\nWrite-Host "๐Ÿš€ Fetching Skill-insight telemetry components from $SKILL_INSIGHT_BASE_URL..."\n\n# 1. Setup Directories\n$homeDir = $env:USERPROFILE\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.skill-insight" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.skill-insight\\logs" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.opencode\\plugins" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.opencode\\skills" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.claude\\projects" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.openclaw\\agents" | Out-Null\nNew-Item -ItemType Directory -Force -Path ".opencode\\skills" | Out-Null\nWrite-Host "๐Ÿ“‚ Created necessary directories"\n\n# 2. Interactive Framework Selection with inquirer\nWrite-Host ""\n\n$SELECTOR_SCRIPT = "$homeDir\\.skill-insight\\framework_selector.mjs"\n$SELECTOR_RESULT = "$homeDir\\.skill-insight\\.selector_result"\n\n# Install inquirer if not already installed\nSet-Location "$homeDir\\.skill-insight"\nif (-not (Test-Path "node_modules\\inquirer")) {\n Write-Host "๐Ÿ“ฆ Installing inquirer for interactive selection..."\n npm install inquirer --save 2>$null\n}\n\n$selectorContent = @\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'OpenClaw\', value: \'openclaw\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'โ•‘ โœจ Skill-insight โœจ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' ๆ็คบ: โ†‘โ†“ ็งปๅŠจ | ็ฉบๆ ผ ้€‰ๆ‹ฉ | a ๅ…จ้€‰ | i ๅ้€‰ | Enter ็กฎ่ฎค\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'้›†ๆˆๅˆฐ๏ผš\',\n choices: frameworks,\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'โœ… ๅฐ†ๅฎ‰่ฃ…ไปฅไธ‹็ป„ไปถ:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' โ€ข \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•็ป„ไปถ๏ผŒๅฐ†ไธ่ฟ›่กŒๅฎ‰่ฃ…ใ€‚\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.USERPROFILE + \'\\\\.skill-insight\\\\.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\n\'@\n\nSet-Content -Path $SELECTOR_SCRIPT -Value $selectorContent -Encoding UTF8\n\n# Run the selector interactively\n$env:SELECTOR_RESULT_FILE = $SELECTOR_RESULT\nSet-Location "$homeDir\\.skill-insight"\nnpx -y tsx $SELECTOR_SCRIPT\n\n# Read the selection result from file\nif (Test-Path $SELECTOR_RESULT) {\n $SELECTED_FRAMEWORKS = Get-Content $SELECTOR_RESULT\n Remove-Item $SELECTOR_RESULT -Force\n} else {\n $SELECTED_FRAMEWORKS = ""\n}\n\n# Set installation flags based on selection\n$INSTALL_OPENCODE = $false\n$INSTALL_CLAUDE = $false\n$INSTALL_OPENCLAW = $false\n\nif ($SELECTED_FRAMEWORKS -match "opencode") {\n $INSTALL_OPENCODE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "claude") {\n $INSTALL_CLAUDE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "openclaw") {\n $INSTALL_OPENCLAW = $true\n}\n\n# Exit if nothing selected\nif (-not $INSTALL_OPENCODE -and -not $INSTALL_CLAUDE -and -not $INSTALL_OPENCLAW) {\n Write-Host "โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•ๆก†ๆžถ็ป„ไปถ๏ผŒๅฐ†่ทณ่ฟ‡ๆ’ไปถๅฎ‰่ฃ…ใ€‚"\n Write-Host " ็ปง็ปญๆ‰ง่กŒ้…็ฝฎๆญฅ้ชค..."\n Write-Host ""\n}\n\n# 3. Download Components\nif ($INSTALL_OPENCODE) {\n Write-Host "โฌ Downloading OpenCode Plugin..."\n $opencodeConfigDir = if ($env:XDG_CONFIG_HOME) { Join-Path $env:XDG_CONFIG_HOME "opencode" } elseif ($env:APPDATA) { Join-Path $env:APPDATA "opencode" } else { Join-Path $homeDir ".config\\opencode" }\n New-Item -ItemType Directory -Path (Join-Path $opencodeConfigDir "plugins") -Force | Out-Null\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -OutFile (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts")\n Copy-Item (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts") "$homeDir\\.opencode\\plugins\\Witty-Skill-Insight.ts" -Force -ErrorAction SilentlyContinue\n Write-Host "โฌ Downloading OpenCode TUI Plugin..."\n $tuiPluginPath = (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.tui.tsx")\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/opencode-tui" -OutFile $tuiPluginPath\n Copy-Item $tuiPluginPath "$homeDir\\.opencode\\plugins\\Witty-Skill-Insight.tui.tsx" -Force -ErrorAction SilentlyContinue\n $tuiConfigFile = (Join-Path $opencodeConfigDir "tui.json")\n try {\n $data = @{}\n if (Test-Path $tuiConfigFile) {\n $raw = Get-Content $tuiConfigFile -Raw\n if ($raw -and $raw.Trim()) { $data = $raw | ConvertFrom-Json }\n }\n if (-not $data.plugin) { $data | Add-Member -MemberType NoteProperty -Name plugin -Value @() -Force }\n if ($data.plugin -notcontains $tuiPluginPath) { $data.plugin += $tuiPluginPath }\n $data | ConvertTo-Json -Depth 10 | Set-Content -Path $tuiConfigFile -Encoding UTF8\n } catch {\n Write-Host "โš ๏ธ Failed to patch tui.json for TUI plugin."\n }\n}\n\nif ($INSTALL_CLAUDE) {\n Write-Host "โฌ Downloading Claude Code Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/claude-watcher" -OutFile "$homeDir\\.skill-insight\\claude_watcher_client.ts"\n}\n\nif ($INSTALL_OPENCLAW) {\n Write-Host "โฌ Downloading OpenClaw Watcher..."\n Invoke-WebRequest -Uri "$SKILL_INSIGHT_BASE_URL/api/setup/openclaw-watcher" -OutFile "$homeDir\\.skill-insight\\openclaw_watcher_client.ts"\n}\n\n# 4. Configure ~/.skill-insight/.env\n$SKILL_INSIGHT_CONFIG_FILE = "$homeDir\\.skill-insight\\.env"\n$EXISTING_KEY = ""\n$EXISTING_HOST = ""\n$EXISTING_SHOW_TASK_STATS = ""\nif (Test-Path $SKILL_INSIGHT_CONFIG_FILE) {\n $content = Get-Content $SKILL_INSIGHT_CONFIG_FILE\n $keyLine = $content | Select-String \'^SKILL_INSIGHT_API_KEY=\' | Select-Object -First 1\n $hostLine = $content | Select-String \'^SKILL_INSIGHT_HOST=\' | Select-Object -First 1\n $showLine = $content | Select-String \'^SKILL_INSIGHT_SHOW_TASK_STATS=\' | Select-Object -First 1\n if ($keyLine) {\n $EXISTING_KEY = $keyLine.Line.Substring(\'SKILL_INSIGHT_API_KEY=\'.Length)\n }\n if ($hostLine) {\n $EXISTING_HOST = $hostLine.Line.Substring(\'SKILL_INSIGHT_HOST=\'.Length)\n }\n if ($showLine) {\n $EXISTING_SHOW_TASK_STATS = $showLine.Line.Substring(\'SKILL_INSIGHT_SHOW_TASK_STATS=\'.Length)\n }\n}\n\n# -- API Key Logic --\n$FINAL_KEY = $EXISTING_KEY\nif ($EXISTING_KEY) {\n Write-Host "๐Ÿ”‘ Found existing API Key."\n $USE_EXISTING = Read-Host "๐Ÿ‘‰ Use existing key? (y/N, Default: y)"\n if ($USE_EXISTING -match \'^[Nn]$\') {\n $FINAL_KEY = Read-Host "๐Ÿ‘‰ Please enter your NEW API Key"\n }\n} else {\n Write-Host "๐Ÿ”‘ SKILL_INSIGHT_API_KEY is not set."\n $FINAL_KEY = Read-Host "๐Ÿ‘‰ Please enter your API Key"\n}\n\n# -- Host Logic --\n$FINAL_HOST = $SKILL_INSIGHT_HOST\nif ($EXISTING_HOST -and ($EXISTING_HOST -ne $SKILL_INSIGHT_HOST)) {\n Write-Host "๐ŸŒ Current Host in config: $EXISTING_HOST"\n Write-Host "๐ŸŒ New Host detected: $SKILL_INSIGHT_HOST"\n $CHANGE_HOST = Read-Host "๐Ÿ‘‰ Change to new Host? (y/N, Default: y)"\n if ($CHANGE_HOST -match \'^[Nn]$\') {\n $FINAL_HOST = $EXISTING_HOST\n }\n} elseif (-not $EXISTING_HOST) {\n $FINAL_HOST = $SKILL_INSIGHT_HOST\n}\n\n$FINAL_SHOW_TASK_STATS = $EXISTING_SHOW_TASK_STATS\nif (-not $FINAL_SHOW_TASK_STATS) {\n $FINAL_SHOW_TASK_STATS = "true"\n}\n\nif (-not $FINAL_KEY) {\n Write-Host "โš ๏ธ Warning: No API Key provided. Telemetry upload will fail until you set it in $SKILL_INSIGHT_CONFIG_FILE"\n}\n\nWrite-Host "โš™๏ธ Updating configuration..."\nNew-Item -ItemType File -Path $SKILL_INSIGHT_CONFIG_FILE -Force | Out-Null\nCopy-Item $SKILL_INSIGHT_CONFIG_FILE "$SKILL_INSIGHT_CONFIG_FILE.bak"\n$content = Get-Content "$SKILL_INSIGHT_CONFIG_FILE.bak"\n$content | Where-Object { $_ -notmatch \'^SKILL_INSIGHT_HOST=\' -and $_ -notmatch \'^SKILL_INSIGHT_API_KEY=\' -and $_ -notmatch \'^SKILL_INSIGHT_SHOW_TASK_STATS=\' } | Set-Content $SKILL_INSIGHT_CONFIG_FILE\nAdd-Content $SKILL_INSIGHT_CONFIG_FILE "SKILL_INSIGHT_HOST=$FINAL_HOST"\nAdd-Content $SKILL_INSIGHT_CONFIG_FILE "SKILL_INSIGHT_API_KEY=$FINAL_KEY"\nAdd-Content $SKILL_INSIGHT_CONFIG_FILE "SKILL_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS"\nRemove-Item "$SKILL_INSIGHT_CONFIG_FILE.bak" -Force\nWrite-Host "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"\n\n# 6. Install Watcher Dependencies\nif ($INSTALL_CLAUDE -or $INSTALL_OPENCLAW) {\n Write-Host ""\n Write-Host "๐Ÿ“ฆ Installing watcher dependencies..."\n if (Get-Command npm -ErrorAction SilentlyContinue) {\n Set-Location "$homeDir\\.skill-insight"\n if (-not (Test-Path "package.json")) {\n \'{"name": "skill-insight-watcher", "version": "1.0.0", "type": "module", "dependencies": {}}\' | Out-File -FilePath "package.json" -Encoding utf8\n }\n npm install chokidar --save 2>$null\n Write-Host "โœ… Dependencies installed"\n } else {\n Write-Host "โš ๏ธ npm not found. Skipping dependency installation."\n }\n}\n\n# 7. Create Watcher Startup/Stop Scripts\n$NEEDS_WATCHER_SCRIPTS = $false\nif ($INSTALL_CLAUDE -or $INSTALL_OPENCLAW) {\n $NEEDS_WATCHER_SCRIPTS = $true\n}\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿ“ Creating watcher management scripts..."\n\n if ($INSTALL_CLAUDE) {\n $startScript = @\'\npkill -f "claude_watcher_client.ts" 2>/dev/null\nSet-Location "$env:USERPROFILE\\.skill-insight"\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", "$env:USERPROFILE\\.skill-insight\\claude_watcher_client.ts" -RedirectStandardOutput "$env:USERPROFILE\\.skill-insight\\logs\\claude_watcher.log" -RedirectStandardError "$env:USERPROFILE\\.skill-insight\\logs\\claude_watcher_error.log" -NoNewWindow\nWrite-Host "Claude watcher started"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\start_claude_watcher.ps1" -Value $startScript -Encoding UTF8\n\n $stopScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nRemove-Item "$env:USERPROFILE\\.skill-insight\\claude_watcher.pid" -Force -ErrorAction SilentlyContinue\nWrite-Host "Claude watcher stopped"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\stop_claude_watcher.ps1" -Value $stopScript -Encoding UTF8\n }\n\n if ($INSTALL_OPENCLAW) {\n $startScript = @\'\npkill -f "openclaw_watcher_client.ts" 2>/dev/null\nSet-Location "$env:USERPROFILE\\.skill-insight"\nStart-Process -FilePath "npx" -ArgumentList "-y", "tsx", "$env:USERPROFILE\\.skill-insight\\openclaw_watcher_client.ts" -RedirectStandardOutput "$env:USERPROFILE\\.skill-insight\\logs\\openclaw_watcher.log" -RedirectStandardError "$env:USERPROFILE\\.skill-insight\\logs\\openclaw_watcher_error.log" -NoNewWindow\nWrite-Host "OpenClaw watcher started"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\start_openclaw_watcher.ps1" -Value $startScript -Encoding UTF8\n\n $stopScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*openclaw_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nRemove-Item "$env:USERPROFILE\\.skill-insight\\openclaw_watcher.pid" -Force -ErrorAction SilentlyContinue\nWrite-Host "OpenClaw watcher stopped"\n\'@\n Set-Content -Path "$homeDir\\.skill-insight\\stop_openclaw_watcher.ps1" -Value $stopScript -Encoding UTF8\n }\n\n $combinedStart = \'Write-Host "Starting Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) { $combinedStart += [char]10 + "& `"$homeDir\\.skill-insight\\start_claude_watcher.ps1`"" }\n if ($INSTALL_OPENCLAW) { $combinedStart += [char]10 + "& `"$homeDir\\.skill-insight\\start_openclaw_watcher.ps1`"" }\n $combinedStart += [char]10 + \'Write-Host "All watchers started!"\'\n Set-Content -Path "$homeDir\\.skill-insight\\start_watchers.ps1" -Value $combinedStart -Encoding UTF8\n\n $combinedStop = \'Write-Host "Stopping Skill-Insight watchers..."\'\n if ($INSTALL_CLAUDE) { $combinedStop += [char]10 + "& `"$homeDir\\.skill-insight\\stop_claude_watcher.ps1`"" }\n if ($INSTALL_OPENCLAW) { $combinedStop += [char]10 + "& `"$homeDir\\.skill-insight\\stop_openclaw_watcher.ps1`"" }\n $combinedStop += [char]10 + \'Write-Host "All watchers stopped!"\'\n Set-Content -Path "$homeDir\\.skill-insight\\stop_watchers.ps1" -Value $combinedStop -Encoding UTF8\n}\n\n# 8. Start Watchers Now\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "๐Ÿš€ Starting telemetry watchers..."\n if (Get-Command npx -ErrorAction SilentlyContinue) {\n & "$homeDir\\.skill-insight\\start_watchers.ps1"\n } else {\n Write-Host "โš ๏ธ Node.js (npx) not found. Skipping watcher startup."\n }\n}\n\n# 10. Final Summary\nWrite-Host ""\nWrite-Host "๐ŸŒŸ Skill-Insight Telemetry: READY"\nWrite-Host "------------------------------------------------"\nWrite-Host "Installed Components:"\nif ($INSTALL_OPENCODE) { Write-Host " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts" }\nif ($INSTALL_CLAUDE) { Write-Host " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts" }\nif ($INSTALL_OPENCLAW) { Write-Host " โœ… OpenClaw Watcher: ~/.skill-insight/openclaw_watcher_client.ts" }\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "Watcher Management:"\n Write-Host " Start all: ~/.skill-insight/start_watchers.ps1"\n Write-Host " Stop all: ~/.skill-insight/stop_watchers.ps1"\n Write-Host " Logs: ~/.skill-insight/logs/"\n}\n\nWrite-Host ""\nWrite-Host "Usage:"\nif ($INSTALL_OPENCODE) { Write-Host " 1. Run: opencode run \'hello\'" }\nif ($INSTALL_CLAUDE) { Write-Host " 2. Run: claude (restart terminal first)" }\nif ($INSTALL_OPENCLAW) { Write-Host " 3. OpenClaw will automatically monitor and upload telemetry" }\nWrite-Host "------------------------------------------------"'].join("\n");return new u.NextResponse(e,{headers:{"Content-Type":"text/plain; charset=utf-8"}})}{let e=["#!/bin/bash\n# =============================================================================\n# Skill-insight One-Click Setup\n# =============================================================================\n",'SKILL_INSIGHT_HOST="'+s+'"','SKILL_INSIGHT_BASE_URL="'+s+'"','OPENCODE_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/opencode"\n\necho "๐Ÿš€ Fetching Skill-insight telemetry components from $SKILL_INSIGHT_BASE_URL..."\n\n# 1. Setup Directories\nmkdir -p "$HOME/.skill-insight"\nmkdir -p "$HOME/.skill-insight/logs"\nmkdir -p "$HOME/.opencode/plugins"\nmkdir -p "$OPENCODE_CONFIG_DIR/plugins"\nmkdir -p "$HOME/.opencode/skills"\nmkdir -p "$HOME/.claude/projects"\nmkdir -p "$HOME/.openclaw/agents"\nmkdir -p ".opencode/skills"\necho "๐Ÿ“‚ Created necessary directories"\n\n# 2. Interactive Framework Selection with inquirer\necho ""\n\nSELECTOR_SCRIPT="$HOME/.skill-insight/framework_selector.mjs"\nSELECTOR_RESULT="$HOME/.skill-insight/.selector_result"\n\n# Install inquirer if not already installed\ncd "$HOME/.skill-insight"\nif [ ! -d "node_modules/inquirer" ]; then\n echo "๐Ÿ“ฆ Installing inquirer for interactive selection..."\n npm install inquirer --save 2>/dev/null\nfi\n\ncat > "$SELECTOR_SCRIPT" << \'SELECTOR_EOF\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'OpenClaw\', value: \'openclaw\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'โ•‘ โœจ Skill-insight โœจ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•‘ โ•‘\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' ๆ็คบ: โ†‘โ†“ ็งปๅŠจ | ็ฉบๆ ผ ้€‰ๆ‹ฉ | a ๅ…จ้€‰ | i ๅ้€‰ | Enter ็กฎ่ฎค\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'้›†ๆˆๅˆฐ๏ผš\',\n choices: frameworks,\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'โœ… ๅฐ†ๅฎ‰่ฃ…ไปฅไธ‹็ป„ไปถ:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' โ€ข \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•็ป„ไปถ๏ผŒๅฐ†ไธ่ฟ›่กŒๅฎ‰่ฃ…ใ€‚\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.HOME + \'/.skill-insight/.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\nSELECTOR_EOF\n\n# Run the selector interactively from /dev/tty\nexport SELECTOR_RESULT_FILE="$SELECTOR_RESULT"\ncd "$HOME/.skill-insight" && npx -y tsx "$SELECTOR_SCRIPT" < /dev/tty\n\n# Read the selection result from file\nif [ -f "$SELECTOR_RESULT" ]; then\n SELECTED_FRAMEWORKS=$(cat "$SELECTOR_RESULT")\n rm -f "$SELECTOR_RESULT"\nelse\n SELECTED_FRAMEWORKS=""\nfi\n\n# Set installation flags based on selection\nINSTALL_OPENCODE=false\nINSTALL_CLAUDE=false\nINSTALL_OPENCLAW=false\n\nif [[ "$SELECTED_FRAMEWORKS" == *"opencode"* ]]; then\n INSTALL_OPENCODE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"claude"* ]]; then\n INSTALL_CLAUDE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"openclaw"* ]]; then\n INSTALL_OPENCLAW=true\nfi\n\n# Exit if nothing selected\nif [ "$INSTALL_OPENCODE" = "false" ] && [ "$INSTALL_CLAUDE" = "false" ] && [ "$INSTALL_OPENCLAW" = "false" ]; then\n echo "โš ๏ธ ๆœช้€‰ๆ‹ฉไปปไฝ•ๆก†ๆžถ็ป„ไปถ๏ผŒๅฐ†่ทณ่ฟ‡ๆ’ไปถๅฎ‰่ฃ…ใ€‚"\n echo " ็ปง็ปญๆ‰ง่กŒ้…็ฝฎๆญฅ้ชค..."\n echo ""\nfi\n\n# 3. Download Components\nif [ "$INSTALL_OPENCODE" = "true" ]; then\n echo "โฌ Downloading OpenCode Plugin..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts"\n cp "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts" "$HOME/.opencode/plugins/Witty-Skill-Insight.ts" 2>/dev/null || true\n echo "โฌ Installing OpenCode commands..."\n mkdir -p "$OPENCODE_CONFIG_DIR/commands"\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode-commands/si-optimizer" -o "$OPENCODE_CONFIG_DIR/commands/si-optimizer.md"\n echo "โฌ Downloading OpenCode TUI Plugin..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/opencode-tui" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"\n cp "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx" "$HOME/.opencode/plugins/Witty-Skill-Insight.tui.tsx" 2>/dev/null || true\n export TUI_PLUGIN_PATH="$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"\n export TUI_CONFIG_FILE="$OPENCODE_CONFIG_DIR/tui.json"\n if command -v node &> /dev/null; then\n node - <<\'NODE\'\nconst fs = require("fs");\nconst path = require("path");\nconst file = process.env.TUI_CONFIG_FILE;\nconst pluginPath = process.env.TUI_PLUGIN_PATH;\nlet data = {};\ntry {\n if (fs.existsSync(file)) {\n const text = fs.readFileSync(file, "utf8");\n data = text && text.trim() ? JSON.parse(text) : {};\n }\n} catch {}\nif (!data || typeof data !== "object") data = {};\nconst list = Array.isArray(data.plugin) ? data.plugin.slice() : [];\nif (pluginPath && !list.includes(pluginPath)) list.push(pluginPath);\ndata.plugin = list;\nfs.mkdirSync(path.dirname(file), { recursive: true });\nfs.writeFileSync(file, JSON.stringify(data, null, 2));\nNODE\n else\n echo "โš ๏ธ node not found; skip TUI plugin config patch."\n fi\nfi\n\nif [ "$INSTALL_CLAUDE" = "true" ]; then\n echo "โฌ Downloading Claude Code Watcher..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/claude-watcher" -o "$HOME/.skill-insight/claude_watcher_client.ts"\nfi\n\nif [ "$INSTALL_OPENCLAW" = "true" ]; then\n echo "โฌ Downloading OpenClaw Watcher..."\n curl -sSf "$SKILL_INSIGHT_BASE_URL/api/setup/openclaw-watcher" -o "$HOME/.skill-insight/openclaw_watcher_client.ts"\nfi\n\n# 4. Configure ~/.skill-insight/.env\nSKILL_INSIGHT_CONFIG_FILE="$HOME/.skill-insight/.env"\nEXISTING_KEY=""\nEXISTING_HOST=""\nEXISTING_SHOW_TASK_STATS=""\nif [ -f "$SKILL_INSIGHT_CONFIG_FILE" ]; then\n EXISTING_KEY=$(grep \'^SKILL_INSIGHT_API_KEY=\' "$SKILL_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_HOST=$(grep \'^SKILL_INSIGHT_HOST=\' "$SKILL_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_SHOW_TASK_STATS=$(grep \'^SKILL_INSIGHT_SHOW_TASK_STATS=\' "$SKILL_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\nfi\n\n# -- API Key Logic --\nFINAL_KEY="$EXISTING_KEY"\nif [ -n "$EXISTING_KEY" ]; then\n echo "๐Ÿ”‘ Found existing API Key."\n read -p "๐Ÿ‘‰ Use existing key? (y/N, Default: y): " USE_EXISTING < /dev/tty\n if [[ "$USE_EXISTING" =~ ^[Nn]$ ]]; then\n read -p "๐Ÿ‘‰ Please enter your NEW API Key: " FINAL_KEY < /dev/tty\n fi\nelse\n echo "๐Ÿ”‘ SKILL_INSIGHT_API_KEY is not set."\n read -p "๐Ÿ‘‰ Please enter your API Key: " FINAL_KEY < /dev/tty\nfi\n\n# -- Host Logic --\nFINAL_HOST="$SKILL_INSIGHT_HOST"\nif [ -n "$EXISTING_HOST" ] && [ "$EXISTING_HOST" != "$SKILL_INSIGHT_HOST" ]; then\n echo "๐ŸŒ Current Host in config: $EXISTING_HOST"\n echo "๐ŸŒ New Host detected: $SKILL_INSIGHT_HOST"\n read -p "๐Ÿ‘‰ Change to new Host? (y/N, Default: y): " CHANGE_HOST < /dev/tty\n if [[ "$CHANGE_HOST" =~ ^[Nn]$ ]]; then\n FINAL_HOST="$EXISTING_HOST"\n fi\nelif [ -z "$EXISTING_HOST" ]; then\n FINAL_HOST="$SKILL_INSIGHT_HOST"\nfi\n\nFINAL_SHOW_TASK_STATS="$EXISTING_SHOW_TASK_STATS"\nif [ -z "$FINAL_SHOW_TASK_STATS" ]; then\n FINAL_SHOW_TASK_STATS="true"\nfi\n\nif [ -z "$FINAL_KEY" ]; then\n echo "โš ๏ธ Warning: No API Key provided. Telemetry upload will fail until you set it in $SKILL_INSIGHT_CONFIG_FILE"\nfi\n\necho "โš™๏ธ Updating configuration..."\ntouch "$SKILL_INSIGHT_CONFIG_FILE"\ncp "$SKILL_INSIGHT_CONFIG_FILE" "${SKILL_INSIGHT_CONFIG_FILE}.bak"\ngrep -v "^SKILL_INSIGHT_HOST=" "${SKILL_INSIGHT_CONFIG_FILE}.bak" | grep -v "^SKILL_INSIGHT_API_KEY=" | grep -v "^SKILL_INSIGHT_SHOW_TASK_STATS=" > "$SKILL_INSIGHT_CONFIG_FILE"\necho "SKILL_INSIGHT_HOST=$FINAL_HOST" >> "$SKILL_INSIGHT_CONFIG_FILE"\necho "SKILL_INSIGHT_API_KEY=$FINAL_KEY" >> "$SKILL_INSIGHT_CONFIG_FILE"\necho "SKILL_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS" >> "$SKILL_INSIGHT_CONFIG_FILE"\nrm "${SKILL_INSIGHT_CONFIG_FILE}.bak"\necho "โœ… Configuration updated at $SKILL_INSIGHT_CONFIG_FILE"\n\n# 6. Install Watcher Dependencies\nif [ "$INSTALL_CLAUDE" = "true" ] || [ "$INSTALL_OPENCLAW" = "true" ]; then\n echo ""\n echo "๐Ÿ“ฆ Installing watcher dependencies..."\n if command -v npm &> /dev/null; then\n cd "$HOME/.skill-insight"\n if [ ! -f "package.json" ]; then\n echo \'{"name": "skill-insight-watcher", "version": "1.0.0", "type": "module", "dependencies": {}}\' > package.json\n fi\n npm install chokidar --save 2>/dev/null\n echo "โœ… Dependencies installed"\n else\n echo "โš ๏ธ npm not found. Skipping dependency installation."\n fi\nfi\n\n# 7. Create Watcher Startup/Stop Scripts\nNEEDS_WATCHER_SCRIPTS=false\nif [ "$INSTALL_CLAUDE" = "true" ] || [ "$INSTALL_OPENCLAW" = "true" ]; then\n NEEDS_WATCHER_SCRIPTS=true\nfi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "๐Ÿ“ Creating watcher management scripts..."\n\n if [ "$INSTALL_CLAUDE" = "true" ]; then\n cat > "$HOME/.skill-insight/start_claude_watcher.sh" << \'WATCHER_EOF\'\n#!/bin/bash\npkill -f "claude_watcher_client.ts" 2>/dev/null\ncd "$HOME/.skill-insight" && nohup npx -y tsx "$HOME/.skill-insight/claude_watcher_client.ts" > "$HOME/.skill-insight/logs/claude_watcher.log" 2>&1 &\necho $! > "$HOME/.skill-insight/claude_watcher.pid"\necho "Claude watcher started with PID $(cat $HOME/.skill-insight/claude_watcher.pid)"\nWATCHER_EOF\n chmod +x "$HOME/.skill-insight/start_claude_watcher.sh"\n\n cat > "$HOME/.skill-insight/stop_claude_watcher.sh" << \'STOP_CLAUDE_EOF\'\n#!/bin/bash\npkill -f "claude_watcher_client.ts" 2>/dev/null\nrm -f "$HOME/.skill-insight/claude_watcher.pid"\necho "Claude watcher stopped"\nSTOP_CLAUDE_EOF\n chmod +x "$HOME/.skill-insight/stop_claude_watcher.sh"\n fi\n\n if [ "$INSTALL_OPENCLAW" = "true" ]; then\n cat > "$HOME/.skill-insight/start_openclaw_watcher.sh" << \'WATCHER_EOF\'\n#!/bin/bash\npkill -f "openclaw_watcher_client.ts" 2>/dev/null\ncd "$HOME/.skill-insight" && nohup npx -y tsx "$HOME/.skill-insight/openclaw_watcher_client.ts" > "$HOME/.skill-insight/logs/openclaw_watcher.log" 2>&1 &\necho $! > "$HOME/.skill-insight/openclaw_watcher.pid"\necho "OpenClaw watcher started with PID $(cat $HOME/.skill-insight/openclaw_watcher.pid)"\nWATCHER_EOF\n chmod +x "$HOME/.skill-insight/start_openclaw_watcher.sh"\n\n cat > "$HOME/.skill-insight/stop_openclaw_watcher.sh" << \'STOP_OPENCLAW_EOF\'\n#!/bin/bash\npkill -f "openclaw_watcher_client.ts" 2>/dev/null\nrm -f "$HOME/.skill-insight/openclaw_watcher.pid"\necho "OpenClaw watcher stopped"\nSTOP_OPENCLAW_EOF\n chmod +x "$HOME/.skill-insight/stop_openclaw_watcher.sh"\n fi\n\n cat > "$HOME/.skill-insight/start_watchers.sh" << \'WATCHER_HEADER\'\n#!/bin/bash\necho "Starting Skill-Insight watchers..."\nWATCHER_HEADER\n if [ "$INSTALL_CLAUDE" = "true" ]; then echo \'"$HOME/.skill-insight/start_claude_watcher.sh"\' >> "$HOME/.skill-insight/start_watchers.sh"; fi\n if [ "$INSTALL_OPENCLAW" = "true" ]; then echo \'"$HOME/.skill-insight/start_openclaw_watcher.sh"\' >> "$HOME/.skill-insight/start_watchers.sh"; fi\n echo \'echo "All watchers started!"\' >> "$HOME/.skill-insight/start_watchers.sh"\n chmod +x "$HOME/.skill-insight/start_watchers.sh"\n\n cat > "$HOME/.skill-insight/stop_watchers.sh" << \'STOP_HEADER\'\n#!/bin/bash\necho "Stopping Skill-Insight watchers..."\nSTOP_HEADER\n if [ "$INSTALL_CLAUDE" = "true" ]; then echo \'"$HOME/.skill-insight/stop_claude_watcher.sh"\' >> "$HOME/.skill-insight/stop_watchers.sh"; fi\n if [ "$INSTALL_OPENCLAW" = "true" ]; then echo \'"$HOME/.skill-insight/stop_openclaw_watcher.sh"\' >> "$HOME/.skill-insight/stop_watchers.sh"; fi\n echo \'echo "All watchers stopped!"\' >> "$HOME/.skill-insight/stop_watchers.sh"\n chmod +x "$HOME/.skill-insight/stop_watchers.sh"\nfi\n\n# 8. Start Watchers Now\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "๐Ÿš€ Starting telemetry watchers..."\n if command -v npx &> /dev/null; then\n "$HOME/.skill-insight/start_watchers.sh"\n else\n echo "โš ๏ธ Node.js (npx) not found. Skipping watcher startup."\n fi\nfi\n\n# 10. Final Summary\necho ""\necho "๐ŸŒŸ Skill-Insight Telemetry: READY"\necho "------------------------------------------------"\necho "Installed Components:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " โœ… OpenCode Plugin: ~/.opencode/plugins/Witty-Skill-Insight.ts"; fi\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " โœ… OpenCode Command: ~/.config/opencode/commands/si-optimizer.md"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " โœ… Claude Watcher: ~/.skill-insight/claude_watcher_client.ts"; fi\nif [ "$INSTALL_OPENCLAW" = "true" ]; then echo " โœ… OpenClaw Watcher: ~/.skill-insight/openclaw_watcher_client.ts"; fi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "Watcher Management:"\n echo " Start all: ~/.skill-insight/start_watchers.sh"\n echo " Stop all: ~/.skill-insight/stop_watchers.sh"\n echo " Logs: ~/.skill-insight/logs/"\nfi\n\necho ""\necho "Usage:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " 1. Run: opencode run \'hello\'"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " 2. Run: claude (restart terminal first)"; fi\nif [ "$INSTALL_OPENCLAW" = "true" ]; then echo " 3. OpenClaw will automatically monitor and upload telemetry"; fi\necho "------------------------------------------------"'].join("\n");return new u.NextResponse(e,{headers:{"Content-Type":"text/x-shellscript"}})}}e.s(["GET",()=>T],21965);var $=e.i(21965);let N=new n.AppRouteRouteModule({definition:{kind:t.RouteKind.APP_ROUTE,page:"/api/setup/route",pathname:"/api/setup",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/setup/route.ts",nextConfigOutput:"standalone",userland:$}),{workAsyncStorage:O,workUnitAsyncStorage:g,serverHooks:C}=N;function f(){return(0,i.patchFetch)({workAsyncStorage:O,workUnitAsyncStorage:g})}async function H(e,n,i){N.isDev&&(0,o.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let u="/api/setup/route";u=u.replace(/\/index$/,"")||"/";let T=await N.prepare(e,n,{srcPage:u,multiZoneDraftMode:!1});if(!T)return n.statusCode=400,n.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:$,params:O,nextConfig:g,parsedUrl:C,isDraftMode:f,prerenderManifest:H,routerServerContext:m,isOnDemandRevalidate:A,revalidateOnlyGenerated:w,resolvedPathname:R,clientReferenceManifest:F,serverActionsManifest:P}=T,k=(0,r.normalizeAppPath)(u),G=!!(H.dynamicRoutes[k]||H.routes[R]),W=async()=>((null==m?void 0:m.render404)?await m.render404(e,n,C,!1):n.end("This page could not be found"),null);if(G&&!f){let e=!!H.routes[R],n=H.dynamicRoutes[k];if(n&&!1===n.fallback&&!e){if(g.experimental.adapterPath)return await W();throw new p.NoFallbackError}}let D=null;!G||N.isDev||f||(D="/index"===(D=R)?"/":D);let y=!0===N.isDev||!G,K=G&&!y;P&&F&&(0,l.setManifestsSingleton)({page:u,clientReferenceManifest:F,serverActionsManifest:P});let v=e.method||"GET",x=(0,s.getTracer)(),U=x.getActiveScopeSpan(),b={params:O,prerenderManifest:H,renderOpts:{experimental:{authInterrupts:!!g.experimental.authInterrupts},cacheComponents:!!g.cacheComponents,supportsDynamicResponse:y,incrementalCache:(0,o.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:g.cacheLife,waitUntil:i.waitUntil,onClose:e=>{n.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(n,t,i,o)=>N.onRequestError(e,n,i,o,m)},sharedContext:{buildId:$}},M=new a.NodeNextRequest(e),X=new a.NodeNextResponse(n),q=c.NextRequestAdapter.fromNodeNextRequest(M,(0,c.signalFromNodeResponse)(n));try{let l=async e=>N.handle(q,b).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":n.statusCode,"next.rsc":!1});let t=x.getRootSpanAttributes();if(!t)return;if(t.get("next.span_type")!==S.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${t.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=t.get("next.route");if(i){let n=`${v} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":n}),e.updateName(n)}else e.updateName(`${v} ${u}`)}),r=!!(0,o.getRequestMeta)(e,"minimalMode"),a=async o=>{var s,a;let c=async({previousCacheEntry:t})=>{try{if(!r&&A&&w&&!t)return n.statusCode=404,n.setHeader("x-nextjs-cache","REVALIDATED"),n.end("This page could not be found"),null;let s=await l(o);e.fetchMetrics=b.renderOpts.fetchMetrics;let a=b.renderOpts.pendingWaitUntil;a&&i.waitUntil&&(i.waitUntil(a),a=void 0);let c=b.renderOpts.collectedTags;if(!G)return await (0,I.sendResponse)(M,X,s,b.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),n=(0,h.toNodeOutgoingHttpHeaders)(s.headers);c&&(n[d.NEXT_CACHE_TAGS_HEADER]=c),!n["content-type"]&&e.type&&(n["content-type"]=e.type);let t=void 0!==b.renderOpts.collectedRevalidate&&!(b.renderOpts.collectedRevalidate>=d.INFINITE_CACHE)&&b.renderOpts.collectedRevalidate,i=void 0===b.renderOpts.collectedExpire||b.renderOpts.collectedExpire>=d.INFINITE_CACHE?void 0:b.renderOpts.collectedExpire;return{value:{kind:L.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:n},cacheControl:{revalidate:t,expire:i}}}}catch(n){throw(null==t?void 0:t.isStale)&&await N.onRequestError(e,n,{routerKind:"App Router",routePath:u,routeType:"route",revalidateReason:(0,_.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:A})},!1,m),n}},S=await N.handleResponse({req:e,nextConfig:g,cacheKey:D,routeKind:t.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:H,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:w,responseGenerator:c,waitUntil:i.waitUntil,isMinimalMode:r});if(!G)return null;if((null==S||null==(s=S.value)?void 0:s.kind)!==L.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==S||null==(a=S.value)?void 0:a.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});r||n.setHeader("x-nextjs-cache",A?"REVALIDATED":S.isMiss?"MISS":S.isStale?"STALE":"HIT"),f&&n.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let p=(0,h.fromNodeOutgoingHttpHeaders)(S.value.headers);return r&&G||p.delete(d.NEXT_CACHE_TAGS_HEADER),!S.cacheControl||n.getHeader("Cache-Control")||p.get("Cache-Control")||p.set("Cache-Control",(0,E.getCacheControlHeader)(S.cacheControl)),await (0,I.sendResponse)(M,X,new Response(S.value.body,{headers:p,status:S.value.status||200})),null};U?await a(U):await x.withPropagatedContext(e.headers,()=>x.trace(S.BaseServerSpan.handleRequest,{spanName:`${v} ${u}`,kind:s.SpanKind.SERVER,attributes:{"http.method":v,"http.target":e.url}},a))}catch(n){if(n instanceof p.NoFallbackError||await N.onRequestError(e,n,{routerKind:"App Router",routePath:k,routeType:"route",revalidateReason:(0,_.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:A})},!1,m),G)throw n;return await (0,I.sendResponse)(M,X,new Response(null,{status:500})),null}}e.s(["handler",()=>H,"patchFetch",()=>f,"routeModule",()=>N,"serverHooks",()=>C,"workAsyncStorage",()=>O,"workUnitAsyncStorage",()=>g],26984)}];
2
2
 
3
3
  //# sourceMappingURL=node_modules_next_dist_esm_build_templates_app-route_f42faeee.js.map