xtrm-tools 0.7.3 → 0.7.4

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 (527) hide show
  1. package/.xtrm/config/pi/extensions/xtrm-ui/format.ts +189 -0
  2. package/.xtrm/config/pi/extensions/xtrm-ui/index.ts +76 -17
  3. package/.xtrm/config/pi/extensions/xtrm-ui/package.json +16 -5
  4. package/.xtrm/hooks/specialists/specialists-complete.mjs +70 -0
  5. package/.xtrm/hooks/specialists/specialists-session-start.mjs +105 -0
  6. package/.xtrm/registry.json +397 -409
  7. package/.xtrm/skills/default/README.txt +31 -0
  8. package/.xtrm/skills/default/clean-code/SKILL.md +201 -0
  9. package/.xtrm/skills/default/creating-service-skills/SKILL.md +433 -0
  10. package/.xtrm/skills/default/creating-service-skills/references/script_quality_standards.md +425 -0
  11. package/.xtrm/skills/default/creating-service-skills/references/service_skill_system_guide.md +278 -0
  12. package/.xtrm/skills/default/creating-service-skills/scripts/bootstrap.py +326 -0
  13. package/.xtrm/skills/default/creating-service-skills/scripts/deep_dive.py +304 -0
  14. package/.xtrm/skills/default/creating-service-skills/scripts/scaffolder.py +482 -0
  15. package/.xtrm/skills/default/deepwiki/SKILL.md +50 -0
  16. package/.xtrm/skills/default/delegating/SKILL.md +196 -0
  17. package/.xtrm/skills/default/delegating/config.yaml +210 -0
  18. package/.xtrm/skills/default/delegating/references/orchestration-protocols.md +41 -0
  19. package/.xtrm/skills/default/documenting/CHANGELOG.md +23 -0
  20. package/.xtrm/skills/default/documenting/README.md +148 -0
  21. package/.xtrm/skills/default/documenting/SKILL.md +113 -0
  22. package/.xtrm/skills/default/documenting/examples/example_pattern.md +70 -0
  23. package/.xtrm/skills/default/documenting/examples/example_reference.md +70 -0
  24. package/.xtrm/skills/default/documenting/examples/example_ssot_analytics.md +64 -0
  25. package/.xtrm/skills/default/documenting/examples/example_workflow.md +141 -0
  26. package/.xtrm/skills/default/documenting/references/changelog-format.md +97 -0
  27. package/.xtrm/skills/default/documenting/references/metadata-schema.md +136 -0
  28. package/.xtrm/skills/default/documenting/references/taxonomy.md +81 -0
  29. package/.xtrm/skills/default/documenting/references/versioning-rules.md +78 -0
  30. package/.xtrm/skills/default/documenting/scripts/bump_version.sh +60 -0
  31. package/.xtrm/skills/default/documenting/scripts/changelog/__init__.py +0 -0
  32. package/.xtrm/skills/default/documenting/scripts/changelog/add_entry.py +216 -0
  33. package/.xtrm/skills/default/documenting/scripts/changelog/bump_release.py +117 -0
  34. package/.xtrm/skills/default/documenting/scripts/changelog/init_changelog.py +54 -0
  35. package/.xtrm/skills/default/documenting/scripts/changelog/validate_changelog.py +128 -0
  36. package/.xtrm/skills/default/documenting/scripts/drift_detector.py +266 -0
  37. package/.xtrm/skills/default/documenting/scripts/generate_template.py +311 -0
  38. package/.xtrm/skills/default/documenting/scripts/list_by_category.sh +84 -0
  39. package/.xtrm/skills/default/documenting/scripts/orchestrator.py +255 -0
  40. package/.xtrm/skills/default/documenting/scripts/validate_metadata.py +242 -0
  41. package/.xtrm/skills/default/documenting/templates/CHANGELOG.md.template +13 -0
  42. package/.xtrm/skills/default/find-docs/SKILL.md +175 -0
  43. package/.xtrm/skills/default/find-skills/SKILL.md +133 -0
  44. package/.xtrm/skills/default/github-search/SKILL.md +49 -0
  45. package/.xtrm/skills/default/gitnexus-debugging/SKILL.md +89 -0
  46. package/.xtrm/skills/default/gitnexus-impact-analysis/SKILL.md +97 -0
  47. package/.xtrm/skills/default/gitnexus-pr-review/SKILL.md +163 -0
  48. package/.xtrm/skills/default/gitnexus-refactoring/SKILL.md +121 -0
  49. package/.xtrm/skills/default/hook-development/SKILL.md +797 -0
  50. package/.xtrm/skills/default/hook-development/examples/load-context.sh +55 -0
  51. package/.xtrm/skills/default/hook-development/examples/quality-check.js +1168 -0
  52. package/.xtrm/skills/default/hook-development/examples/validate-bash.sh +43 -0
  53. package/.xtrm/skills/default/hook-development/examples/validate-write.sh +38 -0
  54. package/.xtrm/skills/default/hook-development/references/advanced.md +527 -0
  55. package/.xtrm/skills/default/hook-development/references/migration.md +369 -0
  56. package/.xtrm/skills/default/hook-development/references/patterns.md +412 -0
  57. package/.xtrm/skills/default/hook-development/scripts/README.md +164 -0
  58. package/.xtrm/skills/default/hook-development/scripts/hook-linter.sh +153 -0
  59. package/.xtrm/skills/default/hook-development/scripts/test-hook.sh +252 -0
  60. package/.xtrm/skills/default/hook-development/scripts/validate-hook-schema.sh +159 -0
  61. package/.xtrm/skills/default/init-session/SKILL.md +69 -0
  62. package/.xtrm/skills/default/last30days/SKILL.md +881 -0
  63. package/.xtrm/skills/default/last30days/scripts/briefing.py +260 -0
  64. package/.xtrm/skills/default/last30days/scripts/evaluate-synthesis.py +120 -0
  65. package/.xtrm/skills/default/last30days/scripts/evaluate_search_quality.py +641 -0
  66. package/.xtrm/skills/default/last30days/scripts/generate-synthesis-inputs.py +53 -0
  67. package/.xtrm/skills/default/last30days/scripts/last30days.py +2137 -0
  68. package/.xtrm/skills/default/last30days/scripts/lib/__init__.py +1 -0
  69. package/.xtrm/skills/default/last30days/scripts/lib/bird_x.py +458 -0
  70. package/.xtrm/skills/default/last30days/scripts/lib/bluesky.py +225 -0
  71. package/.xtrm/skills/default/last30days/scripts/lib/brave_search.py +329 -0
  72. package/.xtrm/skills/default/last30days/scripts/lib/cache.py +165 -0
  73. package/.xtrm/skills/default/last30days/scripts/lib/chrome_cookies.py +265 -0
  74. package/.xtrm/skills/default/last30days/scripts/lib/cookie_extract.py +295 -0
  75. package/.xtrm/skills/default/last30days/scripts/lib/dates.py +124 -0
  76. package/.xtrm/skills/default/last30days/scripts/lib/dedupe.py +290 -0
  77. package/.xtrm/skills/default/last30days/scripts/lib/entity_extract.py +127 -0
  78. package/.xtrm/skills/default/last30days/scripts/lib/env.py +807 -0
  79. package/.xtrm/skills/default/last30days/scripts/lib/exa_search.py +176 -0
  80. package/.xtrm/skills/default/last30days/scripts/lib/hackernews.py +266 -0
  81. package/.xtrm/skills/default/last30days/scripts/lib/http.py +174 -0
  82. package/.xtrm/skills/default/last30days/scripts/lib/instagram.py +365 -0
  83. package/.xtrm/skills/default/last30days/scripts/lib/models.py +221 -0
  84. package/.xtrm/skills/default/last30days/scripts/lib/normalize.py +489 -0
  85. package/.xtrm/skills/default/last30days/scripts/lib/openai_reddit.py +631 -0
  86. package/.xtrm/skills/default/last30days/scripts/lib/openrouter_search.py +216 -0
  87. package/.xtrm/skills/default/last30days/scripts/lib/parallel_search.py +139 -0
  88. package/.xtrm/skills/default/last30days/scripts/lib/polymarket.py +580 -0
  89. package/.xtrm/skills/default/last30days/scripts/lib/quality_nudge.py +201 -0
  90. package/.xtrm/skills/default/last30days/scripts/lib/query.py +117 -0
  91. package/.xtrm/skills/default/last30days/scripts/lib/query_type.py +111 -0
  92. package/.xtrm/skills/default/last30days/scripts/lib/reddit.py +617 -0
  93. package/.xtrm/skills/default/last30days/scripts/lib/reddit_enrich.py +325 -0
  94. package/.xtrm/skills/default/last30days/scripts/lib/reddit_public.py +259 -0
  95. package/.xtrm/skills/default/last30days/scripts/lib/relevance.py +148 -0
  96. package/.xtrm/skills/default/last30days/scripts/lib/render.py +1018 -0
  97. package/.xtrm/skills/default/last30days/scripts/lib/safari_cookies.py +182 -0
  98. package/.xtrm/skills/default/last30days/scripts/lib/schema.py +843 -0
  99. package/.xtrm/skills/default/last30days/scripts/lib/score.py +775 -0
  100. package/.xtrm/skills/default/last30days/scripts/lib/scrapecreators_x.py +182 -0
  101. package/.xtrm/skills/default/last30days/scripts/lib/setup_wizard.py +186 -0
  102. package/.xtrm/skills/default/last30days/scripts/lib/tiktok.py +349 -0
  103. package/.xtrm/skills/default/last30days/scripts/lib/truthsocial.py +183 -0
  104. package/.xtrm/skills/default/last30days/scripts/lib/ui.py +620 -0
  105. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/LICENSE +21 -0
  106. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/bird-search.mjs +134 -0
  107. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/cookies.js +191 -0
  108. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/features.json +17 -0
  109. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/paginate-cursor.js +37 -0
  110. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/query-ids.json +20 -0
  111. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/runtime-features.js +151 -0
  112. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/runtime-query-ids.js +264 -0
  113. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-base.js +129 -0
  114. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-constants.js +50 -0
  115. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-features.js +347 -0
  116. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-search.js +157 -0
  117. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-types.js +2 -0
  118. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/lib/twitter-client-utils.js +511 -0
  119. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/LICENSE +22 -0
  120. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/README.md +29 -0
  121. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.d.ts +3 -0
  122. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.d.ts.map +1 -0
  123. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.js +2 -0
  124. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.js.map +1 -0
  125. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.d.ts +8 -0
  126. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.d.ts.map +1 -0
  127. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.js +27 -0
  128. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.js.map +1 -0
  129. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.d.ts +11 -0
  130. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.d.ts.map +1 -0
  131. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.js +100 -0
  132. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.js.map +1 -0
  133. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.d.ts +25 -0
  134. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.d.ts.map +1 -0
  135. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.js +104 -0
  136. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.js.map +1 -0
  137. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.d.ts +10 -0
  138. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.d.ts.map +1 -0
  139. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.js +293 -0
  140. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.js.map +1 -0
  141. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.d.ts +10 -0
  142. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.d.ts.map +1 -0
  143. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.js +26 -0
  144. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.js.map +1 -0
  145. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.d.ts +7 -0
  146. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.d.ts.map +1 -0
  147. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.js +51 -0
  148. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.js.map +1 -0
  149. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.d.ts +7 -0
  150. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.d.ts.map +1 -0
  151. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.js +60 -0
  152. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.js.map +1 -0
  153. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.d.ts +7 -0
  154. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.d.ts.map +1 -0
  155. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.js +38 -0
  156. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.js.map +1 -0
  157. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.d.ts +5 -0
  158. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.d.ts.map +1 -0
  159. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.js +33 -0
  160. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.js.map +1 -0
  161. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.d.ts +24 -0
  162. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.d.ts.map +1 -0
  163. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.js +30 -0
  164. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.js.map +1 -0
  165. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.d.ts +11 -0
  166. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.d.ts.map +1 -0
  167. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.js +43 -0
  168. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.js.map +1 -0
  169. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.d.ts +8 -0
  170. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.d.ts.map +1 -0
  171. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.js +41 -0
  172. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.js.map +1 -0
  173. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.d.ts +8 -0
  174. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.d.ts.map +1 -0
  175. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.js +53 -0
  176. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.js.map +1 -0
  177. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.d.ts +8 -0
  178. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.d.ts.map +1 -0
  179. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.js +27 -0
  180. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.js.map +1 -0
  181. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.d.ts +7 -0
  182. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.d.ts.map +1 -0
  183. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.js +53 -0
  184. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.js.map +1 -0
  185. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.d.ts +8 -0
  186. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.d.ts.map +1 -0
  187. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.js +60 -0
  188. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.js.map +1 -0
  189. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.d.ts +7 -0
  190. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.d.ts.map +1 -0
  191. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.js +38 -0
  192. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.js.map +1 -0
  193. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.d.ts +6 -0
  194. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.d.ts.map +1 -0
  195. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.js +257 -0
  196. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.js.map +1 -0
  197. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.d.ts +8 -0
  198. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.d.ts.map +1 -0
  199. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.js +71 -0
  200. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.js.map +1 -0
  201. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.d.ts +6 -0
  202. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.d.ts.map +1 -0
  203. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.js +173 -0
  204. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.js.map +1 -0
  205. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.d.ts +26 -0
  206. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.d.ts.map +1 -0
  207. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.js +195 -0
  208. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.js.map +1 -0
  209. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.d.ts +121 -0
  210. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.d.ts.map +1 -0
  211. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.js +2 -0
  212. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.js.map +1 -0
  213. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.d.ts +2 -0
  214. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.d.ts.map +1 -0
  215. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.js +18 -0
  216. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.js.map +1 -0
  217. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.d.ts +8 -0
  218. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.d.ts.map +1 -0
  219. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.js +110 -0
  220. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.js.map +1 -0
  221. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.d.ts +2 -0
  222. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.d.ts.map +1 -0
  223. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.js +32 -0
  224. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.js.map +1 -0
  225. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.d.ts +2 -0
  226. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.d.ts.map +1 -0
  227. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.js +13 -0
  228. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.js.map +1 -0
  229. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.d.ts +2 -0
  230. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.d.ts.map +1 -0
  231. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.js +7 -0
  232. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.js.map +1 -0
  233. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.d.ts +5 -0
  234. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.d.ts.map +1 -0
  235. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.js +58 -0
  236. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.js.map +1 -0
  237. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.d.ts +2 -0
  238. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.d.ts.map +1 -0
  239. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.js +27 -0
  240. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.js.map +1 -0
  241. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.d.ts +2 -0
  242. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.d.ts.map +1 -0
  243. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.js +8 -0
  244. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.js.map +1 -0
  245. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/package.json +40 -0
  246. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/package.json +13 -0
  247. package/.xtrm/skills/default/last30days/scripts/lib/websearch.py +401 -0
  248. package/.xtrm/skills/default/last30days/scripts/lib/xai_x.py +217 -0
  249. package/.xtrm/skills/default/last30days/scripts/lib/xiaohongshu_api.py +162 -0
  250. package/.xtrm/skills/default/last30days/scripts/lib/youtube_yt.py +538 -0
  251. package/.xtrm/skills/default/last30days/scripts/store.py +654 -0
  252. package/.xtrm/skills/default/last30days/scripts/sync.sh +50 -0
  253. package/.xtrm/skills/default/last30days/scripts/test-v1-vs-v2.sh +219 -0
  254. package/.xtrm/skills/default/last30days/scripts/watchlist.py +329 -0
  255. package/.xtrm/skills/default/planning/SKILL.md +405 -0
  256. package/.xtrm/skills/default/planning/evals/evals.json +19 -0
  257. package/.xtrm/skills/default/prompt-improving/README.md +162 -0
  258. package/.xtrm/skills/default/prompt-improving/SKILL.md +74 -0
  259. package/.xtrm/skills/default/prompt-improving/references/analysis_commands.md +24 -0
  260. package/.xtrm/skills/default/prompt-improving/references/chain_of_thought.md +24 -0
  261. package/.xtrm/skills/default/prompt-improving/references/mcp_definitions.md +20 -0
  262. package/.xtrm/skills/default/prompt-improving/references/multishot.md +23 -0
  263. package/.xtrm/skills/default/prompt-improving/references/xml_core.md +60 -0
  264. package/.xtrm/skills/default/quality-gates/.claude/hooks/hook-config.json +66 -0
  265. package/.xtrm/skills/default/quality-gates/.claude/hooks/quality-check.cjs +1286 -0
  266. package/.xtrm/skills/default/quality-gates/.claude/hooks/quality-check.py +334 -0
  267. package/.xtrm/skills/default/quality-gates/.claude/settings.json +3 -0
  268. package/.xtrm/skills/default/quality-gates/.claude/skills/using-quality-gates/SKILL.md +254 -0
  269. package/.xtrm/skills/default/quality-gates/README.md +109 -0
  270. package/.xtrm/skills/default/quality-gates/evals/evals.json +181 -0
  271. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/FINAL-EVAL-SUMMARY.md +75 -0
  272. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/edge-case-auto-fix-verification/with_skill/outputs/response.md +59 -0
  273. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/edge-case-mixed-language-project/with_skill/outputs/response.md +60 -0
  274. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/eval-summary.md +105 -0
  275. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/partial-install-python-only/with_skill/outputs/response.md +93 -0
  276. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/python-refactor-request/with_skill/outputs/response.md +104 -0
  277. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/quality-gate-error-fix/with_skill/outputs/response.md +74 -0
  278. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-general-chat/with_skill/outputs/response.md +18 -0
  279. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-math-question/with_skill/outputs/response.md +18 -0
  280. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-unrelated-coding/with_skill/outputs/response.md +56 -0
  281. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/tdd-guard-blocking-confusion/with_skill/outputs/response.md +67 -0
  282. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/typescript-feature-with-tests/with_skill/outputs/response.md +97 -0
  283. package/.xtrm/skills/default/scoping-service-skills/SKILL.md +231 -0
  284. package/.xtrm/skills/default/scoping-service-skills/scripts/scope.py +74 -0
  285. package/.xtrm/skills/default/service-skills-set/README.md +93 -0
  286. package/.xtrm/skills/default/service-skills-set/git-hooks/doc_reminder.py +67 -0
  287. package/.xtrm/skills/default/service-skills-set/git-hooks/skill_staleness.py +194 -0
  288. package/.xtrm/skills/default/service-skills-set/install-service-skills.py +193 -0
  289. package/.xtrm/skills/default/service-skills-set/service-registry.json +4 -0
  290. package/.xtrm/skills/default/service-skills-set/service-skills-readme.md +236 -0
  291. package/.xtrm/skills/default/service-skills-set/settings.json +37 -0
  292. package/.xtrm/skills/default/session-close-report/SKILL.md +131 -0
  293. package/.xtrm/skills/default/skill-creator/LICENSE.txt +202 -0
  294. package/.xtrm/skills/default/skill-creator/SKILL.md +479 -0
  295. package/.xtrm/skills/default/skill-creator/agents/analyzer.md +274 -0
  296. package/.xtrm/skills/default/skill-creator/agents/comparator.md +202 -0
  297. package/.xtrm/skills/default/skill-creator/agents/grader.md +223 -0
  298. package/.xtrm/skills/default/skill-creator/assets/eval_review.html +146 -0
  299. package/.xtrm/skills/default/skill-creator/eval-viewer/generate_review.py +471 -0
  300. package/.xtrm/skills/default/skill-creator/eval-viewer/viewer.html +1325 -0
  301. package/.xtrm/skills/default/skill-creator/references/schemas.md +430 -0
  302. package/.xtrm/skills/default/skill-creator/scripts/__init__.py +0 -0
  303. package/.xtrm/skills/default/skill-creator/scripts/aggregate_benchmark.py +401 -0
  304. package/.xtrm/skills/default/skill-creator/scripts/generate_report.py +326 -0
  305. package/.xtrm/skills/default/skill-creator/scripts/improve_description.py +248 -0
  306. package/.xtrm/skills/default/skill-creator/scripts/package_skill.py +136 -0
  307. package/.xtrm/skills/default/skill-creator/scripts/quick_validate.py +103 -0
  308. package/.xtrm/skills/default/skill-creator/scripts/run_eval.py +310 -0
  309. package/.xtrm/skills/default/skill-creator/scripts/run_loop.py +332 -0
  310. package/.xtrm/skills/default/skill-creator/scripts/utils.py +47 -0
  311. package/.xtrm/skills/default/specialists-creator/SKILL.md +705 -0
  312. package/.xtrm/skills/default/specialists-creator/scripts/validate-specialist.ts +41 -0
  313. package/.xtrm/skills/default/sync-docs/SKILL.md +262 -0
  314. package/.xtrm/skills/default/sync-docs/evals/evals.json +89 -0
  315. package/.xtrm/skills/default/sync-docs/references/doc-structure.md +99 -0
  316. package/.xtrm/skills/default/sync-docs/references/schema.md +103 -0
  317. package/.xtrm/skills/default/sync-docs/scripts/changelog/add_entry.py +216 -0
  318. package/.xtrm/skills/default/sync-docs/scripts/context_gatherer.py +405 -0
  319. package/.xtrm/skills/default/sync-docs/scripts/doc_structure_analyzer.py +495 -0
  320. package/.xtrm/skills/default/sync-docs/scripts/drift_detector.py +563 -0
  321. package/.xtrm/skills/default/sync-docs/scripts/validate_doc.py +365 -0
  322. package/.xtrm/skills/default/sync-docs/scripts/validate_metadata.py +185 -0
  323. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/benchmark.json +293 -0
  324. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/benchmark.md +13 -0
  325. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/eval_metadata.json +27 -0
  326. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/outputs/result.md +210 -0
  327. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/grading.json +28 -0
  328. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/timing.json +1 -0
  329. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/outputs/result.md +101 -0
  330. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/grading.json +28 -0
  331. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/timing.json +5 -0
  332. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/timing.json +5 -0
  333. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/eval_metadata.json +27 -0
  334. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/outputs/result.md +198 -0
  335. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/grading.json +28 -0
  336. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/timing.json +1 -0
  337. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/outputs/result.md +94 -0
  338. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/grading.json +28 -0
  339. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/timing.json +1 -0
  340. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/eval_metadata.json +27 -0
  341. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/outputs/result.md +237 -0
  342. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/grading.json +28 -0
  343. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
  344. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/outputs/result.md +134 -0
  345. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/grading.json +28 -0
  346. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/timing.json +1 -0
  347. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/benchmark.json +297 -0
  348. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/benchmark.md +13 -0
  349. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/eval_metadata.json +27 -0
  350. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/outputs/result.md +137 -0
  351. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/grading.json +92 -0
  352. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/timing.json +1 -0
  353. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/outputs/result.md +134 -0
  354. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/grading.json +86 -0
  355. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/timing.json +1 -0
  356. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/eval_metadata.json +27 -0
  357. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/outputs/result.md +193 -0
  358. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/grading.json +72 -0
  359. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/timing.json +1 -0
  360. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/outputs/result.md +211 -0
  361. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/grading.json +91 -0
  362. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/timing.json +5 -0
  363. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/eval_metadata.json +27 -0
  364. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/outputs/result.md +182 -0
  365. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
  366. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
  367. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/outputs/result.md +222 -0
  368. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/grading.json +88 -0
  369. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
  370. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/benchmark.json +298 -0
  371. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/benchmark.md +13 -0
  372. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/eval_metadata.json +27 -0
  373. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/outputs/result.md +125 -0
  374. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/grading.json +97 -0
  375. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/timing.json +5 -0
  376. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/outputs/result.md +144 -0
  377. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/grading.json +78 -0
  378. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/timing.json +5 -0
  379. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/eval_metadata.json +27 -0
  380. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/outputs/result.md +104 -0
  381. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/grading.json +91 -0
  382. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/timing.json +5 -0
  383. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/outputs/result.md +79 -0
  384. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/grading.json +82 -0
  385. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/timing.json +5 -0
  386. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/eval_metadata.json +27 -0
  387. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase1_context.json +302 -0
  388. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase2_drift.txt +33 -0
  389. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase3_analysis.json +114 -0
  390. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase4_fix.txt +118 -0
  391. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase5_validate.txt +38 -0
  392. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/result.md +158 -0
  393. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
  394. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/timing.json +5 -0
  395. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/outputs/result.md +71 -0
  396. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/grading.json +90 -0
  397. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
  398. package/.xtrm/skills/default/test-planning/SKILL.md +465 -0
  399. package/.xtrm/skills/default/test-planning/evals/evals.json +23 -0
  400. package/.xtrm/skills/default/updating-service-skills/SKILL.md +136 -0
  401. package/.xtrm/skills/default/updating-service-skills/scripts/drift_detector.py +222 -0
  402. package/.xtrm/skills/default/using-nodes/SKILL.md +333 -0
  403. package/.xtrm/skills/default/using-quality-gates/SKILL.md +254 -0
  404. package/.xtrm/skills/default/using-service-skills/SKILL.md +108 -0
  405. package/.xtrm/skills/default/using-service-skills/scripts/cataloger.py +74 -0
  406. package/.xtrm/skills/default/using-service-skills/scripts/skill_activator.py +152 -0
  407. package/.xtrm/skills/default/using-specialists/SKILL.md +848 -0
  408. package/.xtrm/skills/default/using-specialists/evals/evals.json +68 -0
  409. package/.xtrm/skills/default/using-tdd/SKILL.md +410 -0
  410. package/.xtrm/skills/default/using-xtrm/SKILL.md +127 -0
  411. package/.xtrm/skills/default/xt-debugging/SKILL.md +149 -0
  412. package/.xtrm/skills/default/xt-end/SKILL.md +297 -0
  413. package/.xtrm/skills/default/xt-merge/SKILL.md +326 -0
  414. package/.xtrm/skills/optional/README.txt +2 -0
  415. package/.xtrm/skills/optional/architecture-design/PACK.json +11 -0
  416. package/.xtrm/skills/optional/architecture-design/architecture-patterns/SKILL.md +494 -0
  417. package/.xtrm/skills/optional/architecture-design/architecture-patterns/references/advanced-patterns.md +391 -0
  418. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/SKILL.md +473 -0
  419. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/assets/few-shot-examples.json +106 -0
  420. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/assets/prompt-template-library.md +264 -0
  421. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/references/chain-of-thought.md +412 -0
  422. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/references/few-shot-learning.md +386 -0
  423. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/references/prompt-optimization.md +428 -0
  424. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/references/prompt-templates.md +484 -0
  425. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/references/system-prompts.md +195 -0
  426. package/.xtrm/skills/optional/architecture-design/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  427. package/.xtrm/skills/optional/architecture-design/subagent-driven-development/SKILL.md +277 -0
  428. package/.xtrm/skills/optional/architecture-design/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  429. package/.xtrm/skills/optional/architecture-design/subagent-driven-development/implementer-prompt.md +113 -0
  430. package/.xtrm/skills/optional/architecture-design/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  431. package/.xtrm/skills/optional/code-quality/PACK.json +12 -0
  432. package/.xtrm/skills/optional/code-quality/code-review-excellence/SKILL.md +529 -0
  433. package/.xtrm/skills/optional/code-quality/multi-reviewer-patterns/SKILL.md +127 -0
  434. package/.xtrm/skills/optional/code-quality/systematic-debugging/SKILL.md +296 -0
  435. package/.xtrm/skills/optional/code-quality/verification-before-completion/SKILL.md +139 -0
  436. package/.xtrm/skills/optional/data-engineering/PACK.json +9 -0
  437. package/.xtrm/skills/optional/data-engineering/data-analyst/SKILL.md +57 -0
  438. package/.xtrm/skills/optional/research-methods/PACK.json +12 -0
  439. package/.xtrm/skills/optional/research-methods/academic-researcher/SKILL.md +269 -0
  440. package/.xtrm/skills/optional/research-methods/brainstorming/SKILL.md +164 -0
  441. package/.xtrm/skills/optional/research-methods/brainstorming/scripts/frame-template.html +214 -0
  442. package/.xtrm/skills/optional/research-methods/brainstorming/scripts/helper.js +88 -0
  443. package/.xtrm/skills/optional/research-methods/brainstorming/scripts/server.cjs +354 -0
  444. package/.xtrm/skills/optional/research-methods/brainstorming/scripts/start-server.sh +148 -0
  445. package/.xtrm/skills/optional/research-methods/brainstorming/scripts/stop-server.sh +56 -0
  446. package/.xtrm/skills/optional/research-methods/brainstorming/spec-document-reviewer-prompt.md +49 -0
  447. package/.xtrm/skills/optional/research-methods/brainstorming/visual-companion.md +287 -0
  448. package/.xtrm/skills/optional/research-methods/deep-research/SKILL.md +192 -0
  449. package/.xtrm/skills/optional/research-methods/fact-checker/SKILL.md +182 -0
  450. package/.xtrm/skills/optional/security-ops/PACK.json +9 -0
  451. package/.xtrm/skills/optional/security-ops/security-auditor/SKILL.md +165 -0
  452. package/.xtrm/skills/optional/xt-optional/PACK.json +16 -0
  453. package/.xtrm/skills/optional/xt-optional/docker-expert/SKILL.md +409 -0
  454. package/.xtrm/skills/optional/xt-optional/obsidian-cli/SKILL.md +106 -0
  455. package/.xtrm/skills/optional/xt-optional/python-testing/SKILL.md +815 -0
  456. package/.xtrm/skills/optional/xt-optional/senior-backend/SKILL.md +209 -0
  457. package/.xtrm/skills/optional/xt-optional/senior-backend/references/api_design_patterns.md +103 -0
  458. package/.xtrm/skills/optional/xt-optional/senior-backend/references/backend_security_practices.md +103 -0
  459. package/.xtrm/skills/optional/xt-optional/senior-backend/references/database_optimization_guide.md +103 -0
  460. package/.xtrm/skills/optional/xt-optional/senior-backend/scripts/api_load_tester.py +114 -0
  461. package/.xtrm/skills/optional/xt-optional/senior-backend/scripts/api_scaffolder.py +114 -0
  462. package/.xtrm/skills/optional/xt-optional/senior-backend/scripts/database_migration_tool.py +114 -0
  463. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/SKILL.md +226 -0
  464. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/references/experiment_design_frameworks.md +80 -0
  465. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/references/feature_engineering_patterns.md +80 -0
  466. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/references/statistical_methods_advanced.md +80 -0
  467. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/scripts/experiment_designer.py +100 -0
  468. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/scripts/feature_engineering_pipeline.py +100 -0
  469. package/.xtrm/skills/optional/xt-optional/senior-data-scientist/scripts/model_evaluation_suite.py +100 -0
  470. package/.xtrm/skills/optional/xt-optional/senior-devops/SKILL.md +209 -0
  471. package/.xtrm/skills/optional/xt-optional/senior-devops/references/cicd_pipeline_guide.md +103 -0
  472. package/.xtrm/skills/optional/xt-optional/senior-devops/references/deployment_strategies.md +103 -0
  473. package/.xtrm/skills/optional/xt-optional/senior-devops/references/infrastructure_as_code.md +103 -0
  474. package/.xtrm/skills/optional/xt-optional/senior-devops/scripts/deployment_manager.py +114 -0
  475. package/.xtrm/skills/optional/xt-optional/senior-devops/scripts/pipeline_generator.py +114 -0
  476. package/.xtrm/skills/optional/xt-optional/senior-devops/scripts/terraform_scaffolder.py +114 -0
  477. package/.xtrm/skills/optional/xt-optional/senior-security/SKILL.md +209 -0
  478. package/.xtrm/skills/optional/xt-optional/senior-security/references/cryptography_implementation.md +103 -0
  479. package/.xtrm/skills/optional/xt-optional/senior-security/references/penetration_testing_guide.md +103 -0
  480. package/.xtrm/skills/optional/xt-optional/senior-security/references/security_architecture_patterns.md +103 -0
  481. package/.xtrm/skills/optional/xt-optional/senior-security/scripts/pentest_automator.py +114 -0
  482. package/.xtrm/skills/optional/xt-optional/senior-security/scripts/security_auditor.py +114 -0
  483. package/.xtrm/skills/optional/xt-optional/senior-security/scripts/threat_modeler.py +114 -0
  484. package/CHANGELOG.md +16 -0
  485. package/README.md +5 -0
  486. package/cli/dist/index.cjs +798 -612
  487. package/cli/dist/index.cjs.map +1 -1
  488. package/cli/package.json +1 -1
  489. package/package.json +3 -1
  490. package/.xtrm/extensions/auto-session-name/index.ts +0 -29
  491. package/.xtrm/extensions/auto-session-name/package.json +0 -16
  492. package/.xtrm/extensions/auto-update/index.ts +0 -71
  493. package/.xtrm/extensions/auto-update/package.json +0 -16
  494. package/.xtrm/extensions/beads/index.ts +0 -232
  495. package/.xtrm/extensions/beads/package.json +0 -19
  496. package/.xtrm/extensions/compact-header/index.ts +0 -69
  497. package/.xtrm/extensions/compact-header/package.json +0 -16
  498. package/.xtrm/extensions/core/adapter.ts +0 -52
  499. package/.xtrm/extensions/core/guard-rules.ts +0 -100
  500. package/.xtrm/extensions/core/lib.ts +0 -3
  501. package/.xtrm/extensions/core/logger.ts +0 -45
  502. package/.xtrm/extensions/core/package.json +0 -18
  503. package/.xtrm/extensions/core/runner.ts +0 -71
  504. package/.xtrm/extensions/core/session-state.ts +0 -59
  505. package/.xtrm/extensions/custom-footer/index.ts +0 -398
  506. package/.xtrm/extensions/custom-footer/package.json +0 -19
  507. package/.xtrm/extensions/custom-provider-qwen-cli/index.ts +0 -363
  508. package/.xtrm/extensions/custom-provider-qwen-cli/package.json +0 -1
  509. package/.xtrm/extensions/git-checkpoint/index.ts +0 -53
  510. package/.xtrm/extensions/git-checkpoint/package.json +0 -16
  511. package/.xtrm/extensions/lsp-bootstrap/index.ts +0 -134
  512. package/.xtrm/extensions/lsp-bootstrap/package.json +0 -17
  513. package/.xtrm/extensions/pi-serena-compact/index.ts +0 -121
  514. package/.xtrm/extensions/pi-serena-compact/package.json +0 -16
  515. package/.xtrm/extensions/quality-gates/index.ts +0 -66
  516. package/.xtrm/extensions/quality-gates/package.json +0 -19
  517. package/.xtrm/extensions/service-skills/index.ts +0 -108
  518. package/.xtrm/extensions/service-skills/package.json +0 -19
  519. package/.xtrm/extensions/session-flow/index.ts +0 -96
  520. package/.xtrm/extensions/session-flow/package.json +0 -19
  521. package/.xtrm/extensions/xtrm-loader/index.ts +0 -152
  522. package/.xtrm/extensions/xtrm-loader/package.json +0 -19
  523. package/.xtrm/extensions/xtrm-ui/format.ts +0 -93
  524. package/.xtrm/extensions/xtrm-ui/index.ts +0 -1053
  525. package/.xtrm/extensions/xtrm-ui/package.json +0 -10
  526. package/.xtrm/extensions/xtrm-ui/themes/pidex-dark.json +0 -85
  527. package/.xtrm/extensions/xtrm-ui/themes/pidex-light.json +0 -85
@@ -1,1053 +0,0 @@
1
- /**
2
- * XTRM UI Extension
3
- *
4
- * Wraps pi-dex functionality with XTRM-specific preferences:
5
- * - Uses pi-dex themes and header
6
- * - Disables pi-dex footer (let custom-footer handle it)
7
- * - Provides /xtrm-ui commands for theme/density switching
8
- *
9
- * This eliminates the race condition between pi-dex's footer and
10
- * XTRM's custom-footer extension.
11
- */
12
-
13
- import type {
14
- BashToolDetails,
15
- EditToolDetails,
16
- ExtensionAPI,
17
- ExtensionContext,
18
- FindToolDetails,
19
- GrepToolDetails,
20
- LsToolDetails,
21
- ReadToolDetails,
22
- ToolResultEvent,
23
- } from "@mariozechner/pi-coding-agent";
24
- import {
25
- CustomEditor,
26
- createBashTool,
27
- createEditTool,
28
- createFindTool,
29
- createGrepTool,
30
- createLsTool,
31
- createReadTool,
32
- createWriteTool,
33
- } from "@mariozechner/pi-coding-agent";
34
- import { Box, Text, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
35
- import { basename, join } from "node:path";
36
- import {
37
- cleanOutputLines,
38
- countPrefixedItems,
39
- diffStats,
40
- formatDuration,
41
- formatLineLabel,
42
- joinMeta,
43
- lineCount,
44
- previewLines,
45
- renderToolSummary,
46
- shortenCommand,
47
- shortenPath,
48
- } from "./format";
49
-
50
- // ============================================================================
51
- // Types
52
- // ============================================================================
53
-
54
- export type XtrmThemeName = "pidex-dark" | "pidex-light";
55
- export type XtrmDensity = "compact" | "comfortable";
56
-
57
- export interface XtrmUiPrefs {
58
- themeName: XtrmThemeName;
59
- density: XtrmDensity;
60
- showHeader: boolean;
61
- compactTools: boolean;
62
- showFooter: boolean; // Our key addition - when false, skip setFooter()
63
- forceTheme: boolean; // When false, skip setTheme (allow external theme override)
64
- }
65
-
66
- // ============================================================================
67
- // Defaults
68
- // ============================================================================
69
-
70
- export const XTRM_UI_PREFS_ENTRY = "xtrm-ui-prefs";
71
-
72
- export const DEFAULT_PREFS: XtrmUiPrefs = {
73
- themeName: "pidex-dark",
74
- density: "compact",
75
- showHeader: true,
76
- compactTools: true,
77
- showFooter: false, // XTRM: disable pi-dex footer, use custom-footer
78
- forceTheme: true,
79
- };
80
-
81
- // ============================================================================
82
- // Preferences
83
- // ============================================================================
84
-
85
- type MaybeCustomEntry = {
86
- type?: string;
87
- customType?: string;
88
- data?: unknown;
89
- };
90
-
91
- function normalizePrefs(input: unknown): XtrmUiPrefs {
92
- if (!input || typeof input !== "object") return { ...DEFAULT_PREFS };
93
- const source = input as Partial<XtrmUiPrefs>;
94
- return {
95
- themeName: source.themeName === "pidex-light" ? "pidex-light" : "pidex-dark",
96
- density: source.density === "comfortable" ? "comfortable" : "compact",
97
- showHeader: source.showHeader ?? DEFAULT_PREFS.showHeader,
98
- compactTools: source.compactTools ?? DEFAULT_PREFS.compactTools,
99
- showFooter: source.showFooter ?? DEFAULT_PREFS.showFooter,
100
- forceTheme: source.forceTheme ?? DEFAULT_PREFS.forceTheme,
101
- };
102
- }
103
-
104
- function loadPrefs(entries: ReadonlyArray<MaybeCustomEntry>): XtrmUiPrefs {
105
- for (let i = entries.length - 1; i >= 0; i--) {
106
- const entry = entries[i];
107
- if (entry?.type === "custom" && entry.customType === XTRM_UI_PREFS_ENTRY) {
108
- return normalizePrefs(entry.data);
109
- }
110
- }
111
- return { ...DEFAULT_PREFS };
112
- }
113
-
114
- function persistPrefs(pi: ExtensionAPI, prefs: XtrmUiPrefs): void {
115
- pi.appendEntry(XTRM_UI_PREFS_ENTRY, prefs);
116
- }
117
-
118
- // ============================================================================
119
- // Chrome Application
120
- // ============================================================================
121
-
122
- function fitVisible(text: string, width: number): string {
123
- const truncated = truncateToWidth(text, width);
124
- return truncated + " ".repeat(Math.max(0, width - visibleWidth(truncated)));
125
- }
126
-
127
- function formatThinking(level: string): string {
128
- return level === "off" ? "standard" : level;
129
- }
130
-
131
- function applyXtrmChrome(
132
- ctx: ExtensionContext,
133
- prefs: XtrmUiPrefs,
134
- getThinkingLevel: () => string
135
- ): void {
136
- // Theme
137
- if (prefs.forceTheme) ctx.ui.setTheme(prefs.themeName);
138
-
139
- // Tool expansion
140
- ctx.ui.setToolsExpanded(!prefs.compactTools);
141
-
142
- // Editor — density-aware input padding
143
- ctx.ui.setEditorComponent((tui, theme, keybindings) => {
144
- const editor = new XtrmEditor(tui, theme, keybindings);
145
- editor.setPrefs(prefs);
146
- return editor;
147
- });
148
-
149
- // Header (optional)
150
- if (prefs.showHeader) {
151
- ctx.ui.setHeader((_tui, theme) => ({
152
- invalidate() {},
153
- render(width: number): string[] {
154
- const boxWidth = width >= 54 ? 50 : Math.max(24, width);
155
- const model = ctx.model?.id ?? "no-model";
156
- const thinking = getThinkingLevel();
157
- const border = (text: string) => theme.fg("borderAccent", text);
158
- const leftPad = "";
159
-
160
- const top = leftPad + border(`╭${"─".repeat(Math.max(0, boxWidth - 2))}╮`);
161
- const line1 =
162
- leftPad +
163
- border("│") +
164
- fitVisible(
165
- ` ${theme.fg("dim", ">_")} ${theme.bold("XTRM")} ${theme.fg("dim", `(v1.0.0)`)}`,
166
- boxWidth - 2
167
- ) +
168
- border("│");
169
- const gap = leftPad + border("│") + fitVisible("", boxWidth - 2) + border("│");
170
- const line2 =
171
- leftPad +
172
- border("│") +
173
- fitVisible(
174
- ` ${theme.fg("dim", "model:".padEnd(11))}${model} ${thinking}${theme.fg("accent", " /model")}${theme.fg("dim", " to change")}`,
175
- boxWidth - 2
176
- ) +
177
- border("│");
178
- const line3 =
179
- leftPad +
180
- border("│") +
181
- fitVisible(
182
- ` ${theme.fg("dim", "directory:".padEnd(11))}${basename(ctx.cwd)}`,
183
- boxWidth - 2
184
- ) +
185
- border("│");
186
- const bottom = leftPad + border(`╰${"─".repeat(Math.max(0, boxWidth - 2))}╯`);
187
-
188
- return [top, line1, gap, line2, line3, bottom];
189
- },
190
- }));
191
- } else {
192
- ctx.ui.setHeader(undefined);
193
- }
194
-
195
- // Footer - ONLY if showFooter is true (default false for XTRM)
196
- // This is the key difference from pi-dex - we let custom-footer handle it
197
- if (prefs.showFooter) {
198
- ctx.ui.setFooter((tui, theme, footerData) => {
199
- const unsubscribe = footerData.onBranchChange(() => tui.requestRender());
200
- return {
201
- dispose: unsubscribe,
202
- invalidate() {},
203
- render(width: number): string[] {
204
- const modelId = ctx.model?.id ?? "no-model";
205
- const thinking = getThinkingLevel();
206
- const contextUsage = ctx.getContextUsage();
207
- const leftPct = contextUsage?.percent != null ? `${100 - Math.round(contextUsage.percent)}% left` : undefined;
208
- const line = theme.fg(
209
- "dim",
210
- [`${modelId} ${thinking}`, leftPct, basename(ctx.cwd)]
211
- .filter(Boolean)
212
- .join(" · ")
213
- );
214
- return [truncateToWidth(line, width)];
215
- },
216
- };
217
- });
218
- }
219
- // If showFooter is false, we do NOT call setFooter - custom-footer will handle it
220
- }
221
-
222
- // ============================================================================
223
- // Tool Render Helpers
224
- // ============================================================================
225
-
226
- function renderOutputPreview(theme: any, lines: string[], maxLines: number): string {
227
- const subset = lines.slice(0, maxLines);
228
- let text = subset.map((line) => theme.fg("toolOutput", ` ${line}`)).join("\n");
229
- if (lines.length > maxLines) text += `\n${theme.fg("muted", ` … +${lines.length - maxLines} more`)}`;
230
- return text;
231
- }
232
-
233
- function renderVerticalPreview(theme: any, lines: string[], maxLines: number): string {
234
- const subset = lines.slice(0, maxLines);
235
- let text = subset.map((line) => `${theme.fg("muted", "│")} ${theme.fg("toolOutput", line)}`).join("\n");
236
- if (lines.length > maxLines) text += `\n${theme.fg("muted", "│")} ${theme.fg("muted", `… +${lines.length - maxLines} more lines`)}`;
237
- return text;
238
- }
239
-
240
- function renderDiffPreview(theme: any, diff: string, maxLines: number): string {
241
- const lines = diff.split("\n").slice(0, maxLines);
242
- let out = "";
243
- for (const line of lines) {
244
- const styled =
245
- line.startsWith("+") && !line.startsWith("+++") ? theme.fg("toolDiffAdded", ` ${line}`)
246
- : line.startsWith("-") && !line.startsWith("---") ? theme.fg("toolDiffRemoved", ` ${line}`)
247
- : theme.fg("toolDiffContext", ` ${line}`);
248
- out += (out ? "\n" : "") + styled;
249
- }
250
- if (diff.split("\n").length > maxLines) out += `\n${theme.fg("muted", ` … +${diff.split("\n").length - maxLines} more`)}`;
251
- return out;
252
- }
253
-
254
- function lineRange(offset?: number, limit?: number): string | undefined {
255
- if (offset == null && limit == null) return undefined;
256
- const start = offset ?? 1;
257
- if (limit == null) return `${start}`;
258
- return `${start}-${start + limit - 1}`;
259
- }
260
-
261
- function summarizeCount(text: string): number {
262
- return text.split("\n").filter((line) => line.trim().length > 0).length;
263
- }
264
-
265
- // ============================================================================
266
- // Editor (task p38n.3)
267
- // ============================================================================
268
-
269
- class XtrmEditor extends CustomEditor {
270
- constructor(...args: ConstructorParameters<typeof CustomEditor>) {
271
- super(...args);
272
- }
273
-
274
- setPrefs(prefs: XtrmUiPrefs): void {
275
- this.setPaddingX(prefs.density === "comfortable" ? 2 : 1);
276
- }
277
-
278
- render(width: number): string[] {
279
- return super.render(width);
280
- }
281
- }
282
-
283
- // ============================================================================
284
- // Commands
285
- // ============================================================================
286
-
287
- function sendInfoMessage(pi: ExtensionAPI, title: string, content: string): void {
288
- pi.sendMessage({
289
- customType: "xtrm-ui-info",
290
- content,
291
- display: true,
292
- details: { title },
293
- });
294
- }
295
-
296
- function parseThemeArg(arg: string): XtrmThemeName | undefined {
297
- const normalized = arg.trim().toLowerCase();
298
- if (normalized === "dark" || normalized === "pidex-dark") return "pidex-dark";
299
- if (normalized === "light" || normalized === "pidex-light") return "pidex-light";
300
- return undefined;
301
- }
302
-
303
- function parseDensityArg(arg: string): XtrmDensity | undefined {
304
- const normalized = arg.trim().toLowerCase();
305
- if (normalized === "compact") return "compact";
306
- if (normalized === "comfortable" || normalized === "normal") return "comfortable";
307
- return undefined;
308
- }
309
-
310
- function registerCommands(pi: ExtensionAPI, getPrefs: () => XtrmUiPrefs, setPrefs: (p: XtrmUiPrefs) => void, getThinkingLevel: () => string) {
311
- pi.registerMessageRenderer("xtrm-ui-info", (message, _options, theme) => {
312
- const title = (message.details as { title?: string } | undefined)?.title ?? "XTRM UI";
313
- const box = new Box(1, 1, (text) => theme.bg("customMessageBg", text));
314
- box.addChild(new Text(theme.fg("customMessageLabel", theme.bold(title)), 0, 0));
315
- box.addChild(new Text(theme.fg("customMessageText", String(message.content ?? "")), 0, 0));
316
- return box;
317
- });
318
-
319
- pi.registerCommand("xtrm-ui", {
320
- description: "Show XTRM UI status and active preferences",
321
- handler: async (_args, ctx) => {
322
- const prefs = getPrefs();
323
- const contextUsage = ctx.getContextUsage();
324
- const lines = [
325
- `Theme: ${prefs.themeName}`,
326
- `Force theme: ${prefs.forceTheme ? "on" : "off"}`,
327
- `Density: ${prefs.density}`,
328
- `Compact tools: ${prefs.compactTools ? "on" : "off"}`,
329
- `Show header: ${prefs.showHeader ? "yes" : "no"}`,
330
- `Show footer: ${prefs.showFooter ? "yes" : "no"} (custom-footer handles this)`,
331
- `Model: ${ctx.model?.id ?? "none"}`,
332
- `Context: ${contextUsage?.tokens ?? "unknown"}/${contextUsage?.contextWindow ?? "unknown"}`,
333
- ];
334
- sendInfoMessage(pi, "XTRM UI status", lines.join("\\n"));
335
- },
336
- });
337
-
338
- pi.registerCommand("xtrm-ui-theme", {
339
- description: "Switch XTRM UI theme: dark|light",
340
- getArgumentCompletions: (prefix) => {
341
- const values = ["dark", "light"].filter((item) => item.startsWith(prefix));
342
- return values.length > 0 ? values.map((value) => ({ value, label: value })) : null;
343
- },
344
- handler: async (args, ctx) => {
345
- const themeName = parseThemeArg(args);
346
- if (!themeName) {
347
- ctx.ui.notify("Usage: /xtrm-ui-theme dark|light", "warning");
348
- return;
349
- }
350
- const prefs = { ...getPrefs(), themeName };
351
- setPrefs(prefs);
352
- persistPrefs(pi, prefs);
353
- applyXtrmChrome(ctx, prefs, getThinkingLevel);
354
- ctx.ui.notify(`XTRM UI theme set to ${themeName}`, "info");
355
- },
356
- });
357
-
358
- pi.registerCommand("xtrm-ui-density", {
359
- description: "Switch XTRM UI density: compact|comfortable",
360
- getArgumentCompletions: (prefix) => {
361
- const values = ["compact", "comfortable"].filter((item) => item.startsWith(prefix));
362
- return values.length > 0 ? values.map((value) => ({ value, label: value })) : null;
363
- },
364
- handler: async (args, ctx) => {
365
- const density = parseDensityArg(args);
366
- if (!density) {
367
- ctx.ui.notify("Usage: /xtrm-ui-density compact|comfortable", "warning");
368
- return;
369
- }
370
- const prefs = { ...getPrefs(), density };
371
- setPrefs(prefs);
372
- persistPrefs(pi, prefs);
373
- applyXtrmChrome(ctx, prefs, getThinkingLevel);
374
- ctx.ui.notify(`XTRM UI density set to ${density}`, "info");
375
- },
376
- });
377
-
378
- pi.registerCommand("xtrm-ui-header", {
379
- description: "Toggle XTRM UI header: on|off",
380
- getArgumentCompletions: (prefix) => {
381
- const values = ["on", "off"].filter((item) => item.startsWith(prefix));
382
- return values.length > 0 ? values.map((value) => ({ value, label: value })) : null;
383
- },
384
- handler: async (args, ctx) => {
385
- const showHeader = args.trim().toLowerCase() === "on";
386
- const prefs = { ...getPrefs(), showHeader };
387
- setPrefs(prefs);
388
- persistPrefs(pi, prefs);
389
- applyXtrmChrome(ctx, prefs, getThinkingLevel);
390
- ctx.ui.notify(`XTRM UI header ${showHeader ? "enabled" : "disabled"}`, "info");
391
- },
392
- });
393
-
394
- pi.registerCommand("xtrm-ui-forcetheme", {
395
- description: "Control whether xtrm-ui overrides the active theme: on|off",
396
- getArgumentCompletions: (prefix) => {
397
- const values = ["on", "off"].filter((item) => item.startsWith(prefix));
398
- return values.length > 0 ? values.map((value) => ({ value, label: value })) : null;
399
- },
400
- handler: async (args, ctx) => {
401
- const normalized = args.trim().toLowerCase();
402
- if (normalized !== "on" && normalized !== "off") {
403
- ctx.ui.notify("Usage: /xtrm-ui-forcetheme on|off", "warning");
404
- return;
405
- }
406
- const forceTheme = normalized === "on";
407
- const prefs = { ...getPrefs(), forceTheme };
408
- setPrefs(prefs);
409
- persistPrefs(pi, prefs);
410
- applyXtrmChrome(ctx, prefs, getThinkingLevel);
411
- ctx.ui.notify(`XTRM UI force theme ${forceTheme ? "enabled" : "disabled"}`, "info");
412
- },
413
- });
414
-
415
- pi.registerCommand("xtrm-ui-reset", {
416
- description: "Restore XTRM UI defaults",
417
- handler: async (_args, ctx) => {
418
- const prefs = { ...DEFAULT_PREFS };
419
- setPrefs(prefs);
420
- persistPrefs(pi, prefs);
421
- applyXtrmChrome(ctx, prefs, getThinkingLevel);
422
- ctx.ui.notify("XTRM UI reset to defaults", "info");
423
- },
424
- });
425
- }
426
-
427
- // ============================================================================
428
- // Tool Renderers (ported from pi-dex tooling.ts)
429
- // ============================================================================
430
-
431
- type BuiltInTools = ReturnType<typeof createBuiltInTools>;
432
-
433
- type XtrmMeta<TArgs = Record<string, unknown>> = {
434
- tool: string;
435
- args: TArgs;
436
- durationMs: number;
437
- };
438
-
439
- type DetailsWithXtrmMeta<TDetails, TArgs = Record<string, unknown>> = TDetails & {
440
- xtrmMeta?: XtrmMeta<TArgs>;
441
- };
442
-
443
- const toolCache = new Map<string, BuiltInTools>();
444
-
445
- function createBuiltInTools(cwd: string) {
446
- return {
447
- bash: createBashTool(cwd),
448
- read: createReadTool(cwd),
449
- edit: createEditTool(cwd),
450
- write: createWriteTool(cwd),
451
- find: createFindTool(cwd),
452
- grep: createGrepTool(cwd),
453
- ls: createLsTool(cwd),
454
- };
455
- }
456
-
457
- function getTools(cwd: string): BuiltInTools {
458
- let tools = toolCache.get(cwd);
459
- if (!tools) {
460
- tools = createBuiltInTools(cwd);
461
- toolCache.set(cwd, tools);
462
- }
463
- return tools;
464
- }
465
-
466
- function withXtrmMeta<TDetails extends object, TArgs extends Record<string, unknown>>(
467
- details: TDetails | undefined,
468
- tool: string,
469
- args: TArgs,
470
- durationMs: number,
471
- ): DetailsWithXtrmMeta<TDetails, TArgs> {
472
- return { ...(details ?? ({} as TDetails)), xtrmMeta: { tool, args, durationMs } };
473
- }
474
-
475
- function getXtrmMeta<TDetails extends object, TArgs extends Record<string, unknown>>(
476
- details: TDetails | undefined,
477
- ): XtrmMeta<TArgs> | undefined {
478
- if (!details || typeof details !== "object") return undefined;
479
- return (details as DetailsWithXtrmMeta<TDetails, TArgs>).xtrmMeta;
480
- }
481
-
482
- function getTextContent(result: { content: Array<{ type: string; text?: string }> }): string {
483
- const item = result.content.find((content) => content.type === "text");
484
- return item?.text ?? "";
485
- }
486
-
487
- function renderPendingCall(toolName: string, args: Record<string, unknown>, theme: any): Text {
488
- return new Text(renderToolSummary(theme, "pending", toolName, summarizeToolSubject(toolName, args), undefined), 0, 0);
489
- }
490
-
491
- function stableToolSignature(toolName: string, args: Record<string, unknown>): string {
492
- return `${toolName}:${JSON.stringify(args)}`;
493
- }
494
-
495
- function summarizeToolSubject(toolName: string, args: Record<string, unknown>): string | undefined {
496
- switch (toolName) {
497
- case "bash": return shortenCommand(String(args.command ?? ""), 52);
498
- case "read": {
499
- const path = shortenPath(String(args.path ?? ""), 42);
500
- const range = lineRange(args.offset as number | undefined, args.limit as number | undefined);
501
- return range ? `${path}:${range}` : path;
502
- }
503
- case "edit":
504
- case "write": return shortenPath(String(args.path ?? ""), 42);
505
- case "find":
506
- case "grep": return String(args.pattern ?? "");
507
- case "ls": return shortenPath(String(args.path ?? "."), 42);
508
- default: return undefined;
509
- }
510
- }
511
-
512
- const SERENA_COMPACT_TOOLS = new Set([
513
- "find_symbol",
514
- "find_referencing_symbols",
515
- "insert_after_symbol",
516
- "replace_symbol_body",
517
- "read_file",
518
- "get_symbols_overview",
519
- "insert_before_symbol",
520
- "rename_symbol",
521
- "restart_language_server",
522
- "jet_brains_get_symbols_overview",
523
- "jet_brains_find_symbol",
524
- "jet_brains_find_referencing_symbols",
525
- "jet_brains_type_hierarchy",
526
- "search_for_pattern",
527
- "list_dir",
528
- "find_file",
529
- "create_text_file",
530
- "replace_content",
531
- "delete_lines",
532
- "replace_lines",
533
- "insert_at_line",
534
- "execute_shell_command",
535
- "get_current_config",
536
- "activate_project",
537
- "remove_project",
538
- "switch_modes",
539
- "open_dashboard",
540
- "check_onboarding_performed",
541
- "onboarding",
542
- "initial_instructions",
543
- "prepare_for_new_conversation",
544
- "summarize_changes",
545
- "think_about_collected_information",
546
- "think_about_task_adherence",
547
- "think_about_whether_you_are_done",
548
- "read_memory",
549
- "write_memory",
550
- "list_memories",
551
- "delete_memory",
552
- "rename_memory",
553
- "edit_memory",
554
- "serena_mcp_reset",
555
- ]);
556
-
557
- function parseJson(text: string): unknown | undefined {
558
- try {
559
- return JSON.parse(text);
560
- } catch {
561
- return undefined;
562
- }
563
- }
564
-
565
- function asRecord(value: unknown): Record<string, unknown> | undefined {
566
- return value && typeof value === "object" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;
567
- }
568
-
569
- function countSearchMatches(payload: unknown): number | undefined {
570
- const record = asRecord(payload);
571
- if (!record) return undefined;
572
- let total = 0;
573
- for (const value of Object.values(record)) {
574
- if (Array.isArray(value)) total += value.length;
575
- }
576
- return total > 0 ? total : undefined;
577
- }
578
-
579
- function countOverviewSymbols(payload: unknown): number {
580
- if (Array.isArray(payload)) {
581
- const nested = payload.reduce<number>((total, value) => total + countOverviewSymbols(value), 0);
582
- return nested || payload.length;
583
- }
584
- const record = asRecord(payload);
585
- if (!record) return 0;
586
- return Object.values(record).reduce<number>((total, value) => total + countOverviewSymbols(value), 0);
587
- }
588
-
589
- function countLines(text: string): number {
590
- if (!text) return 0;
591
- return text.split("\n").length;
592
- }
593
-
594
- function countJsonItems(payload: unknown): number | undefined {
595
- if (Array.isArray(payload)) return payload.length;
596
- const record = asRecord(payload);
597
- if (!record) return undefined;
598
-
599
- let total = 0;
600
- for (const value of Object.values(record)) {
601
- if (Array.isArray(value)) total += value.length;
602
- }
603
- return total > 0 ? total : undefined;
604
- }
605
-
606
- function summarizeSerenaSubject(toolName: string, input: Record<string, unknown>): string | undefined {
607
- switch (toolName) {
608
- case "find_symbol":
609
- case "find_referencing_symbols":
610
- case "replace_symbol_body":
611
- case "insert_after_symbol":
612
- case "insert_before_symbol":
613
- case "rename_symbol":
614
- case "jet_brains_find_symbol":
615
- case "jet_brains_find_referencing_symbols":
616
- case "jet_brains_type_hierarchy":
617
- return String(input.name_path_pattern ?? input.name_path ?? "symbol");
618
- case "get_symbols_overview":
619
- case "jet_brains_get_symbols_overview":
620
- case "read_file":
621
- case "create_text_file":
622
- case "replace_content":
623
- case "replace_lines":
624
- case "delete_lines":
625
- case "insert_at_line":
626
- case "list_dir":
627
- case "find_file":
628
- return shortenPath(String(input.relative_path ?? input.path ?? "."), 42);
629
- case "search_for_pattern":
630
- return shortenCommand(String(input.substring_pattern ?? ""), 52);
631
- case "read_memory":
632
- case "write_memory":
633
- case "delete_memory":
634
- case "rename_memory":
635
- case "edit_memory":
636
- return String(input.memory_name ?? input.old_name ?? "memory");
637
- case "activate_project":
638
- case "remove_project":
639
- return String(input.project ?? input.project_name ?? "project");
640
- case "switch_modes": {
641
- const modes = input.modes;
642
- if (Array.isArray(modes)) return modes.map((mode) => String(mode)).join(",");
643
- return "modes";
644
- }
645
- case "execute_shell_command":
646
- return shortenCommand(String(input.command ?? ""), 52);
647
- default:
648
- return undefined;
649
- }
650
- }
651
-
652
- function summarizeSerenaToolResult(
653
- toolName: string,
654
- input: Record<string, unknown>,
655
- text: string,
656
- durationMs: number | undefined,
657
- ): string {
658
- const payload = parseJson(text);
659
- const duration = formatDuration(durationMs);
660
- const subject = summarizeSerenaSubject(toolName, input);
661
- const meta = (...parts: Array<string | undefined>) => {
662
- const joined = joinMeta(parts);
663
- return joined ? ` · ${joined}` : "";
664
- };
665
-
666
- switch (toolName) {
667
- case "find_symbol":
668
- case "find_referencing_symbols":
669
- case "jet_brains_find_symbol":
670
- case "jet_brains_find_referencing_symbols": {
671
- const count = countJsonItems(payload) ?? (text.match(/"name_path"\s*:/g)?.length ?? 0);
672
- return `• serena ${toolName} ${subject ?? "symbol"}${meta(formatLineLabel(count, "result"), duration)}`;
673
- }
674
- case "get_symbols_overview":
675
- case "jet_brains_get_symbols_overview":
676
- case "jet_brains_type_hierarchy": {
677
- const count = Math.max(countOverviewSymbols(payload), text.match(/"name_path"\s*:/g)?.length ?? 0);
678
- return `• serena ${toolName} ${subject ?? "file"}${meta(formatLineLabel(count, "symbol"), duration)}`;
679
- }
680
- case "search_for_pattern": {
681
- const count = countSearchMatches(payload) ?? (text.match(/^\s*>\s*\d+:/gm)?.length ?? 0);
682
- return `• serena search ${subject ?? "pattern"}${meta(formatLineLabel(count, "match"), duration)}`;
683
- }
684
- case "read_file": {
685
- return `• serena read ${subject ?? "file"}${meta(formatLineLabel(countLines(text), "line"), duration)}`;
686
- }
687
- case "list_dir": {
688
- const count = countJsonItems(payload) ?? countLines(text);
689
- return `• serena list_dir ${subject ?? "."}${meta(formatLineLabel(count, "entry"), duration)}`;
690
- }
691
- case "find_file": {
692
- const count = countJsonItems(payload) ?? countLines(text);
693
- return `• serena find_file ${String(input.file_mask ?? "")}${meta(formatLineLabel(count, "match"), duration)}`;
694
- }
695
- case "replace_symbol_body":
696
- case "insert_after_symbol":
697
- case "insert_before_symbol":
698
- case "rename_symbol":
699
- case "create_text_file":
700
- case "replace_content":
701
- case "replace_lines":
702
- case "delete_lines":
703
- case "insert_at_line":
704
- case "write_memory":
705
- case "delete_memory":
706
- case "rename_memory":
707
- case "edit_memory":
708
- case "activate_project":
709
- case "remove_project":
710
- case "switch_modes":
711
- case "restart_language_server":
712
- case "onboarding":
713
- case "serena_mcp_reset":
714
- return `• serena ${toolName}${subject ? ` ${subject}` : ""}${meta(duration)}`;
715
- case "execute_shell_command": {
716
- const count = countLines(text);
717
- return `• serena shell ${subject ?? "command"}${meta(formatLineLabel(count, "line"), duration)}`;
718
- }
719
- default: {
720
- const count = countJsonItems(payload) ?? countLines(text);
721
- return `• serena ${toolName}${subject ? ` ${subject}` : ""}${meta(formatLineLabel(count, "item"), duration)}`;
722
- }
723
- }
724
- }
725
-
726
- function registerXtrmUiTools(pi: ExtensionAPI): void {
727
- const activeToolCalls = new Map<string, string>();
728
- const activeSignatureCounts = new Map<string, number>();
729
- const toolCallStartTimes = new Map<string, number>();
730
-
731
- const trackToolCallStart = (toolCallId: string, toolName: string, args: Record<string, unknown>) => {
732
- const signature = stableToolSignature(toolName, args);
733
- activeToolCalls.set(toolCallId, signature);
734
- activeSignatureCounts.set(signature, (activeSignatureCounts.get(signature) ?? 0) + 1);
735
- toolCallStartTimes.set(toolCallId, Date.now());
736
- };
737
-
738
- const trackToolCallEnd = (toolCallId: string) => {
739
- const signature = activeToolCalls.get(toolCallId);
740
- if (!signature) return;
741
- activeToolCalls.delete(toolCallId);
742
- const next = (activeSignatureCounts.get(signature) ?? 1) - 1;
743
- if (next <= 0) activeSignatureCounts.delete(signature);
744
- else activeSignatureCounts.set(signature, next);
745
- toolCallStartTimes.delete(toolCallId);
746
- };
747
-
748
- const isToolCallActive = (toolName: string, args: Record<string, unknown>) =>
749
- activeSignatureCounts.has(stableToolSignature(toolName, args));
750
-
751
- const renderPendingCallIfActive = (toolName: string, args: Record<string, unknown>, theme: any) =>
752
- isToolCallActive(toolName, args) ? renderPendingCall(toolName, args, theme) : new Text("", 0, 0);
753
-
754
- pi.on("tool_call", async (event) => {
755
- trackToolCallStart(event.toolCallId, event.toolName, event.input as Record<string, unknown>);
756
- });
757
-
758
- pi.on("tool_execution_end", async (event) => {
759
- trackToolCallEnd(event.toolCallId);
760
- });
761
-
762
- pi.on("tool_result", async (event: ToolResultEvent, ctx) => {
763
- if (!SERENA_COMPACT_TOOLS.has(event.toolName)) return undefined;
764
- if (ctx.ui.getToolsExpanded()) return undefined;
765
- if (event.isError) return undefined;
766
-
767
- const text = getTextContent({ content: event.content as Array<{ type: string; text?: string }> });
768
- if (!text.trim()) return undefined;
769
-
770
- const startedAt = toolCallStartTimes.get(event.toolCallId);
771
- const durationMs = startedAt != null ? Date.now() - startedAt : undefined;
772
- const compactText = summarizeSerenaToolResult(event.toolName, event.input, text, durationMs);
773
-
774
- return {
775
- content: [{ type: "text", text: compactText }],
776
- details: event.details,
777
- };
778
- });
779
-
780
- pi.registerTool({
781
- name: "bash",
782
- label: "bash",
783
- description: getTools(process.cwd()).bash.description,
784
- parameters: getTools(process.cwd()).bash.parameters,
785
- async execute(toolCallId, params, signal, onUpdate, ctx) {
786
- const started = Date.now();
787
- const result = await getTools(ctx.cwd).bash.execute(toolCallId, params, signal, onUpdate);
788
- return { ...result, details: withXtrmMeta(result.details as BashToolDetails | undefined, "bash", params as Record<string, unknown>, Date.now() - started) };
789
- },
790
- renderCall: (args, theme) => renderPendingCallIfActive("bash", args as Record<string, unknown>, theme),
791
- renderResult(result, { expanded, isPartial }, theme) {
792
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<BashToolDetails, Record<string, unknown>>;
793
- const meta = getXtrmMeta<BashToolDetails, Record<string, unknown>>(details);
794
- const command = shortenCommand(String(meta?.args.command ?? ""));
795
- if (isPartial) {
796
- return new Text(`${theme.fg("accent", "•")} ${theme.fg("toolTitle", "Running ")}${theme.fg("accent", command)}${theme.fg("toolTitle", " in bash")}`, 0, 0);
797
- }
798
- const output = getTextContent(result as any);
799
- const outputLines = cleanOutputLines(output);
800
- const exitMatch = output.match(/exit code:\s*(-?\d+)/i);
801
- const exitCode = exitMatch ? Number.parseInt(exitMatch[1] ?? "0", 10) : 0;
802
- const bullet = exitCode === 0 ? theme.fg("success", "•") : theme.fg("error", "•");
803
- const summary = joinMeta([formatLineLabel(outputLines.length, "line"), formatDuration(meta?.durationMs), details.truncation?.truncated ? "truncated" : undefined]);
804
- let text = `${bullet} ${theme.fg("toolTitle", "Ran ")}${theme.fg("accent", command)}`;
805
- if (summary) text += theme.fg("dim", ` · ${summary}`);
806
- if (expanded && outputLines.length > 0) text += `\n${renderVerticalPreview(theme, outputLines, 10)}`;
807
- return new Text(text, 0, 0);
808
- },
809
- });
810
-
811
- pi.registerTool({
812
- name: "read",
813
- label: "read",
814
- description: getTools(process.cwd()).read.description,
815
- parameters: getTools(process.cwd()).read.parameters,
816
- async execute(toolCallId, params, signal, onUpdate, ctx) {
817
- const started = Date.now();
818
- const result = await getTools(ctx.cwd).read.execute(toolCallId, params, signal, onUpdate);
819
- return { ...result, details: withXtrmMeta(result.details as ReadToolDetails | undefined, "read", params as Record<string, unknown>, Date.now() - started) };
820
- },
821
- renderCall: (args, theme) => renderPendingCallIfActive("read", args as Record<string, unknown>, theme),
822
- renderResult(result, { expanded, isPartial }, theme) {
823
- if (isPartial) return new Text(renderToolSummary(theme, "pending", "read", "loading", undefined), 0, 0);
824
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<ReadToolDetails, Record<string, unknown>>;
825
- const meta = getXtrmMeta<ReadToolDetails, Record<string, unknown>>(details);
826
- const subjectBase = shortenPath(String(meta?.args.path ?? ""));
827
- const range = lineRange(meta?.args.offset as number | undefined, meta?.args.limit as number | undefined);
828
- const subject = range ? `${subjectBase}:${range}` : subjectBase;
829
- const first = result.content[0];
830
- if (first?.type === "image") {
831
- return new Text(renderToolSummary(theme, "success", "read", subject, joinMeta(["image", formatDuration(meta?.durationMs)])), 0, 0);
832
- }
833
- const textContent = getTextContent(result as any);
834
- const lines = textContent.split("\n");
835
- let text = renderToolSummary(theme, "success", "read", subject, joinMeta([formatLineLabel(lines.length, "line"), formatDuration(meta?.durationMs), details.truncation?.truncated ? `from ${details.truncation.totalLines}` : undefined]));
836
- if (expanded && textContent.length > 0) text += `\n${renderOutputPreview(theme, previewLines(textContent, 14), 14)}`;
837
- return new Text(text, 0, 0);
838
- },
839
- });
840
-
841
- pi.registerTool({
842
- name: "edit",
843
- label: "edit",
844
- description: getTools(process.cwd()).edit.description,
845
- parameters: getTools(process.cwd()).edit.parameters,
846
- async execute(toolCallId, params, signal, onUpdate, ctx) {
847
- const started = Date.now();
848
- const result = await getTools(ctx.cwd).edit.execute(toolCallId, params, signal, onUpdate);
849
- return { ...result, details: withXtrmMeta(result.details as EditToolDetails | undefined, "edit", params as Record<string, unknown>, Date.now() - started) };
850
- },
851
- renderCall: (args, theme) => renderPendingCallIfActive("edit", args as Record<string, unknown>, theme),
852
- renderResult(result, { expanded, isPartial }, theme) {
853
- if (isPartial) return new Text(renderToolSummary(theme, "pending", "edit", "applying", undefined), 0, 0);
854
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<EditToolDetails, Record<string, unknown>>;
855
- const meta = getXtrmMeta<EditToolDetails, Record<string, unknown>>(details);
856
- const textContent = getTextContent(result as any);
857
- if (/^error/i.test(textContent.trim())) {
858
- return new Text(renderToolSummary(theme, "error", "edit", shortenPath(String(meta?.args.path ?? "")), textContent.split("\n")[0]), 0, 0);
859
- }
860
- const stats = details.diff ? diffStats(details.diff) : { additions: 0, removals: 0 };
861
- let text = renderToolSummary(theme, "success", "edit", shortenPath(String(meta?.args.path ?? "")), joinMeta([`+${stats.additions}`, `-${stats.removals}`, formatDuration(meta?.durationMs)]));
862
- if (expanded && details.diff) text += `\n${renderDiffPreview(theme, details.diff, 18)}`;
863
- return new Text(text, 0, 0);
864
- },
865
- });
866
-
867
- pi.registerTool({
868
- name: "write",
869
- label: "write",
870
- description: getTools(process.cwd()).write.description,
871
- parameters: getTools(process.cwd()).write.parameters,
872
- async execute(toolCallId, params, signal, onUpdate, ctx) {
873
- const started = Date.now();
874
- const result = await getTools(ctx.cwd).write.execute(toolCallId, params, signal, onUpdate);
875
- return { ...result, details: withXtrmMeta(result.details as Record<string, never> | undefined, "write", params as Record<string, unknown>, Date.now() - started) };
876
- },
877
- renderCall: (args, theme) => renderPendingCallIfActive("write", args as Record<string, unknown>, theme),
878
- renderResult(result, { isPartial }, theme) {
879
- if (isPartial) return new Text(renderToolSummary(theme, "pending", "write", "writing", undefined), 0, 0);
880
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<Record<string, never>, Record<string, unknown>>;
881
- const meta = getXtrmMeta<Record<string, never>, Record<string, unknown>>(details);
882
- const textContent = getTextContent(result as any);
883
- if (/^error/i.test(textContent.trim())) {
884
- return new Text(renderToolSummary(theme, "error", "write", shortenPath(String(meta?.args.path ?? "")), textContent.split("\n")[0]), 0, 0);
885
- }
886
- return new Text(renderToolSummary(theme, "success", "write", shortenPath(String(meta?.args.path ?? "")), joinMeta([formatLineLabel(lineCount(String(meta?.args.content ?? "")), "line"), formatDuration(meta?.durationMs)])), 0, 0);
887
- },
888
- });
889
-
890
- pi.registerTool({
891
- name: "find",
892
- label: "find",
893
- description: getTools(process.cwd()).find.description,
894
- parameters: getTools(process.cwd()).find.parameters,
895
- async execute(toolCallId, params, signal, onUpdate, ctx) {
896
- const started = Date.now();
897
- const result = await getTools(ctx.cwd).find.execute(toolCallId, params, signal, onUpdate);
898
- return { ...result, details: withXtrmMeta(result.details as FindToolDetails | undefined, "find", params as Record<string, unknown>, Date.now() - started) };
899
- },
900
- renderCall: (args, theme) => renderPendingCallIfActive("find", args as Record<string, unknown>, theme),
901
- renderResult(result, { expanded, isPartial }, theme) {
902
- if (isPartial) return new Text(renderToolSummary(theme, "pending", "find", "searching", undefined), 0, 0);
903
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<FindToolDetails, Record<string, unknown>>;
904
- const meta = getXtrmMeta<FindToolDetails, Record<string, unknown>>(details);
905
- const textContent = getTextContent(result as any);
906
- const count = summarizeCount(textContent);
907
- let text = renderToolSummary(theme, "success", "find", String(meta?.args.pattern ?? ""), joinMeta([formatLineLabel(count, "match"), formatDuration(meta?.durationMs), details.resultLimitReached ? "limit reached" : undefined]));
908
- if (expanded && count > 0) text += `\n${renderOutputPreview(theme, previewLines(textContent, 10), 10)}`;
909
- return new Text(text, 0, 0);
910
- },
911
- });
912
-
913
- pi.registerTool({
914
- name: "grep",
915
- label: "grep",
916
- description: getTools(process.cwd()).grep.description,
917
- parameters: getTools(process.cwd()).grep.parameters,
918
- async execute(toolCallId, params, signal, onUpdate, ctx) {
919
- const started = Date.now();
920
- const result = await getTools(ctx.cwd).grep.execute(toolCallId, params, signal, onUpdate);
921
- return { ...result, details: withXtrmMeta(result.details as GrepToolDetails | undefined, "grep", params as Record<string, unknown>, Date.now() - started) };
922
- },
923
- renderCall: (args, theme) => renderPendingCallIfActive("grep", args as Record<string, unknown>, theme),
924
- renderResult(result, { expanded, isPartial }, theme) {
925
- if (isPartial) return new Text(renderToolSummary(theme, "pending", "grep", "searching", undefined), 0, 0);
926
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<GrepToolDetails, Record<string, unknown>>;
927
- const meta = getXtrmMeta<GrepToolDetails, Record<string, unknown>>(details);
928
- const textContent = getTextContent(result as any);
929
- const count = countPrefixedItems(textContent, ["-- "]) || summarizeCount(textContent);
930
- let text = renderToolSummary(theme, "success", "grep", String(meta?.args.pattern ?? ""), joinMeta([formatLineLabel(count, "match"), formatDuration(meta?.durationMs), details.matchLimitReached ? "limit reached" : undefined]));
931
- if (expanded && textContent.length > 0) text += `\n${renderOutputPreview(theme, previewLines(textContent, 12), 12)}`;
932
- return new Text(text, 0, 0);
933
- },
934
- });
935
-
936
- pi.registerTool({
937
- name: "ls",
938
- label: "ls",
939
- description: getTools(process.cwd()).ls.description,
940
- parameters: getTools(process.cwd()).ls.parameters,
941
- async execute(toolCallId, params, signal, onUpdate, ctx) {
942
- const started = Date.now();
943
- const result = await getTools(ctx.cwd).ls.execute(toolCallId, params, signal, onUpdate);
944
- return { ...result, details: withXtrmMeta(result.details as LsToolDetails | undefined, "ls", params as Record<string, unknown>, Date.now() - started) };
945
- },
946
- renderCall: (args, theme) => renderPendingCallIfActive("ls", args as Record<string, unknown>, theme),
947
- renderResult(result, { expanded, isPartial }, theme) {
948
- if (isPartial) return new Text(renderToolSummary(theme, "pending", "ls", "listing", undefined), 0, 0);
949
- const details = (result.details ?? {}) as DetailsWithXtrmMeta<LsToolDetails, Record<string, unknown>>;
950
- const meta = getXtrmMeta<LsToolDetails, Record<string, unknown>>(details);
951
- const textContent = getTextContent(result as any);
952
- const count = summarizeCount(textContent);
953
- let text = renderToolSummary(theme, "success", "ls", shortenPath(String(meta?.args.path ?? ".")), joinMeta([formatLineLabel(count, "entry"), formatDuration(meta?.durationMs), details.entryLimitReached ? "limit reached" : undefined]));
954
- if (expanded && count > 0) text += `\n${renderOutputPreview(theme, previewLines(textContent, 12), 12)}`;
955
- return new Text(text, 0, 0);
956
- },
957
- });
958
- }
959
-
960
- // ============================================================================
961
- // Main Extension
962
- // ============================================================================
963
-
964
- function isXtrmTheme(name: string | undefined): boolean {
965
- return name === "pidex-dark" || name === "pidex-light";
966
- }
967
-
968
- export default function xtrmUiExtension(pi: ExtensionAPI): void {
969
- let prefs: XtrmUiPrefs = { ...DEFAULT_PREFS };
970
- let previousThemeName: string | null = null;
971
- const extensionThemeDir = join(__dirname, "themes");
972
-
973
- const getPrefs = () => prefs;
974
- const setPrefs = (p: XtrmUiPrefs) => { prefs = p; };
975
- const getThinkingLevel = () => formatThinking(pi.getThinkingLevel());
976
-
977
- registerXtrmUiTools(pi);
978
- registerCommands(pi, getPrefs, setPrefs, getThinkingLevel);
979
-
980
- const refresh = (ctx: ExtensionContext) => {
981
- applyXtrmChrome(ctx, prefs, getThinkingLevel);
982
- };
983
-
984
- pi.on("resources_discover", async () => ({
985
- themePaths: [extensionThemeDir],
986
- }));
987
-
988
- pi.on("session_start", async (_event, ctx) => {
989
- prefs = loadPrefs(ctx.sessionManager.getEntries() as Array<MaybeCustomEntry>);
990
- if (!previousThemeName && !isXtrmTheme(ctx.ui.theme.name)) {
991
- previousThemeName = ctx.ui.theme.name ?? null;
992
- }
993
- refresh(ctx);
994
-
995
- setTimeout(() => {
996
- if (prefs.forceTheme) ctx.ui.setTheme(prefs.themeName);
997
- }, 0);
998
- });
999
-
1000
- pi.on("session_switch", async (_event, ctx) => {
1001
- if (!previousThemeName && !isXtrmTheme(ctx.ui.theme.name)) {
1002
- previousThemeName = ctx.ui.theme.name ?? null;
1003
- }
1004
- refresh(ctx);
1005
- });
1006
-
1007
- pi.on("session_fork", async (_event, ctx) => {
1008
- if (!previousThemeName && !isXtrmTheme(ctx.ui.theme.name)) {
1009
- previousThemeName = ctx.ui.theme.name ?? null;
1010
- }
1011
- refresh(ctx);
1012
- });
1013
-
1014
- pi.on("model_select", async (_event, ctx) => {
1015
- refresh(ctx);
1016
- });
1017
-
1018
- pi.on("session_shutdown", async (_event, ctx) => {
1019
- if (previousThemeName) {
1020
- ctx.ui.setTheme(previousThemeName);
1021
- }
1022
- });
1023
-
1024
- pi.on("input", async (event) => {
1025
- if (event.source === "extension") return { action: "continue" as const };
1026
- if (!event.text.trim()) return { action: "continue" as const };
1027
- if (event.text.startsWith("/") || event.text.startsWith("!")) return { action: "continue" as const };
1028
- if (event.text.startsWith("› ")) return { action: "continue" as const };
1029
- return event.images
1030
- ? { action: "transform" as const, text: `› ${event.text}`, images: event.images }
1031
- : { action: "transform" as const, text: `› ${event.text}` };
1032
- });
1033
-
1034
- pi.on("context", async (event) => {
1035
- const messages = event.messages.map((message) => {
1036
- if (message.role === "user" && typeof message.content === "string" && message.content.startsWith("› ")) {
1037
- return { ...message, content: message.content.slice(2) };
1038
- }
1039
- if (message.role === "user" && Array.isArray(message.content)) {
1040
- return {
1041
- ...message,
1042
- content: message.content.map((item, index) =>
1043
- index === 0 && item.type === "text" && item.text.startsWith("› ")
1044
- ? { ...item, text: item.text.slice(2) }
1045
- : item
1046
- ),
1047
- };
1048
- }
1049
- return message;
1050
- });
1051
- return { messages };
1052
- });
1053
- }