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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +132 -13
- package/commands/sessions.md +80 -65
- package/commands/summary.md +140 -79
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.html +1 -1
- package/web/.next/server/app/assist-resources.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/assist-resources.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/auth.html +1 -1
- package/web/.next/server/app/auth.rsc +1 -1
- package/web/.next/server/app/auth.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/auth.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/auth.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/auth.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/auth.segments/auth/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/auth.segments/auth.segment.rsc +1 -1
- package/web/.next/server/app/console.html +1 -1
- package/web/.next/server/app/console.rsc +1 -1
- package/web/.next/server/app/console.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/console.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/console.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/console.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/console.segments/console/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/console.segments/console.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.html +1 -1
- package/web/.next/server/app/knowledge.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/knowledge.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/lan-blocked.html +1 -1
- package/web/.next/server/app/lan-blocked.rsc +1 -1
- package/web/.next/server/app/lan-blocked.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/lan-blocked.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/lan-blocked.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/lan-blocked.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/lan-blocked.segments/lan-blocked/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/lan-blocked.segments/lan-blocked.segment.rsc +1 -1
- package/web/.next/server/app/machines.html +1 -1
- package/web/.next/server/app/machines.rsc +1 -1
- package/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines.segment.rsc +1 -1
- package/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/machines.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/machines.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/machines.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/machines.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.html +1 -1
- package/web/.next/server/app/process-dashboard.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/process-dashboard.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/projects.html +1 -1
- package/web/.next/server/app/projects.rsc +1 -1
- package/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects.segment.rsc +1 -1
- package/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/projects.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/projects.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/search.html +1 -1
- package/web/.next/server/app/search.rsc +1 -1
- package/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search.segment.rsc +1 -1
- package/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/search.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/search.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/search.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/search.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.html +1 -1
- package/web/.next/server/app/session-dashboard.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/session-dashboard.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/sessions.html +1 -1
- package/web/.next/server/app/sessions.rsc +1 -1
- package/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions.segment.rsc +1 -1
- package/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/sessions.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/settings.html +1 -1
- package/web/.next/server/app/settings.rsc +1 -1
- package/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
- package/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/skills.html +1 -1
- package/web/.next/server/app/skills.rsc +1 -1
- package/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills.segment.rsc +1 -1
- package/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/tasks.html +1 -1
- package/web/.next/server/app/tasks.rsc +1 -1
- package/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks.segment.rsc +1 -1
- package/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.html +1 -1
- package/web/.next/server/app/terminal-dashboard.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/terminal-dashboard.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/pages/404.html +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.html +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk/assist-resources.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/assist-resources.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.html +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.segments/auth/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/auth.segments/auth.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.html +1 -1
- package/web/.next/standalone/web/.next/server/app/console.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.segments/console/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/console.segments/console.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.html +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk/knowledge.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/knowledge.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.html +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/lan-blocked/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/lan-blocked.segments/lan-blocked.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.html +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk/machines.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/machines.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.html +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk/process-dashboard.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/process-dashboard.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.html +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk/projects.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.html +1 -1
- package/web/.next/standalone/web/.next/server/app/search.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk/search.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/search.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.html +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk/session-dashboard.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/session-dashboard.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.html +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk/sessions.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/sessions.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk/settings.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.html +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.html +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk/tasks.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.html +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk/terminal-dashboard.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/terminal-dashboard.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- /package/web/.next/static/{Zx5sHPa3X0Xd4H0apvz9y → KmCZSVL96On-DixrWoKE4}/_buildManifest.js +0 -0
- /package/web/.next/static/{Zx5sHPa3X0Xd4H0apvz9y → KmCZSVL96On-DixrWoKE4}/_clientMiddlewareManifest.json +0 -0
- /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.
|
|
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",
|
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
|
-
##
|
|
236
|
+
## Skills & Commands
|
|
235
237
|
|
|
236
|
-
|
|
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
|
-
|
|
240
|
+
### Skills (auto-triggered)
|
|
241
|
+
|
|
242
|
+
Skills activate automatically when Claude detects relevant intent — no slash command needed.
|
|
247
243
|
|
|
248
|
-
|
|
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
|
|
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`:
|
package/commands/sessions.md
CHANGED
|
@@ -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
|
-
##
|
|
15
|
+
## Execution
|
|
16
16
|
|
|
17
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
|
|
43
|
+
const data = await api('/projects/sessions');
|
|
44
|
+
if (!data?.data?.sessions) { console.log('Failed to fetch sessions.'); return; }
|
|
81
45
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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.
|
package/commands/summary.md
CHANGED
|
@@ -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
|
-
##
|
|
10
|
+
## Step 1: Gather all session data
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
93
|
+
## Step 2: Generate the summary
|
|
33
94
|
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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
package/web/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
KmCZSVL96On-DixrWoKE4
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
"static/chunks/a6dad97d9634a72d.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static/
|
|
11
|
-
"static/
|
|
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/
|
|
9
|
-
"static/
|
|
8
|
+
"static/KmCZSVL96On-DixrWoKE4/_ssgManifest.js",
|
|
9
|
+
"static/KmCZSVL96On-DixrWoKE4/_buildManifest.js"
|
|
10
10
|
],
|
|
11
11
|
"rootMainFiles": []
|
|
12
12
|
}
|