@10et/cli 1.0.0

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 (1401) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/clawdbot-plugin/clawdbot.plugin.json +20 -0
  4. package/clawdbot-plugin/index.js +555 -0
  5. package/clawdbot-plugin/index.ts +582 -0
  6. package/clawdbot-skill/README.md +328 -0
  7. package/clawdbot-skill/SKILL.md +59 -0
  8. package/clawdbot-skill/index.ts +683 -0
  9. package/clawdbot-skill/package.json +28 -0
  10. package/clawdbot-skill/skill.json +19 -0
  11. package/dist/commands/agent.d.ts +7 -0
  12. package/dist/commands/agent.d.ts.map +1 -0
  13. package/dist/commands/agent.js +170 -0
  14. package/dist/commands/agent.js.map +1 -0
  15. package/dist/commands/agents.d.ts +5 -0
  16. package/dist/commands/agents.d.ts.map +1 -0
  17. package/dist/commands/agents.js +400 -0
  18. package/dist/commands/agents.js.map +1 -0
  19. package/dist/commands/ci-setup.d.ts +5 -0
  20. package/dist/commands/ci-setup.d.ts.map +1 -0
  21. package/dist/commands/ci-setup.js +82 -0
  22. package/dist/commands/ci-setup.js.map +1 -0
  23. package/dist/commands/clawdbot.d.ts +11 -0
  24. package/dist/commands/clawdbot.d.ts.map +1 -0
  25. package/dist/commands/clawdbot.js +215 -0
  26. package/dist/commands/clawdbot.js.map +1 -0
  27. package/dist/commands/context-hub.d.ts +22 -0
  28. package/dist/commands/context-hub.d.ts.map +1 -0
  29. package/dist/commands/context-hub.js +3505 -0
  30. package/dist/commands/context-hub.js.map +1 -0
  31. package/dist/commands/deploy.d.ts +5 -0
  32. package/dist/commands/deploy.d.ts.map +1 -0
  33. package/dist/commands/deploy.js +371 -0
  34. package/dist/commands/deploy.js.map +1 -0
  35. package/dist/commands/digest.d.ts +12 -0
  36. package/dist/commands/digest.d.ts.map +1 -0
  37. package/dist/commands/digest.js +128 -0
  38. package/dist/commands/digest.js.map +1 -0
  39. package/dist/commands/doctor.d.ts +8 -0
  40. package/dist/commands/doctor.d.ts.map +1 -0
  41. package/dist/commands/doctor.js +265 -0
  42. package/dist/commands/doctor.js.map +1 -0
  43. package/dist/commands/eval.d.ts +46 -0
  44. package/dist/commands/eval.d.ts.map +1 -0
  45. package/dist/commands/eval.js +427 -0
  46. package/dist/commands/eval.js.map +1 -0
  47. package/dist/commands/feedback.d.ts +2 -0
  48. package/dist/commands/feedback.d.ts.map +1 -0
  49. package/dist/commands/feedback.js +179 -0
  50. package/dist/commands/feedback.js.map +1 -0
  51. package/dist/commands/findings.d.ts +13 -0
  52. package/dist/commands/findings.d.ts.map +1 -0
  53. package/dist/commands/findings.js +203 -0
  54. package/dist/commands/findings.js.map +1 -0
  55. package/dist/commands/flows.d.ts +10 -0
  56. package/dist/commands/flows.d.ts.map +1 -0
  57. package/dist/commands/flows.js +423 -0
  58. package/dist/commands/flows.js.map +1 -0
  59. package/dist/commands/gtm-process-update.d.ts +10 -0
  60. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  61. package/dist/commands/gtm-process-update.js +101 -0
  62. package/dist/commands/gtm-process-update.js.map +1 -0
  63. package/dist/commands/hooks.d.ts +13 -0
  64. package/dist/commands/hooks.d.ts.map +1 -0
  65. package/dist/commands/hooks.js +304 -0
  66. package/dist/commands/hooks.js.map +1 -0
  67. package/dist/commands/hud.d.ts +4 -0
  68. package/dist/commands/hud.d.ts.map +1 -0
  69. package/dist/commands/hud.js +300 -0
  70. package/dist/commands/hud.js.map +1 -0
  71. package/dist/commands/ide.d.ts +28 -0
  72. package/dist/commands/ide.d.ts.map +1 -0
  73. package/dist/commands/ide.js +628 -0
  74. package/dist/commands/ide.js.map +1 -0
  75. package/dist/commands/improve.d.ts +11 -0
  76. package/dist/commands/improve.d.ts.map +1 -0
  77. package/dist/commands/improve.js +77 -0
  78. package/dist/commands/improve.js.map +1 -0
  79. package/dist/commands/init-from-service.d.ts +15 -0
  80. package/dist/commands/init-from-service.d.ts.map +1 -0
  81. package/dist/commands/init-from-service.js +540 -0
  82. package/dist/commands/init-from-service.js.map +1 -0
  83. package/dist/commands/init.d.ts +15 -0
  84. package/dist/commands/init.d.ts.map +1 -0
  85. package/dist/commands/init.js +940 -0
  86. package/dist/commands/init.js.map +1 -0
  87. package/dist/commands/kanban.d.ts +34 -0
  88. package/dist/commands/kanban.d.ts.map +1 -0
  89. package/dist/commands/kanban.js +225 -0
  90. package/dist/commands/kanban.js.map +1 -0
  91. package/dist/commands/linear.d.ts +41 -0
  92. package/dist/commands/linear.d.ts.map +1 -0
  93. package/dist/commands/linear.js +740 -0
  94. package/dist/commands/linear.js.map +1 -0
  95. package/dist/commands/login.d.ts +12 -0
  96. package/dist/commands/login.d.ts.map +1 -0
  97. package/dist/commands/login.js +780 -0
  98. package/dist/commands/login.js.map +1 -0
  99. package/dist/commands/memory.d.ts +38 -0
  100. package/dist/commands/memory.d.ts.map +1 -0
  101. package/dist/commands/memory.js +229 -0
  102. package/dist/commands/memory.js.map +1 -0
  103. package/dist/commands/migrate-services.d.ts +8 -0
  104. package/dist/commands/migrate-services.d.ts.map +1 -0
  105. package/dist/commands/migrate-services.js +182 -0
  106. package/dist/commands/migrate-services.js.map +1 -0
  107. package/dist/commands/migrate-tenet.d.ts +25 -0
  108. package/dist/commands/migrate-tenet.d.ts.map +1 -0
  109. package/dist/commands/migrate-tenet.js +252 -0
  110. package/dist/commands/migrate-tenet.js.map +1 -0
  111. package/dist/commands/onboard.d.ts +24 -0
  112. package/dist/commands/onboard.d.ts.map +1 -0
  113. package/dist/commands/onboard.js +873 -0
  114. package/dist/commands/onboard.js.map +1 -0
  115. package/dist/commands/openclaw.d.ts +59 -0
  116. package/dist/commands/openclaw.d.ts.map +1 -0
  117. package/dist/commands/openclaw.js +775 -0
  118. package/dist/commands/openclaw.js.map +1 -0
  119. package/dist/commands/orchestrate.d.ts +14 -0
  120. package/dist/commands/orchestrate.d.ts.map +1 -0
  121. package/dist/commands/orchestrate.js +270 -0
  122. package/dist/commands/orchestrate.js.map +1 -0
  123. package/dist/commands/organize.d.ts +16 -0
  124. package/dist/commands/organize.d.ts.map +1 -0
  125. package/dist/commands/organize.js +334 -0
  126. package/dist/commands/organize.js.map +1 -0
  127. package/dist/commands/peter.d.ts +21 -0
  128. package/dist/commands/peter.d.ts.map +1 -0
  129. package/dist/commands/peter.js +2778 -0
  130. package/dist/commands/peter.js.map +1 -0
  131. package/dist/commands/pi-fleet.d.ts +18 -0
  132. package/dist/commands/pi-fleet.d.ts.map +1 -0
  133. package/dist/commands/pi-fleet.js +382 -0
  134. package/dist/commands/pi-fleet.js.map +1 -0
  135. package/dist/commands/pi.d.ts +25 -0
  136. package/dist/commands/pi.d.ts.map +1 -0
  137. package/dist/commands/pi.js +218 -0
  138. package/dist/commands/pi.js.map +1 -0
  139. package/dist/commands/pivot.d.ts +28 -0
  140. package/dist/commands/pivot.d.ts.map +1 -0
  141. package/dist/commands/pivot.js +216 -0
  142. package/dist/commands/pivot.js.map +1 -0
  143. package/dist/commands/portfolio.d.ts +11 -0
  144. package/dist/commands/portfolio.d.ts.map +1 -0
  145. package/dist/commands/portfolio.js +239 -0
  146. package/dist/commands/portfolio.js.map +1 -0
  147. package/dist/commands/predict.d.ts +25 -0
  148. package/dist/commands/predict.d.ts.map +1 -0
  149. package/dist/commands/predict.js +234 -0
  150. package/dist/commands/predict.js.map +1 -0
  151. package/dist/commands/profile.d.ts +46 -0
  152. package/dist/commands/profile.d.ts.map +1 -0
  153. package/dist/commands/profile.js +498 -0
  154. package/dist/commands/profile.js.map +1 -0
  155. package/dist/commands/ralph.d.ts +11 -0
  156. package/dist/commands/ralph.d.ts.map +1 -0
  157. package/dist/commands/ralph.js +102 -0
  158. package/dist/commands/ralph.js.map +1 -0
  159. package/dist/commands/repair.d.ts +7 -0
  160. package/dist/commands/repair.d.ts.map +1 -0
  161. package/dist/commands/repair.js +356 -0
  162. package/dist/commands/repair.js.map +1 -0
  163. package/dist/commands/scope.d.ts +8 -0
  164. package/dist/commands/scope.d.ts.map +1 -0
  165. package/dist/commands/scope.js +503 -0
  166. package/dist/commands/scope.js.map +1 -0
  167. package/dist/commands/service-agent.d.ts +16 -0
  168. package/dist/commands/service-agent.d.ts.map +1 -0
  169. package/dist/commands/service-agent.js +375 -0
  170. package/dist/commands/service-agent.js.map +1 -0
  171. package/dist/commands/service-manager.d.ts +12 -0
  172. package/dist/commands/service-manager.d.ts.map +1 -0
  173. package/dist/commands/service-manager.js +969 -0
  174. package/dist/commands/service-manager.js.map +1 -0
  175. package/dist/commands/service-validate.d.ts +12 -0
  176. package/dist/commands/service-validate.d.ts.map +1 -0
  177. package/dist/commands/service-validate.js +619 -0
  178. package/dist/commands/service-validate.js.map +1 -0
  179. package/dist/commands/services-create.d.ts +15 -0
  180. package/dist/commands/services-create.d.ts.map +1 -0
  181. package/dist/commands/services-create.js +1800 -0
  182. package/dist/commands/services-create.js.map +1 -0
  183. package/dist/commands/services-scan.d.ts +13 -0
  184. package/dist/commands/services-scan.d.ts.map +1 -0
  185. package/dist/commands/services-scan.js +251 -0
  186. package/dist/commands/services-scan.js.map +1 -0
  187. package/dist/commands/services-sync-agents.d.ts +23 -0
  188. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  189. package/dist/commands/services-sync-agents.js +207 -0
  190. package/dist/commands/services-sync-agents.js.map +1 -0
  191. package/dist/commands/services.d.ts +19 -0
  192. package/dist/commands/services.d.ts.map +1 -0
  193. package/dist/commands/services.js +906 -0
  194. package/dist/commands/services.js.map +1 -0
  195. package/dist/commands/session.d.ts +7 -0
  196. package/dist/commands/session.d.ts.map +1 -0
  197. package/dist/commands/session.js +597 -0
  198. package/dist/commands/session.js.map +1 -0
  199. package/dist/commands/setup.d.ts +12 -0
  200. package/dist/commands/setup.d.ts.map +1 -0
  201. package/dist/commands/setup.js +727 -0
  202. package/dist/commands/setup.js.map +1 -0
  203. package/dist/commands/skills.d.ts +31 -0
  204. package/dist/commands/skills.d.ts.map +1 -0
  205. package/dist/commands/skills.js +314 -0
  206. package/dist/commands/skills.js.map +1 -0
  207. package/dist/commands/start.d.ts +25 -0
  208. package/dist/commands/start.d.ts.map +1 -0
  209. package/dist/commands/start.js +251 -0
  210. package/dist/commands/start.js.map +1 -0
  211. package/dist/commands/status.d.ts +2 -0
  212. package/dist/commands/status.d.ts.map +1 -0
  213. package/dist/commands/status.js +163 -0
  214. package/dist/commands/status.js.map +1 -0
  215. package/dist/commands/synopsis.d.ts +54 -0
  216. package/dist/commands/synopsis.d.ts.map +1 -0
  217. package/dist/commands/synopsis.js +277 -0
  218. package/dist/commands/synopsis.js.map +1 -0
  219. package/dist/commands/telemetry-monitor.d.ts +11 -0
  220. package/dist/commands/telemetry-monitor.d.ts.map +1 -0
  221. package/dist/commands/telemetry-monitor.js +224 -0
  222. package/dist/commands/telemetry-monitor.js.map +1 -0
  223. package/dist/commands/telemetry-test.d.ts +11 -0
  224. package/dist/commands/telemetry-test.d.ts.map +1 -0
  225. package/dist/commands/telemetry-test.js +67 -0
  226. package/dist/commands/telemetry-test.js.map +1 -0
  227. package/dist/commands/tenet-agents.d.ts +13 -0
  228. package/dist/commands/tenet-agents.d.ts.map +1 -0
  229. package/dist/commands/tenet-agents.js +191 -0
  230. package/dist/commands/tenet-agents.js.map +1 -0
  231. package/dist/commands/tenet-setup.d.ts +20 -0
  232. package/dist/commands/tenet-setup.d.ts.map +1 -0
  233. package/dist/commands/tenet-setup.js +135 -0
  234. package/dist/commands/tenet-setup.js.map +1 -0
  235. package/dist/commands/train.d.ts +51 -0
  236. package/dist/commands/train.d.ts.map +1 -0
  237. package/dist/commands/train.js +692 -0
  238. package/dist/commands/train.js.map +1 -0
  239. package/dist/commands/update.d.ts +12 -0
  240. package/dist/commands/update.d.ts.map +1 -0
  241. package/dist/commands/update.js +559 -0
  242. package/dist/commands/update.js.map +1 -0
  243. package/dist/commands/validate-settings.d.ts +37 -0
  244. package/dist/commands/validate-settings.d.ts.map +1 -0
  245. package/dist/commands/validate-settings.js +197 -0
  246. package/dist/commands/validate-settings.js.map +1 -0
  247. package/dist/commands/verify.d.ts +14 -0
  248. package/dist/commands/verify.d.ts.map +1 -0
  249. package/dist/commands/verify.js +304 -0
  250. package/dist/commands/verify.js.map +1 -0
  251. package/dist/commands/viz.d.ts +40 -0
  252. package/dist/commands/viz.d.ts.map +1 -0
  253. package/dist/commands/viz.js +877 -0
  254. package/dist/commands/viz.js.map +1 -0
  255. package/dist/commands/voice.d.ts +409 -0
  256. package/dist/commands/voice.d.ts.map +1 -0
  257. package/dist/commands/voice.js +4765 -0
  258. package/dist/commands/voice.js.map +1 -0
  259. package/dist/commands/whoami.d.ts +2 -0
  260. package/dist/commands/whoami.d.ts.map +1 -0
  261. package/dist/commands/whoami.js +24 -0
  262. package/dist/commands/whoami.js.map +1 -0
  263. package/dist/dashboard/index.d.ts +11 -0
  264. package/dist/dashboard/index.d.ts.map +1 -0
  265. package/dist/dashboard/index.js +70 -0
  266. package/dist/dashboard/index.js.map +1 -0
  267. package/dist/dashboard-static/assets/index-BVrmW-ZI.js +154 -0
  268. package/dist/dashboard-static/assets/index-DtruPD44.css +1 -0
  269. package/dist/dashboard-static/index.html +16 -0
  270. package/dist/index.d.ts +4 -0
  271. package/dist/index.d.ts.map +1 -0
  272. package/dist/index.js +1707 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/lib/advanced-setup.d.ts +78 -0
  275. package/dist/lib/advanced-setup.d.ts.map +1 -0
  276. package/dist/lib/advanced-setup.js +433 -0
  277. package/dist/lib/advanced-setup.js.map +1 -0
  278. package/dist/lib/agent-config.d.ts +86 -0
  279. package/dist/lib/agent-config.d.ts.map +1 -0
  280. package/dist/lib/agent-config.js +281 -0
  281. package/dist/lib/agent-config.js.map +1 -0
  282. package/dist/lib/agent-generator.d.ts +36 -0
  283. package/dist/lib/agent-generator.d.ts.map +1 -0
  284. package/dist/lib/agent-generator.js +400 -0
  285. package/dist/lib/agent-generator.js.map +1 -0
  286. package/dist/lib/agent-guards.d.ts +67 -0
  287. package/dist/lib/agent-guards.d.ts.map +1 -0
  288. package/dist/lib/agent-guards.js +229 -0
  289. package/dist/lib/agent-guards.js.map +1 -0
  290. package/dist/lib/agent-manifest.d.ts +35 -0
  291. package/dist/lib/agent-manifest.d.ts.map +1 -0
  292. package/dist/lib/agent-manifest.js +75 -0
  293. package/dist/lib/agent-manifest.js.map +1 -0
  294. package/dist/lib/agent-runtime-api.d.ts +32 -0
  295. package/dist/lib/agent-runtime-api.d.ts.map +1 -0
  296. package/dist/lib/agent-runtime-api.js +270 -0
  297. package/dist/lib/agent-runtime-api.js.map +1 -0
  298. package/dist/lib/agent-session.d.ts +104 -0
  299. package/dist/lib/agent-session.d.ts.map +1 -0
  300. package/dist/lib/agent-session.js +954 -0
  301. package/dist/lib/agent-session.js.map +1 -0
  302. package/dist/lib/build-supervisor.d.ts +44 -0
  303. package/dist/lib/build-supervisor.d.ts.map +1 -0
  304. package/dist/lib/build-supervisor.js +79 -0
  305. package/dist/lib/build-supervisor.js.map +1 -0
  306. package/dist/lib/connectors/index.d.ts +19 -0
  307. package/dist/lib/connectors/index.d.ts.map +1 -0
  308. package/dist/lib/connectors/index.js +23 -0
  309. package/dist/lib/connectors/index.js.map +1 -0
  310. package/dist/lib/counterfactual-engine.d.ts +136 -0
  311. package/dist/lib/counterfactual-engine.d.ts.map +1 -0
  312. package/dist/lib/counterfactual-engine.js +417 -0
  313. package/dist/lib/counterfactual-engine.js.map +1 -0
  314. package/dist/lib/counterfactual-training-bridge.d.ts +114 -0
  315. package/dist/lib/counterfactual-training-bridge.d.ts.map +1 -0
  316. package/dist/lib/counterfactual-training-bridge.js +322 -0
  317. package/dist/lib/counterfactual-training-bridge.js.map +1 -0
  318. package/dist/lib/discovery-agent.d.ts +48 -0
  319. package/dist/lib/discovery-agent.d.ts.map +1 -0
  320. package/dist/lib/discovery-agent.js +111 -0
  321. package/dist/lib/discovery-agent.js.map +1 -0
  322. package/dist/lib/domain/engine.d.ts +11 -0
  323. package/dist/lib/domain/engine.d.ts.map +1 -0
  324. package/dist/lib/domain/engine.js +23 -0
  325. package/dist/lib/domain/engine.js.map +1 -0
  326. package/dist/lib/domain/index.d.ts +3 -0
  327. package/dist/lib/domain/index.d.ts.map +1 -0
  328. package/dist/lib/domain/index.js +3 -0
  329. package/dist/lib/domain/index.js.map +1 -0
  330. package/dist/lib/domain/template-loader.d.ts +9 -0
  331. package/dist/lib/domain/template-loader.d.ts.map +1 -0
  332. package/dist/lib/domain/template-loader.js +29 -0
  333. package/dist/lib/domain/template-loader.js.map +1 -0
  334. package/dist/lib/domain/types.d.ts +29 -0
  335. package/dist/lib/domain/types.d.ts.map +1 -0
  336. package/dist/lib/domain/types.js +2 -0
  337. package/dist/lib/domain/types.js.map +1 -0
  338. package/dist/lib/dynamics-model.d.ts +107 -0
  339. package/dist/lib/dynamics-model.d.ts.map +1 -0
  340. package/dist/lib/dynamics-model.js +363 -0
  341. package/dist/lib/dynamics-model.js.map +1 -0
  342. package/dist/lib/eval-snapshot.d.ts +47 -0
  343. package/dist/lib/eval-snapshot.d.ts.map +1 -0
  344. package/dist/lib/eval-snapshot.js +326 -0
  345. package/dist/lib/eval-snapshot.js.map +1 -0
  346. package/dist/lib/eval-store.d.ts +20 -0
  347. package/dist/lib/eval-store.d.ts.map +1 -0
  348. package/dist/lib/eval-store.js +209 -0
  349. package/dist/lib/eval-store.js.map +1 -0
  350. package/dist/lib/findings-engine.d.ts +51 -0
  351. package/dist/lib/findings-engine.d.ts.map +1 -0
  352. package/dist/lib/findings-engine.js +338 -0
  353. package/dist/lib/findings-engine.js.map +1 -0
  354. package/dist/lib/flow-engine.d.ts +57 -0
  355. package/dist/lib/flow-engine.d.ts.map +1 -0
  356. package/dist/lib/flow-engine.js +717 -0
  357. package/dist/lib/flow-engine.js.map +1 -0
  358. package/dist/lib/gtm-generator.d.ts +29 -0
  359. package/dist/lib/gtm-generator.d.ts.map +1 -0
  360. package/dist/lib/gtm-generator.js +250 -0
  361. package/dist/lib/gtm-generator.js.map +1 -0
  362. package/dist/lib/hook-transformer.d.ts +11 -0
  363. package/dist/lib/hook-transformer.d.ts.map +1 -0
  364. package/dist/lib/hook-transformer.js +74 -0
  365. package/dist/lib/hook-transformer.js.map +1 -0
  366. package/dist/lib/hub-client.d.ts +81 -0
  367. package/dist/lib/hub-client.d.ts.map +1 -0
  368. package/dist/lib/hub-client.js +73 -0
  369. package/dist/lib/hub-client.js.map +1 -0
  370. package/dist/lib/hub-health.d.ts +40 -0
  371. package/dist/lib/hub-health.d.ts.map +1 -0
  372. package/dist/lib/hub-health.js +101 -0
  373. package/dist/lib/hub-health.js.map +1 -0
  374. package/dist/lib/ide-panes.d.ts +58 -0
  375. package/dist/lib/ide-panes.d.ts.map +1 -0
  376. package/dist/lib/ide-panes.js +508 -0
  377. package/dist/lib/ide-panes.js.map +1 -0
  378. package/dist/lib/invariant-monitor.d.ts +54 -0
  379. package/dist/lib/invariant-monitor.d.ts.map +1 -0
  380. package/dist/lib/invariant-monitor.js +487 -0
  381. package/dist/lib/invariant-monitor.js.map +1 -0
  382. package/dist/lib/journal-analyzer.d.ts +71 -0
  383. package/dist/lib/journal-analyzer.d.ts.map +1 -0
  384. package/dist/lib/journal-analyzer.js +306 -0
  385. package/dist/lib/journal-analyzer.js.map +1 -0
  386. package/dist/lib/kanban-github.d.ts +81 -0
  387. package/dist/lib/kanban-github.d.ts.map +1 -0
  388. package/dist/lib/kanban-github.js +318 -0
  389. package/dist/lib/kanban-github.js.map +1 -0
  390. package/dist/lib/kanban.d.ts +131 -0
  391. package/dist/lib/kanban.d.ts.map +1 -0
  392. package/dist/lib/kanban.js +340 -0
  393. package/dist/lib/kanban.js.map +1 -0
  394. package/dist/lib/kuva.d.ts +45 -0
  395. package/dist/lib/kuva.d.ts.map +1 -0
  396. package/dist/lib/kuva.js +131 -0
  397. package/dist/lib/kuva.js.map +1 -0
  398. package/dist/lib/linear-client.d.ts +73 -0
  399. package/dist/lib/linear-client.d.ts.map +1 -0
  400. package/dist/lib/linear-client.js +112 -0
  401. package/dist/lib/linear-client.js.map +1 -0
  402. package/dist/lib/linear-id-map.d.ts +20 -0
  403. package/dist/lib/linear-id-map.d.ts.map +1 -0
  404. package/dist/lib/linear-id-map.js +59 -0
  405. package/dist/lib/linear-id-map.js.map +1 -0
  406. package/dist/lib/linear-kanban.d.ts +66 -0
  407. package/dist/lib/linear-kanban.d.ts.map +1 -0
  408. package/dist/lib/linear-kanban.js +175 -0
  409. package/dist/lib/linear-kanban.js.map +1 -0
  410. package/dist/lib/linear-webhook.d.ts +50 -0
  411. package/dist/lib/linear-webhook.d.ts.map +1 -0
  412. package/dist/lib/linear-webhook.js +92 -0
  413. package/dist/lib/linear-webhook.js.map +1 -0
  414. package/dist/lib/map-event-bus.d.ts +50 -0
  415. package/dist/lib/map-event-bus.d.ts.map +1 -0
  416. package/dist/lib/map-event-bus.js +366 -0
  417. package/dist/lib/map-event-bus.js.map +1 -0
  418. package/dist/lib/memory-db.d.ts +136 -0
  419. package/dist/lib/memory-db.d.ts.map +1 -0
  420. package/dist/lib/memory-db.js +429 -0
  421. package/dist/lib/memory-db.js.map +1 -0
  422. package/dist/lib/memory-indexer.d.ts +61 -0
  423. package/dist/lib/memory-indexer.d.ts.map +1 -0
  424. package/dist/lib/memory-indexer.js +418 -0
  425. package/dist/lib/memory-indexer.js.map +1 -0
  426. package/dist/lib/memory-search.d.ts +185 -0
  427. package/dist/lib/memory-search.d.ts.map +1 -0
  428. package/dist/lib/memory-search.js +678 -0
  429. package/dist/lib/memory-search.js.map +1 -0
  430. package/dist/lib/meta-orchestrator.d.ts +141 -0
  431. package/dist/lib/meta-orchestrator.d.ts.map +1 -0
  432. package/dist/lib/meta-orchestrator.js +552 -0
  433. package/dist/lib/meta-orchestrator.js.map +1 -0
  434. package/dist/lib/model-pricing.d.ts +11 -0
  435. package/dist/lib/model-pricing.d.ts.map +1 -0
  436. package/dist/lib/model-pricing.js +27 -0
  437. package/dist/lib/model-pricing.js.map +1 -0
  438. package/dist/lib/onboarding.d.ts +40 -0
  439. package/dist/lib/onboarding.d.ts.map +1 -0
  440. package/dist/lib/onboarding.js +213 -0
  441. package/dist/lib/onboarding.js.map +1 -0
  442. package/dist/lib/openclaw-registry.d.ts +48 -0
  443. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  444. package/dist/lib/openclaw-registry.js +181 -0
  445. package/dist/lib/openclaw-registry.js.map +1 -0
  446. package/dist/lib/openclaw-sdk.d.ts +115 -0
  447. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  448. package/dist/lib/openclaw-sdk.js +220 -0
  449. package/dist/lib/openclaw-sdk.js.map +1 -0
  450. package/dist/lib/peer-agent-generator.d.ts +44 -0
  451. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  452. package/dist/lib/peer-agent-generator.js +310 -0
  453. package/dist/lib/peer-agent-generator.js.map +1 -0
  454. package/dist/lib/peter-parker-bridge.d.ts +70 -0
  455. package/dist/lib/peter-parker-bridge.d.ts.map +1 -0
  456. package/dist/lib/peter-parker-bridge.js +345 -0
  457. package/dist/lib/peter-parker-bridge.js.map +1 -0
  458. package/dist/lib/peter-parker-config.d.ts +13 -0
  459. package/dist/lib/peter-parker-config.d.ts.map +1 -0
  460. package/dist/lib/peter-parker-config.js +86 -0
  461. package/dist/lib/peter-parker-config.js.map +1 -0
  462. package/dist/lib/physical-world-model.d.ts +50 -0
  463. package/dist/lib/physical-world-model.d.ts.map +1 -0
  464. package/dist/lib/physical-world-model.js +251 -0
  465. package/dist/lib/physical-world-model.js.map +1 -0
  466. package/dist/lib/pi-sky/bridge.d.ts +55 -0
  467. package/dist/lib/pi-sky/bridge.d.ts.map +1 -0
  468. package/dist/lib/pi-sky/bridge.js +264 -0
  469. package/dist/lib/pi-sky/bridge.js.map +1 -0
  470. package/dist/lib/pi-sky/cost-monitor.d.ts +21 -0
  471. package/dist/lib/pi-sky/cost-monitor.d.ts.map +1 -0
  472. package/dist/lib/pi-sky/cost-monitor.js +126 -0
  473. package/dist/lib/pi-sky/cost-monitor.js.map +1 -0
  474. package/dist/lib/pi-sky/eval-sweep.d.ts +27 -0
  475. package/dist/lib/pi-sky/eval-sweep.d.ts.map +1 -0
  476. package/dist/lib/pi-sky/eval-sweep.js +141 -0
  477. package/dist/lib/pi-sky/eval-sweep.js.map +1 -0
  478. package/dist/lib/pi-sky/event-router.d.ts +32 -0
  479. package/dist/lib/pi-sky/event-router.d.ts.map +1 -0
  480. package/dist/lib/pi-sky/event-router.js +176 -0
  481. package/dist/lib/pi-sky/event-router.js.map +1 -0
  482. package/dist/lib/pi-sky/experiment.d.ts +9 -0
  483. package/dist/lib/pi-sky/experiment.d.ts.map +1 -0
  484. package/dist/lib/pi-sky/experiment.js +83 -0
  485. package/dist/lib/pi-sky/experiment.js.map +1 -0
  486. package/dist/lib/pi-sky/index.d.ts +16 -0
  487. package/dist/lib/pi-sky/index.d.ts.map +1 -0
  488. package/dist/lib/pi-sky/index.js +16 -0
  489. package/dist/lib/pi-sky/index.js.map +1 -0
  490. package/dist/lib/pi-sky/stratus-gate.d.ts +28 -0
  491. package/dist/lib/pi-sky/stratus-gate.d.ts.map +1 -0
  492. package/dist/lib/pi-sky/stratus-gate.js +61 -0
  493. package/dist/lib/pi-sky/stratus-gate.js.map +1 -0
  494. package/dist/lib/pi-sky/swarm.d.ts +28 -0
  495. package/dist/lib/pi-sky/swarm.d.ts.map +1 -0
  496. package/dist/lib/pi-sky/swarm.js +208 -0
  497. package/dist/lib/pi-sky/swarm.js.map +1 -0
  498. package/dist/lib/pi-sky/types.d.ts +139 -0
  499. package/dist/lib/pi-sky/types.d.ts.map +1 -0
  500. package/dist/lib/pi-sky/types.js +2 -0
  501. package/dist/lib/pi-sky/types.js.map +1 -0
  502. package/dist/lib/pi-sky/voice-bridge.d.ts +20 -0
  503. package/dist/lib/pi-sky/voice-bridge.d.ts.map +1 -0
  504. package/dist/lib/pi-sky/voice-bridge.js +91 -0
  505. package/dist/lib/pi-sky/voice-bridge.js.map +1 -0
  506. package/dist/lib/planning-loop.d.ts +157 -0
  507. package/dist/lib/planning-loop.d.ts.map +1 -0
  508. package/dist/lib/planning-loop.js +537 -0
  509. package/dist/lib/planning-loop.js.map +1 -0
  510. package/dist/lib/policy-head.d.ts +53 -0
  511. package/dist/lib/policy-head.d.ts.map +1 -0
  512. package/dist/lib/policy-head.js +400 -0
  513. package/dist/lib/policy-head.js.map +1 -0
  514. package/dist/lib/predictor.d.ts +109 -0
  515. package/dist/lib/predictor.d.ts.map +1 -0
  516. package/dist/lib/predictor.js +433 -0
  517. package/dist/lib/predictor.js.map +1 -0
  518. package/dist/lib/replay-buffer.d.ts +93 -0
  519. package/dist/lib/replay-buffer.d.ts.map +1 -0
  520. package/dist/lib/replay-buffer.js +302 -0
  521. package/dist/lib/replay-buffer.js.map +1 -0
  522. package/dist/lib/resource-optimizer-middleware.d.ts +39 -0
  523. package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -0
  524. package/dist/lib/resource-optimizer-middleware.js +228 -0
  525. package/dist/lib/resource-optimizer-middleware.js.map +1 -0
  526. package/dist/lib/resource-optimizer.d.ts +71 -0
  527. package/dist/lib/resource-optimizer.d.ts.map +1 -0
  528. package/dist/lib/resource-optimizer.js +228 -0
  529. package/dist/lib/resource-optimizer.js.map +1 -0
  530. package/dist/lib/rewards/index.d.ts +14 -0
  531. package/dist/lib/rewards/index.d.ts.map +1 -0
  532. package/dist/lib/rewards/index.js +15 -0
  533. package/dist/lib/rewards/index.js.map +1 -0
  534. package/dist/lib/rl-manager.d.ts +74 -0
  535. package/dist/lib/rl-manager.d.ts.map +1 -0
  536. package/dist/lib/rl-manager.js +245 -0
  537. package/dist/lib/rl-manager.js.map +1 -0
  538. package/dist/lib/sentinel-rl.d.ts +97 -0
  539. package/dist/lib/sentinel-rl.d.ts.map +1 -0
  540. package/dist/lib/sentinel-rl.js +430 -0
  541. package/dist/lib/sentinel-rl.js.map +1 -0
  542. package/dist/lib/service-analyzer.d.ts +76 -0
  543. package/dist/lib/service-analyzer.d.ts.map +1 -0
  544. package/dist/lib/service-analyzer.js +704 -0
  545. package/dist/lib/service-analyzer.js.map +1 -0
  546. package/dist/lib/service-dependencies.d.ts +44 -0
  547. package/dist/lib/service-dependencies.d.ts.map +1 -0
  548. package/dist/lib/service-dependencies.js +314 -0
  549. package/dist/lib/service-dependencies.js.map +1 -0
  550. package/dist/lib/service-detector.d.ts +61 -0
  551. package/dist/lib/service-detector.d.ts.map +1 -0
  552. package/dist/lib/service-detector.js +541 -0
  553. package/dist/lib/service-detector.js.map +1 -0
  554. package/dist/lib/service-gtm.d.ts +208 -0
  555. package/dist/lib/service-gtm.d.ts.map +1 -0
  556. package/dist/lib/service-gtm.js +1006 -0
  557. package/dist/lib/service-gtm.js.map +1 -0
  558. package/dist/lib/service-mcp-base.d.ts +103 -0
  559. package/dist/lib/service-mcp-base.d.ts.map +1 -0
  560. package/dist/lib/service-mcp-base.js +263 -0
  561. package/dist/lib/service-mcp-base.js.map +1 -0
  562. package/dist/lib/service-questionnaire.d.ts +11 -0
  563. package/dist/lib/service-questionnaire.d.ts.map +1 -0
  564. package/dist/lib/service-questionnaire.js +89 -0
  565. package/dist/lib/service-questionnaire.js.map +1 -0
  566. package/dist/lib/service-utils.d.ts +103 -0
  567. package/dist/lib/service-utils.d.ts.map +1 -0
  568. package/dist/lib/service-utils.js +385 -0
  569. package/dist/lib/service-utils.js.map +1 -0
  570. package/dist/lib/session-lock.d.ts +61 -0
  571. package/dist/lib/session-lock.d.ts.map +1 -0
  572. package/dist/lib/session-lock.js +438 -0
  573. package/dist/lib/session-lock.js.map +1 -0
  574. package/dist/lib/setup/agent-generator.d.ts +25 -0
  575. package/dist/lib/setup/agent-generator.d.ts.map +1 -0
  576. package/dist/lib/setup/agent-generator.js +444 -0
  577. package/dist/lib/setup/agent-generator.js.map +1 -0
  578. package/dist/lib/setup/context-analyzer.d.ts +16 -0
  579. package/dist/lib/setup/context-analyzer.d.ts.map +1 -0
  580. package/dist/lib/setup/context-analyzer.js +112 -0
  581. package/dist/lib/setup/context-analyzer.js.map +1 -0
  582. package/dist/lib/setup/doc-auditor.d.ts +54 -0
  583. package/dist/lib/setup/doc-auditor.d.ts.map +1 -0
  584. package/dist/lib/setup/doc-auditor.js +629 -0
  585. package/dist/lib/setup/doc-auditor.js.map +1 -0
  586. package/dist/lib/setup/domain-generator.d.ts +7 -0
  587. package/dist/lib/setup/domain-generator.d.ts.map +1 -0
  588. package/dist/lib/setup/domain-generator.js +58 -0
  589. package/dist/lib/setup/domain-generator.js.map +1 -0
  590. package/dist/lib/setup/flow-generator.d.ts +10 -0
  591. package/dist/lib/setup/flow-generator.d.ts.map +1 -0
  592. package/dist/lib/setup/flow-generator.js +113 -0
  593. package/dist/lib/setup/flow-generator.js.map +1 -0
  594. package/dist/lib/setup/invariant-bridge.d.ts +91 -0
  595. package/dist/lib/setup/invariant-bridge.d.ts.map +1 -0
  596. package/dist/lib/setup/invariant-bridge.js +384 -0
  597. package/dist/lib/setup/invariant-bridge.js.map +1 -0
  598. package/dist/lib/setup/smart-eval-generator.d.ts +38 -0
  599. package/dist/lib/setup/smart-eval-generator.d.ts.map +1 -0
  600. package/dist/lib/setup/smart-eval-generator.js +378 -0
  601. package/dist/lib/setup/smart-eval-generator.js.map +1 -0
  602. package/dist/lib/setup/smart-recommender.d.ts +63 -0
  603. package/dist/lib/setup/smart-recommender.d.ts.map +1 -0
  604. package/dist/lib/setup/smart-recommender.js +329 -0
  605. package/dist/lib/setup/smart-recommender.js.map +1 -0
  606. package/dist/lib/setup/spec-generator.d.ts +99 -0
  607. package/dist/lib/setup/spec-generator.d.ts.map +1 -0
  608. package/dist/lib/setup/spec-generator.js +784 -0
  609. package/dist/lib/setup/spec-generator.js.map +1 -0
  610. package/dist/lib/setup/starter-intelligence.d.ts +25 -0
  611. package/dist/lib/setup/starter-intelligence.d.ts.map +1 -0
  612. package/dist/lib/setup/starter-intelligence.js +309 -0
  613. package/dist/lib/setup/starter-intelligence.js.map +1 -0
  614. package/dist/lib/setup/violation-agent-generator.d.ts +32 -0
  615. package/dist/lib/setup/violation-agent-generator.d.ts.map +1 -0
  616. package/dist/lib/setup/violation-agent-generator.js +255 -0
  617. package/dist/lib/setup/violation-agent-generator.js.map +1 -0
  618. package/dist/lib/skill-generator.d.ts +21 -0
  619. package/dist/lib/skill-generator.d.ts.map +1 -0
  620. package/dist/lib/skill-generator.js +253 -0
  621. package/dist/lib/skill-generator.js.map +1 -0
  622. package/dist/lib/state-capture.d.ts +36 -0
  623. package/dist/lib/state-capture.d.ts.map +1 -0
  624. package/dist/lib/state-capture.js +541 -0
  625. package/dist/lib/state-capture.js.map +1 -0
  626. package/dist/lib/stealth-onboarding.d.ts +40 -0
  627. package/dist/lib/stealth-onboarding.d.ts.map +1 -0
  628. package/dist/lib/stealth-onboarding.js +213 -0
  629. package/dist/lib/stealth-onboarding.js.map +1 -0
  630. package/dist/lib/storage/cloud.d.ts +27 -0
  631. package/dist/lib/storage/cloud.d.ts.map +1 -0
  632. package/dist/lib/storage/cloud.js +75 -0
  633. package/dist/lib/storage/cloud.js.map +1 -0
  634. package/dist/lib/storage/index.d.ts +15 -0
  635. package/dist/lib/storage/index.d.ts.map +1 -0
  636. package/dist/lib/storage/index.js +15 -0
  637. package/dist/lib/storage/index.js.map +1 -0
  638. package/dist/lib/storage/interface.d.ts +56 -0
  639. package/dist/lib/storage/interface.d.ts.map +1 -0
  640. package/dist/lib/storage/interface.js +2 -0
  641. package/dist/lib/storage/interface.js.map +1 -0
  642. package/dist/lib/storage/local.d.ts +26 -0
  643. package/dist/lib/storage/local.d.ts.map +1 -0
  644. package/dist/lib/storage/local.js +164 -0
  645. package/dist/lib/storage/local.js.map +1 -0
  646. package/dist/lib/stratus-client.d.ts +178 -0
  647. package/dist/lib/stratus-client.d.ts.map +1 -0
  648. package/dist/lib/stratus-client.js +739 -0
  649. package/dist/lib/stratus-client.js.map +1 -0
  650. package/dist/lib/stratus-rollout-test.d.ts +10 -0
  651. package/dist/lib/stratus-rollout-test.d.ts.map +1 -0
  652. package/dist/lib/stratus-rollout-test.js +412 -0
  653. package/dist/lib/stratus-rollout-test.js.map +1 -0
  654. package/dist/lib/surface-agent.d.ts +78 -0
  655. package/dist/lib/surface-agent.d.ts.map +1 -0
  656. package/dist/lib/surface-agent.js +105 -0
  657. package/dist/lib/surface-agent.js.map +1 -0
  658. package/dist/lib/surface-coordination-example.d.ts +30 -0
  659. package/dist/lib/surface-coordination-example.d.ts.map +1 -0
  660. package/dist/lib/surface-coordination-example.js +164 -0
  661. package/dist/lib/surface-coordination-example.js.map +1 -0
  662. package/dist/lib/telemetry/physical-world-collector.d.ts +15 -0
  663. package/dist/lib/telemetry/physical-world-collector.d.ts.map +1 -0
  664. package/dist/lib/telemetry/physical-world-collector.js +177 -0
  665. package/dist/lib/telemetry/physical-world-collector.js.map +1 -0
  666. package/dist/lib/telemetry/training-bridge.d.ts +51 -0
  667. package/dist/lib/telemetry/training-bridge.d.ts.map +1 -0
  668. package/dist/lib/telemetry/training-bridge.js +185 -0
  669. package/dist/lib/telemetry/training-bridge.js.map +1 -0
  670. package/dist/lib/telemetry-agent-v2.d.ts +128 -0
  671. package/dist/lib/telemetry-agent-v2.d.ts.map +1 -0
  672. package/dist/lib/telemetry-agent-v2.js +1043 -0
  673. package/dist/lib/telemetry-agent-v2.js.map +1 -0
  674. package/dist/lib/telemetry-agent.d.ts +57 -0
  675. package/dist/lib/telemetry-agent.d.ts.map +1 -0
  676. package/dist/lib/telemetry-agent.js +289 -0
  677. package/dist/lib/telemetry-agent.js.map +1 -0
  678. package/dist/lib/telemetry-digest.d.ts +10 -0
  679. package/dist/lib/telemetry-digest.d.ts.map +1 -0
  680. package/dist/lib/telemetry-digest.js +381 -0
  681. package/dist/lib/telemetry-digest.js.map +1 -0
  682. package/dist/lib/telemetry.d.ts +37 -0
  683. package/dist/lib/telemetry.d.ts.map +1 -0
  684. package/dist/lib/telemetry.js +376 -0
  685. package/dist/lib/telemetry.js.map +1 -0
  686. package/dist/lib/tenet-board-agent.d.ts +52 -0
  687. package/dist/lib/tenet-board-agent.d.ts.map +1 -0
  688. package/dist/lib/tenet-board-agent.js +226 -0
  689. package/dist/lib/tenet-board-agent.js.map +1 -0
  690. package/dist/lib/tenet-ide-agent.d.ts +40 -0
  691. package/dist/lib/tenet-ide-agent.d.ts.map +1 -0
  692. package/dist/lib/tenet-ide-agent.js +199 -0
  693. package/dist/lib/tenet-ide-agent.js.map +1 -0
  694. package/dist/lib/text-preprocessing.d.ts +83 -0
  695. package/dist/lib/text-preprocessing.d.ts.map +1 -0
  696. package/dist/lib/text-preprocessing.js +261 -0
  697. package/dist/lib/text-preprocessing.js.map +1 -0
  698. package/dist/lib/tool-schemas.d.ts +35 -0
  699. package/dist/lib/tool-schemas.d.ts.map +1 -0
  700. package/dist/lib/tool-schemas.js +246 -0
  701. package/dist/lib/tool-schemas.js.map +1 -0
  702. package/dist/lib/training-buffer.d.ts +86 -0
  703. package/dist/lib/training-buffer.d.ts.map +1 -0
  704. package/dist/lib/training-buffer.js +139 -0
  705. package/dist/lib/training-buffer.js.map +1 -0
  706. package/dist/lib/training-tuples.d.ts +33 -0
  707. package/dist/lib/training-tuples.d.ts.map +1 -0
  708. package/dist/lib/training-tuples.js +273 -0
  709. package/dist/lib/training-tuples.js.map +1 -0
  710. package/dist/lib/trajectory-loader.d.ts +82 -0
  711. package/dist/lib/trajectory-loader.d.ts.map +1 -0
  712. package/dist/lib/trajectory-loader.js +406 -0
  713. package/dist/lib/trajectory-loader.js.map +1 -0
  714. package/dist/lib/tuple-miner.d.ts +30 -0
  715. package/dist/lib/tuple-miner.d.ts.map +1 -0
  716. package/dist/lib/tuple-miner.js +427 -0
  717. package/dist/lib/tuple-miner.js.map +1 -0
  718. package/dist/lib/vm-backend.d.ts +72 -0
  719. package/dist/lib/vm-backend.d.ts.map +1 -0
  720. package/dist/lib/vm-backend.js +175 -0
  721. package/dist/lib/vm-backend.js.map +1 -0
  722. package/dist/lib/workspace/backend.d.ts +53 -0
  723. package/dist/lib/workspace/backend.d.ts.map +1 -0
  724. package/dist/lib/workspace/backend.js +37 -0
  725. package/dist/lib/workspace/backend.js.map +1 -0
  726. package/dist/lib/workspace/cmux-adapter.d.ts +46 -0
  727. package/dist/lib/workspace/cmux-adapter.d.ts.map +1 -0
  728. package/dist/lib/workspace/cmux-adapter.js +261 -0
  729. package/dist/lib/workspace/cmux-adapter.js.map +1 -0
  730. package/dist/lib/workspace/data-pipeline.d.ts +35 -0
  731. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -0
  732. package/dist/lib/workspace/data-pipeline.js +494 -0
  733. package/dist/lib/workspace/data-pipeline.js.map +1 -0
  734. package/dist/lib/workspace/engine.d.ts +65 -0
  735. package/dist/lib/workspace/engine.d.ts.map +1 -0
  736. package/dist/lib/workspace/engine.js +407 -0
  737. package/dist/lib/workspace/engine.js.map +1 -0
  738. package/dist/lib/workspace/notifications.d.ts +14 -0
  739. package/dist/lib/workspace/notifications.d.ts.map +1 -0
  740. package/dist/lib/workspace/notifications.js +41 -0
  741. package/dist/lib/workspace/notifications.js.map +1 -0
  742. package/dist/lib/workspace/sidebar-runner.d.ts +13 -0
  743. package/dist/lib/workspace/sidebar-runner.d.ts.map +1 -0
  744. package/dist/lib/workspace/sidebar-runner.js +419 -0
  745. package/dist/lib/workspace/sidebar-runner.js.map +1 -0
  746. package/dist/lib/workspace/surface-registry.d.ts +49 -0
  747. package/dist/lib/workspace/surface-registry.d.ts.map +1 -0
  748. package/dist/lib/workspace/surface-registry.js +225 -0
  749. package/dist/lib/workspace/surface-registry.js.map +1 -0
  750. package/dist/lib/workspace/surface-type.d.ts +153 -0
  751. package/dist/lib/workspace/surface-type.d.ts.map +1 -0
  752. package/dist/lib/workspace/surface-type.js +9 -0
  753. package/dist/lib/workspace/surface-type.js.map +1 -0
  754. package/dist/lib/workspace/surfaces/agent-overview.d.ts +16 -0
  755. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -0
  756. package/dist/lib/workspace/surfaces/agent-overview.js +116 -0
  757. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -0
  758. package/dist/lib/workspace/surfaces/agent.d.ts +16 -0
  759. package/dist/lib/workspace/surfaces/agent.d.ts.map +1 -0
  760. package/dist/lib/workspace/surfaces/agent.js +112 -0
  761. package/dist/lib/workspace/surfaces/agent.js.map +1 -0
  762. package/dist/lib/workspace/surfaces/claude.d.ts +15 -0
  763. package/dist/lib/workspace/surfaces/claude.d.ts.map +1 -0
  764. package/dist/lib/workspace/surfaces/claude.js +23 -0
  765. package/dist/lib/workspace/surfaces/claude.js.map +1 -0
  766. package/dist/lib/workspace/surfaces/dashboard.d.ts +21 -0
  767. package/dist/lib/workspace/surfaces/dashboard.d.ts.map +1 -0
  768. package/dist/lib/workspace/surfaces/dashboard.js +32 -0
  769. package/dist/lib/workspace/surfaces/dashboard.js.map +1 -0
  770. package/dist/lib/workspace/surfaces/eval.d.ts +15 -0
  771. package/dist/lib/workspace/surfaces/eval.d.ts.map +1 -0
  772. package/dist/lib/workspace/surfaces/eval.js +42 -0
  773. package/dist/lib/workspace/surfaces/eval.js.map +1 -0
  774. package/dist/lib/workspace/surfaces/event-stream.d.ts +16 -0
  775. package/dist/lib/workspace/surfaces/event-stream.d.ts.map +1 -0
  776. package/dist/lib/workspace/surfaces/event-stream.js +40 -0
  777. package/dist/lib/workspace/surfaces/event-stream.js.map +1 -0
  778. package/dist/lib/workspace/surfaces/flow.d.ts +16 -0
  779. package/dist/lib/workspace/surfaces/flow.d.ts.map +1 -0
  780. package/dist/lib/workspace/surfaces/flow.js +49 -0
  781. package/dist/lib/workspace/surfaces/flow.js.map +1 -0
  782. package/dist/lib/workspace/surfaces/index.d.ts +19 -0
  783. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -0
  784. package/dist/lib/workspace/surfaces/index.js +19 -0
  785. package/dist/lib/workspace/surfaces/index.js.map +1 -0
  786. package/dist/lib/workspace/surfaces/kanban.d.ts +15 -0
  787. package/dist/lib/workspace/surfaces/kanban.d.ts.map +1 -0
  788. package/dist/lib/workspace/surfaces/kanban.js +43 -0
  789. package/dist/lib/workspace/surfaces/kanban.js.map +1 -0
  790. package/dist/lib/workspace/surfaces/physical-world.d.ts +15 -0
  791. package/dist/lib/workspace/surfaces/physical-world.d.ts.map +1 -0
  792. package/dist/lib/workspace/surfaces/physical-world.js +37 -0
  793. package/dist/lib/workspace/surfaces/physical-world.js.map +1 -0
  794. package/dist/lib/workspace/surfaces/portfolio.d.ts +16 -0
  795. package/dist/lib/workspace/surfaces/portfolio.d.ts.map +1 -0
  796. package/dist/lib/workspace/surfaces/portfolio.js +102 -0
  797. package/dist/lib/workspace/surfaces/portfolio.js.map +1 -0
  798. package/dist/lib/workspace/surfaces/service.d.ts +16 -0
  799. package/dist/lib/workspace/surfaces/service.d.ts.map +1 -0
  800. package/dist/lib/workspace/surfaces/service.js +45 -0
  801. package/dist/lib/workspace/surfaces/service.js.map +1 -0
  802. package/dist/lib/workspace/surfaces/shell.d.ts +15 -0
  803. package/dist/lib/workspace/surfaces/shell.d.ts.map +1 -0
  804. package/dist/lib/workspace/surfaces/shell.js +19 -0
  805. package/dist/lib/workspace/surfaces/shell.js.map +1 -0
  806. package/dist/lib/workspace/surfaces/sidebar.d.ts +22 -0
  807. package/dist/lib/workspace/surfaces/sidebar.d.ts.map +1 -0
  808. package/dist/lib/workspace/surfaces/sidebar.js +94 -0
  809. package/dist/lib/workspace/surfaces/sidebar.js.map +1 -0
  810. package/dist/lib/workspace/surfaces/telemetry.d.ts +16 -0
  811. package/dist/lib/workspace/surfaces/telemetry.d.ts.map +1 -0
  812. package/dist/lib/workspace/surfaces/telemetry.js +48 -0
  813. package/dist/lib/workspace/surfaces/telemetry.js.map +1 -0
  814. package/dist/lib/workspace/surfaces/topology.d.ts +15 -0
  815. package/dist/lib/workspace/surfaces/topology.d.ts.map +1 -0
  816. package/dist/lib/workspace/surfaces/topology.js +19 -0
  817. package/dist/lib/workspace/surfaces/topology.js.map +1 -0
  818. package/dist/lib/workspace/surfaces/training.d.ts +16 -0
  819. package/dist/lib/workspace/surfaces/training.d.ts.map +1 -0
  820. package/dist/lib/workspace/surfaces/training.js +22 -0
  821. package/dist/lib/workspace/surfaces/training.js.map +1 -0
  822. package/dist/lib/workspace/tmux-adapter.d.ts +30 -0
  823. package/dist/lib/workspace/tmux-adapter.d.ts.map +1 -0
  824. package/dist/lib/workspace/tmux-adapter.js +137 -0
  825. package/dist/lib/workspace/tmux-adapter.js.map +1 -0
  826. package/dist/lib/workspace/tmux-sidebar.d.ts +14 -0
  827. package/dist/lib/workspace/tmux-sidebar.d.ts.map +1 -0
  828. package/dist/lib/workspace/tmux-sidebar.js +230 -0
  829. package/dist/lib/workspace/tmux-sidebar.js.map +1 -0
  830. package/dist/lib/world-model-store.d.ts +172 -0
  831. package/dist/lib/world-model-store.d.ts.map +1 -0
  832. package/dist/lib/world-model-store.js +487 -0
  833. package/dist/lib/world-model-store.js.map +1 -0
  834. package/dist/mcp/context-hub-mcp.d.ts +11 -0
  835. package/dist/mcp/context-hub-mcp.d.ts.map +1 -0
  836. package/dist/mcp/context-hub-mcp.js +797 -0
  837. package/dist/mcp/context-hub-mcp.js.map +1 -0
  838. package/dist/mcp/service-mcp-server.d.ts +12 -0
  839. package/dist/mcp/service-mcp-server.d.ts.map +1 -0
  840. package/dist/mcp/service-mcp-server.js +434 -0
  841. package/dist/mcp/service-mcp-server.js.map +1 -0
  842. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  843. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  844. package/dist/mcp/service-peer-mcp.js +220 -0
  845. package/dist/mcp/service-peer-mcp.js.map +1 -0
  846. package/dist/mcp/service-registry-mcp.d.ts +13 -0
  847. package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
  848. package/dist/mcp/service-registry-mcp.js +330 -0
  849. package/dist/mcp/service-registry-mcp.js.map +1 -0
  850. package/dist/telegram/voice.d.ts +146 -0
  851. package/dist/telegram/voice.d.ts.map +1 -0
  852. package/dist/telegram/voice.js +351 -0
  853. package/dist/telegram/voice.js.map +1 -0
  854. package/dist/types/eval.d.ts +18 -0
  855. package/dist/types/eval.d.ts.map +1 -0
  856. package/dist/types/eval.js +5 -0
  857. package/dist/types/eval.js.map +1 -0
  858. package/dist/types/flows.d.ts +72 -0
  859. package/dist/types/flows.d.ts.map +1 -0
  860. package/dist/types/flows.js +10 -0
  861. package/dist/types/flows.js.map +1 -0
  862. package/dist/types/ide.d.ts +49 -0
  863. package/dist/types/ide.d.ts.map +1 -0
  864. package/dist/types/ide.js +5 -0
  865. package/dist/types/ide.js.map +1 -0
  866. package/dist/types/journal.d.ts +133 -0
  867. package/dist/types/journal.d.ts.map +1 -0
  868. package/dist/types/journal.js +59 -0
  869. package/dist/types/journal.js.map +1 -0
  870. package/dist/types/map.d.ts +42 -0
  871. package/dist/types/map.d.ts.map +1 -0
  872. package/dist/types/map.js +39 -0
  873. package/dist/types/map.js.map +1 -0
  874. package/dist/types/physical-world-model.d.ts +65 -0
  875. package/dist/types/physical-world-model.d.ts.map +1 -0
  876. package/dist/types/physical-world-model.js +43 -0
  877. package/dist/types/physical-world-model.js.map +1 -0
  878. package/dist/types/platform-digest.d.ts +228 -0
  879. package/dist/types/platform-digest.d.ts.map +1 -0
  880. package/dist/types/platform-digest.js +5 -0
  881. package/dist/types/platform-digest.js.map +1 -0
  882. package/dist/types/skills.d.ts +44 -0
  883. package/dist/types/skills.d.ts.map +1 -0
  884. package/dist/types/skills.js +5 -0
  885. package/dist/types/skills.js.map +1 -0
  886. package/dist/types/telemetry-digest.d.ts +75 -0
  887. package/dist/types/telemetry-digest.d.ts.map +1 -0
  888. package/dist/types/telemetry-digest.js +5 -0
  889. package/dist/types/telemetry-digest.js.map +1 -0
  890. package/dist/types/telemetry.d.ts +107 -0
  891. package/dist/types/telemetry.d.ts.map +1 -0
  892. package/dist/types/telemetry.js +5 -0
  893. package/dist/types/telemetry.js.map +1 -0
  894. package/dist/types/world-model.d.ts +478 -0
  895. package/dist/types/world-model.d.ts.map +1 -0
  896. package/dist/types/world-model.js +87 -0
  897. package/dist/types/world-model.js.map +1 -0
  898. package/dist/ui/banner.d.ts +18 -0
  899. package/dist/ui/banner.d.ts.map +1 -0
  900. package/dist/ui/banner.js +323 -0
  901. package/dist/ui/banner.js.map +1 -0
  902. package/dist/ui/context-hub-logs.d.ts +10 -0
  903. package/dist/ui/context-hub-logs.d.ts.map +1 -0
  904. package/dist/ui/context-hub-logs.js +175 -0
  905. package/dist/ui/context-hub-logs.js.map +1 -0
  906. package/dist/ui/event-dashboard.d.ts +12 -0
  907. package/dist/ui/event-dashboard.d.ts.map +1 -0
  908. package/dist/ui/event-dashboard.js +342 -0
  909. package/dist/ui/event-dashboard.js.map +1 -0
  910. package/dist/ui/index.d.ts +8 -0
  911. package/dist/ui/index.d.ts.map +1 -0
  912. package/dist/ui/index.js +8 -0
  913. package/dist/ui/index.js.map +1 -0
  914. package/dist/ui/prompts.d.ts +52 -0
  915. package/dist/ui/prompts.d.ts.map +1 -0
  916. package/dist/ui/prompts.js +72 -0
  917. package/dist/ui/prompts.js.map +1 -0
  918. package/dist/ui/service-dashboard.d.ts +11 -0
  919. package/dist/ui/service-dashboard.d.ts.map +1 -0
  920. package/dist/ui/service-dashboard.js +357 -0
  921. package/dist/ui/service-dashboard.js.map +1 -0
  922. package/dist/ui/services-manager.d.ts +11 -0
  923. package/dist/ui/services-manager.d.ts.map +1 -0
  924. package/dist/ui/services-manager.js +507 -0
  925. package/dist/ui/services-manager.js.map +1 -0
  926. package/dist/ui/theme.d.ts +82 -0
  927. package/dist/ui/theme.d.ts.map +1 -0
  928. package/dist/ui/theme.js +142 -0
  929. package/dist/ui/theme.js.map +1 -0
  930. package/dist/utils/auth-guard.d.ts +66 -0
  931. package/dist/utils/auth-guard.d.ts.map +1 -0
  932. package/dist/utils/auth-guard.js +347 -0
  933. package/dist/utils/auth-guard.js.map +1 -0
  934. package/dist/utils/auth-status.d.ts +21 -0
  935. package/dist/utils/auth-status.d.ts.map +1 -0
  936. package/dist/utils/auth-status.js +53 -0
  937. package/dist/utils/auth-status.js.map +1 -0
  938. package/dist/utils/claude-md-generator.d.ts +10 -0
  939. package/dist/utils/claude-md-generator.d.ts.map +1 -0
  940. package/dist/utils/claude-md-generator.js +215 -0
  941. package/dist/utils/claude-md-generator.js.map +1 -0
  942. package/dist/utils/context-hub-port.d.ts +33 -0
  943. package/dist/utils/context-hub-port.d.ts.map +1 -0
  944. package/dist/utils/context-hub-port.js +118 -0
  945. package/dist/utils/context-hub-port.js.map +1 -0
  946. package/dist/utils/ensure-context-hub.d.ts +20 -0
  947. package/dist/utils/ensure-context-hub.d.ts.map +1 -0
  948. package/dist/utils/ensure-context-hub.js +66 -0
  949. package/dist/utils/ensure-context-hub.js.map +1 -0
  950. package/dist/utils/ensure-project.d.ts +12 -0
  951. package/dist/utils/ensure-project.d.ts.map +1 -0
  952. package/dist/utils/ensure-project.js +81 -0
  953. package/dist/utils/ensure-project.js.map +1 -0
  954. package/dist/utils/git.d.ts +73 -0
  955. package/dist/utils/git.d.ts.map +1 -0
  956. package/dist/utils/git.js +222 -0
  957. package/dist/utils/git.js.map +1 -0
  958. package/dist/utils/github-auth.d.ts +54 -0
  959. package/dist/utils/github-auth.d.ts.map +1 -0
  960. package/dist/utils/github-auth.js +376 -0
  961. package/dist/utils/github-auth.js.map +1 -0
  962. package/dist/utils/github-repo.d.ts +30 -0
  963. package/dist/utils/github-repo.d.ts.map +1 -0
  964. package/dist/utils/github-repo.js +219 -0
  965. package/dist/utils/github-repo.js.map +1 -0
  966. package/dist/utils/jfl-config.d.ts +30 -0
  967. package/dist/utils/jfl-config.d.ts.map +1 -0
  968. package/dist/utils/jfl-config.js +153 -0
  969. package/dist/utils/jfl-config.js.map +1 -0
  970. package/dist/utils/jfl-migration.d.ts +29 -0
  971. package/dist/utils/jfl-migration.d.ts.map +1 -0
  972. package/dist/utils/jfl-migration.js +142 -0
  973. package/dist/utils/jfl-migration.js.map +1 -0
  974. package/dist/utils/jfl-paths.d.ts +71 -0
  975. package/dist/utils/jfl-paths.d.ts.map +1 -0
  976. package/dist/utils/jfl-paths.js +157 -0
  977. package/dist/utils/jfl-paths.js.map +1 -0
  978. package/dist/utils/platform-auth.d.ts +81 -0
  979. package/dist/utils/platform-auth.d.ts.map +1 -0
  980. package/dist/utils/platform-auth.js +192 -0
  981. package/dist/utils/platform-auth.js.map +1 -0
  982. package/dist/utils/project-config.d.ts +43 -0
  983. package/dist/utils/project-config.d.ts.map +1 -0
  984. package/dist/utils/project-config.js +97 -0
  985. package/dist/utils/project-config.js.map +1 -0
  986. package/dist/utils/provenance.d.ts +65 -0
  987. package/dist/utils/provenance.d.ts.map +1 -0
  988. package/dist/utils/provenance.js +213 -0
  989. package/dist/utils/provenance.js.map +1 -0
  990. package/dist/utils/settings-validator.d.ts +74 -0
  991. package/dist/utils/settings-validator.d.ts.map +1 -0
  992. package/dist/utils/settings-validator.js +241 -0
  993. package/dist/utils/settings-validator.js.map +1 -0
  994. package/dist/utils/skill-registry.d.ts +49 -0
  995. package/dist/utils/skill-registry.d.ts.map +1 -0
  996. package/dist/utils/skill-registry.js +192 -0
  997. package/dist/utils/skill-registry.js.map +1 -0
  998. package/dist/utils/tenet-env.d.ts +34 -0
  999. package/dist/utils/tenet-env.d.ts.map +1 -0
  1000. package/dist/utils/tenet-env.js +42 -0
  1001. package/dist/utils/tenet-env.js.map +1 -0
  1002. package/dist/utils/wallet.d.ts +62 -0
  1003. package/dist/utils/wallet.d.ts.map +1 -0
  1004. package/dist/utils/wallet.js +253 -0
  1005. package/dist/utils/wallet.js.map +1 -0
  1006. package/dist/utils/x402-client.d.ts +86 -0
  1007. package/dist/utils/x402-client.d.ts.map +1 -0
  1008. package/dist/utils/x402-client.js +266 -0
  1009. package/dist/utils/x402-client.js.map +1 -0
  1010. package/package.json +105 -0
  1011. package/packages/pi/AGENTS.md +112 -0
  1012. package/packages/pi/assets/boot.mp3 +0 -0
  1013. package/packages/pi/dist/agent-grid.d.ts +24 -0
  1014. package/packages/pi/dist/agent-grid.d.ts.map +1 -0
  1015. package/packages/pi/dist/agent-grid.js +162 -0
  1016. package/packages/pi/dist/agent-grid.js.map +1 -0
  1017. package/packages/pi/dist/agent-names.d.ts +43 -0
  1018. package/packages/pi/dist/agent-names.d.ts.map +1 -0
  1019. package/packages/pi/dist/agent-names.js +156 -0
  1020. package/packages/pi/dist/agent-names.js.map +1 -0
  1021. package/packages/pi/dist/autoresearch.d.ts +15 -0
  1022. package/packages/pi/dist/autoresearch.d.ts.map +1 -0
  1023. package/packages/pi/dist/autoresearch.js +372 -0
  1024. package/packages/pi/dist/autoresearch.js.map +1 -0
  1025. package/packages/pi/dist/bookmarks.d.ts +15 -0
  1026. package/packages/pi/dist/bookmarks.d.ts.map +1 -0
  1027. package/packages/pi/dist/bookmarks.js +77 -0
  1028. package/packages/pi/dist/bookmarks.js.map +1 -0
  1029. package/packages/pi/dist/context.d.ts +17 -0
  1030. package/packages/pi/dist/context.d.ts.map +1 -0
  1031. package/packages/pi/dist/context.js +152 -0
  1032. package/packages/pi/dist/context.js.map +1 -0
  1033. package/packages/pi/dist/crm-tool.d.ts +12 -0
  1034. package/packages/pi/dist/crm-tool.d.ts.map +1 -0
  1035. package/packages/pi/dist/crm-tool.js +58 -0
  1036. package/packages/pi/dist/crm-tool.js.map +1 -0
  1037. package/packages/pi/dist/eval-tool.d.ts +11 -0
  1038. package/packages/pi/dist/eval-tool.d.ts.map +1 -0
  1039. package/packages/pi/dist/eval-tool.js +188 -0
  1040. package/packages/pi/dist/eval-tool.js.map +1 -0
  1041. package/packages/pi/dist/eval.d.ts +12 -0
  1042. package/packages/pi/dist/eval.d.ts.map +1 -0
  1043. package/packages/pi/dist/eval.js +43 -0
  1044. package/packages/pi/dist/eval.js.map +1 -0
  1045. package/packages/pi/dist/footer.d.ts +20 -0
  1046. package/packages/pi/dist/footer.d.ts.map +1 -0
  1047. package/packages/pi/dist/footer.js +222 -0
  1048. package/packages/pi/dist/footer.js.map +1 -0
  1049. package/packages/pi/dist/header.d.ts +17 -0
  1050. package/packages/pi/dist/header.d.ts.map +1 -0
  1051. package/packages/pi/dist/header.js +156 -0
  1052. package/packages/pi/dist/header.js.map +1 -0
  1053. package/packages/pi/dist/hub-resolver.d.ts +11 -0
  1054. package/packages/pi/dist/hub-resolver.d.ts.map +1 -0
  1055. package/packages/pi/dist/hub-resolver.js +58 -0
  1056. package/packages/pi/dist/hub-resolver.js.map +1 -0
  1057. package/packages/pi/dist/hub-tools.d.ts +14 -0
  1058. package/packages/pi/dist/hub-tools.d.ts.map +1 -0
  1059. package/packages/pi/dist/hub-tools.js +266 -0
  1060. package/packages/pi/dist/hub-tools.js.map +1 -0
  1061. package/packages/pi/dist/hud-tool.d.ts +17 -0
  1062. package/packages/pi/dist/hud-tool.d.ts.map +1 -0
  1063. package/packages/pi/dist/hud-tool.js +297 -0
  1064. package/packages/pi/dist/hud-tool.js.map +1 -0
  1065. package/packages/pi/dist/index.d.ts +12 -0
  1066. package/packages/pi/dist/index.d.ts.map +1 -0
  1067. package/packages/pi/dist/index.js +556 -0
  1068. package/packages/pi/dist/index.js.map +1 -0
  1069. package/packages/pi/dist/jfl-resolve.d.ts +29 -0
  1070. package/packages/pi/dist/jfl-resolve.d.ts.map +1 -0
  1071. package/packages/pi/dist/jfl-resolve.js +89 -0
  1072. package/packages/pi/dist/jfl-resolve.js.map +1 -0
  1073. package/packages/pi/dist/journal.d.ts +23 -0
  1074. package/packages/pi/dist/journal.d.ts.map +1 -0
  1075. package/packages/pi/dist/journal.js +250 -0
  1076. package/packages/pi/dist/journal.js.map +1 -0
  1077. package/packages/pi/dist/map-bridge.d.ts +20 -0
  1078. package/packages/pi/dist/map-bridge.d.ts.map +1 -0
  1079. package/packages/pi/dist/map-bridge.js +181 -0
  1080. package/packages/pi/dist/map-bridge.js.map +1 -0
  1081. package/packages/pi/dist/memory-tool.d.ts +11 -0
  1082. package/packages/pi/dist/memory-tool.d.ts.map +1 -0
  1083. package/packages/pi/dist/memory-tool.js +162 -0
  1084. package/packages/pi/dist/memory-tool.js.map +1 -0
  1085. package/packages/pi/dist/notifications.d.ts +15 -0
  1086. package/packages/pi/dist/notifications.d.ts.map +1 -0
  1087. package/packages/pi/dist/notifications.js +65 -0
  1088. package/packages/pi/dist/notifications.js.map +1 -0
  1089. package/packages/pi/dist/onboarding-v1.d.ts +15 -0
  1090. package/packages/pi/dist/onboarding-v1.d.ts.map +1 -0
  1091. package/packages/pi/dist/onboarding-v1.js +417 -0
  1092. package/packages/pi/dist/onboarding-v1.js.map +1 -0
  1093. package/packages/pi/dist/onboarding-v2.d.ts +18 -0
  1094. package/packages/pi/dist/onboarding-v2.d.ts.map +1 -0
  1095. package/packages/pi/dist/onboarding-v2.js +402 -0
  1096. package/packages/pi/dist/onboarding-v2.js.map +1 -0
  1097. package/packages/pi/dist/onboarding-v3.d.ts +13 -0
  1098. package/packages/pi/dist/onboarding-v3.d.ts.map +1 -0
  1099. package/packages/pi/dist/onboarding-v3.js +581 -0
  1100. package/packages/pi/dist/onboarding-v3.js.map +1 -0
  1101. package/packages/pi/dist/peter-parker.d.ts +12 -0
  1102. package/packages/pi/dist/peter-parker.d.ts.map +1 -0
  1103. package/packages/pi/dist/peter-parker.js +162 -0
  1104. package/packages/pi/dist/peter-parker.js.map +1 -0
  1105. package/packages/pi/dist/pivot-tool.d.ts +11 -0
  1106. package/packages/pi/dist/pivot-tool.d.ts.map +1 -0
  1107. package/packages/pi/dist/pivot-tool.js +56 -0
  1108. package/packages/pi/dist/pivot-tool.js.map +1 -0
  1109. package/packages/pi/dist/policy-head-tool.d.ts +15 -0
  1110. package/packages/pi/dist/policy-head-tool.d.ts.map +1 -0
  1111. package/packages/pi/dist/policy-head-tool.js +220 -0
  1112. package/packages/pi/dist/policy-head-tool.js.map +1 -0
  1113. package/packages/pi/dist/portfolio-bridge.d.ts +12 -0
  1114. package/packages/pi/dist/portfolio-bridge.d.ts.map +1 -0
  1115. package/packages/pi/dist/portfolio-bridge.js +81 -0
  1116. package/packages/pi/dist/portfolio-bridge.js.map +1 -0
  1117. package/packages/pi/dist/service-skills.d.ts +15 -0
  1118. package/packages/pi/dist/service-skills.d.ts.map +1 -0
  1119. package/packages/pi/dist/service-skills.js +198 -0
  1120. package/packages/pi/dist/service-skills.js.map +1 -0
  1121. package/packages/pi/dist/session.d.ts +28 -0
  1122. package/packages/pi/dist/session.d.ts.map +1 -0
  1123. package/packages/pi/dist/session.js +649 -0
  1124. package/packages/pi/dist/session.js.map +1 -0
  1125. package/packages/pi/dist/shortcuts.d.ts +11 -0
  1126. package/packages/pi/dist/shortcuts.d.ts.map +1 -0
  1127. package/packages/pi/dist/shortcuts.js +231 -0
  1128. package/packages/pi/dist/shortcuts.js.map +1 -0
  1129. package/packages/pi/dist/startup-briefing.d.ts +13 -0
  1130. package/packages/pi/dist/startup-briefing.d.ts.map +1 -0
  1131. package/packages/pi/dist/startup-briefing.js +432 -0
  1132. package/packages/pi/dist/startup-briefing.js.map +1 -0
  1133. package/packages/pi/dist/stratus-bridge.d.ts +14 -0
  1134. package/packages/pi/dist/stratus-bridge.d.ts.map +1 -0
  1135. package/packages/pi/dist/stratus-bridge.js +104 -0
  1136. package/packages/pi/dist/stratus-bridge.js.map +1 -0
  1137. package/packages/pi/dist/subway-mesh.d.ts +88 -0
  1138. package/packages/pi/dist/subway-mesh.d.ts.map +1 -0
  1139. package/packages/pi/dist/subway-mesh.js +813 -0
  1140. package/packages/pi/dist/subway-mesh.js.map +1 -0
  1141. package/packages/pi/dist/synopsis-tool.d.ts +12 -0
  1142. package/packages/pi/dist/synopsis-tool.d.ts.map +1 -0
  1143. package/packages/pi/dist/synopsis-tool.js +84 -0
  1144. package/packages/pi/dist/synopsis-tool.js.map +1 -0
  1145. package/packages/pi/dist/tool-renderers.d.ts +55 -0
  1146. package/packages/pi/dist/tool-renderers.d.ts.map +1 -0
  1147. package/packages/pi/dist/tool-renderers.js +349 -0
  1148. package/packages/pi/dist/tool-renderers.js.map +1 -0
  1149. package/packages/pi/dist/training-buffer-tool.d.ts +16 -0
  1150. package/packages/pi/dist/training-buffer-tool.d.ts.map +1 -0
  1151. package/packages/pi/dist/training-buffer-tool.js +319 -0
  1152. package/packages/pi/dist/training-buffer-tool.js.map +1 -0
  1153. package/packages/pi/dist/types.d.ts +195 -0
  1154. package/packages/pi/dist/types.d.ts.map +1 -0
  1155. package/packages/pi/dist/types.js +11 -0
  1156. package/packages/pi/dist/types.js.map +1 -0
  1157. package/packages/pi/extensions/agent-grid.ts +191 -0
  1158. package/packages/pi/extensions/agent-names.ts +178 -0
  1159. package/packages/pi/extensions/autoresearch.ts +428 -0
  1160. package/packages/pi/extensions/bookmarks.ts +85 -0
  1161. package/packages/pi/extensions/context.ts +158 -0
  1162. package/packages/pi/extensions/crm-tool.ts +61 -0
  1163. package/packages/pi/extensions/eval-tool.ts +224 -0
  1164. package/packages/pi/extensions/eval.ts +61 -0
  1165. package/packages/pi/extensions/footer.ts +239 -0
  1166. package/packages/pi/extensions/header.ts +171 -0
  1167. package/packages/pi/extensions/hub-resolver.ts +63 -0
  1168. package/packages/pi/extensions/hub-tools.ts +267 -0
  1169. package/packages/pi/extensions/hud-tool.ts +294 -0
  1170. package/packages/pi/extensions/index.ts +601 -0
  1171. package/packages/pi/extensions/jfl-resolve.ts +98 -0
  1172. package/packages/pi/extensions/journal.ts +309 -0
  1173. package/packages/pi/extensions/map-bridge.ts +209 -0
  1174. package/packages/pi/extensions/memory-tool.ts +170 -0
  1175. package/packages/pi/extensions/notifications.ts +73 -0
  1176. package/packages/pi/extensions/onboarding-v1.ts +455 -0
  1177. package/packages/pi/extensions/onboarding-v2.ts +374 -0
  1178. package/packages/pi/extensions/onboarding-v3.ts +686 -0
  1179. package/packages/pi/extensions/peter-parker.ts +203 -0
  1180. package/packages/pi/extensions/pivot-tool.ts +59 -0
  1181. package/packages/pi/extensions/policy-head-tool.ts +277 -0
  1182. package/packages/pi/extensions/portfolio-bridge.ts +89 -0
  1183. package/packages/pi/extensions/service-skills.ts +219 -0
  1184. package/packages/pi/extensions/session.ts +684 -0
  1185. package/packages/pi/extensions/shortcuts.ts +259 -0
  1186. package/packages/pi/extensions/startup-briefing.ts +482 -0
  1187. package/packages/pi/extensions/stratus-bridge.ts +116 -0
  1188. package/packages/pi/extensions/subway-mesh.ts +893 -0
  1189. package/packages/pi/extensions/synopsis-tool.ts +88 -0
  1190. package/packages/pi/extensions/tool-renderers.ts +366 -0
  1191. package/packages/pi/extensions/training-buffer-tool.ts +376 -0
  1192. package/packages/pi/extensions/types.ts +169 -0
  1193. package/packages/pi/package-lock.json +346 -0
  1194. package/packages/pi/package.json +42 -0
  1195. package/packages/pi/skills/agent-browser/SKILL.md +116 -0
  1196. package/packages/pi/skills/brand-architect/SKILL.md +240 -0
  1197. package/packages/pi/skills/brand-architect/config.yaml +137 -0
  1198. package/packages/pi/skills/campaign-hud/config.yaml +112 -0
  1199. package/packages/pi/skills/content-creator/SKILL.md +294 -0
  1200. package/packages/pi/skills/context/SKILL.md +65 -0
  1201. package/packages/pi/skills/debug/MULTI_AGENT.md +360 -0
  1202. package/packages/pi/skills/debug/SKILL.md +554 -0
  1203. package/packages/pi/skills/end/SKILL.md +1790 -0
  1204. package/packages/pi/skills/eval/SKILL.md +75 -0
  1205. package/packages/pi/skills/fly-deploy/SKILL.md +676 -0
  1206. package/packages/pi/skills/founder-video/SKILL.md +467 -0
  1207. package/packages/pi/skills/hud/SKILL.md +160 -0
  1208. package/packages/pi/skills/orchestrate/SKILL.md +74 -0
  1209. package/packages/pi/skills/pi-agents/SKILL.md +78 -0
  1210. package/packages/pi/skills/pivot/SKILL.md +91 -0
  1211. package/packages/pi/skills/react-best-practices/AGENTS.md +2249 -0
  1212. package/packages/pi/skills/react-best-practices/README.md +123 -0
  1213. package/packages/pi/skills/react-best-practices/SKILL.md +125 -0
  1214. package/packages/pi/skills/react-best-practices/metadata.json +15 -0
  1215. package/packages/pi/skills/react-best-practices/rules/_sections.md +46 -0
  1216. package/packages/pi/skills/react-best-practices/rules/_template.md +28 -0
  1217. package/packages/pi/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  1218. package/packages/pi/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  1219. package/packages/pi/skills/react-best-practices/rules/async-api-routes.md +38 -0
  1220. package/packages/pi/skills/react-best-practices/rules/async-defer-await.md +80 -0
  1221. package/packages/pi/skills/react-best-practices/rules/async-dependencies.md +36 -0
  1222. package/packages/pi/skills/react-best-practices/rules/async-parallel.md +28 -0
  1223. package/packages/pi/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  1224. package/packages/pi/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  1225. package/packages/pi/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  1226. package/packages/pi/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  1227. package/packages/pi/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  1228. package/packages/pi/skills/react-best-practices/rules/bundle-preload.md +50 -0
  1229. package/packages/pi/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  1230. package/packages/pi/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  1231. package/packages/pi/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  1232. package/packages/pi/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  1233. package/packages/pi/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  1234. package/packages/pi/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  1235. package/packages/pi/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  1236. package/packages/pi/skills/react-best-practices/rules/js-early-exit.md +50 -0
  1237. package/packages/pi/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  1238. package/packages/pi/skills/react-best-practices/rules/js-index-maps.md +37 -0
  1239. package/packages/pi/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  1240. package/packages/pi/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  1241. package/packages/pi/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  1242. package/packages/pi/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  1243. package/packages/pi/skills/react-best-practices/rules/rendering-activity.md +26 -0
  1244. package/packages/pi/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  1245. package/packages/pi/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  1246. package/packages/pi/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  1247. package/packages/pi/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  1248. package/packages/pi/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  1249. package/packages/pi/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  1250. package/packages/pi/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  1251. package/packages/pi/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  1252. package/packages/pi/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  1253. package/packages/pi/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  1254. package/packages/pi/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  1255. package/packages/pi/skills/react-best-practices/rules/rerender-memo.md +44 -0
  1256. package/packages/pi/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  1257. package/packages/pi/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  1258. package/packages/pi/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  1259. package/packages/pi/skills/react-best-practices/rules/server-cache-react.md +26 -0
  1260. package/packages/pi/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
  1261. package/packages/pi/skills/react-best-practices/rules/server-serialization.md +38 -0
  1262. package/packages/pi/skills/remotion-best-practices/SKILL.md +43 -0
  1263. package/packages/pi/skills/remotion-best-practices/rules/3d.md +86 -0
  1264. package/packages/pi/skills/remotion-best-practices/rules/animations.md +29 -0
  1265. package/packages/pi/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  1266. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  1267. package/packages/pi/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +108 -0
  1268. package/packages/pi/skills/remotion-best-practices/rules/assets.md +78 -0
  1269. package/packages/pi/skills/remotion-best-practices/rules/audio.md +172 -0
  1270. package/packages/pi/skills/remotion-best-practices/rules/calculate-metadata.md +104 -0
  1271. package/packages/pi/skills/remotion-best-practices/rules/can-decode.md +75 -0
  1272. package/packages/pi/skills/remotion-best-practices/rules/charts.md +58 -0
  1273. package/packages/pi/skills/remotion-best-practices/rules/compositions.md +146 -0
  1274. package/packages/pi/skills/remotion-best-practices/rules/display-captions.md +126 -0
  1275. package/packages/pi/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  1276. package/packages/pi/skills/remotion-best-practices/rules/fonts.md +152 -0
  1277. package/packages/pi/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  1278. package/packages/pi/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  1279. package/packages/pi/skills/remotion-best-practices/rules/get-video-duration.md +58 -0
  1280. package/packages/pi/skills/remotion-best-practices/rules/gifs.md +138 -0
  1281. package/packages/pi/skills/remotion-best-practices/rules/images.md +130 -0
  1282. package/packages/pi/skills/remotion-best-practices/rules/import-srt-captions.md +67 -0
  1283. package/packages/pi/skills/remotion-best-practices/rules/lottie.md +68 -0
  1284. package/packages/pi/skills/remotion-best-practices/rules/measuring-dom-nodes.md +35 -0
  1285. package/packages/pi/skills/remotion-best-practices/rules/measuring-text.md +143 -0
  1286. package/packages/pi/skills/remotion-best-practices/rules/sequencing.md +106 -0
  1287. package/packages/pi/skills/remotion-best-practices/rules/tailwind.md +11 -0
  1288. package/packages/pi/skills/remotion-best-practices/rules/text-animations.md +20 -0
  1289. package/packages/pi/skills/remotion-best-practices/rules/timing.md +179 -0
  1290. package/packages/pi/skills/remotion-best-practices/rules/transcribe-captions.md +19 -0
  1291. package/packages/pi/skills/remotion-best-practices/rules/transitions.md +122 -0
  1292. package/packages/pi/skills/remotion-best-practices/rules/trimming.md +53 -0
  1293. package/packages/pi/skills/remotion-best-practices/rules/videos.md +171 -0
  1294. package/packages/pi/skills/search/SKILL.md +220 -0
  1295. package/packages/pi/skills/spec/SKILL.md +377 -0
  1296. package/packages/pi/skills/startup/SKILL.md +315 -0
  1297. package/packages/pi/skills/subway-browser/SKILL.md +292 -0
  1298. package/packages/pi/skills/viz/SKILL.md +204 -0
  1299. package/packages/pi/skills/web-architect/SKILL.md +309 -0
  1300. package/packages/pi/skills/x-algorithm/SKILL.md +305 -0
  1301. package/packages/pi/teams/dev-team.yaml +63 -0
  1302. package/packages/pi/teams/gtm-team.yaml +79 -0
  1303. package/packages/pi/themes/jfl.theme.json +76 -0
  1304. package/packages/pi/tsconfig.json +21 -0
  1305. package/scripts/__pycache__/train-policy-head.cpython-314.pyc +0 -0
  1306. package/scripts/collect-tuples.sh +124 -0
  1307. package/scripts/commit-gtm.sh +56 -0
  1308. package/scripts/commit-product.sh +68 -0
  1309. package/scripts/context-query.sh +45 -0
  1310. package/scripts/destroy-fleet.sh +37 -0
  1311. package/scripts/generate-changesets.sh +113 -0
  1312. package/scripts/jfl-ide.sh +48 -0
  1313. package/scripts/migrate-to-branch-sessions.sh +201 -0
  1314. package/scripts/postinstall.js +146 -0
  1315. package/scripts/pp-branch-pr.sh +133 -0
  1316. package/scripts/pp-branch-pr.sh.bak +115 -0
  1317. package/scripts/session/auto-commit.sh +297 -0
  1318. package/scripts/session/fix-tracked-logs.sh +97 -0
  1319. package/scripts/session/jfl-doctor.sh +707 -0
  1320. package/scripts/session/session-cleanup.sh +292 -0
  1321. package/scripts/session/session-end.sh +198 -0
  1322. package/scripts/session/session-init.sh +356 -0
  1323. package/scripts/session/session-init.sh.backup +292 -0
  1324. package/scripts/session/session-sync.sh +192 -0
  1325. package/scripts/session/test-context-preservation.sh +160 -0
  1326. package/scripts/session/test-critical-infrastructure.sh +293 -0
  1327. package/scripts/session/test-experience-level.sh +336 -0
  1328. package/scripts/session/test-session-cleanup.sh +268 -0
  1329. package/scripts/session/test-session-sync.sh +320 -0
  1330. package/scripts/setup-branch-protection.sh +106 -0
  1331. package/scripts/spawn-fleet.sh +144 -0
  1332. package/scripts/telemetry-dashboard.sh +44 -0
  1333. package/scripts/test-map-eventbus.sh +357 -0
  1334. package/scripts/test-onboarding.sh +121 -0
  1335. package/scripts/test-planning-loop-e2e.ts +181 -0
  1336. package/scripts/test-server-inference.ts +49 -0
  1337. package/scripts/test-state-sensitivity.ts +32 -0
  1338. package/scripts/train/requirements.txt +5 -0
  1339. package/scripts/train/train-policy-head.py +477 -0
  1340. package/scripts/train/v2/__pycache__/dataset.cpython-314.pyc +0 -0
  1341. package/scripts/train/v2/__pycache__/eval.cpython-314.pyc +0 -0
  1342. package/scripts/train/v2/__pycache__/generate_data.cpython-314.pyc +0 -0
  1343. package/scripts/train/v2/__pycache__/infer.cpython-314.pyc +0 -0
  1344. package/scripts/train/v2/__pycache__/model.cpython-314.pyc +0 -0
  1345. package/scripts/train/v2/__pycache__/precompute.cpython-314.pyc +0 -0
  1346. package/scripts/train/v2/__pycache__/train.cpython-314.pyc +0 -0
  1347. package/scripts/train/v2/__pycache__/transform_buffer.cpython-314.pyc +0 -0
  1348. package/scripts/train/v2/__pycache__/validate_data.cpython-314.pyc +0 -0
  1349. package/scripts/train/v2/benchmark.py +661 -0
  1350. package/scripts/train/v2/dataset.py +81 -0
  1351. package/scripts/train/v2/domain.json +66 -0
  1352. package/scripts/train/v2/eval.py +196 -0
  1353. package/scripts/train/v2/generate_balanced.py +439 -0
  1354. package/scripts/train/v2/generate_data.py +219 -0
  1355. package/scripts/train/v2/generate_hard_negatives.py +219 -0
  1356. package/scripts/train/v2/infer.py +301 -0
  1357. package/scripts/train/v2/infer_server.py +224 -0
  1358. package/scripts/train/v2/model.py +112 -0
  1359. package/scripts/train/v2/online_train.py +576 -0
  1360. package/scripts/train/v2/precompute.py +150 -0
  1361. package/scripts/train/v2/train.py +302 -0
  1362. package/scripts/train/v2/transform_buffer.py +227 -0
  1363. package/scripts/train/v2/validate_data.py +115 -0
  1364. package/scripts/train-policy-head.py +434 -0
  1365. package/scripts/vm-swarm/README.md +301 -0
  1366. package/scripts/vm-swarm/collect-tuples.sh +331 -0
  1367. package/scripts/vm-swarm/create-base-template.sh +339 -0
  1368. package/scripts/vm-swarm/kill-fleet.sh +204 -0
  1369. package/scripts/vm-swarm/monitor-fleet.sh +346 -0
  1370. package/scripts/vm-swarm/spawn-fleet.sh +304 -0
  1371. package/scripts/voice-start.sh +156 -0
  1372. package/scripts/voice-stop.sh +33 -0
  1373. package/scripts/where-am-i.sh +78 -0
  1374. package/templates/QUICKSTART_SKILL_TO_PRODUCT.md +242 -0
  1375. package/templates/brand/BRAND_BRIEF.md +124 -0
  1376. package/templates/brand/BRAND_DECISIONS.md +168 -0
  1377. package/templates/brand/BRAND_GUIDELINES.md +251 -0
  1378. package/templates/brand/VOICE_AND_TONE.md +146 -0
  1379. package/templates/brand/global.css +240 -0
  1380. package/templates/collaboration/CONTRIBUTOR.md +74 -0
  1381. package/templates/collaboration/CRM.md +97 -0
  1382. package/templates/collaboration/TASKS.md +83 -0
  1383. package/templates/dating/FUNNEL.md +29 -0
  1384. package/templates/dating/REWARDS.md +24 -0
  1385. package/templates/dating/SIGNALS.md +18 -0
  1386. package/templates/dating/anti_patterns.md +23 -0
  1387. package/templates/dating/connectors/index.md +16 -0
  1388. package/templates/dating/modes.md +21 -0
  1389. package/templates/dating/psychology.md +18 -0
  1390. package/templates/default/README.md +19 -0
  1391. package/templates/service-agent/.claude/settings.json +32 -0
  1392. package/templates/service-agent/CLAUDE.md +334 -0
  1393. package/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  1394. package/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  1395. package/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  1396. package/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  1397. package/templates/service-mcp-template.js +325 -0
  1398. package/templates/strategic/NARRATIVE.md +114 -0
  1399. package/templates/strategic/ROADMAP.md +128 -0
  1400. package/templates/strategic/THESIS.md +108 -0
  1401. package/templates/strategic/VISION.md +74 -0
@@ -0,0 +1,1790 @@
1
+ ---
2
+ name: end
3
+ description: End the current JFL session gracefully with automatic merge and cleanup
4
+ triggers:
5
+ - done
6
+ - that's it
7
+ - I'm finished
8
+ - end session
9
+ - /end
10
+ - let's wrap up
11
+ - all set for today
12
+ ---
13
+
14
+ # /end - Session Reconciliation
15
+
16
+ End the current JFL session gracefully with work preservation, conflict resolution, and handoff visibility.
17
+
18
+ ---
19
+
20
+ ## Core Principle
21
+
22
+ **Session ending is a critical handoff point.** Poor UX here creates uncertainty ("Did my work get saved?"), risks lost work if errors aren't handled clearly, and loses context if journal entries aren't captured.
23
+
24
+ JFL's session architecture guarantees work preservation through multiple safety layers:
25
+
26
+ 1. **Continuous auto-commit** - Background process commits every 2 minutes (managed by `session.ts` extension in Pi)
27
+ 2. **session_shutdown hook** - Pi's `session_shutdown` extension handler runs cleanup when session ends
28
+ 3. **This skill** - User-initiated clean ending with full visibility
29
+
30
+ **Note for Pi sessions:** Hook enforcement is handled by the `session_shutdown` extension (`extensions/session.ts`), not `.claude/settings.json` Stop hooks. The cleanup script and journal checks run via the Pi extension lifecycle.
31
+
32
+ **Parallel architecture (session.ts):** The `onShutdown` hook runs 4 phases concurrently:
33
+ - **Phase 1 (fire immediately):** Hub API end, synopsis generation, memory indexing — all start in parallel before git ops
34
+ - **Phase 2 (sequential):** Commit → merge (must be ordered, but uses async exec so Phase 1 tasks progress between steps)
35
+ - **Phase 3 (after merge):** Push + remote branch delete in single command, runs in parallel with Phase 1 collection
36
+ - **Phase 4 (collect):** Await all parallel tasks, show synopsis, report timing
37
+
38
+ This means the user sees "Session ended (Xs)" where X is roughly max(merge_time, push_time, synopsis_time) instead of the sum of all operations.
39
+
40
+ When you invoke `/end`, the user wants to:
41
+ - **Know what happened** - What commits merged? What changed?
42
+ - **Trust their work is saved** - No uncertainty about state
43
+ - **Understand next steps** - What should they or others do next?
44
+ - **Get handoff context** - Synopsis of work accomplished
45
+
46
+ This skill provides **comprehensive UX orchestration** around the solid `session-cleanup.sh` infrastructure. The script handles all git operations correctly - we wrap it with clear communication, pre-flight checks, and error guidance.
47
+
48
+ ### What "Clean Ending" Means
49
+
50
+ A clean session end has these properties:
51
+
52
+ 1. **All work committed** - No uncommitted changes left behind
53
+ 2. **Merged to working branch** - Session branch integrated, not stranded
54
+ 3. **Journal entry exists** - Future sessions understand what happened
55
+ 4. **Conflicts resolved** - No manual cleanup required later
56
+ 5. **Remote updated** - Team can see the work
57
+ 6. **Synopsis shown** - Clear summary of accomplishments
58
+
59
+ This skill ensures all six properties are met, or guides the user to resolve issues that prevent them.
60
+
61
+ ### Relationship to Other Safety Mechanisms
62
+
63
+ ```
64
+ User working...
65
+
66
+ ├─ Auto-commit (every 2 minutes)
67
+ │ └─ Prevents data loss during crashes
68
+
69
+ ├─ Stop hook (terminal close)
70
+ │ └─ Automatic fallback if /end not called
71
+
72
+ └─ /end skill (user-initiated) ← YOU ARE HERE
73
+ └─ Best UX: visibility + control
74
+ ```
75
+
76
+ **When to use each:**
77
+ - **Auto-commit**: Runs automatically, you don't invoke it
78
+ - **Stop hook**: Triggered automatically on terminal close
79
+ - **This skill**: User explicitly says "done" → invoke this for best experience
80
+
81
+ ---
82
+
83
+ ## When to Use This Skill
84
+
85
+ ### Explicit Triggers (HIGH CONFIDENCE)
86
+
87
+ User says any of these phrases → **immediately invoke this skill**:
88
+
89
+ | Phrase | Confidence | Action |
90
+ |--------|-----------|--------|
91
+ | "done" | 100% | Invoke immediately |
92
+ | "that's it" | 100% | Invoke immediately |
93
+ | "I'm finished" | 100% | Invoke immediately |
94
+ | "end session" | 100% | Invoke immediately |
95
+ | "/end" | 100% | Invoke immediately |
96
+ | "let's wrap up" | 95% | Invoke immediately |
97
+ | "all set for today" | 95% | Invoke immediately |
98
+ | "I'm out" | 90% | Invoke immediately |
99
+ | "good for now" | 85% | Invoke immediately |
100
+ | "ship it" | 80% | Check context - might mean commit, not end |
101
+
102
+ ### Implicit Triggers (CONTEXT-DEPENDENT)
103
+
104
+ User says these in a concluding context → **consider invoking**:
105
+
106
+ | Phrase | When to Invoke | When NOT to Invoke |
107
+ |--------|---------------|-------------------|
108
+ | "looks good" | After reviewing final work | After reviewing one piece of ongoing work |
109
+ | "perfect" | At end of conversation | In middle of iteration |
110
+ | "thanks" | With no pending questions | After getting help mid-session |
111
+ | "bye" | Clear goodbye | Just casual acknowledgment |
112
+
113
+ **Test: Is this the end of the session or just the end of a task?**
114
+
115
+ ```
116
+ User: "Great, the auth flow works. Thanks!"
117
+
118
+ → NOT an ending (still building, just finished one feature)
119
+ → Don't invoke /end
120
+
121
+ User: "Auth flow is done. That's all I needed today."
122
+
123
+ → IS an ending (explicit scope closure)
124
+ → Invoke /end
125
+ ```
126
+
127
+ ### When NOT to Use
128
+
129
+ **Do NOT invoke this skill if:**
130
+
131
+ 1. **User is continuing work** - "That's done, let's do X next"
132
+ 2. **In middle of iteration** - "Okay that works, but change the color to blue"
133
+ 3. **Just answered a question** - "Got it, thanks" (not ending, just acknowledging)
134
+ 4. **Unclear intent** - If unsure, ask: "Ready to end the session, or keep going?"
135
+
136
+ ---
137
+
138
+ ## Pre-Flight Check
139
+
140
+ Before executing cleanup, gather complete session state. This informs what to show the user and what prompts are needed.
141
+
142
+ ### Step 1: Detect Session Mode
143
+
144
+ ```bash
145
+ # Read worktree state
146
+ WORKTREE_PATH=$(cat .jfl/current-worktree.txt 2>/dev/null || echo "")
147
+
148
+ if [[ "$WORKTREE_PATH" == "direct" ]]; then
149
+ MODE="direct"
150
+ LOCATION=$(pwd)
151
+ elif [[ -n "$WORKTREE_PATH" ]]; then
152
+ MODE="worktree"
153
+ LOCATION="$WORKTREE_PATH"
154
+ else
155
+ # Not in a session
156
+ MODE="none"
157
+ fi
158
+ ```
159
+
160
+ **What this tells you:**
161
+ - `direct` → Single session, working on branch directly
162
+ - `worktree` → Multiple concurrent sessions, isolated worktree
163
+ - `none` → Not in a JFL session (shouldn't happen, but handle gracefully)
164
+
165
+ ### Step 1.5: Detect Service Context
166
+
167
+ After detecting session mode, check if running in a service:
168
+
169
+ ```bash
170
+ # Read config to detect environment
171
+ CONFIG_TYPE=$(jq -r '.type // "unknown"' .jfl/config.json 2>/dev/null)
172
+
173
+ if [[ "$CONFIG_TYPE" == "service" ]]; then
174
+ # Running in a service
175
+ GTM_PARENT=$(jq -r '.gtm_parent // empty' .jfl/config.json)
176
+
177
+ if [[ -z "$GTM_PARENT" ]]; then
178
+ echo "⚠️ Service not linked to GTM workspace"
179
+ echo ""
180
+ echo "This service can still be cleaned up, but changes won't sync to a GTM."
181
+ echo "To link: cd <gtm> && jfl services register $(pwd)"
182
+ echo ""
183
+ fi
184
+
185
+ SERVICE_NAME=$(jq -r '.name' .jfl/config.json)
186
+ SYNC_TO_GTM=true
187
+ echo "📡 Service context detected: $SERVICE_NAME"
188
+ echo " GTM parent: $GTM_PARENT"
189
+ else
190
+ # Running in GTM or standalone
191
+ SYNC_TO_GTM=false
192
+ fi
193
+ ```
194
+
195
+ **What this tells you:**
196
+ - If `SYNC_TO_GTM=true`: This is a service session, sync after cleanup
197
+ - If `GTM_PARENT` is empty: Service exists but not linked
198
+ - Otherwise: Regular GTM or standalone session
199
+
200
+ ### Step 1.6: Validate Service Configuration (Services Only)
201
+
202
+ If running in a service (`SYNC_TO_GTM=true`), validate configuration before ending:
203
+
204
+ ```bash
205
+ if [[ "$SYNC_TO_GTM" == "true" ]]; then
206
+ echo ""
207
+ echo "🔍 Validating service configuration..."
208
+
209
+ # Run validation (non-blocking, just show warnings)
210
+ if jfl services validate --json > /tmp/validation-result.json 2>/dev/null; then
211
+ # Parse results
212
+ ERRORS=$(jq -r '.summary.errors' /tmp/validation-result.json)
213
+ WARNINGS=$(jq -r '.summary.warnings' /tmp/validation-result.json)
214
+
215
+ if [[ "$ERRORS" -gt 0 ]]; then
216
+ echo "⚠️ Service validation found $ERRORS error(s)"
217
+ echo ""
218
+ echo "Run 'jfl services validate' to see details"
219
+ echo "Run 'jfl services validate --fix' to auto-repair"
220
+ echo ""
221
+
222
+ # Ask if they want to fix before ending
223
+ read -p "Auto-fix issues now? (y/N) " -n 1 -r
224
+ echo
225
+ if [[ $REPLY =~ ^[Yy]$ ]]; then
226
+ jfl services validate --fix
227
+ fi
228
+ elif [[ "$WARNINGS" -gt 0 ]]; then
229
+ echo "✓ Validation passed ($WARNINGS warning(s))"
230
+ else
231
+ echo "✓ Service configuration valid"
232
+ fi
233
+ fi
234
+
235
+ rm -f /tmp/validation-result.json
236
+ fi
237
+ ```
238
+
239
+ **What this does:**
240
+ - Validates service configuration before ending session
241
+ - Non-blocking: Shows warnings but doesn't prevent session end
242
+ - Offers to auto-fix issues if errors found
243
+ - Only runs for services, not GTM workspaces
244
+
245
+ **Why this matters:**
246
+ - Catches configuration issues before they cause problems
247
+ - Prevents services from ending in an invalid state
248
+ - Ensures hooks, journal, and GTM integration are correct
249
+
250
+ ### Step 2: Get Branch Information
251
+
252
+ ```bash
253
+ # Current session branch
254
+ BRANCH=$(cat .jfl/current-session-branch.txt 2>/dev/null || git branch --show-current 2>/dev/null || echo "")
255
+
256
+ # Working branch (where session merges to)
257
+ WORKING_BRANCH=$(jq -r '.working_branch // "main"' .jfl/config.json 2>/dev/null || echo "main")
258
+
259
+ # Verify session branch format
260
+ if [[ ! "$BRANCH" =~ ^session- ]]; then
261
+ echo "⚠ Not on a session branch (current: $BRANCH)"
262
+ echo "Session branches start with 'session-'"
263
+ echo ""
264
+ echo "You might already be on $WORKING_BRANCH."
265
+ echo "No cleanup needed."
266
+ exit 0
267
+ fi
268
+ ```
269
+
270
+ **What this tells you:**
271
+ - `BRANCH` → Current session being worked on
272
+ - `WORKING_BRANCH` → Where work will merge (usually `main` or `develop`)
273
+
274
+ ### Step 3: Check for Uncommitted Changes
275
+
276
+ ```bash
277
+ # Check working directory and staging area
278
+ if ! git diff --quiet || ! git diff --cached --quiet; then
279
+ UNCOMMITTED=true
280
+ UNCOMMITTED_COUNT=$(git status --porcelain | wc -l | tr -d ' ')
281
+ else
282
+ UNCOMMITTED=false
283
+ UNCOMMITTED_COUNT=0
284
+ fi
285
+ ```
286
+
287
+ **What this tells you:**
288
+ - `true` → User has uncommitted changes, need to prompt
289
+ - `false` → Clean working directory, can proceed
290
+
291
+ ### Step 4: Check for Journal Entry
292
+
293
+ ```bash
294
+ # Session journal file
295
+ JOURNAL_FILE=".jfl/journal/${BRANCH}.jsonl"
296
+
297
+ if [[ -s "$JOURNAL_FILE" ]]; then
298
+ JOURNAL_EXISTS=true
299
+ JOURNAL_ENTRY_COUNT=$(wc -l < "$JOURNAL_FILE" | tr -d ' ')
300
+ else
301
+ JOURNAL_EXISTS=false
302
+ JOURNAL_ENTRY_COUNT=0
303
+ fi
304
+ ```
305
+
306
+ **What this tells you:**
307
+ - `true` → Session is documented, good handoff
308
+ - `false` → No journal entry, should warn user
309
+
310
+ ### Step 5: Count Session Work
311
+
312
+ ```bash
313
+ # Commits in this session (since branching from working branch)
314
+ COMMIT_COUNT=$(git rev-list --count $WORKING_BRANCH..HEAD 2>/dev/null || echo "0")
315
+
316
+ # Files changed in this session
317
+ FILES_CHANGED=$(git diff --name-only $WORKING_BRANCH..HEAD 2>/dev/null | wc -l | tr -d ' ')
318
+
319
+ # Lines changed (rough metric)
320
+ LINES_ADDED=$(git diff --numstat $WORKING_BRANCH..HEAD 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
321
+ LINES_REMOVED=$(git diff --numstat $WORKING_BRANCH..HEAD 2>/dev/null | awk '{sum+=$2} END {print sum+0}')
322
+ ```
323
+
324
+ **What this tells you:**
325
+ - How much work will be merged
326
+ - Whether session had any meaningful work
327
+ - Context for journal warning (lots of work, no journal = bad)
328
+
329
+ ### Step 6: Calculate Session Duration
330
+
331
+ ```bash
332
+ # First commit in session (timestamp)
333
+ SESSION_START=$(git log --format=%ct --reverse $WORKING_BRANCH..HEAD 2>/dev/null | head -1)
334
+
335
+ if [[ -n "$SESSION_START" ]]; then
336
+ NOW=$(date +%s)
337
+ DURATION_SECONDS=$((NOW - SESSION_START))
338
+ DURATION_HOURS=$((DURATION_SECONDS / 3600))
339
+ DURATION_MINUTES=$(((DURATION_SECONDS % 3600) / 60))
340
+ else
341
+ # No commits yet
342
+ DURATION_HOURS=0
343
+ DURATION_MINUTES=0
344
+ fi
345
+ ```
346
+
347
+ **What this tells you:**
348
+ - How long user has been working
349
+ - Used for synopsis timeframe (show last N hours)
350
+
351
+ ### Complete Pre-Flight Check Script
352
+
353
+ Here's the full pattern to gather all session state:
354
+
355
+ ```bash
356
+ #!/bin/bash
357
+
358
+ # Pre-flight check - gather complete session state
359
+
360
+ echo "Gathering session state..."
361
+
362
+ # 1. Detect mode
363
+ WORKTREE_PATH=$(cat .jfl/current-worktree.txt 2>/dev/null || echo "")
364
+ if [[ "$WORKTREE_PATH" == "direct" ]]; then
365
+ MODE="direct"
366
+ elif [[ -n "$WORKTREE_PATH" ]]; then
367
+ MODE="worktree"
368
+ else
369
+ MODE="none"
370
+ fi
371
+
372
+ # 2. Get branches
373
+ BRANCH=$(cat .jfl/current-session-branch.txt 2>/dev/null || git branch --show-current 2>/dev/null || echo "")
374
+ WORKING_BRANCH=$(jq -r '.working_branch // "main"' .jfl/config.json 2>/dev/null || echo "main")
375
+
376
+ # Verify this is a session
377
+ if [[ ! "$BRANCH" =~ ^session- ]]; then
378
+ echo "⚠ Not in a JFL session"
379
+ exit 1
380
+ fi
381
+
382
+ # 3. Check uncommitted changes
383
+ if ! git diff --quiet || ! git diff --cached --quiet; then
384
+ UNCOMMITTED=true
385
+ UNCOMMITTED_COUNT=$(git status --porcelain | wc -l | tr -d ' ')
386
+ else
387
+ UNCOMMITTED=false
388
+ UNCOMMITTED_COUNT=0
389
+ fi
390
+
391
+ # 4. Check journal
392
+ JOURNAL_FILE=".jfl/journal/${BRANCH}.jsonl"
393
+ if [[ -s "$JOURNAL_FILE" ]]; then
394
+ JOURNAL_EXISTS=true
395
+ JOURNAL_ENTRY_COUNT=$(wc -l < "$JOURNAL_FILE" | tr -d ' ')
396
+ else
397
+ JOURNAL_EXISTS=false
398
+ JOURNAL_ENTRY_COUNT=0
399
+ fi
400
+
401
+ # 5. Count work
402
+ COMMIT_COUNT=$(git rev-list --count $WORKING_BRANCH..HEAD 2>/dev/null || echo "0")
403
+ FILES_CHANGED=$(git diff --name-only $WORKING_BRANCH..HEAD 2>/dev/null | wc -l | tr -d ' ')
404
+ LINES_ADDED=$(git diff --numstat $WORKING_BRANCH..HEAD 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
405
+ LINES_REMOVED=$(git diff --numstat $WORKING_BRANCH..HEAD 2>/dev/null | awk '{sum+=$2} END {print sum+0}')
406
+
407
+ # 6. Calculate duration
408
+ SESSION_START=$(git log --format=%ct --reverse $WORKING_BRANCH..HEAD 2>/dev/null | head -1)
409
+ if [[ -n "$SESSION_START" ]]; then
410
+ NOW=$(date +%s)
411
+ DURATION_SECONDS=$((NOW - SESSION_START))
412
+ DURATION_HOURS=$((DURATION_SECONDS / 3600))
413
+ DURATION_MINUTES=$(((DURATION_SECONDS % 3600) / 60))
414
+ else
415
+ DURATION_HOURS=0
416
+ DURATION_MINUTES=0
417
+ fi
418
+
419
+ # Export for use by skill
420
+ echo "MODE=$MODE"
421
+ echo "BRANCH=$BRANCH"
422
+ echo "WORKING_BRANCH=$WORKING_BRANCH"
423
+ echo "UNCOMMITTED=$UNCOMMITTED"
424
+ echo "UNCOMMITTED_COUNT=$UNCOMMITTED_COUNT"
425
+ echo "JOURNAL_EXISTS=$JOURNAL_EXISTS"
426
+ echo "JOURNAL_ENTRY_COUNT=$JOURNAL_ENTRY_COUNT"
427
+ echo "COMMIT_COUNT=$COMMIT_COUNT"
428
+ echo "FILES_CHANGED=$FILES_CHANGED"
429
+ echo "LINES_ADDED=$LINES_ADDED"
430
+ echo "LINES_REMOVED=$LINES_REMOVED"
431
+ echo "DURATION_HOURS=$DURATION_HOURS"
432
+ echo "DURATION_MINUTES=$DURATION_MINUTES"
433
+ ```
434
+
435
+ You can run this and parse the output, or inline the checks directly in your skill logic.
436
+
437
+ ---
438
+
439
+ ## User Experience Flows
440
+
441
+ ### Scenario 1: Clean State (Happy Path)
442
+
443
+ **State:** No uncommitted changes, journal exists, clean merge expected
444
+
445
+ **What user sees:**
446
+
447
+ ```
448
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
449
+ Ending Session
450
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
451
+ Session: session-goose-20260210-1430-a1b2c3
452
+ Mode: worktree
453
+ Merging to: main
454
+
455
+ Changes:
456
+ • 8 commits
457
+ • 12 files modified
458
+ • +234 / -67 lines
459
+
460
+ ✓ Journal entry exists (3 entries)
461
+ ✓ No uncommitted changes
462
+
463
+ Executing cleanup...
464
+ ✓ Merged to main
465
+ ✓ Pushed to origin
466
+ ✓ Removed worktree
467
+ ✓ Deleted session branch
468
+
469
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
470
+ Work Summary (2h 15m session)
471
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
472
+
473
+ [Synopsis output here...]
474
+
475
+ ✓ Session ended successfully
476
+ ```
477
+
478
+ **Implementation:**
479
+
480
+ ```bash
481
+ # After pre-flight check shows clean state
482
+
483
+ echo ""
484
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
485
+ echo " Ending Session"
486
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
487
+ echo "Session: $BRANCH"
488
+ echo "Mode: $MODE"
489
+ echo "Merging to: $WORKING_BRANCH"
490
+ echo ""
491
+ echo "Changes:"
492
+ echo " • $COMMIT_COUNT commits"
493
+ echo " • $FILES_CHANGED files modified"
494
+ echo " • +$LINES_ADDED / -$LINES_REMOVED lines"
495
+ echo ""
496
+ echo "✓ Journal entry exists ($JOURNAL_ENTRY_COUNT entries)"
497
+ echo "✓ No uncommitted changes"
498
+ echo ""
499
+ echo "Executing cleanup..."
500
+
501
+ # Call session-cleanup.sh
502
+ ./scripts/session/session-cleanup.sh 2>&1 | while IFS= read -r line; do
503
+ # Filter output to show only key steps
504
+ if [[ "$line" =~ ^✓ ]] || [[ "$line" =~ ^⚠ ]] || [[ "$line" =~ "Merged" ]] || [[ "$line" =~ "Pushed" ]]; then
505
+ echo " $line"
506
+ fi
507
+ done
508
+
509
+ EXIT_CODE=${PIPESTATUS[0]}
510
+
511
+ if [[ $EXIT_CODE -eq 0 ]]; then
512
+ # Show synopsis
513
+ echo ""
514
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
515
+ echo " Work Summary (${DURATION_HOURS}h ${DURATION_MINUTES}m session)"
516
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
517
+ jfl synopsis $((DURATION_HOURS + 1)) # Round up to next hour
518
+ echo ""
519
+ echo "✓ Session ended successfully"
520
+ else
521
+ echo ""
522
+ echo "⚠ Session cleanup encountered issues"
523
+ echo "See log: .jfl/logs/session-cleanup.log"
524
+ fi
525
+ ```
526
+
527
+ ### Scenario 2: Uncommitted Changes
528
+
529
+ **State:** User has uncommitted changes (forgot to commit before ending)
530
+
531
+ **What user sees:**
532
+
533
+ ```
534
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
535
+ Uncommitted Changes Detected
536
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
537
+
538
+ You have 5 uncommitted changes:
539
+
540
+ M src/lib/auth.ts
541
+ M src/components/LoginForm.tsx
542
+ A src/lib/session-manager.ts
543
+ ?? src/lib/types.ts
544
+ M README.md
545
+
546
+ Options:
547
+ 1. Auto-commit these changes (recommended)
548
+ 2. Show me the diff first
549
+ 3. Discard these changes (⚠ cannot be undone)
550
+ 4. Cancel (stay in session)
551
+
552
+ What would you like to do? [1-4]:
553
+ ```
554
+
555
+ **Implementation:**
556
+
557
+ ```bash
558
+ # After detecting UNCOMMITTED=true
559
+
560
+ echo ""
561
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
562
+ echo " Uncommitted Changes Detected"
563
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
564
+ echo ""
565
+ echo "You have $UNCOMMITTED_COUNT uncommitted changes:"
566
+ echo ""
567
+ git status --porcelain | head -10 | sed 's/^/ /'
568
+ if [[ $UNCOMMITTED_COUNT -gt 10 ]]; then
569
+ echo " ... and $((UNCOMMITTED_COUNT - 10)) more"
570
+ fi
571
+ echo ""
572
+ ```
573
+
574
+ **Then present options to the user via AskUserQuestion tool:**
575
+
576
+ ```json
577
+ {
578
+ "questions": [
579
+ {
580
+ "question": "What would you like to do with uncommitted changes?",
581
+ "header": "Uncommitted",
582
+ "multiSelect": false,
583
+ "options": [
584
+ {
585
+ "label": "Auto-commit (Recommended)",
586
+ "description": "Automatically commit all changes with message 'session: end'. Safe and fast."
587
+ },
588
+ {
589
+ "label": "Show diff first",
590
+ "description": "Review changes before deciding. Lets you see exactly what will be committed."
591
+ },
592
+ {
593
+ "label": "Discard changes",
594
+ "description": "⚠ Permanently delete uncommitted changes. Cannot be undone. Only use if you're sure."
595
+ },
596
+ {
597
+ "label": "Cancel",
598
+ "description": "Stay in the session. Commit changes manually, then run /end again."
599
+ }
600
+ ]
601
+ }
602
+ ]
603
+ }
604
+ ```
605
+
606
+ **Handle each choice:**
607
+
608
+ **Choice 1: Auto-commit**
609
+ ```bash
610
+ echo "Auto-committing changes..."
611
+ git add -A
612
+ git commit -m "session: end $(date +%Y-%m-%d\ %H:%M)"
613
+ echo "✓ Changes committed"
614
+ echo ""
615
+ # Continue to cleanup
616
+ ```
617
+
618
+ **Choice 2: Show diff**
619
+ ```bash
620
+ echo "Changes to be committed:"
621
+ echo ""
622
+ git diff HEAD
623
+ echo ""
624
+ echo "What now?"
625
+ echo " 1. Commit these changes"
626
+ echo " 2. Discard these changes"
627
+ echo " 3. Cancel"
628
+ # Prompt again
629
+ ```
630
+
631
+ **Choice 3: Discard**
632
+ ```bash
633
+ echo "⚠ WARNING: This will permanently delete all uncommitted changes."
634
+ echo ""
635
+ echo "Type 'discard' to confirm: "
636
+ # Wait for user confirmation
637
+ # If confirmed:
638
+ git reset --hard HEAD
639
+ git clean -fd
640
+ echo "✓ Changes discarded"
641
+ # Continue to cleanup
642
+ ```
643
+
644
+ **Choice 4: Cancel**
645
+ ```bash
646
+ echo "Session still active."
647
+ echo "Commit your changes, then run /end again."
648
+ exit 0
649
+ ```
650
+
651
+ ### Scenario 3: No Journal Entry
652
+
653
+ **State:** Session has substantial work but no journal entry
654
+
655
+ **What user sees:**
656
+
657
+ ```
658
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
659
+ Missing Journal Entry
660
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
661
+
662
+ This session has work, but no journal entry:
663
+ • 8 commits
664
+ • 12 files changed
665
+ • 2h 15m duration
666
+
667
+ Journal entries help you (and others) understand what
668
+ happened when resuming work later.
669
+
670
+ Would you like to:
671
+ 1. Write a quick journal entry now (30 seconds)
672
+ 2. Skip (not recommended, but allowed)
673
+
674
+ Choice [1-2]:
675
+ ```
676
+
677
+ **Implementation:**
678
+
679
+ ```bash
680
+ # After detecting JOURNAL_EXISTS=false and COMMIT_COUNT > 0
681
+
682
+ echo ""
683
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
684
+ echo " Missing Journal Entry"
685
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
686
+ echo ""
687
+ echo "This session has work, but no journal entry:"
688
+ echo " • $COMMIT_COUNT commits"
689
+ echo " • $FILES_CHANGED files changed"
690
+ echo " • ${DURATION_HOURS}h ${DURATION_MINUTES}m duration"
691
+ echo ""
692
+ echo "Journal entries help you (and others) understand what"
693
+ echo "happened when resuming work later."
694
+ echo ""
695
+ ```
696
+
697
+ **Present options:**
698
+
699
+ ```json
700
+ {
701
+ "questions": [
702
+ {
703
+ "question": "Would you like to write a journal entry?",
704
+ "header": "Journal",
705
+ "multiSelect": false,
706
+ "options": [
707
+ {
708
+ "label": "Write entry (Recommended)",
709
+ "description": "Quick 30-second entry. Just a title and summary of what you did."
710
+ },
711
+ {
712
+ "label": "Skip",
713
+ "description": "Not recommended. Future sessions won't have context for this work."
714
+ }
715
+ ]
716
+ }
717
+ ]
718
+ }
719
+ ```
720
+
721
+ **If write entry:**
722
+
723
+ Prompt for minimal info:
724
+
725
+ ```
726
+ What did you work on? (one sentence):
727
+ ```
728
+
729
+ Wait for user input, then write basic journal entry:
730
+
731
+ ```bash
732
+ TITLE="$USER_INPUT"
733
+ SUMMARY="Session work (auto-generated)"
734
+ TS=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
735
+
736
+ # Get files changed
737
+ FILES=$(git diff --name-only $WORKING_BRANCH..HEAD | jq -R -s -c 'split("\n") | map(select(length > 0))')
738
+
739
+ # Write entry
740
+ cat >> "$JOURNAL_FILE" << EOF
741
+ {"v":1,"ts":"$TS","session":"$BRANCH","type":"session-end","status":"complete","title":"$TITLE","summary":"$SUMMARY","files":$FILES}
742
+ EOF
743
+
744
+ echo "✓ Journal entry created"
745
+ ```
746
+
747
+ **If skip:**
748
+
749
+ ```bash
750
+ echo "⚠ Proceeding without journal entry"
751
+ echo "Note: This makes handoffs harder for future sessions"
752
+ echo ""
753
+ # Continue to cleanup
754
+ ```
755
+
756
+ ### Scenario 4: Merge Conflicts
757
+
758
+ **State:** Cleanup script detects conflicts that can't be auto-resolved
759
+
760
+ **What user sees:**
761
+
762
+ ```
763
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
764
+ Merge Conflicts Detected
765
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
766
+
767
+ Conflicts in:
768
+ • src/lib/auth.ts
769
+ • src/components/LoginForm.tsx
770
+
771
+ Your session branch has been preserved: session-goose-20260210-1430-a1b2c3
772
+
773
+ To resolve manually:
774
+
775
+ 1. Review changes:
776
+ git log main..session-goose-20260210-1430-a1b2c3
777
+
778
+ 2. Merge manually:
779
+ git checkout main
780
+ git merge session-goose-20260210-1430-a1b2c3
781
+
782
+ 3. Resolve conflicts in your editor
783
+
784
+ 4. Complete merge:
785
+ git add .
786
+ git commit
787
+ git push origin main
788
+
789
+ 5. Delete session branch:
790
+ git branch -D session-goose-20260210-1430-a1b2c3
791
+
792
+ Need help? Ask Claude to guide you through conflict resolution.
793
+ ```
794
+
795
+ **Implementation:**
796
+
797
+ ```bash
798
+ # session-cleanup.sh handles conflict detection
799
+ # If it exits with conflicts, parse output and guide user
800
+
801
+ EXIT_CODE=${PIPESTATUS[0]}
802
+
803
+ if [[ $EXIT_CODE -ne 0 ]]; then
804
+ # Check if conflicts were the issue
805
+ if grep -q "Merge conflicts remain" .jfl/logs/session-cleanup.log; then
806
+ echo ""
807
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
808
+ echo " Merge Conflicts Detected"
809
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
810
+ echo ""
811
+ echo "Conflicts in:"
812
+ grep "Cannot auto-resolve:" .jfl/logs/session-cleanup.log | sed 's/^.*: / • /'
813
+ echo ""
814
+ echo "Your session branch has been preserved: $BRANCH"
815
+ echo ""
816
+ echo "To resolve manually:"
817
+ echo ""
818
+ echo "1. Review changes:"
819
+ echo " git log $WORKING_BRANCH..$BRANCH"
820
+ echo ""
821
+ echo "2. Merge manually:"
822
+ echo " git checkout $WORKING_BRANCH"
823
+ echo " git merge $BRANCH"
824
+ echo ""
825
+ echo "3. Resolve conflicts in your editor"
826
+ echo ""
827
+ echo "4. Complete merge:"
828
+ echo " git add ."
829
+ echo " git commit"
830
+ echo " git push origin $WORKING_BRANCH"
831
+ echo ""
832
+ echo "5. Delete session branch:"
833
+ echo " git branch -D $BRANCH"
834
+ echo ""
835
+ echo "Need help? Ask Claude to guide you through conflict resolution."
836
+ fi
837
+ fi
838
+ ```
839
+
840
+ ---
841
+
842
+ ## Implementation Steps
843
+
844
+ ### Complete Execution Flow
845
+
846
+ Here's the full implementation pattern for the `/end` skill:
847
+
848
+ ```bash
849
+ #!/bin/bash
850
+
851
+ # /end skill implementation
852
+
853
+ set -e
854
+
855
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
856
+ echo " Preparing to End Session"
857
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
858
+ echo ""
859
+
860
+ # ============================================================
861
+ # STEP 1: Pre-Flight Check
862
+ # ============================================================
863
+
864
+ echo "Running pre-flight checks..."
865
+ echo ""
866
+
867
+ # Detect mode
868
+ WORKTREE_PATH=$(cat .jfl/current-worktree.txt 2>/dev/null || echo "")
869
+ if [[ "$WORKTREE_PATH" == "direct" ]]; then
870
+ MODE="direct"
871
+ elif [[ -n "$WORKTREE_PATH" ]]; then
872
+ MODE="worktree"
873
+ else
874
+ MODE="none"
875
+ fi
876
+
877
+ # Get branches
878
+ BRANCH=$(cat .jfl/current-session-branch.txt 2>/dev/null || git branch --show-current 2>/dev/null || echo "")
879
+ WORKING_BRANCH=$(jq -r '.working_branch // "main"' .jfl/config.json 2>/dev/null || echo "main")
880
+
881
+ # Verify session
882
+ if [[ ! "$BRANCH" =~ ^session- ]]; then
883
+ echo "⚠ Not in a JFL session (current branch: ${BRANCH:-none})"
884
+ echo ""
885
+ echo "You might already be on $WORKING_BRANCH."
886
+ echo "Session branches start with 'session-'."
887
+ echo ""
888
+ echo "No cleanup needed."
889
+ exit 0
890
+ fi
891
+
892
+ # Check uncommitted
893
+ if ! git diff --quiet || ! git diff --cached --quiet; then
894
+ UNCOMMITTED=true
895
+ UNCOMMITTED_COUNT=$(git status --porcelain | wc -l | tr -d ' ')
896
+ else
897
+ UNCOMMITTED=false
898
+ UNCOMMITTED_COUNT=0
899
+ fi
900
+
901
+ # Check journal
902
+ JOURNAL_FILE=".jfl/journal/${BRANCH}.jsonl"
903
+ if [[ -s "$JOURNAL_FILE" ]]; then
904
+ JOURNAL_EXISTS=true
905
+ JOURNAL_ENTRY_COUNT=$(wc -l < "$JOURNAL_FILE" | tr -d ' ')
906
+ else
907
+ JOURNAL_EXISTS=false
908
+ JOURNAL_ENTRY_COUNT=0
909
+ fi
910
+
911
+ # Count work
912
+ COMMIT_COUNT=$(git rev-list --count $WORKING_BRANCH..HEAD 2>/dev/null || echo "0")
913
+ FILES_CHANGED=$(git diff --name-only $WORKING_BRANCH..HEAD 2>/dev/null | wc -l | tr -d ' ')
914
+ LINES_ADDED=$(git diff --numstat $WORKING_BRANCH..HEAD 2>/dev/null | awk '{sum+=$1} END {print sum+0}')
915
+ LINES_REMOVED=$(git diff --numstat $WORKING_BRANCH..HEAD 2>/dev/null | awk '{sum+=$2} END {print sum+0}')
916
+
917
+ # Calculate duration
918
+ SESSION_START=$(git log --format=%ct --reverse $WORKING_BRANCH..HEAD 2>/dev/null | head -1)
919
+ if [[ -n "$SESSION_START" ]]; then
920
+ NOW=$(date +%s)
921
+ DURATION_SECONDS=$((NOW - SESSION_START))
922
+ DURATION_HOURS=$((DURATION_SECONDS / 3600))
923
+ DURATION_MINUTES=$(((DURATION_SECONDS % 3600) / 60))
924
+ else
925
+ DURATION_HOURS=0
926
+ DURATION_MINUTES=0
927
+ fi
928
+
929
+ # ============================================================
930
+ # STEP 2: Display Session Summary
931
+ # ============================================================
932
+
933
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
934
+ echo " Session Summary"
935
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
936
+ echo "Session: $BRANCH"
937
+ echo "Mode: $MODE"
938
+ echo "Merging to: $WORKING_BRANCH"
939
+ echo "Duration: ${DURATION_HOURS}h ${DURATION_MINUTES}m"
940
+ echo ""
941
+ echo "Changes:"
942
+ echo " • $COMMIT_COUNT commits"
943
+ echo " • $FILES_CHANGED files modified"
944
+ echo " • +$LINES_ADDED / -$LINES_REMOVED lines"
945
+ echo ""
946
+
947
+ # ============================================================
948
+ # STEP 3: Handle Uncommitted Changes
949
+ # ============================================================
950
+
951
+ if [[ "$UNCOMMITTED" == "true" ]]; then
952
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
953
+ echo " Uncommitted Changes Detected"
954
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
955
+ echo ""
956
+ echo "You have $UNCOMMITTED_COUNT uncommitted changes:"
957
+ echo ""
958
+ git status --porcelain | head -10 | sed 's/^/ /'
959
+ if [[ $UNCOMMITTED_COUNT -gt 10 ]]; then
960
+ echo " ... and $((UNCOMMITTED_COUNT - 10)) more"
961
+ fi
962
+ echo ""
963
+
964
+ # Use AskUserQuestion tool here in actual implementation
965
+ # For script, prompt directly:
966
+ echo "Options:"
967
+ echo " 1. Auto-commit (recommended)"
968
+ echo " 2. Show diff first"
969
+ echo " 3. Discard changes (⚠ cannot undo)"
970
+ echo " 4. Cancel"
971
+ echo ""
972
+ read -p "Choice [1-4]: " CHOICE
973
+
974
+ case $CHOICE in
975
+ 1)
976
+ echo "Auto-committing changes..."
977
+ git add -A
978
+ git commit -m "session: end $(date +%Y-%m-%d\ %H:%M)"
979
+ echo "✓ Changes committed"
980
+ echo ""
981
+ ;;
982
+ 2)
983
+ git diff HEAD
984
+ echo ""
985
+ echo "Commit these changes? [y/n]"
986
+ read -p "> " CONFIRM
987
+ if [[ "$CONFIRM" =~ ^[Yy] ]]; then
988
+ git add -A
989
+ git commit -m "session: end $(date +%Y-%m-%d\ %H:%M)"
990
+ echo "✓ Changes committed"
991
+ else
992
+ echo "Cancelled."
993
+ exit 0
994
+ fi
995
+ ;;
996
+ 3)
997
+ echo "⚠ WARNING: Permanently delete uncommitted changes?"
998
+ read -p "Type 'discard' to confirm: " CONFIRM
999
+ if [[ "$CONFIRM" == "discard" ]]; then
1000
+ git reset --hard HEAD
1001
+ git clean -fd
1002
+ echo "✓ Changes discarded"
1003
+ else
1004
+ echo "Cancelled."
1005
+ exit 0
1006
+ fi
1007
+ ;;
1008
+ 4)
1009
+ echo "Session still active."
1010
+ echo "Commit your changes, then run /end again."
1011
+ exit 0
1012
+ ;;
1013
+ esac
1014
+ fi
1015
+
1016
+ # ============================================================
1017
+ # STEP 4: Handle Missing Journal
1018
+ # ============================================================
1019
+
1020
+ if [[ "$JOURNAL_EXISTS" == "false" ]] && [[ $COMMIT_COUNT -gt 0 ]]; then
1021
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1022
+ echo " Missing Journal Entry"
1023
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1024
+ echo ""
1025
+ echo "This session has work, but no journal entry:"
1026
+ echo " • $COMMIT_COUNT commits"
1027
+ echo " • $FILES_CHANGED files changed"
1028
+ echo " • ${DURATION_HOURS}h ${DURATION_MINUTES}m duration"
1029
+ echo ""
1030
+ echo "Journal entries help future sessions understand this work."
1031
+ echo ""
1032
+ echo "Options:"
1033
+ echo " 1. Write quick entry (30 seconds)"
1034
+ echo " 2. Skip (not recommended)"
1035
+ echo ""
1036
+ read -p "Choice [1-2]: " CHOICE
1037
+
1038
+ if [[ "$CHOICE" == "1" ]]; then
1039
+ echo ""
1040
+ read -p "What did you work on? (one sentence): " TITLE
1041
+ SUMMARY="Session work"
1042
+ TS=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
1043
+ FILES=$(git diff --name-only $WORKING_BRANCH..HEAD | jq -R -s -c 'split("\n") | map(select(length > 0))')
1044
+
1045
+ mkdir -p .jfl/journal
1046
+ cat >> "$JOURNAL_FILE" << EOF
1047
+ {"v":1,"ts":"$TS","session":"$BRANCH","type":"session-end","status":"complete","title":"$TITLE","summary":"$SUMMARY","files":$FILES}
1048
+ EOF
1049
+
1050
+ echo "✓ Journal entry created"
1051
+ echo ""
1052
+ else
1053
+ echo "⚠ Proceeding without journal entry"
1054
+ echo ""
1055
+ fi
1056
+ else
1057
+ echo "✓ Journal entry exists ($JOURNAL_ENTRY_COUNT entries)"
1058
+ fi
1059
+
1060
+ if [[ "$UNCOMMITTED" == "false" ]]; then
1061
+ echo "✓ No uncommitted changes"
1062
+ fi
1063
+
1064
+ # ============================================================
1065
+ # STEP 5: Execute Cleanup
1066
+ # ============================================================
1067
+
1068
+ echo ""
1069
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1070
+ echo " Executing Cleanup"
1071
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1072
+ echo ""
1073
+
1074
+ # Create logs directory
1075
+ mkdir -p .jfl/logs
1076
+
1077
+ # Run session-cleanup.sh and capture output
1078
+ ./scripts/session/session-cleanup.sh 2>&1 | tee .jfl/logs/session-cleanup.log | while IFS= read -r line; do
1079
+ # Filter to show only key steps
1080
+ if [[ "$line" =~ ^✓ ]] || [[ "$line" =~ ^⚠ ]] || [[ "$line" =~ "Merged" ]] || [[ "$line" =~ "Pushed" ]] || [[ "$line" =~ "Removing" ]] || [[ "$line" =~ "Deleting" ]]; then
1081
+ echo " $line"
1082
+ fi
1083
+ done
1084
+
1085
+ EXIT_CODE=${PIPESTATUS[0]}
1086
+
1087
+ # ============================================================
1088
+ # STEP 5.5: Sync to GTM (if in service)
1089
+ # ============================================================
1090
+
1091
+ if [[ "$SYNC_TO_GTM" == "true" && -n "$GTM_PARENT" ]]; then
1092
+ echo ""
1093
+ echo "📡 Syncing to GTM workspace..."
1094
+
1095
+ # Validate GTM parent exists
1096
+ if [[ ! -d "$GTM_PARENT" ]]; then
1097
+ echo "⚠️ GTM parent not found: $GTM_PARENT"
1098
+ echo "Skipping sync. Session cleaned up locally."
1099
+ else
1100
+ # Validate it's actually a GTM
1101
+ GTM_TYPE=$(jq -r '.type // empty' "$GTM_PARENT/.jfl/config.json" 2>/dev/null)
1102
+ if [[ "$GTM_TYPE" != "gtm" ]]; then
1103
+ echo "⚠️ Parent is not a GTM workspace (type: $GTM_TYPE)"
1104
+ echo "Skipping sync. Session cleaned up locally."
1105
+ else
1106
+ # 1. Sync journal entries
1107
+ mkdir -p "$GTM_PARENT/.jfl/journal"
1108
+
1109
+ SYNCED_COUNT=0
1110
+ for journal in .jfl/journal/*.jsonl; do
1111
+ if [[ -f "$journal" ]]; then
1112
+ BASENAME=$(basename "$journal")
1113
+ TARGET="$GTM_PARENT/.jfl/journal/service-${SERVICE_NAME}-${BASENAME}"
1114
+
1115
+ # Copy journal with preserved permissions
1116
+ cp "$journal" "$TARGET"
1117
+ ((SYNCED_COUNT++))
1118
+ echo " ✓ Synced: $BASENAME"
1119
+ fi
1120
+ done
1121
+
1122
+ # 2. Update GTM's last_sync timestamp
1123
+ cd "$GTM_PARENT"
1124
+ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
1125
+
1126
+ # Use jq to update the timestamp (create registered_services if needed)
1127
+ jq --arg name "$SERVICE_NAME" \
1128
+ --arg ts "$TIMESTAMP" \
1129
+ '(.registered_services // []) |= (
1130
+ if any(.name == $name) then
1131
+ map(if .name == $name then .last_sync = $ts else . end)
1132
+ else
1133
+ . + [{"name": $name, "last_sync": $ts}]
1134
+ end
1135
+ )' \
1136
+ .jfl/config.json > .jfl/config.json.tmp && \
1137
+ mv .jfl/config.json.tmp .jfl/config.json
1138
+
1139
+ # 3. Create sync entry in GTM journal
1140
+ GTM_SESSION=$(git branch --show-current 2>/dev/null || echo "main")
1141
+ GTM_JOURNAL=".jfl/journal/${GTM_SESSION}.jsonl"
1142
+
1143
+ cat >> "$GTM_JOURNAL" << EOF
1144
+ {"v":1,"ts":"$TIMESTAMP","session":"$GTM_SESSION","type":"sync","title":"Service sync: $SERVICE_NAME","summary":"Synced $SYNCED_COUNT journal file(s) from $SERVICE_NAME","service":"$SERVICE_NAME","files_synced":$SYNCED_COUNT}
1145
+ EOF
1146
+
1147
+ echo " ✓ Updated GTM registry"
1148
+ echo ""
1149
+ echo "✅ Sync complete ($SYNCED_COUNT journal file(s) → GTM)"
1150
+ fi
1151
+ fi
1152
+ fi
1153
+
1154
+ # ============================================================
1155
+ # STEP 6: Report Results
1156
+ # ============================================================
1157
+
1158
+ echo ""
1159
+
1160
+ if [[ $EXIT_CODE -eq 0 ]]; then
1161
+ # Check if merge happened or if conflicts remained
1162
+ if grep -q "Merge conflicts remain" .jfl/logs/session-cleanup.log; then
1163
+ # Conflicts - branch preserved
1164
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1165
+ echo " Merge Conflicts Detected"
1166
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1167
+ echo ""
1168
+ echo "Conflicts in:"
1169
+ grep "Cannot auto-resolve:" .jfl/logs/session-cleanup.log | sed 's/^.*: / • /'
1170
+ echo ""
1171
+ echo "Your session branch has been preserved: $BRANCH"
1172
+ echo ""
1173
+ echo "To resolve manually:"
1174
+ echo ""
1175
+ echo "1. Review changes:"
1176
+ echo " git log $WORKING_BRANCH..$BRANCH"
1177
+ echo ""
1178
+ echo "2. Merge manually:"
1179
+ echo " git checkout $WORKING_BRANCH"
1180
+ echo " git merge $BRANCH"
1181
+ echo ""
1182
+ echo "3. Resolve conflicts in your editor"
1183
+ echo ""
1184
+ echo "4. Complete merge:"
1185
+ echo " git add ."
1186
+ echo " git commit"
1187
+ echo " git push origin $WORKING_BRANCH"
1188
+ echo ""
1189
+ echo "5. Delete session branch:"
1190
+ echo " git branch -D $BRANCH"
1191
+ echo ""
1192
+ echo "Need help? Ask Claude to guide you through conflict resolution."
1193
+ else
1194
+ # Success - show synopsis
1195
+ echo "✓ Session ended successfully"
1196
+
1197
+ # ============================================================
1198
+ # STEP 7: Show Synopsis
1199
+ # ============================================================
1200
+
1201
+ echo ""
1202
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1203
+ echo " Work Summary (${DURATION_HOURS}h ${DURATION_MINUTES}m session)"
1204
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1205
+ echo ""
1206
+
1207
+ # Round up duration for synopsis
1208
+ SYNOPSIS_HOURS=$((DURATION_HOURS + 1))
1209
+ if [[ $SYNOPSIS_HOURS -lt 1 ]]; then
1210
+ SYNOPSIS_HOURS=1
1211
+ fi
1212
+
1213
+ # Run synopsis command
1214
+ if command -v jfl >/dev/null 2>&1; then
1215
+ jfl synopsis $SYNOPSIS_HOURS 2>/dev/null || echo "Synopsis not available (jfl command not found or synopsis failed)"
1216
+ else
1217
+ echo "Synopsis not available (jfl command not in PATH)"
1218
+ fi
1219
+
1220
+ echo ""
1221
+ echo "✓ All changes merged to $WORKING_BRANCH and pushed to origin"
1222
+ fi
1223
+ else
1224
+ # Generic failure
1225
+ echo "⚠ Session cleanup encountered issues"
1226
+ echo ""
1227
+ echo "Check the log for details:"
1228
+ echo " cat .jfl/logs/session-cleanup.log"
1229
+ echo ""
1230
+ echo "Your session branch is preserved: $BRANCH"
1231
+ echo "No work has been lost."
1232
+ echo ""
1233
+ echo "Common issues:"
1234
+ echo " • Push failed → retry: git push origin $WORKING_BRANCH"
1235
+ echo " • Merge conflicts → see conflict resolution steps above"
1236
+ echo " • Other errors → check log and ask for help"
1237
+ fi
1238
+
1239
+ echo ""
1240
+ ```
1241
+
1242
+ ---
1243
+
1244
+ ## Error Handling
1245
+
1246
+ ### Error Pattern 1: Not in a Session
1247
+
1248
+ **Detection:**
1249
+ ```bash
1250
+ if [[ ! "$BRANCH" =~ ^session- ]]; then
1251
+ # Not in a session
1252
+ fi
1253
+ ```
1254
+
1255
+ **Message:**
1256
+ ```
1257
+ ⚠ Not in a JFL session
1258
+
1259
+ Current branch: main
1260
+
1261
+ You're already on your working branch.
1262
+ Session branches start with 'session-'.
1263
+
1264
+ No cleanup needed.
1265
+ ```
1266
+
1267
+ **Recovery:** None needed, gracefully exit.
1268
+
1269
+ ### Error Pattern 2: Cleanup Script Fails
1270
+
1271
+ **Detection:**
1272
+ ```bash
1273
+ EXIT_CODE=${PIPESTATUS[0]}
1274
+ if [[ $EXIT_CODE -ne 0 ]]; then
1275
+ # Cleanup failed
1276
+ fi
1277
+ ```
1278
+
1279
+ **Message:**
1280
+ ```
1281
+ ⚠ Session cleanup encountered issues
1282
+
1283
+ Check the log for details:
1284
+ cat .jfl/logs/session-cleanup.log
1285
+
1286
+ Your session branch is preserved: session-goose-20260210-1430-a1b2c3
1287
+ No work has been lost.
1288
+
1289
+ Common issues:
1290
+ • Push failed → retry: git push origin main
1291
+ • Merge conflicts → see conflict resolution guide
1292
+ • Other errors → share log with Claude for help
1293
+ ```
1294
+
1295
+ **Recovery:** Guide user to check log, provide common solutions.
1296
+
1297
+ ### Error Pattern 3: Push Fails
1298
+
1299
+ **Detection:**
1300
+ ```bash
1301
+ if grep -q "Push failed" .jfl/logs/session-cleanup.log; then
1302
+ # Push to remote failed
1303
+ fi
1304
+ ```
1305
+
1306
+ **Message:**
1307
+ ```
1308
+ ✓ Merged to main locally
1309
+ ⚠ Push to origin failed
1310
+
1311
+ Your work is merged locally but not on GitHub yet.
1312
+
1313
+ To retry push:
1314
+ git push origin main
1315
+
1316
+ Common causes:
1317
+ • No network connection
1318
+ • Remote has new commits → fetch and merge first
1319
+ • Authentication issue → check git credentials
1320
+ ```
1321
+
1322
+ **Recovery:** Provide retry command, list common causes.
1323
+
1324
+ ### Error Pattern 4: Synopsis Command Fails
1325
+
1326
+ **Detection:**
1327
+ ```bash
1328
+ if ! jfl synopsis $HOURS 2>/dev/null; then
1329
+ # Synopsis failed
1330
+ fi
1331
+ ```
1332
+
1333
+ **Handling:**
1334
+ ```bash
1335
+ # Don't fail the entire skill if synopsis fails
1336
+ jfl synopsis $HOURS 2>/dev/null || echo "Synopsis not available"
1337
+ ```
1338
+
1339
+ **Message:**
1340
+ ```
1341
+ Synopsis not available (jfl command failed)
1342
+
1343
+ But your session ended successfully:
1344
+ ✓ Merged to main
1345
+ ✓ Pushed to origin
1346
+ ```
1347
+
1348
+ **Recovery:** Session end still successful, synopsis is nice-to-have.
1349
+
1350
+ ### Error Pattern 5: Journal Write Fails
1351
+
1352
+ **Detection:**
1353
+ ```bash
1354
+ if ! cat >> "$JOURNAL_FILE" << EOF ...; then
1355
+ # Journal write failed
1356
+ fi
1357
+ ```
1358
+
1359
+ **Handling:**
1360
+ ```bash
1361
+ # Try to write journal, but don't block session end if it fails
1362
+ if ! cat >> "$JOURNAL_FILE" << EOF
1363
+ ...
1364
+ EOF
1365
+ then
1366
+ echo "⚠ Failed to write journal entry (file permissions?)"
1367
+ echo "Continuing with session end anyway..."
1368
+ fi
1369
+ ```
1370
+
1371
+ **Message:**
1372
+ ```
1373
+ ⚠ Failed to write journal entry
1374
+
1375
+ Possible causes:
1376
+ • .jfl/journal/ directory doesn't exist
1377
+ • Permission issue
1378
+
1379
+ Session ending anyway (journal is recommended but not required).
1380
+ ```
1381
+
1382
+ **Recovery:** Session ends, user can manually add journal later.
1383
+
1384
+ ---
1385
+
1386
+ ## Synopsis Integration
1387
+
1388
+ **Always run synopsis after successful session end.** This provides handoff context for future sessions.
1389
+
1390
+ ### Calculating Duration
1391
+
1392
+ ```bash
1393
+ # Get first commit timestamp in session
1394
+ SESSION_START=$(git log --format=%ct --reverse $WORKING_BRANCH..HEAD 2>/dev/null | head -1)
1395
+
1396
+ if [[ -n "$SESSION_START" ]]; then
1397
+ NOW=$(date +%s)
1398
+ DURATION_SECONDS=$((NOW - SESSION_START))
1399
+ DURATION_HOURS=$((DURATION_SECONDS / 3600))
1400
+ DURATION_MINUTES=$(((DURATION_SECONDS % 3600) / 60))
1401
+ else
1402
+ # No commits yet (shouldn't happen at session end, but handle gracefully)
1403
+ DURATION_HOURS=0
1404
+ DURATION_MINUTES=0
1405
+ fi
1406
+
1407
+ # Round up for synopsis (show at least last hour)
1408
+ SYNOPSIS_HOURS=$((DURATION_HOURS + 1))
1409
+ if [[ $SYNOPSIS_HOURS -lt 1 ]]; then
1410
+ SYNOPSIS_HOURS=1
1411
+ fi
1412
+ ```
1413
+
1414
+ ### Calling Synopsis
1415
+
1416
+ ```bash
1417
+ echo ""
1418
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1419
+ echo " Work Summary (${DURATION_HOURS}h ${DURATION_MINUTES}m session)"
1420
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1421
+ echo ""
1422
+
1423
+ # Call jfl synopsis command
1424
+ if command -v jfl >/dev/null 2>&1; then
1425
+ jfl synopsis $SYNOPSIS_HOURS 2>/dev/null || {
1426
+ echo "Synopsis command failed"
1427
+ echo ""
1428
+ echo "Manual summary:"
1429
+ echo " Commits: $COMMIT_COUNT"
1430
+ echo " Files: $FILES_CHANGED"
1431
+ echo " Lines: +$LINES_ADDED / -$LINES_REMOVED"
1432
+ echo ""
1433
+ git log --oneline $WORKING_BRANCH..HEAD~10 2>/dev/null | head -10
1434
+ }
1435
+ else
1436
+ echo "Synopsis not available (jfl not in PATH)"
1437
+ echo ""
1438
+ echo "Manual summary:"
1439
+ echo " Commits: $COMMIT_COUNT"
1440
+ echo " Files: $FILES_CHANGED"
1441
+ echo " Lines: +$LINES_ADDED / -$LINES_REMOVED"
1442
+ echo ""
1443
+ echo "Recent commits:"
1444
+ git log --oneline $WORKING_BRANCH..HEAD~10 2>/dev/null | head -10
1445
+ fi
1446
+ ```
1447
+
1448
+ ### Fallback if Synopsis Unavailable
1449
+
1450
+ If `jfl synopsis` fails, show manual summary:
1451
+
1452
+ ```
1453
+ Manual summary:
1454
+ Commits: 8
1455
+ Files: 12
1456
+ Lines: +234 / -67
1457
+
1458
+ Recent commits:
1459
+ a1b2c3d feat: add session manager
1460
+ e4f5g6h fix: auth token refresh
1461
+ i7j8k9l docs: update README
1462
+ m1n2o3p style: format code
1463
+ ...
1464
+ ```
1465
+
1466
+ ---
1467
+
1468
+ ## Integration Points
1469
+
1470
+ ### 1. session-cleanup.sh
1471
+
1472
+ **Location:** `scripts/session/session-cleanup.sh`
1473
+
1474
+ **What it does:**
1475
+ - Stops background processes (auto-commit, context-hub)
1476
+ - Auto-commits uncommitted changes
1477
+ - Detects worktree vs direct mode
1478
+ - Pre-merge cleanup (removes session metadata)
1479
+ - Merges session branch to working branch with `-X ours`
1480
+ - Auto-resolves common conflicts (.jfl files, submodules)
1481
+ - Pushes to remote
1482
+ - Removes worktrees and deletes session branches
1483
+ - Notifies jfl-services API
1484
+
1485
+ **How skill uses it:**
1486
+ - Calls it after pre-flight checks and user prompts
1487
+ - Captures output to show key steps
1488
+ - Parses exit code and output for error handling
1489
+ - Logs full output to `.jfl/logs/session-cleanup.log`
1490
+
1491
+ ### 2. Journal System
1492
+
1493
+ **Location:** `.jfl/journal/*.jsonl`
1494
+
1495
+ **Format:** One JSON object per line (JSONL)
1496
+
1497
+ **Example entry:**
1498
+ ```json
1499
+ {
1500
+ "v": 1,
1501
+ "ts": "2026-02-10T14:30:00.000Z",
1502
+ "session": "session-goose-20260210-1430-a1b2c3",
1503
+ "type": "session-end",
1504
+ "status": "complete",
1505
+ "title": "Session management enhancements",
1506
+ "summary": "Enhanced /end skill with comprehensive UX",
1507
+ "files": ["SKILL.md", "session-cleanup.sh"]
1508
+ }
1509
+ ```
1510
+
1511
+ **How skill uses it:**
1512
+ - Checks if file exists: `[[ -s ".jfl/journal/${BRANCH}.jsonl" ]]`
1513
+ - Counts entries: `wc -l < "$JOURNAL_FILE"`
1514
+ - Warns if missing and offers to create
1515
+ - Creates minimal entry if user agrees
1516
+
1517
+ ### 3. Synopsis Command
1518
+
1519
+ **Location:** `src/commands/synopsis.ts` (TypeScript)
1520
+
1521
+ **Usage:** `jfl synopsis [hours] [author]`
1522
+
1523
+ **What it returns:**
1524
+ - Journal entries from all sessions/worktrees
1525
+ - Git commits from all branches
1526
+ - File headers (@purpose, @spec tags)
1527
+ - Time audit with category breakdown
1528
+ - Health checks and next steps
1529
+
1530
+ **How skill uses it:**
1531
+ - Called after successful cleanup
1532
+ - Duration calculated from session start time
1533
+ - Rounds up to next hour (e.g., 2h 15m → 3 hours)
1534
+ - Fallback to manual summary if command fails
1535
+
1536
+ ### 4. Session State Files
1537
+
1538
+ **Location:** `.jfl/`
1539
+
1540
+ | File | Purpose |
1541
+ |------|---------|
1542
+ | `current-session-branch.txt` | Current session branch name |
1543
+ | `current-worktree.txt` | Worktree path or "direct" |
1544
+ | `config.json` | Project config (working_branch, etc.) |
1545
+ | `logs/session-cleanup.log` | Last cleanup output |
1546
+
1547
+ **How skill uses it:**
1548
+ - Reads to detect mode and branch info
1549
+ - Used by pre-flight check
1550
+ - cleanup.sh removes metadata files before merge
1551
+
1552
+ ### 5. Working Branch Config
1553
+
1554
+ **Location:** `.jfl/config.json`
1555
+
1556
+ **Format:**
1557
+ ```json
1558
+ {
1559
+ "name": "project-name",
1560
+ "working_branch": "develop"
1561
+ }
1562
+ ```
1563
+
1564
+ **How skill uses it:**
1565
+ - Reads working_branch (defaults to "main")
1566
+ - Shows in summary: "Merging to: develop"
1567
+ - Passed to session-cleanup.sh
1568
+
1569
+ ---
1570
+
1571
+ ## Dependencies & Testing
1572
+
1573
+ ### Required Commands
1574
+
1575
+ The skill requires these commands to be available:
1576
+
1577
+ | Command | Purpose | Fallback if Missing |
1578
+ |---------|---------|-------------------|
1579
+ | `git` | Version control | **REQUIRED** - skill cannot run |
1580
+ | `jq` | JSON parsing | Use sed/awk for simple parsing |
1581
+ | `jfl` | Synopsis command | Show manual summary |
1582
+ | `bash` | Shell execution | **REQUIRED** - skill runs in bash |
1583
+
1584
+ **Checking dependencies:**
1585
+
1586
+ ```bash
1587
+ # Check git
1588
+ if ! command -v git >/dev/null 2>&1; then
1589
+ echo "Error: git is required"
1590
+ exit 1
1591
+ fi
1592
+
1593
+ # Check jq (optional but recommended)
1594
+ if ! command -v jq >/dev/null 2>&1; then
1595
+ echo "Warning: jq not found, using basic parsing"
1596
+ USE_JQ=false
1597
+ else
1598
+ USE_JQ=true
1599
+ fi
1600
+
1601
+ # Check jfl (optional)
1602
+ if ! command -v jfl >/dev/null 2>&1; then
1603
+ echo "Warning: jfl not found, synopsis unavailable"
1604
+ USE_SYNOPSIS=false
1605
+ else
1606
+ USE_SYNOPSIS=true
1607
+ fi
1608
+ ```
1609
+
1610
+ ### Required Files
1611
+
1612
+ | File | Purpose | What if Missing |
1613
+ |------|---------|----------------|
1614
+ | `scripts/session/session-cleanup.sh` | Core cleanup | **CRITICAL** - skill fails |
1615
+ | `.jfl/config.json` | Working branch | Use "main" as default |
1616
+ | `.jfl/current-session-branch.txt` | Session info | Read from git |
1617
+
1618
+ ### Testing Checklist
1619
+
1620
+ Test these scenarios to verify the skill works correctly:
1621
+
1622
+ #### 1. Happy Path (Clean State)
1623
+ - [ ] No uncommitted changes
1624
+ - [ ] Journal entry exists
1625
+ - [ ] Merges cleanly to working branch
1626
+ - [ ] Pushes to origin successfully
1627
+ - [ ] Shows synopsis
1628
+ - [ ] Success message displayed
1629
+
1630
+ #### 2. Uncommitted Changes → Auto-commit
1631
+ - [ ] Make changes without committing
1632
+ - [ ] Choose "auto-commit" option
1633
+ - [ ] Changes committed automatically
1634
+ - [ ] Merge succeeds
1635
+ - [ ] Synopsis shows all work
1636
+
1637
+ #### 3. Uncommitted Changes → Show Diff
1638
+ - [ ] Make changes without committing
1639
+ - [ ] Choose "show diff" option
1640
+ - [ ] Diff displayed correctly
1641
+ - [ ] Prompted for next action
1642
+ - [ ] Can commit or cancel
1643
+
1644
+ #### 4. Uncommitted Changes → Discard
1645
+ - [ ] Make changes without committing
1646
+ - [ ] Choose "discard" option
1647
+ - [ ] Warning shown
1648
+ - [ ] Confirmation required
1649
+ - [ ] Changes discarded (verified)
1650
+ - [ ] Merge proceeds
1651
+
1652
+ #### 5. Uncommitted Changes → Cancel
1653
+ - [ ] Make changes without committing
1654
+ - [ ] Choose "cancel" option
1655
+ - [ ] Session stays active
1656
+ - [ ] No cleanup performed
1657
+ - [ ] Can continue working
1658
+
1659
+ #### 6. No Journal → Write Entry
1660
+ - [ ] End session without journal
1661
+ - [ ] Prompted to write entry
1662
+ - [ ] Choose "write entry"
1663
+ - [ ] Provide title
1664
+ - [ ] Entry created (verified in .jfl/journal/)
1665
+ - [ ] Merge proceeds
1666
+
1667
+ #### 7. No Journal → Skip
1668
+ - [ ] End session without journal
1669
+ - [ ] Prompted to write entry
1670
+ - [ ] Choose "skip"
1671
+ - [ ] Warning shown
1672
+ - [ ] Merge proceeds anyway
1673
+
1674
+ #### 8. Worktree Mode
1675
+ - [ ] Start second concurrent session (creates worktree)
1676
+ - [ ] Make commits in worktree
1677
+ - [ ] End worktree session
1678
+ - [ ] Worktree removed (verified)
1679
+ - [ ] Branch deleted
1680
+ - [ ] Main repo untouched
1681
+
1682
+ #### 9. Direct Mode
1683
+ - [ ] Start single session (no worktree)
1684
+ - [ ] Make commits
1685
+ - [ ] End session
1686
+ - [ ] Merges on same branch
1687
+ - [ ] No worktree cleanup needed
1688
+
1689
+ #### 10. Merge Conflicts
1690
+ - [ ] Create intentional conflict (modify same line in session and working branch)
1691
+ - [ ] End session
1692
+ - [ ] Conflicts detected
1693
+ - [ ] Branch preserved (not deleted)
1694
+ - [ ] Clear resolution guidance shown
1695
+ - [ ] Can resolve manually
1696
+
1697
+ #### 11. Synopsis Display
1698
+ - [ ] Work for 10+ minutes
1699
+ - [ ] Make several commits
1700
+ - [ ] Write journal entries
1701
+ - [ ] End session
1702
+ - [ ] Synopsis shows commits, files, journal entries
1703
+ - [ ] Time breakdown displayed
1704
+
1705
+ #### 12. Not in Session
1706
+ - [ ] Checkout main branch manually
1707
+ - [ ] Try to invoke /end
1708
+ - [ ] Graceful message shown
1709
+ - [ ] Explains not in session
1710
+ - [ ] No errors thrown
1711
+
1712
+ ### Success Criteria
1713
+
1714
+ The skill is working correctly if:
1715
+
1716
+ - ✅ All 12 test scenarios pass
1717
+ - ✅ User always knows what's happening at each step
1718
+ - ✅ No work is lost in any scenario
1719
+ - ✅ Error messages provide clear recovery steps
1720
+ - ✅ Synopsis integrates cleanly after successful cleanup
1721
+ - ✅ Session ends in < 30 seconds (without conflicts)
1722
+ - ✅ Journal compliance encouraged without being blocking
1723
+
1724
+ ---
1725
+
1726
+ ## Notes for Claude
1727
+
1728
+ ### When to Invoke This Skill
1729
+
1730
+ **Immediate invocation (HIGH CONFIDENCE):**
1731
+ - User says "done", "that's it", "I'm finished", "end session", "/end"
1732
+ - User says "wrap up", "all set", "good for now" in concluding context
1733
+
1734
+ **Check context first:**
1735
+ - User says "thanks", "looks good", "perfect" → Is this end of session or just task?
1736
+ - If unclear, ask: "Ready to end the session, or keep working?"
1737
+
1738
+ ### What You Should Do
1739
+
1740
+ When you invoke this skill:
1741
+
1742
+ 1. **Don't run commands yourself** - The skill script handles everything
1743
+ 2. **Present prompts to user** - Use AskUserQuestion for uncommitted/journal decisions
1744
+ 3. **Parse script output** - Show key steps, not full git output
1745
+ 4. **Guide on errors** - If conflicts, walk user through resolution
1746
+ 5. **Always show synopsis** - User chose "always show" preference
1747
+
1748
+ ### What You Should NOT Do
1749
+
1750
+ - ❌ Don't manually run `git commit`, `git merge`, etc. - Let the script do it
1751
+ - ❌ Don't skip uncommitted change check - User must decide what to do
1752
+ - ❌ Don't force journal entries - Encourage but allow skip
1753
+ - ❌ Don't hide errors - Parse and explain clearly
1754
+
1755
+ ### User Preferences (From Plan)
1756
+
1757
+ | Setting | User Choice | How to Handle |
1758
+ |---------|-------------|---------------|
1759
+ | Synopsis | Always show | Run synopsis after every session end |
1760
+ | Journal | Warn if missing | Prompt to write or skip, don't block |
1761
+ | Verbosity | Balanced | Show summary + key steps, not full output |
1762
+ | Auto-commit | Prompt | Ask what to do with uncommitted changes |
1763
+
1764
+ ### Common User Questions
1765
+
1766
+ **"Did my work get saved?"**
1767
+ → Yes! Show what merged: "✓ 8 commits, 12 files merged to main and pushed"
1768
+
1769
+ **"What if I made a mistake?"**
1770
+ → On main, you can: `git revert <commit>` or `git reset --hard HEAD~1` (before push)
1771
+
1772
+ **"Can I undo the session end?"**
1773
+ → If merge happened: No, but commits are on main, can revert. If conflicts: Yes, branch preserved.
1774
+
1775
+ **"Where did my session branch go?"**
1776
+ → Deleted after successful merge (work is on main now). If conflicts: Preserved for manual resolution.
1777
+
1778
+ ---
1779
+
1780
+ ## Summary
1781
+
1782
+ This skill provides comprehensive UX orchestration for session ending:
1783
+
1784
+ 1. ✅ **Pre-flight checks** - Gather complete state (mode, branches, uncommitted, journal, work stats)
1785
+ 2. ✅ **User prompts** - Handle uncommitted changes and missing journal gracefully
1786
+ 3. ✅ **Execute cleanup** - Call session-cleanup.sh with clear progress display
1787
+ 4. ✅ **Error handling** - Guide user through conflicts and failures
1788
+ 5. ✅ **Synopsis** - Always show work summary for handoff context
1789
+
1790
+ **Key principle:** Wrap solid infrastructure (session-cleanup.sh) with excellent UX.