lm-assist 0.1.66 → 0.1.67

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 (314) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +132 -13
  4. package/commands/sessions.md +80 -65
  5. package/commands/summary.md +140 -79
  6. package/package.json +1 -1
  7. package/web/.next/BUILD_ID +1 -1
  8. package/web/.next/build-manifest.json +2 -2
  9. package/web/.next/fallback-build-manifest.json +2 -2
  10. package/web/.next/server/app/_global-error.html +2 -2
  11. package/web/.next/server/app/_global-error.rsc +1 -1
  12. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  13. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/web/.next/server/app/_not-found.html +1 -1
  18. package/web/.next/server/app/_not-found.rsc +1 -1
  19. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  20. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  22. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/web/.next/server/app/assist-resources.html +1 -1
  26. package/web/.next/server/app/assist-resources.rsc +1 -1
  27. package/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources/__PAGE__.segment.rsc +1 -1
  28. package/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources.segment.rsc +1 -1
  29. package/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  30. package/web/.next/server/app/assist-resources.segments/_full.segment.rsc +1 -1
  31. package/web/.next/server/app/assist-resources.segments/_head.segment.rsc +1 -1
  32. package/web/.next/server/app/assist-resources.segments/_index.segment.rsc +1 -1
  33. package/web/.next/server/app/assist-resources.segments/_tree.segment.rsc +1 -1
  34. package/web/.next/server/app/auth.html +1 -1
  35. package/web/.next/server/app/auth.rsc +1 -1
  36. package/web/.next/server/app/auth.segments/_full.segment.rsc +1 -1
  37. package/web/.next/server/app/auth.segments/_head.segment.rsc +1 -1
  38. package/web/.next/server/app/auth.segments/_index.segment.rsc +1 -1
  39. package/web/.next/server/app/auth.segments/_tree.segment.rsc +1 -1
  40. package/web/.next/server/app/auth.segments/auth/__PAGE__.segment.rsc +1 -1
  41. package/web/.next/server/app/auth.segments/auth.segment.rsc +1 -1
  42. package/web/.next/server/app/console.html +1 -1
  43. package/web/.next/server/app/console.rsc +1 -1
  44. package/web/.next/server/app/console.segments/_full.segment.rsc +1 -1
  45. package/web/.next/server/app/console.segments/_head.segment.rsc +1 -1
  46. package/web/.next/server/app/console.segments/_index.segment.rsc +1 -1
  47. package/web/.next/server/app/console.segments/_tree.segment.rsc +1 -1
  48. package/web/.next/server/app/console.segments/console/__PAGE__.segment.rsc +1 -1
  49. package/web/.next/server/app/console.segments/console.segment.rsc +1 -1
  50. package/web/.next/server/app/knowledge.html +1 -1
  51. package/web/.next/server/app/knowledge.rsc +1 -1
  52. package/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge/__PAGE__.segment.rsc +1 -1
  53. package/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge.segment.rsc +1 -1
  54. package/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  55. package/web/.next/server/app/knowledge.segments/_full.segment.rsc +1 -1
  56. package/web/.next/server/app/knowledge.segments/_head.segment.rsc +1 -1
  57. package/web/.next/server/app/knowledge.segments/_index.segment.rsc +1 -1
  58. package/web/.next/server/app/knowledge.segments/_tree.segment.rsc +1 -1
  59. package/web/.next/server/app/lan-blocked.html +1 -1
  60. package/web/.next/server/app/lan-blocked.rsc +1 -1
  61. package/web/.next/server/app/lan-blocked.segments/_full.segment.rsc +1 -1
  62. package/web/.next/server/app/lan-blocked.segments/_head.segment.rsc +1 -1
  63. package/web/.next/server/app/lan-blocked.segments/_index.segment.rsc +1 -1
  64. package/web/.next/server/app/lan-blocked.segments/_tree.segment.rsc +1 -1
  65. package/web/.next/server/app/lan-blocked.segments/lan-blocked/__PAGE__.segment.rsc +1 -1
  66. package/web/.next/server/app/lan-blocked.segments/lan-blocked.segment.rsc +1 -1
  67. package/web/.next/server/app/machines.html +1 -1
  68. package/web/.next/server/app/machines.rsc +1 -1
  69. package/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines.segment.rsc +1 -1
  71. package/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  72. package/web/.next/server/app/machines.segments/_full.segment.rsc +1 -1
  73. package/web/.next/server/app/machines.segments/_head.segment.rsc +1 -1
  74. package/web/.next/server/app/machines.segments/_index.segment.rsc +1 -1
  75. package/web/.next/server/app/machines.segments/_tree.segment.rsc +1 -1
  76. package/web/.next/server/app/process-dashboard.html +1 -1
  77. package/web/.next/server/app/process-dashboard.rsc +1 -1
  78. package/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard/__PAGE__.segment.rsc +1 -1
  79. package/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard.segment.rsc +1 -1
  80. package/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  81. package/web/.next/server/app/process-dashboard.segments/_full.segment.rsc +1 -1
  82. package/web/.next/server/app/process-dashboard.segments/_head.segment.rsc +1 -1
  83. package/web/.next/server/app/process-dashboard.segments/_index.segment.rsc +1 -1
  84. package/web/.next/server/app/process-dashboard.segments/_tree.segment.rsc +1 -1
  85. package/web/.next/server/app/projects.html +1 -1
  86. package/web/.next/server/app/projects.rsc +1 -1
  87. package/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects/__PAGE__.segment.rsc +1 -1
  88. package/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects.segment.rsc +1 -1
  89. package/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  90. package/web/.next/server/app/projects.segments/_full.segment.rsc +1 -1
  91. package/web/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  92. package/web/.next/server/app/projects.segments/_index.segment.rsc +1 -1
  93. package/web/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/server/app/search.html +1 -1
  95. package/web/.next/server/app/search.rsc +1 -1
  96. package/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search/__PAGE__.segment.rsc +1 -1
  97. package/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search.segment.rsc +1 -1
  98. package/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  99. package/web/.next/server/app/search.segments/_full.segment.rsc +1 -1
  100. package/web/.next/server/app/search.segments/_head.segment.rsc +1 -1
  101. package/web/.next/server/app/search.segments/_index.segment.rsc +1 -1
  102. package/web/.next/server/app/search.segments/_tree.segment.rsc +1 -1
  103. package/web/.next/server/app/session-dashboard.html +1 -1
  104. package/web/.next/server/app/session-dashboard.rsc +1 -1
  105. package/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard/__PAGE__.segment.rsc +1 -1
  106. package/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard.segment.rsc +1 -1
  107. package/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  108. package/web/.next/server/app/session-dashboard.segments/_full.segment.rsc +1 -1
  109. package/web/.next/server/app/session-dashboard.segments/_head.segment.rsc +1 -1
  110. package/web/.next/server/app/session-dashboard.segments/_index.segment.rsc +1 -1
  111. package/web/.next/server/app/session-dashboard.segments/_tree.segment.rsc +1 -1
  112. package/web/.next/server/app/sessions.html +1 -1
  113. package/web/.next/server/app/sessions.rsc +1 -1
  114. package/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions/__PAGE__.segment.rsc +1 -1
  115. package/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions.segment.rsc +1 -1
  116. package/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  117. package/web/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
  118. package/web/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  119. package/web/.next/server/app/sessions.segments/_index.segment.rsc +1 -1
  120. package/web/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
  121. package/web/.next/server/app/settings.html +1 -1
  122. package/web/.next/server/app/settings.rsc +1 -1
  123. package/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
  124. package/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  125. package/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  126. package/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  127. package/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  128. package/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  129. package/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  130. package/web/.next/server/app/skills.html +1 -1
  131. package/web/.next/server/app/skills.rsc +1 -1
  132. package/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills/__PAGE__.segment.rsc +1 -1
  133. package/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills.segment.rsc +1 -1
  134. package/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  135. package/web/.next/server/app/skills.segments/_full.segment.rsc +1 -1
  136. package/web/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  137. package/web/.next/server/app/skills.segments/_index.segment.rsc +1 -1
  138. package/web/.next/server/app/skills.segments/_tree.segment.rsc +1 -1
  139. package/web/.next/server/app/tasks.html +1 -1
  140. package/web/.next/server/app/tasks.rsc +1 -1
  141. package/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks/__PAGE__.segment.rsc +1 -1
  142. package/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks.segment.rsc +1 -1
  143. package/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  144. package/web/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  145. package/web/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  146. package/web/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  147. package/web/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  148. package/web/.next/server/app/terminal-dashboard.html +1 -1
  149. package/web/.next/server/app/terminal-dashboard.rsc +1 -1
  150. package/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard/__PAGE__.segment.rsc +1 -1
  151. package/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard.segment.rsc +1 -1
  152. package/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  153. package/web/.next/server/app/terminal-dashboard.segments/_full.segment.rsc +1 -1
  154. package/web/.next/server/app/terminal-dashboard.segments/_head.segment.rsc +1 -1
  155. package/web/.next/server/app/terminal-dashboard.segments/_index.segment.rsc +1 -1
  156. package/web/.next/server/app/terminal-dashboard.segments/_tree.segment.rsc +1 -1
  157. package/web/.next/server/pages/404.html +1 -1
  158. package/web/.next/server/pages/500.html +2 -2
  159. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  160. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  161. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  162. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  163. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  164. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  165. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  166. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  167. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  168. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  169. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
  170. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  171. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  172. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  173. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  174. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  175. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  176. package/web/.next/standalone/web/.next/server/app/assist-resources.html +1 -1
  177. package/web/.next/standalone/web/.next/server/app/assist-resources.rsc +1 -1
  178. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources/__PAGE__.segment.rsc +1 -1
  179. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources.segment.rsc +1 -1
  180. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  181. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_full.segment.rsc +1 -1
  182. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_head.segment.rsc +1 -1
  183. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_index.segment.rsc +1 -1
  184. package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_tree.segment.rsc +1 -1
  185. package/web/.next/standalone/web/.next/server/app/auth.html +1 -1
  186. package/web/.next/standalone/web/.next/server/app/auth.rsc +1 -1
  187. package/web/.next/standalone/web/.next/server/app/auth.segments/_full.segment.rsc +1 -1
  188. package/web/.next/standalone/web/.next/server/app/auth.segments/_head.segment.rsc +1 -1
  189. package/web/.next/standalone/web/.next/server/app/auth.segments/_index.segment.rsc +1 -1
  190. package/web/.next/standalone/web/.next/server/app/auth.segments/_tree.segment.rsc +1 -1
  191. package/web/.next/standalone/web/.next/server/app/auth.segments/auth/__PAGE__.segment.rsc +1 -1
  192. package/web/.next/standalone/web/.next/server/app/auth.segments/auth.segment.rsc +1 -1
  193. package/web/.next/standalone/web/.next/server/app/console.html +1 -1
  194. package/web/.next/standalone/web/.next/server/app/console.rsc +1 -1
  195. package/web/.next/standalone/web/.next/server/app/console.segments/_full.segment.rsc +1 -1
  196. package/web/.next/standalone/web/.next/server/app/console.segments/_head.segment.rsc +1 -1
  197. package/web/.next/standalone/web/.next/server/app/console.segments/_index.segment.rsc +1 -1
  198. package/web/.next/standalone/web/.next/server/app/console.segments/_tree.segment.rsc +1 -1
  199. package/web/.next/standalone/web/.next/server/app/console.segments/console/__PAGE__.segment.rsc +1 -1
  200. package/web/.next/standalone/web/.next/server/app/console.segments/console.segment.rsc +1 -1
  201. package/web/.next/standalone/web/.next/server/app/knowledge.html +1 -1
  202. package/web/.next/standalone/web/.next/server/app/knowledge.rsc +1 -1
  203. package/web/.next/standalone/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge/__PAGE__.segment.rsc +1 -1
  204. package/web/.next/standalone/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge.segment.rsc +1 -1
  205. package/web/.next/standalone/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  206. package/web/.next/standalone/web/.next/server/app/knowledge.segments/_full.segment.rsc +1 -1
  207. package/web/.next/standalone/web/.next/server/app/knowledge.segments/_head.segment.rsc +1 -1
  208. package/web/.next/standalone/web/.next/server/app/knowledge.segments/_index.segment.rsc +1 -1
  209. package/web/.next/standalone/web/.next/server/app/knowledge.segments/_tree.segment.rsc +1 -1
  210. package/web/.next/standalone/web/.next/server/app/lan-blocked.html +1 -1
  211. package/web/.next/standalone/web/.next/server/app/lan-blocked.rsc +1 -1
  212. package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_full.segment.rsc +1 -1
  213. package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_head.segment.rsc +1 -1
  214. package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_index.segment.rsc +1 -1
  215. package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_tree.segment.rsc +1 -1
  216. package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/lan-blocked/__PAGE__.segment.rsc +1 -1
  217. package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/lan-blocked.segment.rsc +1 -1
  218. package/web/.next/standalone/web/.next/server/app/machines.html +1 -1
  219. package/web/.next/standalone/web/.next/server/app/machines.rsc +1 -1
  220. package/web/.next/standalone/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines/__PAGE__.segment.rsc +1 -1
  221. package/web/.next/standalone/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines.segment.rsc +1 -1
  222. package/web/.next/standalone/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  223. package/web/.next/standalone/web/.next/server/app/machines.segments/_full.segment.rsc +1 -1
  224. package/web/.next/standalone/web/.next/server/app/machines.segments/_head.segment.rsc +1 -1
  225. package/web/.next/standalone/web/.next/server/app/machines.segments/_index.segment.rsc +1 -1
  226. package/web/.next/standalone/web/.next/server/app/machines.segments/_tree.segment.rsc +1 -1
  227. package/web/.next/standalone/web/.next/server/app/process-dashboard.html +1 -1
  228. package/web/.next/standalone/web/.next/server/app/process-dashboard.rsc +1 -1
  229. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard/__PAGE__.segment.rsc +1 -1
  230. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard.segment.rsc +1 -1
  231. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  232. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_full.segment.rsc +1 -1
  233. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_head.segment.rsc +1 -1
  234. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_index.segment.rsc +1 -1
  235. package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_tree.segment.rsc +1 -1
  236. package/web/.next/standalone/web/.next/server/app/projects.html +1 -1
  237. package/web/.next/standalone/web/.next/server/app/projects.rsc +1 -1
  238. package/web/.next/standalone/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects/__PAGE__.segment.rsc +1 -1
  239. package/web/.next/standalone/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects.segment.rsc +1 -1
  240. package/web/.next/standalone/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  241. package/web/.next/standalone/web/.next/server/app/projects.segments/_full.segment.rsc +1 -1
  242. package/web/.next/standalone/web/.next/server/app/projects.segments/_head.segment.rsc +1 -1
  243. package/web/.next/standalone/web/.next/server/app/projects.segments/_index.segment.rsc +1 -1
  244. package/web/.next/standalone/web/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
  245. package/web/.next/standalone/web/.next/server/app/search.html +1 -1
  246. package/web/.next/standalone/web/.next/server/app/search.rsc +1 -1
  247. package/web/.next/standalone/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search/__PAGE__.segment.rsc +1 -1
  248. package/web/.next/standalone/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search.segment.rsc +1 -1
  249. package/web/.next/standalone/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  250. package/web/.next/standalone/web/.next/server/app/search.segments/_full.segment.rsc +1 -1
  251. package/web/.next/standalone/web/.next/server/app/search.segments/_head.segment.rsc +1 -1
  252. package/web/.next/standalone/web/.next/server/app/search.segments/_index.segment.rsc +1 -1
  253. package/web/.next/standalone/web/.next/server/app/search.segments/_tree.segment.rsc +1 -1
  254. package/web/.next/standalone/web/.next/server/app/session-dashboard.html +1 -1
  255. package/web/.next/standalone/web/.next/server/app/session-dashboard.rsc +1 -1
  256. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard/__PAGE__.segment.rsc +1 -1
  257. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard.segment.rsc +1 -1
  258. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  259. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_full.segment.rsc +1 -1
  260. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_head.segment.rsc +1 -1
  261. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_index.segment.rsc +1 -1
  262. package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_tree.segment.rsc +1 -1
  263. package/web/.next/standalone/web/.next/server/app/sessions.html +1 -1
  264. package/web/.next/standalone/web/.next/server/app/sessions.rsc +1 -1
  265. package/web/.next/standalone/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions/__PAGE__.segment.rsc +1 -1
  266. package/web/.next/standalone/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions.segment.rsc +1 -1
  267. package/web/.next/standalone/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  268. package/web/.next/standalone/web/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
  269. package/web/.next/standalone/web/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
  270. package/web/.next/standalone/web/.next/server/app/sessions.segments/_index.segment.rsc +1 -1
  271. package/web/.next/standalone/web/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
  272. package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
  273. package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
  274. package/web/.next/standalone/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
  275. package/web/.next/standalone/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
  276. package/web/.next/standalone/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  277. package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  278. package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  279. package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  280. package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  281. package/web/.next/standalone/web/.next/server/app/skills.html +1 -1
  282. package/web/.next/standalone/web/.next/server/app/skills.rsc +1 -1
  283. package/web/.next/standalone/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills/__PAGE__.segment.rsc +1 -1
  284. package/web/.next/standalone/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills.segment.rsc +1 -1
  285. package/web/.next/standalone/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  286. package/web/.next/standalone/web/.next/server/app/skills.segments/_full.segment.rsc +1 -1
  287. package/web/.next/standalone/web/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  288. package/web/.next/standalone/web/.next/server/app/skills.segments/_index.segment.rsc +1 -1
  289. package/web/.next/standalone/web/.next/server/app/skills.segments/_tree.segment.rsc +1 -1
  290. package/web/.next/standalone/web/.next/server/app/tasks.html +1 -1
  291. package/web/.next/standalone/web/.next/server/app/tasks.rsc +1 -1
  292. package/web/.next/standalone/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks/__PAGE__.segment.rsc +1 -1
  293. package/web/.next/standalone/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks.segment.rsc +1 -1
  294. package/web/.next/standalone/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  295. package/web/.next/standalone/web/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  296. package/web/.next/standalone/web/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  297. package/web/.next/standalone/web/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  298. package/web/.next/standalone/web/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  299. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.html +1 -1
  300. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.rsc +1 -1
  301. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard/__PAGE__.segment.rsc +1 -1
  302. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard.segment.rsc +1 -1
  303. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
  304. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_full.segment.rsc +1 -1
  305. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_head.segment.rsc +1 -1
  306. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_index.segment.rsc +1 -1
  307. package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_tree.segment.rsc +1 -1
  308. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  309. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  310. package/web/.next/trace +1 -1
  311. package/web/.next/trace-build +1 -1
  312. /package/web/.next/static/{Zx5sHPa3X0Xd4H0apvz9y → KmCZSVL96On-DixrWoKE4}/_buildManifest.js +0 -0
  313. /package/web/.next/static/{Zx5sHPa3X0Xd4H0apvz9y → KmCZSVL96On-DixrWoKE4}/_clientMiddlewareManifest.json +0 -0
  314. /package/web/.next/static/{Zx5sHPa3X0Xd4H0apvz9y → KmCZSVL96On-DixrWoKE4}/_ssgManifest.js +0 -0
@@ -12,7 +12,7 @@
12
12
  "plugins": [
13
13
  {
14
14
  "name": "lm-assist",
15
- "version": "0.1.66",
15
+ "version": "0.1.67",
16
16
  "source": "./",
17
17
  "description": "Auto-build knowledge from Claude Code sessions and inject it as context. Inspect sessions with deep views into agents, tasks, teams, plans, and tool calls. Access and control all Claude Code terminals from any device via web browser. Includes MCP server (search, detail, feedback), context-injection hook, and 6 slash commands.",
18
18
  "category": "productivity",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lm-assist",
3
- "version": "0.1.66",
3
+ "version": "0.1.67",
4
4
  "description": "Knowledge management, session inspector, and web terminal control for Claude Code",
5
5
  "author": {
6
6
  "name": "langmartai"
package/README.md CHANGED
@@ -215,6 +215,8 @@ Then in Claude Code, run `/plugin install .` and `/assist-setup`.
215
215
  | MCP server | Yes (via plugin) | `search`, `detail`, `feedback` tools |
216
216
  | Context hook | Yes (via plugin) | Knowledge injection (optional) |
217
217
  | Slash commands | Yes (via plugin) | 6 `/assist-*` commands |
218
+ | Skills | Yes (via plugin) | `observe` (auto-triggered observability) + `route` (cross-project routing) |
219
+ | Slash commands | Yes (via plugin) | 9 commands: `/sessions`, `/summary`, `/run` + 6 `/assist-*` |
218
220
  | Statusline | Optional | Git branch, context %, rate limits, process stats |
219
221
 
220
222
  ## Services
@@ -231,31 +233,148 @@ lm-assist status # Health check + process info
231
233
  lm-assist upgrade # Upgrade to latest version
232
234
  ```
233
235
 
234
- ## Key API Endpoints
236
+ ## Skills & Commands
235
237
 
236
- | Category | Endpoints | Highlights |
237
- |----------|-----------|------------|
238
- | **Sessions** | 27 | List, detail, delta fetch, batch-check, conversation, subagents, forks, DAG |
239
- | **Monitor** | 6 | Running executions, summary, abort, SSE stream |
240
- | **Projects** | 12 | List projects, sessions per project, git info, worktree detection |
241
- | **Terminal** | 13 | ttyd start/stop/status, WebSocket proxy, tmux attach |
242
- | **Tasks** | 22 | Task lists, aggregated tasks, ready tasks, dependency tracking |
243
- | **Knowledge** | 21 | List, search, generate, review (optional — can be disabled) |
244
- | **Vectors** | 6 | Semantic search, index, reindex (optional) |
238
+ lm-assist ships with **2 auto-triggered skills** and **9 slash commands** that work inside Claude Code.
245
239
 
246
- All endpoints support `ifModifiedSince` for efficient polling. Session data supports three indexing dimensions: `lineIndex` (JSONL position), `turnIndex` (conversation turn), and `userPromptIndex` (user message count).
240
+ ### Skills (auto-triggered)
241
+
242
+ Skills activate automatically when Claude detects relevant intent — no slash command needed.
247
243
 
248
- ## Slash Commands
244
+ | Skill | Triggers on | What it does |
245
+ |-------|------------|--------------|
246
+ | **observe** | "what's running?", "session costs", "show subagents", "run this on project X" | Full observability — monitor sessions, debug agents, control executions, manage summaries |
247
+ | **route** | Prompt mentions another project's features or codebase | Cross-project routing — evaluates whether to stay, resume, fork, queue, or start new |
248
+
249
+ ### Commands
249
250
 
250
251
  | Command | Description |
251
252
  |---------|-------------|
253
+ | `/sessions` | Session list with costs, turns, running status |
254
+ | `/summary` | Summarize current session, generate display name, record learning |
255
+ | `/run <prompt>` | Execute an agent with pre-flight checks |
252
256
  | `/assist` | Open the web UI in your browser |
253
257
  | `/assist-status` | Show status of all components |
254
258
  | `/assist-setup` | Start services and verify integrations |
255
- | `/assist-search <query>` | Search the knowledge base |
259
+ | `/assist-search` | Search the knowledge base |
256
260
  | `/assist-logs` | View context-inject hook logs |
257
261
  | `/assist-mcp-logs` | View MCP tool call logs |
258
262
 
263
+ ### Use Cases with Examples
264
+
265
+ **"What sessions are running and how much have they cost?"**
266
+ ```
267
+ > /sessions
268
+ Sessions (3 running, 415 total)
269
+ ───────────────────────────────────────────────────────────────────────
270
+ Status Name Project Model Cost Turns
271
+ ───────────────────────────────────────────────────────────────────────
272
+ [RUN] observability-platform-build lm-assist opus $307.66 1462
273
+ [RUN] trade-delta-analysis lm-unified-trade opus $153.20 822
274
+ [RUN] anti-kelly-system lm-unified-trade opus $35.49 433
275
+ two-track-dashboard lm-unified-trade opus $107.43 516
276
+ skill-validation-test lm-assist opus $0.63 11
277
+ ───────────────────────────────────────────────────────────────────────
278
+ Total cost: $604.41
279
+ ```
280
+
281
+ **"Summarize what this session has been doing"**
282
+ ```
283
+ > /summary
284
+ Session Summary
285
+ ═══════════════
286
+ Name: observability-platform-build
287
+ Project: lm-assist
288
+ Turns: 1462 | Cost: $307.66
289
+ Status: in progress
290
+
291
+ What this session is about:
292
+ Building the lm-assist observability platform — session summaries,
293
+ cross-project routing, prompt queue, auto-learning.
294
+
295
+ What was accomplished:
296
+ • Session slug/customTitle parsing from Claude Code JSONL
297
+ • Knowledge system kill switch (saves ~100MB)
298
+ • Observability skill + routing skill + 3 new commands
299
+ • Persistent session summaries with delta tracking
300
+ • Universal prompt queue with source/target context
301
+ • Auto-learning signals that evolve routing over time
302
+ ```
303
+
304
+ **"Fix the delta analysis bug in the trading pipeline"**
305
+
306
+ The route skill auto-detects this belongs to another project:
307
+ ```
308
+ This task appears to belong to lm-unified-trade, not the current project.
309
+
310
+ Relevant session found: trade-delta-analysis
311
+ Summary: Implemented delta analysis mode for /trade-analyze command...
312
+ Status: idle (not running)
313
+
314
+ Recommendation: RESUME
315
+ Reason: This session built all existing delta modes and knows the spec,
316
+ flag table, and pre-launch copy patterns.
317
+
318
+ To resume: claude --resume 36a30ba6-4bd1-4587-8bb3-c1d21a2ab616
319
+ ```
320
+
321
+ **"Run a security review on this project"**
322
+ ```
323
+ > /run review all API endpoints for security vulnerabilities
324
+ Checking running executions... OK: none running.
325
+
326
+ Execution started: agent-1774468578687-1p2cnh
327
+ Session: nifty-wishing-boole
328
+ Status: running
329
+ Monitor with: /sessions
330
+ Web UI: http://localhost:3848
331
+ ```
332
+
333
+ **"What's the cost breakdown by project?"**
334
+
335
+ The observe skill activates:
336
+ ```
337
+ Project costs:
338
+ lm-assist $308.29 (80 sessions)
339
+ lm-unified-trade $892.15 (440 sessions)
340
+ LangMartDesign $45.20 (12 sessions)
341
+ tier-agent $23.50 (15 sessions)
342
+ ```
343
+
344
+ ### Session Intelligence
345
+
346
+ lm-assist learns from every interaction to route prompts smarter over time:
347
+
348
+ - **Session summaries** — LLM-generated descriptions stored with delta tracking. Updated incrementally as sessions grow.
349
+ - **Project summaries** — Comprehensive reference generated by agents that explore each project's CLAUDE.md, scripts, configs, and codebase.
350
+ - **Prompt queue** — When a session is busy, new work is queued with full context (original intent, formatted prompt, routing reason, context hint).
351
+ - **Auto-learning** — Keywords, commands, and routing patterns accumulate with frequency counts. After a few interactions, routing skips deep scans entirely.
352
+
353
+ ```
354
+ Learning context for lm-unified-trade:
355
+ Frequently mentioned: delta analysis(3x), anti-kelly(2x), regime analysis(1x)
356
+ Areas worked in: analysis pipeline(1x)
357
+ Routing patterns: delta analysis → trade-delta-analysis session
358
+ ```
359
+
360
+ ## Key API Endpoints
361
+
362
+ | Category | Endpoints | Highlights |
363
+ |----------|-----------|------------|
364
+ | **Sessions** | 27 | List, detail, delta fetch, batch-check, conversation, subagents, forks, DAG |
365
+ | **Monitor** | 6 | Running executions, summary, abort, SSE stream |
366
+ | **Projects** | 12 | List projects, sessions per project, git info, worktree detection, costs |
367
+ | **Terminal** | 13 | ttyd start/stop/status, WebSocket proxy, tmux attach |
368
+ | **Tasks** | 22 | Task lists, aggregated tasks, ready tasks, dependency tracking |
369
+ | **Summaries** | 10 | Session summaries, project summaries, needs-update check |
370
+ | **Queue** | 10 | Prompt queue with source/target, priority, dispatch/complete lifecycle |
371
+ | **Learning** | 4 | Record signals, query by project, learning context generation |
372
+ | **Search** | 4 | Session content search, recent sessions, vector search |
373
+ | **Skills** | 9 | Skills analytics, chains, traces, per-session breakdown |
374
+ | **Knowledge** | 21 | List, search, generate, review (optional — can be disabled) |
375
+
376
+ All endpoints support `ifModifiedSince` for efficient polling. Session data supports three indexing dimensions: `lineIndex` (JSONL position), `turnIndex` (conversation turn), and `userPromptIndex` (user message count).
377
+
259
378
  ## Configuration
260
379
 
261
380
  No API key needed — lm-assist works entirely with your local Claude Code session data. Optionally copy `.env.example` to `.env`:
@@ -12,76 +12,91 @@ Show recent Claude Code sessions with costs, turns, model, and running status.
12
12
  - No arguments: show sessions across all projects
13
13
  - `$ARGUMENTS[0]`: filter by project name (partial match)
14
14
 
15
- ## Steps
15
+ ## Execution
16
16
 
17
- 1. **Check API health:**
18
- ```bash
19
- curl -s --max-time 2 http://localhost:3100/health
20
- ```
21
- If not healthy, tell the user to start lm-assist with `lm-assist start` or `/assist-setup`.
17
+ Run this single script. It handles health check, session fetch, and execution monitoring in one call:
22
18
 
23
- 2. **Fetch sessions:**
24
19
  ```bash
25
- curl -s --max-time 5 http://localhost:3100/projects/sessions | python3 -c "
26
- import sys,json
27
- data = json.load(sys.stdin).get('data',{})
28
- sessions = data.get('sessions',[])
29
- total = data.get('total', len(sessions))
30
-
31
- # Filter by project if argument provided
32
- project_filter = '''$ARGUMENTS[0]'''.strip()
33
- if project_filter:
34
- sessions = [s for s in sessions if project_filter.lower() in (s.get('projectPath','') + s.get('projectName','')).lower()]
35
-
36
- # Separate running from completed
37
- running = [s for s in sessions if s.get('isRunning')]
38
- rest = [s for s in sessions if not s.get('isRunning')][:10 - len(running)]
39
- show = running + rest
40
-
41
- print(f'Sessions ({len(show)} of {total})')
42
- if project_filter:
43
- print(f'Filtered: {project_filter}')
44
- print('─' * 95)
45
- fmt = '{:<7} {:<28} {:<18} {:<8} {:>8} {:>6}'
46
- print(fmt.format('Status', 'Name', 'Project', 'Model', 'Cost', 'Turns'))
47
- print('─' * 95)
48
- for s in show:
49
- status = '[RUN]' if s.get('isRunning') else ''
50
- name = (s.get('customTitle') or s.get('slug') or s['sessionId'][:12])[:26]
51
- project = (s.get('projectPath','').split('/')[-1] or '-')[:16]
52
- model = (s.get('model','') or '-').replace('claude-','').replace('opus-4-6','opus').replace('sonnet-4-6','sonnet')[:7]
53
- cost = f'\${s[\"totalCostUsd\"]:.2f}' if s.get('totalCostUsd') else '-'
54
- turns = str(s.get('numTurns','')) or '-'
55
- print(fmt.format(status, name, project, model, cost, turns))
56
- "
57
- ```
20
+ node -e "
21
+ const http = require('http');
22
+ const filter = process.argv[1] || '';
58
23
 
59
- 3. **Check running executions:**
60
- ```bash
61
- curl -s --max-time 3 http://localhost:3100/monitor/executions | python3 -c "
62
- import sys,json
63
- execs = json.load(sys.stdin).get('data',{}).get('executions',[])
64
- running = [e for e in execs if e.get('isRunning')]
65
- if running:
66
- print(f'\nRunning Executions ({len(running)}):')
67
- for e in running:
68
- eid = e.get('executionId','')[:12]
69
- turns = e.get('turnCount',0)
70
- cost = e.get('costUsd',0)
71
- elapsed = (e.get('elapsedMs',0) or 0) // 1000
72
- mins = elapsed // 60
73
- secs = elapsed % 60
74
- print(f' {eid} T:{turns} \${cost:.2f} {mins}m{secs}s')
75
- "
76
- ```
24
+ function api(path) {
25
+ return new Promise((resolve) => {
26
+ const req = http.get('http://localhost:3100' + path, { timeout: 5000 }, (res) => {
27
+ let data = '';
28
+ res.on('data', c => data += c);
29
+ res.on('end', () => { try { resolve(JSON.parse(data)); } catch { resolve(null); } });
30
+ });
31
+ req.on('error', () => resolve(null));
32
+ req.on('timeout', () => { req.destroy(); resolve(null); });
33
+ });
34
+ }
77
35
 
78
- ## Output
36
+ (async () => {
37
+ const health = await api('/health');
38
+ if (!health?.success) {
39
+ console.log('lm-assist API is not running.\nStart with: lm-assist start\nOr run: /assist-setup');
40
+ return;
41
+ }
79
42
 
80
- Present the table output from the python script directly. Do NOT reformat as markdown — show it as-is from the terminal output.
43
+ const data = await api('/projects/sessions');
44
+ if (!data?.data?.sessions) { console.log('Failed to fetch sessions.'); return; }
81
45
 
82
- If the API is not running, show:
83
- ```
84
- lm-assist API is not running.
85
- Start with: lm-assist start
86
- Or run: /assist-setup
46
+ let sessions = data.data.sessions;
47
+ const total = data.data.total || sessions.length;
48
+
49
+ if (filter) {
50
+ sessions = sessions.filter(s => ((s.projectPath || '') + (s.projectName || '')).toLowerCase().includes(filter.toLowerCase()));
51
+ }
52
+
53
+ const running = sessions.filter(s => s.isRunning);
54
+ const rest = sessions.filter(s => !s.isRunning).slice(0, 15);
55
+ const show = [...running, ...rest];
56
+
57
+ console.log('Sessions (' + running.length + ' running, ' + total + ' total)');
58
+ if (filter) console.log('Filtered: ' + filter);
59
+ console.log('\u2500'.repeat(95));
60
+ const hdr = (s,n) => (s + ' '.repeat(n)).slice(0,n);
61
+ const rgt = (s,n) => (' '.repeat(n) + s).slice(-n);
62
+ console.log(hdr('Status',7) + hdr('Name',28) + hdr('Project',18) + hdr('Model',8) + rgt('Cost',8) + rgt('Turns',6));
63
+ console.log('\u2500'.repeat(95));
64
+
65
+ for (const s of show) {
66
+ const status = s.isRunning ? '[RUN]' : '';
67
+ const name = (s.customTitle || s.slug || s.sessionId.slice(0,12)).slice(0,26);
68
+ const project = ((s.projectPath || '').split('/').pop() || '-').slice(0,16);
69
+ const model = (s.model || '-').replace('claude-','').replace('opus-4-6','opus').replace('sonnet-4-6','sonnet').slice(0,7);
70
+ const cost = s.totalCostUsd ? '\$' + s.totalCostUsd.toFixed(2) : '-';
71
+ const turns = String(s.numTurns || '-');
72
+ console.log(hdr(status,7) + hdr(name,28) + hdr(project,18) + hdr(model,8) + rgt(cost,8) + rgt(turns,6));
73
+ }
74
+
75
+ // Running executions
76
+ const exData = await api('/monitor/executions');
77
+ if (exData?.data?.executions) {
78
+ const re = exData.data.executions.filter(e => e.isRunning);
79
+ if (re.length) {
80
+ console.log('\nRunning Executions (' + re.length + '):');
81
+ for (const e of re) {
82
+ const eid = (e.executionId || '').slice(0,12);
83
+ const t = e.turnCount || 0;
84
+ const c = (e.costUsd || 0).toFixed(2);
85
+ const elapsed = Math.floor((e.elapsedMs || 0) / 1000);
86
+ const mins = Math.floor(elapsed / 60);
87
+ const secs = elapsed % 60;
88
+ console.log(' ' + eid + ' T:' + t + ' \$' + c + ' ' + mins + 'm' + secs + 's');
89
+ }
90
+ }
91
+ }
92
+
93
+ const totalCost = sessions.reduce((a, s) => a + (s.totalCostUsd || 0), 0);
94
+ console.log('\u2500'.repeat(95));
95
+ console.log('Total cost: \$' + totalCost.toFixed(2));
96
+ })();
97
+ " -- "$ARGUMENTS[0]"
87
98
  ```
99
+
100
+ ## Output
101
+
102
+ Present the script output directly. Do NOT reformat as markdown — show it as-is from the terminal.
@@ -7,99 +7,160 @@ description: Summarize the current session — what we're working on, what was d
7
7
 
8
8
  Generate or refresh a summary of THIS session. Shows what we're working on, what was accomplished, and current state. Used by the routing system to ensure new prompts stay in the right session.
9
9
 
10
- ## Steps
10
+ ## Step 1: Gather all session data
11
11
 
12
- 1. **Get the current session ID:**
13
- ```bash
14
- echo "Session ID: $CLAUDE_SESSION_ID"
15
- echo "Project: $PWD"
16
- ```
12
+ Run this single script to collect session ID, existing summary, conversation, and metadata:
17
13
 
18
- 2. **Check if a summary already exists for this session:**
19
14
  ```bash
20
- curl -s --max-time 3 "http://localhost:3100/sessions/$CLAUDE_SESSION_ID/summary" | python3 -c "
21
- import sys,json
22
- d = json.load(sys.stdin).get('data')
23
- if d and d.get('summary'):
24
- print(f'Existing summary (built to turn {d.get(\"lastTurnIndex\",0)}):')
25
- print(f' Display name: {d.get(\"displayName\",\"(none)\")}')
26
- print(f' Summary: {d.get(\"summary\")}')
27
- else:
28
- print('No summary exists yet.')
15
+ node -e "
16
+ const http = require('http');
17
+ const cwd = process.cwd();
18
+ const projectName = cwd.split('/').pop();
19
+
20
+ function api(path, timeout = 5000) {
21
+ return new Promise((resolve) => {
22
+ const req = http.get('http://localhost:3100' + path, { timeout }, (res) => {
23
+ let data = '';
24
+ res.on('data', c => data += c);
25
+ res.on('end', () => { try { resolve(JSON.parse(data)); } catch { resolve(null); } });
26
+ });
27
+ req.on('error', () => resolve(null));
28
+ req.on('timeout', () => { req.destroy(); resolve(null); });
29
+ });
30
+ }
31
+
32
+ (async () => {
33
+ const health = await api('/health');
34
+ if (!health?.success) {
35
+ console.log('ERROR: lm-assist API is not running. Start with: lm-assist start');
36
+ return;
37
+ }
38
+
39
+ // Detect current session — most recent for this project
40
+ const sessions = await api('/sessions?cwd=' + encodeURIComponent(cwd) + '&limit=3');
41
+ const sid = sessions?.data?.sessions?.[0]?.sessionId;
42
+ if (!sid) {
43
+ console.log('ERROR: Could not determine session ID');
44
+ return;
45
+ }
46
+
47
+ console.log('Session: ' + sid);
48
+ console.log('Project: ' + cwd);
49
+
50
+ // Existing summary
51
+ console.log('\n--- EXISTING SUMMARY ---');
52
+ const summary = await api('/sessions/' + sid + '/summary');
53
+ if (summary?.data?.summary) {
54
+ const d = summary.data;
55
+ console.log('Display name: ' + (d.displayName || '(none)'));
56
+ console.log('Last turn index: ' + (d.lastTurnIndex || 0));
57
+ console.log('Summary: ' + d.summary);
58
+ } else {
59
+ console.log('No summary exists yet.');
60
+ }
61
+
62
+ // Session metadata
63
+ console.log('\n--- SESSION METADATA ---');
64
+ const meta = await api('/sessions/' + sid);
65
+ if (meta?.data) {
66
+ const d = meta.data;
67
+ console.log('turns=' + (d.numTurns || 0));
68
+ console.log('cost=\$' + (d.totalCostUsd || 0).toFixed(2));
69
+ console.log('slug=' + (d.slug || ''));
70
+ console.log('customTitle=' + (d.customTitle || ''));
71
+ console.log('model=' + (d.model || ''));
72
+ console.log('status=' + (d.status || ''));
73
+ }
74
+
75
+ // Conversation (last 20 turns)
76
+ console.log('\n--- CONVERSATION ---');
77
+ const conv = await api('/sessions/' + sid + '/conversation?toolDetail=summary&lastN=20', 10000);
78
+ if (conv?.data?.messages?.length) {
79
+ const msgs = conv.data.messages;
80
+ console.log(msgs.length + ' messages in last 20 turns');
81
+ for (const m of msgs) {
82
+ const content = (m.content || '').slice(0, 200);
83
+ if (m.type === 'human' && content) console.log(' USER: ' + content);
84
+ else if (m.type === 'assistant' && content.length > 50) console.log(' CLAUDE: ' + content.slice(0, 150));
85
+ }
86
+ } else {
87
+ console.log('No conversation data available.');
88
+ }
89
+ })();
29
90
  "
30
91
  ```
31
92
 
32
- 3. **Read the conversation to understand what this session has done:**
93
+ ## Step 2: Generate the summary
33
94
 
34
- If no summary exists, read the full conversation. If a summary exists but is stale (new turns since last summary), read only the new turns.
35
-
36
- ```bash
37
- # For new summary: read last 20 turns
38
- curl -s --max-time 5 "http://localhost:3100/sessions/$CLAUDE_SESSION_ID/conversation?toolDetail=summary&lastN=20" | python3 -c "
39
- import sys,json
40
- d = json.load(sys.stdin).get('data',{})
41
- messages = d.get('messages',[])
42
- print(f'{len(messages)} messages in last 20 turns')
43
- for m in messages:
44
- role = m.get('type','')
45
- content = (m.get('content','') or '')[:200]
46
- if role == 'human' and content:
47
- print(f' USER: {content}')
48
- elif role == 'assistant' and len(content) > 50:
49
- print(f' CLAUDE: {content[:150]}')
50
- "
51
- ```
95
+ Analyze the data from Step 1 and generate:
52
96
 
53
- 4. **Generate the summary by analyzing what you just read from the conversation.**
97
+ - **Summary text** what this session is about, what was accomplished, current state, key context
98
+ - **Display name** — 2-4 words, kebab-case (if no customTitle exists)
99
+ - **Learning signals** — main topic keyword and area of project
54
100
 
55
- The summary must answer:
56
- - **What is this session about?** — the overall goal/theme
57
- - **What has been accomplished?** — key milestones, files changed, features built
58
- - **Current state?** — what we're working on RIGHT NOW, any blockers
59
- - **Key context** — important decisions made, patterns established, things to remember
101
+ ## Step 3: Save summary and record learning
60
102
 
61
- Also generate a **display name** (2-4 words, kebab-case) if this session doesn't already have a customTitle.
103
+ Run this single script to save the summary AND record learning signals in one call. Replace the placeholder values with your generated content:
62
104
 
63
- 5. **Get the current turn count for tracking:**
64
105
  ```bash
65
- curl -s --max-time 3 "http://localhost:3100/sessions/$CLAUDE_SESSION_ID" | python3 -c "
66
- import sys,json
67
- d = json.load(sys.stdin).get('data',{})
68
- print(f'turns={d.get(\"numTurns\",0)} cost=\${d.get(\"totalCostUsd\",0):.2f} slug={d.get(\"slug\",\"\")}')
69
- "
70
- ```
106
+ node -e "
107
+ const http = require('http');
108
+ const sessionId = process.argv[1];
109
+ const cwd = process.cwd();
110
+ const projectName = cwd.split('/').pop();
111
+
112
+ // Replace these with generated values
113
+ const summary = process.argv[2];
114
+ const displayName = process.argv[3];
115
+ const turnCount = parseInt(process.argv[4]) || 0;
116
+ const keyword = process.argv[5];
117
+ const area = process.argv[6];
118
+
119
+ function apiPost(path, body, method = 'POST') {
120
+ return new Promise((resolve) => {
121
+ const payload = JSON.stringify(body);
122
+ const url = new URL('http://localhost:3100' + path);
123
+ const req = http.request({ hostname: url.hostname, port: url.port, path: url.pathname, method, headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) }, timeout: 5000 }, (res) => {
124
+ let data = '';
125
+ res.on('data', c => data += c);
126
+ res.on('end', () => { try { resolve(JSON.parse(data)); } catch { resolve(null); } });
127
+ });
128
+ req.on('error', () => resolve(null));
129
+ req.on('timeout', () => { req.destroy(); resolve(null); });
130
+ req.write(payload);
131
+ req.end();
132
+ });
133
+ }
134
+
135
+ (async () => {
136
+ // Save summary
137
+ const result = await apiPost('/sessions/' + sessionId + '/summary', {
138
+ summary, displayName, projectPath: cwd,
139
+ lastTurnIndex: turnCount, totalTurns: turnCount
140
+ }, 'PUT');
141
+ const saved = result?.success || false;
142
+
143
+ // Record learning signals
144
+ const learn = await apiPost('/learn', {
145
+ signals: [
146
+ { type: 'keyword', value: keyword, projectPath: cwd, projectName },
147
+ { type: 'area', value: area, projectPath: cwd }
148
+ ]
149
+ });
150
+ const learned = learn?.success || false;
71
151
 
72
- 6. **Save the summary:**
73
- ```bash
74
- curl -s -X PUT "http://localhost:3100/sessions/$CLAUDE_SESSION_ID/summary" \
75
- -H 'Content-Type: application/json' \
76
- -d '{
77
- "summary": "YOUR_GENERATED_SUMMARY",
78
- "displayName": "YOUR_DISPLAY_NAME",
79
- "slug": "SESSION_SLUG",
80
- "projectPath": "PROJECT_PATH",
81
- "lastTurnIndex": CURRENT_TURN_COUNT,
82
- "totalTurns": CURRENT_TURN_COUNT
83
- }'
152
+ console.log('Summary: ' + (saved ? 'saved' : 'failed') + ' | Learning: ' + (learned ? 'recorded' : 'failed'));
153
+ })();
154
+ " -- "SESSION_ID" "YOUR_GENERATED_SUMMARY" "YOUR_DISPLAY_NAME" "TURN_COUNT" "MAIN_TOPIC" "AREA_OF_PROJECT"
84
155
  ```
85
156
 
86
- 7. **Rename the session** if it doesn't have a customTitle and you generated a displayName:
157
+ ## Step 4: Rename session (if needed)
158
+
159
+ If the session doesn't have a customTitle, rename it:
87
160
  ```
88
161
  /rename YOUR_DISPLAY_NAME
89
162
  ```
90
163
 
91
- 8. **Record learning signals** from what this session is about:
92
- ```bash
93
- curl -s -X POST http://localhost:3100/learn \
94
- -H 'Content-Type: application/json' \
95
- -d '{
96
- "signals": [
97
- {"type": "keyword", "value": "MAIN_TOPIC", "projectPath": "PROJECT_PATH", "projectName": "PROJECT_NAME"},
98
- {"type": "area", "value": "AREA_OF_PROJECT", "projectPath": "PROJECT_PATH"}
99
- ]
100
- }'
101
- ```
102
-
103
164
  ## Output
104
165
 
105
166
  Present the summary clearly:
@@ -116,16 +177,16 @@ What this session is about:
116
177
  OVERALL_GOAL_DESCRIPTION
117
178
 
118
179
  What was accomplished:
119
- MILESTONE_1
120
- MILESTONE_2
121
- MILESTONE_3
180
+ - MILESTONE_1
181
+ - MILESTONE_2
182
+ - MILESTONE_3
122
183
 
123
184
  Current state:
124
185
  WHAT_WE_ARE_DOING_NOW
125
186
 
126
187
  Key context:
127
- IMPORTANT_DECISION_1
128
- PATTERN_ESTABLISHED
188
+ - IMPORTANT_DECISION_1
189
+ - PATTERN_ESTABLISHED
129
190
  ```
130
191
 
131
192
  If `$ARGUMENTS` contains text, treat it as additional context to include in the summary (e.g., `/summary just finished the routing tests`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lm-assist",
3
- "version": "0.1.66",
3
+ "version": "0.1.67",
4
4
  "description": "Knowledge management, session inspector, and web terminal control for Claude Code",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": {
@@ -1 +1 @@
1
- Zx5sHPa3X0Xd4H0apvz9y
1
+ KmCZSVL96On-DixrWoKE4
@@ -7,8 +7,8 @@
7
7
  "static/chunks/a6dad97d9634a72d.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/Zx5sHPa3X0Xd4H0apvz9y/_ssgManifest.js",
11
- "static/Zx5sHPa3X0Xd4H0apvz9y/_buildManifest.js"
10
+ "static/KmCZSVL96On-DixrWoKE4/_ssgManifest.js",
11
+ "static/KmCZSVL96On-DixrWoKE4/_buildManifest.js"
12
12
  ],
13
13
  "rootMainFiles": [
14
14
  "static/chunks/36a05b7c4a79a899.js",
@@ -5,8 +5,8 @@
5
5
  "devFiles": [],
6
6
  "polyfillFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/Zx5sHPa3X0Xd4H0apvz9y/_ssgManifest.js",
9
- "static/Zx5sHPa3X0Xd4H0apvz9y/_buildManifest.js"
8
+ "static/KmCZSVL96On-DixrWoKE4/_ssgManifest.js",
9
+ "static/KmCZSVL96On-DixrWoKE4/_buildManifest.js"
10
10
  ],
11
11
  "rootMainFiles": []
12
12
  }