oh-my-claude-sisyphus 3.6.1 → 3.6.3

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 (308) hide show
  1. package/commands/doctor.md +1 -1
  2. package/commands/psm.md +180 -0
  3. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  4. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  5. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  6. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  7. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  8. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  9. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  10. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  11. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
  12. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
  14. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
  15. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  16. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  18. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  19. package/dist/__tests__/installer.test.js +1 -1
  20. package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
  21. package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
  22. package/dist/__tests__/learned-skills/config.test.js +37 -0
  23. package/dist/__tests__/learned-skills/config.test.js.map +1 -0
  24. package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
  25. package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
  26. package/dist/__tests__/learned-skills/detector.test.js +99 -0
  27. package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
  28. package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
  29. package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
  30. package/dist/__tests__/learned-skills/finder.test.js +59 -0
  31. package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
  32. package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
  33. package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
  34. package/dist/__tests__/learned-skills/loader.test.js +69 -0
  35. package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
  36. package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
  37. package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
  38. package/dist/__tests__/learned-skills/parser.test.js +81 -0
  39. package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
  40. package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
  41. package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
  42. package/dist/__tests__/learned-skills/validator.test.js +85 -0
  43. package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
  44. package/dist/__tests__/skills.test.js +6 -5
  45. package/dist/__tests__/skills.test.js.map +1 -1
  46. package/dist/agents/codex-agents.d.ts +20 -0
  47. package/dist/agents/codex-agents.d.ts.map +1 -0
  48. package/dist/agents/codex-agents.js +36 -0
  49. package/dist/agents/codex-agents.js.map +1 -0
  50. package/dist/agents/document-writer.d.ts +11 -0
  51. package/dist/agents/document-writer.d.ts.map +1 -0
  52. package/dist/agents/document-writer.js +209 -0
  53. package/dist/agents/document-writer.js.map +1 -0
  54. package/dist/agents/frontend-engineer.d.ts +11 -0
  55. package/dist/agents/frontend-engineer.d.ts.map +1 -0
  56. package/dist/agents/frontend-engineer.js +115 -0
  57. package/dist/agents/frontend-engineer.js.map +1 -0
  58. package/dist/agents/librarian.d.ts +12 -0
  59. package/dist/agents/librarian.d.ts.map +1 -0
  60. package/dist/agents/librarian.js +103 -0
  61. package/dist/agents/librarian.js.map +1 -0
  62. package/dist/agents/metis.d.ts +12 -0
  63. package/dist/agents/metis.d.ts.map +1 -0
  64. package/dist/agents/metis.js +117 -0
  65. package/dist/agents/metis.js.map +1 -0
  66. package/dist/agents/momus.d.ts +12 -0
  67. package/dist/agents/momus.d.ts.map +1 -0
  68. package/dist/agents/momus.js +128 -0
  69. package/dist/agents/momus.js.map +1 -0
  70. package/dist/agents/multimodal-looker.d.ts +11 -0
  71. package/dist/agents/multimodal-looker.d.ts.map +1 -0
  72. package/dist/agents/multimodal-looker.js +70 -0
  73. package/dist/agents/multimodal-looker.js.map +1 -0
  74. package/dist/agents/oracle.d.ts +13 -0
  75. package/dist/agents/oracle.d.ts.map +1 -0
  76. package/dist/agents/oracle.js +191 -0
  77. package/dist/agents/oracle.js.map +1 -0
  78. package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
  79. package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
  80. package/dist/agents/orchestrator-sisyphus.js +115 -0
  81. package/dist/agents/orchestrator-sisyphus.js.map +1 -0
  82. package/dist/agents/prometheus.d.ts +12 -0
  83. package/dist/agents/prometheus.d.ts.map +1 -0
  84. package/dist/agents/prometheus.js +195 -0
  85. package/dist/agents/prometheus.js.map +1 -0
  86. package/dist/agents/sisyphus-junior.d.ts +12 -0
  87. package/dist/agents/sisyphus-junior.d.ts.map +1 -0
  88. package/dist/agents/sisyphus-junior.js +93 -0
  89. package/dist/agents/sisyphus-junior.js.map +1 -0
  90. package/dist/cli/analytics.js +0 -0
  91. package/dist/cli/components/CostDashboard.d.ts +15 -0
  92. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  93. package/dist/cli/components/CostDashboard.js +15 -0
  94. package/dist/cli/components/CostDashboard.js.map +1 -0
  95. package/dist/cli/components/LiveStats.d.ts +16 -0
  96. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  97. package/dist/cli/components/LiveStats.js +16 -0
  98. package/dist/cli/components/LiveStats.js.map +1 -0
  99. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  100. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  101. package/dist/cli/components/SessionBrowser.js +14 -0
  102. package/dist/cli/components/SessionBrowser.js.map +1 -0
  103. package/dist/cli/index.js +0 -0
  104. package/dist/cli/tui.d.ts +21 -0
  105. package/dist/cli/tui.d.ts.map +1 -0
  106. package/dist/cli/tui.js +21 -0
  107. package/dist/cli/tui.js.map +1 -0
  108. package/dist/hooks/autopilot/signals.d.ts +20 -0
  109. package/dist/hooks/autopilot/signals.d.ts.map +1 -0
  110. package/dist/hooks/autopilot/signals.js +75 -0
  111. package/dist/hooks/autopilot/signals.js.map +1 -0
  112. package/dist/hooks/autopilot/summary.d.ts +27 -0
  113. package/dist/hooks/autopilot/summary.d.ts.map +1 -0
  114. package/dist/hooks/autopilot/summary.js +160 -0
  115. package/dist/hooks/autopilot/summary.js.map +1 -0
  116. package/dist/hooks/autopilot/transition.d.ts +39 -0
  117. package/dist/hooks/autopilot/transition.d.ts.map +1 -0
  118. package/dist/hooks/autopilot/transition.js +216 -0
  119. package/dist/hooks/autopilot/transition.js.map +1 -0
  120. package/dist/hooks/context-window-limit-recovery/constants.d.ts +28 -0
  121. package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +1 -0
  122. package/dist/hooks/context-window-limit-recovery/constants.js +85 -0
  123. package/dist/hooks/context-window-limit-recovery/constants.js.map +1 -0
  124. package/dist/hooks/context-window-limit-recovery/index.d.ts +62 -0
  125. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -0
  126. package/dist/hooks/context-window-limit-recovery/index.js +201 -0
  127. package/dist/hooks/context-window-limit-recovery/index.js.map +1 -0
  128. package/dist/hooks/context-window-limit-recovery/parser.d.ts +31 -0
  129. package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +1 -0
  130. package/dist/hooks/context-window-limit-recovery/parser.js +241 -0
  131. package/dist/hooks/context-window-limit-recovery/parser.js.map +1 -0
  132. package/dist/hooks/context-window-limit-recovery/types.d.ts +84 -0
  133. package/dist/hooks/context-window-limit-recovery/types.d.ts.map +1 -0
  134. package/dist/hooks/context-window-limit-recovery/types.js +34 -0
  135. package/dist/hooks/context-window-limit-recovery/types.js.map +1 -0
  136. package/dist/hooks/edit-error-recovery/index.d.ts +62 -0
  137. package/dist/hooks/edit-error-recovery/index.d.ts.map +1 -0
  138. package/dist/hooks/edit-error-recovery/index.js +89 -0
  139. package/dist/hooks/edit-error-recovery/index.js.map +1 -0
  140. package/dist/hooks/learned-skills/config.d.ts +53 -0
  141. package/dist/hooks/learned-skills/config.d.ts.map +1 -0
  142. package/dist/hooks/learned-skills/config.js +103 -0
  143. package/dist/hooks/learned-skills/config.js.map +1 -0
  144. package/dist/hooks/learned-skills/constants.d.ts +24 -0
  145. package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
  146. package/dist/hooks/learned-skills/constants.js +26 -0
  147. package/dist/hooks/learned-skills/constants.js.map +1 -0
  148. package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
  149. package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
  150. package/dist/hooks/learned-skills/detection-hook.js +83 -0
  151. package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
  152. package/dist/hooks/learned-skills/detector.d.ts +30 -0
  153. package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
  154. package/dist/hooks/learned-skills/detector.js +150 -0
  155. package/dist/hooks/learned-skills/detector.js.map +1 -0
  156. package/dist/hooks/learned-skills/finder.d.ts +21 -0
  157. package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
  158. package/dist/hooks/learned-skills/finder.js +117 -0
  159. package/dist/hooks/learned-skills/finder.js.map +1 -0
  160. package/dist/hooks/learned-skills/index.d.ts +62 -0
  161. package/dist/hooks/learned-skills/index.d.ts.map +1 -0
  162. package/dist/hooks/learned-skills/index.js +137 -0
  163. package/dist/hooks/learned-skills/index.js.map +1 -0
  164. package/dist/hooks/learned-skills/loader.d.ts +20 -0
  165. package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
  166. package/dist/hooks/learned-skills/loader.js +107 -0
  167. package/dist/hooks/learned-skills/loader.js.map +1 -0
  168. package/dist/hooks/learned-skills/parser.d.ts +21 -0
  169. package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
  170. package/dist/hooks/learned-skills/parser.js +190 -0
  171. package/dist/hooks/learned-skills/parser.js.map +1 -0
  172. package/dist/hooks/learned-skills/promotion.d.ts +29 -0
  173. package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
  174. package/dist/hooks/learned-skills/promotion.js +87 -0
  175. package/dist/hooks/learned-skills/promotion.js.map +1 -0
  176. package/dist/hooks/learned-skills/types.d.ts +109 -0
  177. package/dist/hooks/learned-skills/types.d.ts.map +1 -0
  178. package/dist/hooks/learned-skills/types.js +8 -0
  179. package/dist/hooks/learned-skills/types.js.map +1 -0
  180. package/dist/hooks/learned-skills/validator.d.ts +15 -0
  181. package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
  182. package/dist/hooks/learned-skills/validator.js +87 -0
  183. package/dist/hooks/learned-skills/validator.js.map +1 -0
  184. package/dist/hooks/learned-skills/writer.d.ts +27 -0
  185. package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
  186. package/dist/hooks/learned-skills/writer.js +126 -0
  187. package/dist/hooks/learned-skills/writer.js.map +1 -0
  188. package/dist/hooks/mnemosyne/config.d.ts +53 -0
  189. package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
  190. package/dist/hooks/mnemosyne/config.js +103 -0
  191. package/dist/hooks/mnemosyne/config.js.map +1 -0
  192. package/dist/hooks/mnemosyne/constants.d.ts +24 -0
  193. package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
  194. package/dist/hooks/mnemosyne/constants.js +26 -0
  195. package/dist/hooks/mnemosyne/constants.js.map +1 -0
  196. package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
  197. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
  198. package/dist/hooks/mnemosyne/detection-hook.js +83 -0
  199. package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
  200. package/dist/hooks/mnemosyne/detector.d.ts +30 -0
  201. package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
  202. package/dist/hooks/mnemosyne/detector.js +150 -0
  203. package/dist/hooks/mnemosyne/detector.js.map +1 -0
  204. package/dist/hooks/mnemosyne/finder.d.ts +21 -0
  205. package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
  206. package/dist/hooks/mnemosyne/finder.js +117 -0
  207. package/dist/hooks/mnemosyne/finder.js.map +1 -0
  208. package/dist/hooks/mnemosyne/index.d.ts +62 -0
  209. package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
  210. package/dist/hooks/mnemosyne/index.js +137 -0
  211. package/dist/hooks/mnemosyne/index.js.map +1 -0
  212. package/dist/hooks/mnemosyne/loader.d.ts +20 -0
  213. package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
  214. package/dist/hooks/mnemosyne/loader.js +113 -0
  215. package/dist/hooks/mnemosyne/loader.js.map +1 -0
  216. package/dist/hooks/mnemosyne/parser.d.ts +21 -0
  217. package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
  218. package/dist/hooks/mnemosyne/parser.js +190 -0
  219. package/dist/hooks/mnemosyne/parser.js.map +1 -0
  220. package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
  221. package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
  222. package/dist/hooks/mnemosyne/promotion.js +87 -0
  223. package/dist/hooks/mnemosyne/promotion.js.map +1 -0
  224. package/dist/hooks/mnemosyne/types.d.ts +109 -0
  225. package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
  226. package/dist/hooks/mnemosyne/types.js +8 -0
  227. package/dist/hooks/mnemosyne/types.js.map +1 -0
  228. package/dist/hooks/mnemosyne/validator.d.ts +15 -0
  229. package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
  230. package/dist/hooks/mnemosyne/validator.js +87 -0
  231. package/dist/hooks/mnemosyne/validator.js.map +1 -0
  232. package/dist/hooks/mnemosyne/writer.d.ts +27 -0
  233. package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
  234. package/dist/hooks/mnemosyne/writer.js +126 -0
  235. package/dist/hooks/mnemosyne/writer.js.map +1 -0
  236. package/dist/hooks/ralph-loop/index.d.ts +116 -0
  237. package/dist/hooks/ralph-loop/index.d.ts.map +1 -0
  238. package/dist/hooks/ralph-loop/index.js +322 -0
  239. package/dist/hooks/ralph-loop/index.js.map +1 -0
  240. package/dist/hooks/ralph-prd/index.d.ts +130 -0
  241. package/dist/hooks/ralph-prd/index.d.ts.map +1 -0
  242. package/dist/hooks/ralph-prd/index.js +310 -0
  243. package/dist/hooks/ralph-prd/index.js.map +1 -0
  244. package/dist/hooks/ralph-progress/index.d.ts +102 -0
  245. package/dist/hooks/ralph-progress/index.d.ts.map +1 -0
  246. package/dist/hooks/ralph-progress/index.js +408 -0
  247. package/dist/hooks/ralph-progress/index.js.map +1 -0
  248. package/dist/hooks/ralph-verifier/index.d.ts +72 -0
  249. package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
  250. package/dist/hooks/ralph-verifier/index.js +223 -0
  251. package/dist/hooks/ralph-verifier/index.js.map +1 -0
  252. package/dist/hooks/session-recovery/constants.d.ts +56 -0
  253. package/dist/hooks/session-recovery/constants.d.ts.map +1 -0
  254. package/dist/hooks/session-recovery/constants.js +78 -0
  255. package/dist/hooks/session-recovery/constants.js.map +1 -0
  256. package/dist/hooks/session-recovery/index.d.ts +53 -0
  257. package/dist/hooks/session-recovery/index.d.ts.map +1 -0
  258. package/dist/hooks/session-recovery/index.js +321 -0
  259. package/dist/hooks/session-recovery/index.js.map +1 -0
  260. package/dist/hooks/session-recovery/storage.d.ts +76 -0
  261. package/dist/hooks/session-recovery/storage.d.ts.map +1 -0
  262. package/dist/hooks/session-recovery/storage.js +383 -0
  263. package/dist/hooks/session-recovery/storage.js.map +1 -0
  264. package/dist/hooks/session-recovery/types.d.ts +145 -0
  265. package/dist/hooks/session-recovery/types.d.ts.map +1 -0
  266. package/dist/hooks/session-recovery/types.js +8 -0
  267. package/dist/hooks/session-recovery/types.js.map +1 -0
  268. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
  269. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
  270. package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
  271. package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
  272. package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
  273. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
  274. package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
  275. package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
  276. package/dist/hooks/subagent-tracker/index.d.ts +83 -0
  277. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -0
  278. package/dist/hooks/subagent-tracker/index.js +207 -0
  279. package/dist/hooks/subagent-tracker/index.js.map +1 -0
  280. package/dist/hooks/ultraqa-loop/index.d.ts +94 -0
  281. package/dist/hooks/ultraqa-loop/index.d.ts.map +1 -0
  282. package/dist/hooks/ultraqa-loop/index.js +216 -0
  283. package/dist/hooks/ultraqa-loop/index.js.map +1 -0
  284. package/dist/hooks/ultrawork-state/index.d.ts +62 -0
  285. package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
  286. package/dist/hooks/ultrawork-state/index.js +208 -0
  287. package/dist/hooks/ultrawork-state/index.js.map +1 -0
  288. package/dist/hud/sisyphus-state.d.ts +31 -0
  289. package/dist/hud/sisyphus-state.d.ts.map +1 -0
  290. package/dist/hud/sisyphus-state.js +163 -0
  291. package/dist/hud/sisyphus-state.js.map +1 -0
  292. package/dist/installer/index.d.ts +1 -1
  293. package/dist/installer/index.js +1 -1
  294. package/docs/MIGRATION.md +2 -2
  295. package/docs/design/project-session-manager.md +1033 -0
  296. package/package.json +1 -1
  297. package/skills/doctor/SKILL.md +1 -1
  298. package/skills/project-session-manager/SKILL.md +410 -0
  299. package/skills/project-session-manager/lib/config.sh +86 -0
  300. package/skills/project-session-manager/lib/parse.sh +121 -0
  301. package/skills/project-session-manager/lib/session.sh +132 -0
  302. package/skills/project-session-manager/lib/tmux.sh +103 -0
  303. package/skills/project-session-manager/lib/worktree.sh +171 -0
  304. package/skills/project-session-manager/psm.sh +629 -0
  305. package/skills/project-session-manager/templates/feature.md +56 -0
  306. package/skills/project-session-manager/templates/issue-fix.md +57 -0
  307. package/skills/project-session-manager/templates/pr-review.md +65 -0
  308. package/skills/project-session-manager/templates/projects.json +19 -0
@@ -0,0 +1,132 @@
1
+ #!/bin/bash
2
+ # PSM Session Registry Management
3
+
4
+ # Add session to registry
5
+ # Usage: psm_add_session <id> <type> <project> <ref> <branch> <base> <tmux> <worktree> <source_repo> <metadata_json>
6
+ psm_add_session() {
7
+ local id="$1"
8
+ local type="$2"
9
+ local project="$3"
10
+ local ref="$4"
11
+ local branch="$5"
12
+ local base="$6"
13
+ local tmux_session="$7"
14
+ local worktree="$8"
15
+ local source_repo="$9"
16
+ local metadata="${10:-{}}"
17
+
18
+ local now=$(date -Iseconds)
19
+
20
+ local tmp=$(mktemp)
21
+ jq --arg id "$id" \
22
+ --arg type "$type" \
23
+ --arg project "$project" \
24
+ --arg ref "$ref" \
25
+ --arg branch "$branch" \
26
+ --arg base "$base" \
27
+ --arg tmux "$tmux_session" \
28
+ --arg worktree "$worktree" \
29
+ --arg source "$source_repo" \
30
+ --arg now "$now" \
31
+ --argjson meta "$metadata" \
32
+ '.sessions[$id] = {
33
+ "id": $id,
34
+ "type": $type,
35
+ "project": $project,
36
+ "ref": $ref,
37
+ "branch": $branch,
38
+ "base": $base,
39
+ "tmux": $tmux,
40
+ "worktree": $worktree,
41
+ "source_repo": $source,
42
+ "created_at": $now,
43
+ "last_accessed": $now,
44
+ "state": "active",
45
+ "metadata": $meta
46
+ } | .stats.total_created += 1' \
47
+ "$PSM_SESSIONS" > "$tmp" && mv "$tmp" "$PSM_SESSIONS"
48
+ }
49
+
50
+ # Get session by ID
51
+ # Usage: psm_get_session <id>
52
+ psm_get_session() {
53
+ local id="$1"
54
+ jq -r ".sessions[\"$id\"] // empty" "$PSM_SESSIONS"
55
+ }
56
+
57
+ # Update session state
58
+ # Usage: psm_update_session_state <id> <state>
59
+ psm_update_session_state() {
60
+ local id="$1"
61
+ local state="$2"
62
+ local now=$(date -Iseconds)
63
+
64
+ local tmp=$(mktemp)
65
+ jq --arg id "$id" \
66
+ --arg state "$state" \
67
+ --arg now "$now" \
68
+ '.sessions[$id].state = $state | .sessions[$id].last_accessed = $now' \
69
+ "$PSM_SESSIONS" > "$tmp" && mv "$tmp" "$PSM_SESSIONS"
70
+ }
71
+
72
+ # Remove session from registry
73
+ # Usage: psm_remove_session <id>
74
+ psm_remove_session() {
75
+ local id="$1"
76
+
77
+ local tmp=$(mktemp)
78
+ jq --arg id "$id" \
79
+ 'del(.sessions[$id]) | .stats.total_cleaned += 1' \
80
+ "$PSM_SESSIONS" > "$tmp" && mv "$tmp" "$PSM_SESSIONS"
81
+ }
82
+
83
+ # List all sessions
84
+ # Usage: psm_list_sessions [project]
85
+ psm_list_sessions() {
86
+ local project="$1"
87
+
88
+ if [[ -n "$project" ]]; then
89
+ jq -r ".sessions | to_entries[] | select(.value.project == \"$project\") | .value | \"\(.id)|\(.type)|\(.state)|\(.worktree)\"" "$PSM_SESSIONS"
90
+ else
91
+ jq -r '.sessions | to_entries[] | .value | "\(.id)|\(.type)|\(.state)|\(.worktree)"' "$PSM_SESSIONS"
92
+ fi
93
+ }
94
+
95
+ # Get sessions by state
96
+ psm_get_sessions_by_state() {
97
+ local state="$1"
98
+ jq -r ".sessions | to_entries[] | select(.value.state == \"$state\") | .value.id" "$PSM_SESSIONS"
99
+ }
100
+
101
+ # Get session count
102
+ psm_session_count() {
103
+ jq -r '.sessions | length' "$PSM_SESSIONS"
104
+ }
105
+
106
+ # Write session metadata file in worktree
107
+ # Usage: psm_write_session_metadata <worktree_path> <session_json>
108
+ psm_write_session_metadata() {
109
+ local worktree_path="$1"
110
+ local session_json="$2"
111
+
112
+ echo "$session_json" > "${worktree_path}/.psm-session.json"
113
+ }
114
+
115
+ # Read session metadata from worktree
116
+ psm_read_session_metadata() {
117
+ local worktree_path="$1"
118
+ local meta_file="${worktree_path}/.psm-session.json"
119
+
120
+ if [[ -f "$meta_file" ]]; then
121
+ cat "$meta_file"
122
+ fi
123
+ }
124
+
125
+ # Get all session IDs for cleanup check
126
+ psm_get_review_sessions() {
127
+ jq -r '.sessions | to_entries[] | select(.value.type == "review") | "\(.value.id)|\(.value.metadata.pr_number // empty)|\(.value.project)"' "$PSM_SESSIONS"
128
+ }
129
+
130
+ psm_get_fix_sessions() {
131
+ jq -r '.sessions | to_entries[] | select(.value.type == "fix") | "\(.value.id)|\(.value.metadata.issue_number // empty)|\(.value.project)"' "$PSM_SESSIONS"
132
+ }
@@ -0,0 +1,103 @@
1
+ #!/bin/bash
2
+ # PSM Tmux Session Management
3
+
4
+ # Check if tmux is available
5
+ psm_has_tmux() {
6
+ command -v tmux &> /dev/null
7
+ }
8
+
9
+ # Create a tmux session
10
+ # Usage: psm_create_tmux_session <session_name> <working_dir>
11
+ psm_create_tmux_session() {
12
+ local session_name="$1"
13
+ local working_dir="$2"
14
+
15
+ if ! psm_has_tmux; then
16
+ echo "error|tmux not found"
17
+ return 1
18
+ fi
19
+
20
+ # Check if session already exists
21
+ if tmux has-session -t "$session_name" 2>/dev/null; then
22
+ echo "exists|$session_name"
23
+ return 1
24
+ fi
25
+
26
+ # Create detached session
27
+ tmux new-session -d -s "$session_name" -c "$working_dir" 2>/dev/null || {
28
+ echo "error|Failed to create tmux session"
29
+ return 1
30
+ }
31
+
32
+ echo "created|$session_name"
33
+ return 0
34
+ }
35
+
36
+ # Launch Claude Code in tmux session
37
+ # Usage: psm_launch_claude <session_name>
38
+ psm_launch_claude() {
39
+ local session_name="$1"
40
+
41
+ if ! tmux has-session -t "$session_name" 2>/dev/null; then
42
+ echo "error|Session not found: $session_name"
43
+ return 1
44
+ fi
45
+
46
+ # Send claude command to the session
47
+ tmux send-keys -t "$session_name" "claude" Enter
48
+
49
+ echo "launched|$session_name"
50
+ return 0
51
+ }
52
+
53
+ # Kill a tmux session
54
+ # Usage: psm_kill_tmux_session <session_name>
55
+ psm_kill_tmux_session() {
56
+ local session_name="$1"
57
+
58
+ if ! tmux has-session -t "$session_name" 2>/dev/null; then
59
+ echo "not_found|$session_name"
60
+ return 0
61
+ fi
62
+
63
+ tmux kill-session -t "$session_name" 2>/dev/null || {
64
+ echo "error|Failed to kill session"
65
+ return 1
66
+ }
67
+
68
+ echo "killed|$session_name"
69
+ return 0
70
+ }
71
+
72
+ # List all PSM tmux sessions
73
+ psm_list_tmux_sessions() {
74
+ if ! psm_has_tmux; then
75
+ return 0
76
+ fi
77
+
78
+ tmux list-sessions -F "#{session_name}|#{session_created}|#{session_attached}" 2>/dev/null | grep "^psm:" || true
79
+ }
80
+
81
+ # Check if a tmux session exists
82
+ # Usage: psm_tmux_session_exists <session_name>
83
+ psm_tmux_session_exists() {
84
+ local session_name="$1"
85
+ tmux has-session -t "$session_name" 2>/dev/null
86
+ }
87
+
88
+ # Get current tmux session name
89
+ psm_current_tmux_session() {
90
+ if [[ -n "$TMUX" ]]; then
91
+ tmux display-message -p "#{session_name}" 2>/dev/null
92
+ fi
93
+ }
94
+
95
+ # Generate tmux session name
96
+ # Usage: psm_tmux_session_name <alias> <type> <id>
97
+ psm_tmux_session_name() {
98
+ local alias="$1"
99
+ local type="$2"
100
+ local id="$3"
101
+
102
+ echo "psm:${alias}:${type}-${id}"
103
+ }
@@ -0,0 +1,171 @@
1
+ #!/bin/bash
2
+ # PSM Worktree Management
3
+
4
+ # Create a worktree for PR review
5
+ # Usage: psm_create_pr_worktree <local_repo> <alias> <pr_number> <pr_branch>
6
+ psm_create_pr_worktree() {
7
+ local local_repo="$1"
8
+ local alias="$2"
9
+ local pr_number="$3"
10
+ local pr_branch="$4"
11
+
12
+ local worktree_root=$(psm_get_worktree_root)
13
+ local worktree_path="${worktree_root}/${alias}/pr-${pr_number}"
14
+
15
+ # Check if worktree already exists
16
+ if [[ -d "$worktree_path" ]]; then
17
+ echo "exists|$worktree_path"
18
+ return 1
19
+ fi
20
+
21
+ # Ensure parent directory exists
22
+ mkdir -p "${worktree_root}/${alias}"
23
+
24
+ # Fetch the PR branch
25
+ cd "$local_repo" || return 1
26
+ git fetch origin "pull/${pr_number}/head:psm-pr-${pr_number}-review" 2>/dev/null || {
27
+ echo "error|Failed to fetch PR #${pr_number}"
28
+ return 1
29
+ }
30
+
31
+ # Create worktree
32
+ git worktree add "$worktree_path" "psm-pr-${pr_number}-review" 2>/dev/null || {
33
+ echo "error|Failed to create worktree"
34
+ return 1
35
+ }
36
+
37
+ echo "created|$worktree_path"
38
+ return 0
39
+ }
40
+
41
+ # Create a worktree for issue fix
42
+ # Usage: psm_create_issue_worktree <local_repo> <alias> <issue_number> <slug> <base_branch>
43
+ psm_create_issue_worktree() {
44
+ local local_repo="$1"
45
+ local alias="$2"
46
+ local issue_number="$3"
47
+ local slug="$4"
48
+ local base_branch="${5:-main}"
49
+
50
+ local worktree_root=$(psm_get_worktree_root)
51
+ local worktree_path="${worktree_root}/${alias}/issue-${issue_number}"
52
+ local branch_name="fix/${issue_number}-${slug}"
53
+
54
+ # Check if worktree already exists
55
+ if [[ -d "$worktree_path" ]]; then
56
+ echo "exists|$worktree_path|$branch_name"
57
+ return 1
58
+ fi
59
+
60
+ mkdir -p "${worktree_root}/${alias}"
61
+
62
+ cd "$local_repo" || return 1
63
+
64
+ # Fetch latest from origin
65
+ git fetch origin "$base_branch" 2>/dev/null || {
66
+ echo "error|Failed to fetch $base_branch"
67
+ return 1
68
+ }
69
+
70
+ # Create and checkout new branch
71
+ git branch "$branch_name" "origin/$base_branch" 2>/dev/null || {
72
+ # Branch might already exist
73
+ true
74
+ }
75
+
76
+ # Create worktree
77
+ git worktree add "$worktree_path" "$branch_name" 2>/dev/null || {
78
+ echo "error|Failed to create worktree"
79
+ return 1
80
+ }
81
+
82
+ echo "created|$worktree_path|$branch_name"
83
+ return 0
84
+ }
85
+
86
+ # Create a worktree for feature development
87
+ # Usage: psm_create_feature_worktree <local_repo> <alias> <feature_name> <base_branch>
88
+ psm_create_feature_worktree() {
89
+ local local_repo="$1"
90
+ local alias="$2"
91
+ local feature_name="$3"
92
+ local base_branch="${4:-main}"
93
+
94
+ local worktree_root=$(psm_get_worktree_root)
95
+ local safe_name=$(psm_sanitize "$feature_name")
96
+ local worktree_path="${worktree_root}/${alias}/feat-${safe_name}"
97
+ local branch_name="feature/${safe_name}"
98
+
99
+ # Check if worktree already exists
100
+ if [[ -d "$worktree_path" ]]; then
101
+ echo "exists|$worktree_path|$branch_name"
102
+ return 1
103
+ fi
104
+
105
+ mkdir -p "${worktree_root}/${alias}"
106
+
107
+ cd "$local_repo" || return 1
108
+
109
+ # Fetch latest
110
+ git fetch origin "$base_branch" 2>/dev/null || {
111
+ echo "error|Failed to fetch $base_branch"
112
+ return 1
113
+ }
114
+
115
+ # Create branch
116
+ git branch "$branch_name" "origin/$base_branch" 2>/dev/null || true
117
+
118
+ # Create worktree
119
+ git worktree add "$worktree_path" "$branch_name" 2>/dev/null || {
120
+ echo "error|Failed to create worktree"
121
+ return 1
122
+ }
123
+
124
+ echo "created|$worktree_path|$branch_name"
125
+ return 0
126
+ }
127
+
128
+ # Remove a worktree
129
+ # Usage: psm_remove_worktree <local_repo> <worktree_path>
130
+ psm_remove_worktree() {
131
+ local local_repo="$1"
132
+ local worktree_path="$2"
133
+
134
+ if [[ ! -d "$worktree_path" ]]; then
135
+ echo "not_found|$worktree_path"
136
+ return 1
137
+ fi
138
+
139
+ # Check for uncommitted changes
140
+ if [[ -d "$worktree_path/.git" ]] || [[ -f "$worktree_path/.git" ]]; then
141
+ cd "$worktree_path" || return 1
142
+ if [[ -n $(git status --porcelain 2>/dev/null) ]]; then
143
+ echo "dirty|$worktree_path"
144
+ return 1
145
+ fi
146
+ fi
147
+
148
+ cd "$local_repo" || return 1
149
+ git worktree remove "$worktree_path" --force 2>/dev/null || {
150
+ # Force remove the directory if git worktree remove fails
151
+ rm -rf "$worktree_path"
152
+ }
153
+
154
+ echo "removed|$worktree_path"
155
+ return 0
156
+ }
157
+
158
+ # List all PSM worktrees
159
+ psm_list_worktrees() {
160
+ local worktree_root=$(psm_get_worktree_root)
161
+
162
+ if [[ ! -d "$worktree_root" ]]; then
163
+ return 0
164
+ fi
165
+
166
+ find "$worktree_root" -mindepth 2 -maxdepth 2 -type d 2>/dev/null | while read -r dir; do
167
+ local alias=$(basename "$(dirname "$dir")")
168
+ local name=$(basename "$dir")
169
+ echo "${alias}:${name}|${dir}"
170
+ done
171
+ }