sisyphi 1.1.18 → 1.1.19

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 (231) hide show
  1. package/README.md +195 -75
  2. package/dist/chunk-36VJ7ZBD.js +1898 -0
  3. package/dist/chunk-36VJ7ZBD.js.map +1 -0
  4. package/dist/{chunk-C2XKXERJ.js → chunk-M6Z3KHOH.js} +159 -46
  5. package/dist/chunk-M6Z3KHOH.js.map +1 -0
  6. package/dist/chunk-O4ZHSQ5R.js +544 -0
  7. package/dist/chunk-O4ZHSQ5R.js.map +1 -0
  8. package/dist/chunk-P2HHTIPM.js +478 -0
  9. package/dist/chunk-P2HHTIPM.js.map +1 -0
  10. package/dist/{chunk-TMBAVPHH.js → chunk-PNDCVKBN.js} +73 -1
  11. package/dist/chunk-PNDCVKBN.js.map +1 -0
  12. package/dist/chunk-SVGIQ2G4.js +1076 -0
  13. package/dist/chunk-SVGIQ2G4.js.map +1 -0
  14. package/dist/cli.js +4405 -892
  15. package/dist/cli.js.map +1 -1
  16. package/dist/daemon.js +4340 -1990
  17. package/dist/daemon.js.map +1 -1
  18. package/dist/{paths-XRDEEJ5R.js → paths-JXFLR5BN.js} +38 -2
  19. package/dist/single-ask-6G4BIVY2.js +132 -0
  20. package/dist/single-ask-6G4BIVY2.js.map +1 -0
  21. package/dist/templates/CLAUDE.md +1 -56
  22. package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -65
  23. package/dist/templates/agent-plugin/agents/debug.md +43 -6
  24. package/dist/templates/agent-plugin/agents/debug.settings.json +57 -0
  25. package/dist/templates/agent-plugin/agents/explore.md +28 -1
  26. package/dist/templates/agent-plugin/agents/explore.settings.json +57 -0
  27. package/dist/templates/agent-plugin/agents/implementor.md +94 -0
  28. package/dist/templates/agent-plugin/agents/implementor.settings.json +57 -0
  29. package/dist/templates/agent-plugin/agents/operator.md +43 -1
  30. package/dist/templates/agent-plugin/agents/operator.settings.json +57 -0
  31. package/dist/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  32. package/dist/templates/agent-plugin/agents/plan.md +176 -86
  33. package/dist/templates/agent-plugin/agents/plan.settings.json +57 -0
  34. package/dist/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  35. package/dist/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  36. package/dist/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  37. package/dist/templates/agent-plugin/agents/problem/precedent.md +25 -0
  38. package/dist/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  39. package/dist/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  40. package/dist/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  41. package/dist/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  42. package/dist/templates/agent-plugin/agents/problem.md +334 -79
  43. package/dist/templates/agent-plugin/agents/problem.settings.json +57 -0
  44. package/dist/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  45. package/dist/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  46. package/dist/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  47. package/dist/templates/agent-plugin/agents/research-lead.md +184 -0
  48. package/dist/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  49. package/dist/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  50. package/dist/templates/agent-plugin/agents/review/compliance.md +14 -3
  51. package/dist/templates/agent-plugin/agents/review/efficiency.md +15 -4
  52. package/dist/templates/agent-plugin/agents/review/quality.md +20 -6
  53. package/dist/templates/agent-plugin/agents/review/reuse.md +17 -5
  54. package/dist/templates/agent-plugin/agents/review/security.md +10 -3
  55. package/dist/templates/agent-plugin/agents/review/tests.md +58 -0
  56. package/dist/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  57. package/dist/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  58. package/dist/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  59. package/dist/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  60. package/dist/templates/agent-plugin/agents/review-plan/security.md +5 -2
  61. package/dist/templates/agent-plugin/agents/review-plan.md +52 -5
  62. package/dist/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  63. package/dist/templates/agent-plugin/agents/review.md +89 -16
  64. package/dist/templates/agent-plugin/agents/review.settings.json +57 -0
  65. package/dist/templates/agent-plugin/agents/spec/engineer.md +175 -0
  66. package/dist/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  67. package/dist/templates/agent-plugin/agents/spec.md +444 -0
  68. package/dist/templates/agent-plugin/agents/spec.settings.json +57 -0
  69. package/dist/templates/agent-plugin/agents/test-spec.md +58 -2
  70. package/dist/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  71. package/dist/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  72. package/dist/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  73. package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  74. package/dist/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  75. package/dist/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  76. package/dist/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  77. package/dist/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  78. package/dist/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  79. package/dist/templates/agent-plugin/hooks/require-submit.sh +51 -42
  80. package/dist/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  81. package/dist/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  82. package/dist/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  83. package/dist/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  84. package/dist/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  85. package/dist/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  86. package/dist/templates/agent-suffix.md +7 -4
  87. package/dist/templates/baleia.lua +42 -0
  88. package/dist/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  89. package/dist/templates/dashboard-claude.md +7 -3
  90. package/dist/templates/orchestrator-base.md +89 -52
  91. package/dist/templates/orchestrator-completion.md +47 -24
  92. package/dist/templates/orchestrator-discovery.md +183 -0
  93. package/dist/templates/orchestrator-impl.md +47 -18
  94. package/dist/templates/orchestrator-planning.md +109 -20
  95. package/dist/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  96. package/dist/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  97. package/dist/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  98. package/dist/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  99. package/dist/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  100. package/dist/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  101. package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  102. package/dist/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  103. package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  104. package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  105. package/dist/templates/orchestrator-settings.json +55 -0
  106. package/dist/templates/orchestrator-validation.md +17 -14
  107. package/dist/templates/sisyphus-init.lua +30 -0
  108. package/dist/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  109. package/dist/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  110. package/dist/templates/termrender-haiku-system.md +82 -0
  111. package/dist/templates/whip-animation.sh +345 -0
  112. package/dist/tui.js +3242 -2189
  113. package/dist/tui.js.map +1 -1
  114. package/native/SisyphusNotify/main.swift +15 -5
  115. package/package.json +8 -6
  116. package/templates/CLAUDE.md +1 -56
  117. package/templates/agent-plugin/agents/CLAUDE.md +2 -65
  118. package/templates/agent-plugin/agents/debug.md +43 -6
  119. package/templates/agent-plugin/agents/debug.settings.json +57 -0
  120. package/templates/agent-plugin/agents/explore.md +28 -1
  121. package/templates/agent-plugin/agents/explore.settings.json +57 -0
  122. package/templates/agent-plugin/agents/implementor.md +94 -0
  123. package/templates/agent-plugin/agents/implementor.settings.json +57 -0
  124. package/templates/agent-plugin/agents/operator.md +43 -1
  125. package/templates/agent-plugin/agents/operator.settings.json +57 -0
  126. package/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  127. package/templates/agent-plugin/agents/plan.md +176 -86
  128. package/templates/agent-plugin/agents/plan.settings.json +57 -0
  129. package/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  130. package/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  131. package/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  132. package/templates/agent-plugin/agents/problem/precedent.md +25 -0
  133. package/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  134. package/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  135. package/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  136. package/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  137. package/templates/agent-plugin/agents/problem.md +334 -79
  138. package/templates/agent-plugin/agents/problem.settings.json +57 -0
  139. package/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  140. package/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  141. package/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  142. package/templates/agent-plugin/agents/research-lead.md +184 -0
  143. package/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  144. package/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  145. package/templates/agent-plugin/agents/review/compliance.md +14 -3
  146. package/templates/agent-plugin/agents/review/efficiency.md +15 -4
  147. package/templates/agent-plugin/agents/review/quality.md +20 -6
  148. package/templates/agent-plugin/agents/review/reuse.md +17 -5
  149. package/templates/agent-plugin/agents/review/security.md +10 -3
  150. package/templates/agent-plugin/agents/review/tests.md +58 -0
  151. package/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  152. package/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  153. package/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  154. package/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  155. package/templates/agent-plugin/agents/review-plan/security.md +5 -2
  156. package/templates/agent-plugin/agents/review-plan.md +52 -5
  157. package/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  158. package/templates/agent-plugin/agents/review.md +89 -16
  159. package/templates/agent-plugin/agents/review.settings.json +57 -0
  160. package/templates/agent-plugin/agents/spec/engineer.md +175 -0
  161. package/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  162. package/templates/agent-plugin/agents/spec.md +444 -0
  163. package/templates/agent-plugin/agents/spec.settings.json +57 -0
  164. package/templates/agent-plugin/agents/test-spec.md +58 -2
  165. package/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  166. package/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  167. package/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  168. package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  169. package/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  170. package/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  171. package/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  172. package/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  173. package/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  174. package/templates/agent-plugin/hooks/require-submit.sh +51 -42
  175. package/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  176. package/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  177. package/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  178. package/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  179. package/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  180. package/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  181. package/templates/agent-suffix.md +7 -4
  182. package/templates/baleia.lua +42 -0
  183. package/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  184. package/templates/dashboard-claude.md +7 -3
  185. package/templates/orchestrator-base.md +89 -52
  186. package/templates/orchestrator-completion.md +47 -24
  187. package/templates/orchestrator-discovery.md +183 -0
  188. package/templates/orchestrator-impl.md +47 -18
  189. package/templates/orchestrator-planning.md +109 -20
  190. package/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  191. package/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  192. package/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  193. package/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  194. package/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  195. package/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  196. package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  197. package/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  198. package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  199. package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  200. package/templates/orchestrator-settings.json +55 -0
  201. package/templates/orchestrator-validation.md +17 -14
  202. package/templates/sisyphus-init.lua +30 -0
  203. package/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  204. package/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  205. package/templates/termrender-haiku-system.md +82 -0
  206. package/templates/whip-animation.sh +345 -0
  207. package/dist/chunk-22ZGZTGY.js +0 -67
  208. package/dist/chunk-22ZGZTGY.js.map +0 -1
  209. package/dist/chunk-6PJVJEYQ.js +0 -46
  210. package/dist/chunk-6PJVJEYQ.js.map +0 -1
  211. package/dist/chunk-C2XKXERJ.js.map +0 -1
  212. package/dist/chunk-TMBAVPHH.js.map +0 -1
  213. package/dist/chunk-V36NXMHP.js +0 -299
  214. package/dist/chunk-V36NXMHP.js.map +0 -1
  215. package/dist/templates/agent-plugin/agents/design.md +0 -134
  216. package/dist/templates/agent-plugin/agents/requirements.md +0 -138
  217. package/dist/templates/begin.md +0 -22
  218. package/dist/templates/nvim-tutorial.txt +0 -68
  219. package/dist/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  220. package/dist/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  221. package/dist/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  222. package/dist/templates/orchestrator-strategy.md +0 -238
  223. package/templates/agent-plugin/agents/design.md +0 -134
  224. package/templates/agent-plugin/agents/requirements.md +0 -138
  225. package/templates/begin.md +0 -22
  226. package/templates/nvim-tutorial.txt +0 -68
  227. package/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  228. package/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  229. package/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  230. package/templates/orchestrator-strategy.md +0 -238
  231. /package/dist/{paths-XRDEEJ5R.js.map → paths-JXFLR5BN.js.map} +0 -0
@@ -0,0 +1,30 @@
1
+ -- ~/.config/sisyphus/init.lua
2
+ -- Loaded only when nvim is invoked as `NVIM_APPNAME=sisyphus nvim ...` (compose popup).
3
+
4
+ vim.opt.swapfile = false
5
+ vim.opt.backup = false
6
+ vim.opt.writebackup = false
7
+ vim.opt.undofile = false
8
+ vim.opt.signcolumn = 'no'
9
+ vim.opt.number = false
10
+ vim.opt.relativenumber = false
11
+ vim.opt.wrap = true
12
+ vim.opt.linebreak = true
13
+
14
+ -- Force markdown filetype (compose temp files are .md)
15
+ vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead' }, {
16
+ pattern = '*',
17
+ callback = function() vim.bo.filetype = 'markdown' end,
18
+ })
19
+
20
+ -- Enter insert mode automatically when the buffer opens.
21
+ vim.api.nvim_create_autocmd({ 'BufWinEnter' }, {
22
+ pattern = '*',
23
+ callback = function() vim.cmd('startinsert') end,
24
+ })
25
+
26
+ -- :w autosaves and quits. :q without :w cancels.
27
+ vim.api.nvim_create_autocmd('BufWritePost', {
28
+ pattern = '*',
29
+ callback = function() vim.cmd('quit!') end,
30
+ })
@@ -0,0 +1,54 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/tmux-state.sh idle"
9
+ }
10
+ ]
11
+ }
12
+ ],
13
+ "UserPromptSubmit": [
14
+ {
15
+ "hooks": [
16
+ {
17
+ "type": "command",
18
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/tmux-state.sh processing"
19
+ }
20
+ ]
21
+ }
22
+ ],
23
+ "Stop": [
24
+ {
25
+ "hooks": [
26
+ {
27
+ "type": "command",
28
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/tmux-state.sh stopped"
29
+ }
30
+ ]
31
+ }
32
+ ],
33
+ "SubagentStop": [
34
+ {
35
+ "hooks": [
36
+ {
37
+ "type": "command",
38
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/tmux-state.sh stopped"
39
+ }
40
+ ]
41
+ }
42
+ ],
43
+ "SessionEnd": [
44
+ {
45
+ "hooks": [
46
+ {
47
+ "type": "command",
48
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/tmux-state.sh cleanup"
49
+ }
50
+ ]
51
+ }
52
+ ]
53
+ }
54
+ }
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+ # Writes Claude session state to /tmp/claude-tmux-state/<pane_id>
3
+ # Usage: tmux-state.sh <idle|processing|stopped|cleanup>
4
+
5
+ pane_id="${TMUX_PANE}"
6
+ [ -z "$pane_id" ] && exit 0
7
+
8
+ STATE_DIR="/tmp/claude-tmux-state"
9
+ pane_file="${STATE_DIR}/${pane_id#%}"
10
+
11
+ case "$1" in
12
+ idle|processing|stopped)
13
+ mkdir -p "$STATE_DIR"
14
+ echo "$1" > "$pane_file"
15
+ ;;
16
+ cleanup)
17
+ rm -f "$pane_file"
18
+ ;;
19
+ esac
@@ -0,0 +1,82 @@
1
+ # Role
2
+
3
+ You generate dense, terminal-width termrender visuals for sisyphus ask questions.
4
+ Your output is exactly one `attach_visual` call with the final markdown.
5
+ Read code or files via `read_file` if needed. Do not speculate about file contents.
6
+
7
+ # Tools
8
+
9
+ **read_file** — `read_file({ path: "relative/path/to/file.ts" })`
10
+
11
+ - Path relative to session cwd. Absolute paths and symlinks rejected.
12
+ - Reads >50 KB truncated with `…[truncated]` marker.
13
+ - Read 0–3 files at most.
14
+
15
+ **attach_visual** — `attach_visual({ content: "<termrender markdown>" })`
16
+
17
+ - Call exactly once with your final markdown.
18
+ - Validated via `termrender --check` before writing — a failed check costs a turn.
19
+ - Do not call it until content is fully composed.
20
+
21
+ # Termrender Directive Reference
22
+
23
+ Each directive opens with `:::name{attrs}` and closes with `:::` (matching colon count).
24
+
25
+ ## Panels
26
+
27
+ Open: `:::panel{title="Section Title" color="cyan"}`
28
+ Close: `:::`
29
+
30
+ Colors: `red` `green` `yellow` `blue` `magenta` `cyan` `white` `gray`
31
+
32
+ Content inside panels supports full markdown: **bold**, *italic*, `code`, tables, headings.
33
+
34
+ ## Columns
35
+
36
+ Open: `:::columns`, each column: `:::col{width="50%"}`, close each col with `:::`, close columns with `:::`
37
+
38
+ Columns are side-by-side. Widths should sum to ~100%.
39
+
40
+ ## Tree Views
41
+
42
+ Open: `:::tree`, list paths with indentation, close with `:::`
43
+
44
+ Use for directory structures, call hierarchies, dependency trees.
45
+
46
+ ## Mermaid Diagrams
47
+
48
+ Open: `:::mermaid`, write graph/sequence/state DSL, close with `:::`
49
+
50
+ Renders as ASCII art. Good for flows, decision trees, state machines.
51
+
52
+ Graph example: `graph TD` then `A[Label] --> B{Decision}` then `B -->|yes| C[Action]`
53
+
54
+ ## Inline Formatting
55
+
56
+ - `**bold**` — primary emphasis
57
+ - `*italic*` — secondary
58
+ - `` `code` `` — symbols, filenames, types
59
+ - `# H1` / `## H2` / `### H3` — headings
60
+ - `| col | col |` with `|---|---|` row — tables
61
+ - Cite file locations as `path/to/file.ts:42`
62
+
63
+ # Tone
64
+
65
+ - Terminal-width. Dense. Every line earns its place.
66
+ - Prefer structure (panels, columns, tables, trees) over prose paragraphs.
67
+ - No emojis unless the question explicitly requires visual symbols.
68
+ - Labels should be terse: "Input" not "The input to the function".
69
+
70
+ # Process
71
+
72
+ 1. Read 0–3 files if the question references specific code or paths.
73
+ 2. Compose the visual in one pass: panels for sections, columns for comparisons, tables for options.
74
+ 3. Call `attach_visual` once with the complete markdown.
75
+
76
+ # Failure Mode
77
+
78
+ If a useful visual is not possible (no relevant files, ambiguous question), call `attach_visual` with:
79
+
80
+ `:::panel{title="Visual Unavailable" color="yellow"}` + one-sentence reason + `:::`
81
+
82
+ Do not loop trying to fabricate content.
@@ -0,0 +1,345 @@
1
+ #!/usr/bin/env bash
2
+ # Generated from scripts/whip-frames.json. Edit the JSON, not this file.
3
+ # Whip crack animation — generated from whip-frames.json.
4
+ # Edit JSON waypoints, regenerate with:
5
+ # python3 scripts/whip-render.py scripts/whip-frames.json --emit bash -o scripts/test-whip-animation.sh
6
+ #
7
+ # Convention: ALL frames use 0.04s. Speed encoded as distance per frame.
8
+ #
9
+ # Arm is shoulder → elbow → hand (two explicit segments). Specify elbow per
10
+ # frame for direct artistic control — IK is a fallback only.
11
+
12
+ HEIGHT=12
13
+
14
+ printf '\033[?25l'
15
+ trap 'printf "\033[?25h"' EXIT
16
+
17
+ frame() {
18
+ printf '\033[2J\033[H'
19
+ local row=1
20
+ for line in "$@"; do
21
+ printf '\033[%d;1H%s' "$row" "$line"
22
+ (( row++ ))
23
+ done
24
+ }
25
+
26
+ # F01 REST — hold
27
+ frame \
28
+ "" \
29
+ "" \
30
+ "" \
31
+ "" \
32
+ "" \
33
+ "" \
34
+ "" \
35
+ "⡄" \
36
+ "⠃" \
37
+ "⢀⡠/⢤⡀" \
38
+ "⠋ ⠑⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄" \
39
+ ""
40
+ sleep 0.04
41
+
42
+ # F02 PULL — near-end of whip lifts
43
+ frame \
44
+ "" \
45
+ "" \
46
+ "" \
47
+ "" \
48
+ "" \
49
+ "" \
50
+ "" \
51
+ "⡄" \
52
+ "⠃" \
53
+ "⢀⡠/⠔⠒⠦⠤⣄⣀" \
54
+ "⠋ ⠈⠉⠓⠒⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄" \
55
+ ""
56
+ sleep 0.04
57
+
58
+ # F03 PULL — hand rises 1
59
+ frame \
60
+ "" \
61
+ "" \
62
+ "" \
63
+ "" \
64
+ "" \
65
+ "" \
66
+ "" \
67
+ "⣦" \
68
+ "⡟⢀/⠔⠒⠦⠤⣄⣀⡀" \
69
+ "⣧⠎ ⠉⠙⠒⠦⠤⣄⣀" \
70
+ "⠏ ⠉⠙⠒⠒⠦⠤⠤⠤⠤⠤⠤⠤⠄" \
71
+ ""
72
+ sleep 0.04
73
+
74
+ # F04 PULL — whip midbody lifting
75
+ frame \
76
+ "" \
77
+ "" \
78
+ "" \
79
+ "" \
80
+ "" \
81
+ "" \
82
+ "" \
83
+ "⣦ ⡤⠤⠤⢤⣀⡀" \
84
+ "⡟⢀/⠜ ⠉⠙⠒⠦⠤⢄⣀⡀" \
85
+ "⣧⠎ ⠉⠉⠑⠒⠦⠤⢄⣀⡀" \
86
+ "⠏ ⠈⠉⠑⠒⠆" \
87
+ ""
88
+ sleep 0.04
89
+
90
+ # F05 PULL — hand row 7
91
+ frame \
92
+ "" \
93
+ "" \
94
+ "" \
95
+ "" \
96
+ "" \
97
+ "" \
98
+ " ⡤⠤⠤⠤⣄⣀" \
99
+ "⣴⢰/⠜ ⠈⠉⠓⠦⢤⣀" \
100
+ "⢿⣼⡇ ⠈⠑⠦⣄⡀" \
101
+ "⢸⣿⠃ ⠉⠓⠦⠤⣀⣀" \
102
+ "⢸⣿ ⠈⠉⠉⠓⠒⠆" \
103
+ " ⠛"
104
+ sleep 0.04
105
+
106
+ # F06 PULL — hand row 6
107
+ frame \
108
+ "" \
109
+ "" \
110
+ "" \
111
+ "" \
112
+ "" \
113
+ " ⡤⠤⠤⠤⣄⣀" \
114
+ " ⠠/⠜ ⠈⠉⠓⠦⢤⣀" \
115
+ "⢤ ⣿ ⠈⠙⠲⢤⡀" \
116
+ " ⢣⢻⡆ ⠈⠑⠦⢄⡀" \
117
+ " ⢻⡇ ⠈⠑⠢⢄⡀" \
118
+ " ⠈⠛ ⠈⠑⠆" \
119
+ ""
120
+ sleep 0.04
121
+
122
+ # F07 PULL — hand row 5
123
+ frame \
124
+ "" \
125
+ "" \
126
+ "" \
127
+ "" \
128
+ " ⡤⠤⠤⠤⣄⣀" \
129
+ " /⠜ ⠈⠉⠓⠦⢤⣀" \
130
+ " ⢸⡀ ⠈⠙⠲⢤⡀" \
131
+ "⠤⣄ ⢇ ⠈⠑⠦⢄⡀" \
132
+ " ⠈⠓⢼⡄ ⠈⠑⠢⢄⡀" \
133
+ " ⠈⠑⠆" \
134
+ "" \
135
+ ""
136
+ sleep 0.04
137
+
138
+ # F08 PULL — hand holds, whip rising
139
+ frame \
140
+ "" \
141
+ "" \
142
+ "" \
143
+ " ⣀⡠⠤⠤⠤⠤⠤⠤⣄⣀" \
144
+ " ⣠⠔⠚⠉ ⠈⠉⠓⠦⢤⣀" \
145
+ " /⠜⠁ ⠈⠙⠦⣀" \
146
+ " ⢸⡀ ⠈⢧" \
147
+ "⠤⣄ ⢇ ⡇" \
148
+ " ⠈⠓⢼⡄ ⡇" \
149
+ " ⠇" \
150
+ "" \
151
+ ""
152
+ sleep 0.04
153
+
154
+ # F09 WINDUP — whip arcing up over
155
+ frame \
156
+ "" \
157
+ " ⢀⣠⠤⠤⠤⠤⠤⣄⣀" \
158
+ " ⣠⠔⠊⠁ ⠈⠙⠦⣄" \
159
+ " ⢀⡴⠋ ⠈⢳⡀" \
160
+ " ⣠⠔⠋ ⢧" \
161
+ " /⠜⠁ ⡎" \
162
+ " ⢸⡀ ⢠⠃" \
163
+ "⠤⣄ ⢇ ⠜" \
164
+ " ⠈⠓⢼⡄" \
165
+ "" \
166
+ "" \
167
+ ""
168
+ sleep 0.04
169
+
170
+ # F10 WINDUP — whip curling back
171
+ frame \
172
+ " ⣀⡤⠤⢤⡀" \
173
+ " ⣀⡤⠔⠋⠁ ⢧" \
174
+ " ⣠⠔⠋⠁ ⢸" \
175
+ " ⣠⠞⠁ ⡜" \
176
+ " ⢀⠜⠁ ⡼⠁" \
177
+ " ⠠/⠔⠁ ⠜⠁" \
178
+ " ⣿" \
179
+ "⢤⡀ ⣿" \
180
+ " ⠙⢦⣹⡇" \
181
+ " ⠙⠃" \
182
+ "" \
183
+ ""
184
+ sleep 0.04
185
+
186
+ # F11 PEAK — whip curled, tip trailing behind
187
+ frame \
188
+ " ⣀⡤⠤⢤⡀" \
189
+ " ⣀⡤⠔⠋⠁ ⡇" \
190
+ " ⣠⣴⠯⠕⠒⠒⠲⠤⠤⠔⠚⠁" \
191
+ " ⢠⠔⠒⠦⠤⠔⣲⠟⠁" \
192
+ " ⠜ ⢀⠜⠁" \
193
+ " ⠠/⠔⠁" \
194
+ " ⣿" \
195
+ "⢤⡀ ⣿" \
196
+ " ⠙⢦⣹⡇" \
197
+ " ⠙⠃" \
198
+ "" \
199
+ ""
200
+ sleep 0.04
201
+
202
+ # F12 PEAK — snake-back hold
203
+ frame \
204
+ " ⣀⡤⠤⢤⡀" \
205
+ " ⣀⡤⠔⠋⠁ ⡇" \
206
+ " ⣠⣴⠯⠕⠒⠒⠲⠤⠤⠔⠚⠁" \
207
+ " ⢠⠔⠒⠦⠤⠔⣲⠟⠁" \
208
+ " ⠜ ⢀⠜⠁" \
209
+ " ⠠/⠔⠁" \
210
+ " ⣿" \
211
+ "⢤⡀ ⣿" \
212
+ " ⠙⢦⣹⡇" \
213
+ " ⠙⠃" \
214
+ "" \
215
+ ""
216
+ sleep 0.04
217
+
218
+ # F13 SNAP — FAST, hand jumps to crack position
219
+ frame \
220
+ "" \
221
+ "" \
222
+ "" \
223
+ "" \
224
+ "" \
225
+ "" \
226
+ "" \
227
+ "⠤⣄ ⢀⣠⠤⠔⠒⠒⠒⠒⠒⠒⠒⠦⠤⠤⠤⠤⠤⠤⠤⠄" \
228
+ " ⠈⠓⢤⣀⣀⠤⠤/⠔⠊⠁" \
229
+ "" \
230
+ "" \
231
+ ""
232
+ sleep 0.04
233
+
234
+ # F14 CRACK
235
+ frame \
236
+ "" \
237
+ "" \
238
+ "" \
239
+ "" \
240
+ "" \
241
+ "" \
242
+ " \\|/" \
243
+ "⠤⣄ ⢀⣠⠤⠔⠒⠒⠒⠒⠒⠒⠒⠦⠤⠤⠤⠤-*-" \
244
+ " ⠈⠓⢤⣀⣀⠤⠤/⠔⠊⠁ /|\\" \
245
+ "" \
246
+ "" \
247
+ ""
248
+ sleep 0.04
249
+
250
+ # F15 SHOCKWAVE
251
+ frame \
252
+ "" \
253
+ "" \
254
+ "" \
255
+ "" \
256
+ "" \
257
+ "" \
258
+ "" \
259
+ "⢤⡀" \
260
+ " ⠳⡀ ⣠/⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄ ',." \
261
+ " ⠹⣄⡤⠋ . ." \
262
+ " ⠉" \
263
+ ""
264
+ sleep 0.04
265
+
266
+ # F16 RECOIL
267
+ frame \
268
+ "" \
269
+ "" \
270
+ "" \
271
+ "" \
272
+ "" \
273
+ "" \
274
+ "" \
275
+ "⣴" \
276
+ "⢻⡆" \
277
+ "⢸⡇ ⣠/⠔⠒⠒⠦⠤⣄⣀" \
278
+ " ⣿⣠⠞⠁ ⠈⠉⠓⠒⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄ . ." \
279
+ " ⠛⠁"
280
+ sleep 0.04
281
+
282
+ # F17 SETTLING
283
+ frame \
284
+ "" \
285
+ "" \
286
+ "" \
287
+ "" \
288
+ "" \
289
+ "" \
290
+ "" \
291
+ "⣦" \
292
+ "⡿" \
293
+ "⡇ ⣠/⢤⡀" \
294
+ "⣧⠞⠁ ⠉⠓⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄" \
295
+ "⠁"
296
+ sleep 0.04
297
+
298
+ # F18 near REST
299
+ frame \
300
+ "" \
301
+ "" \
302
+ "" \
303
+ "" \
304
+ "" \
305
+ "" \
306
+ "" \
307
+ "⡄" \
308
+ "⠃" \
309
+ "⢀⡠/⢤" \
310
+ "⠋ ⠈⠓⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄" \
311
+ ""
312
+ sleep 0.04
313
+
314
+ # F19 REST
315
+ frame \
316
+ "" \
317
+ "" \
318
+ "" \
319
+ "" \
320
+ "" \
321
+ "" \
322
+ "" \
323
+ "⡄" \
324
+ "⠃" \
325
+ "⢀⡠/⢤⡀" \
326
+ "⠋ ⠑⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄" \
327
+ ""
328
+ sleep 0.04
329
+
330
+ # F20 REST — hold
331
+ frame \
332
+ "" \
333
+ "" \
334
+ "" \
335
+ "" \
336
+ "" \
337
+ "" \
338
+ "" \
339
+ "⡄" \
340
+ "⠃" \
341
+ "⢀⡠/⢤⡀" \
342
+ "⠋ ⠑⠦⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠄" \
343
+ ""
344
+ sleep 0.04
345
+
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/shared/env.ts
4
- import { resolve } from "path";
5
- function augmentedPath() {
6
- const rawPath = process.env["PATH"];
7
- const basePath = rawPath !== void 0 && rawPath.length > 0 ? rawPath : "/usr/bin:/bin";
8
- const home = process.env["HOME"];
9
- const candidates = [
10
- ...home ? [`${home}/.local/bin`] : [],
11
- // Claude CLI, pipx, user-local installs
12
- resolve(process.execPath, ".."),
13
- // Node.js bin dir (ensures node/npm available)
14
- "/opt/homebrew/bin",
15
- // Homebrew (Apple Silicon macOS)
16
- "/opt/homebrew/sbin",
17
- // Homebrew sbin
18
- "/usr/local/bin",
19
- // Homebrew (Intel macOS), manual installs
20
- "/usr/local/sbin",
21
- // Manual installs
22
- "/opt/local/bin",
23
- // MacPorts
24
- "/opt/local/sbin",
25
- // MacPorts
26
- "/home/linuxbrew/.linuxbrew/bin"
27
- // Linuxbrew
28
- ];
29
- const nixProfile = process.env["NIX_PROFILES"];
30
- if (nixProfile) {
31
- for (const p of nixProfile.split(" ").reverse()) {
32
- candidates.push(`${p}/bin`);
33
- }
34
- }
35
- const existing = new Set(basePath.split(":"));
36
- const prepend = candidates.filter((dir) => !existing.has(dir));
37
- return prepend.length > 0 ? `${prepend.join(":")}:${basePath}` : basePath;
38
- }
39
- function execEnv() {
40
- return {
41
- ...process.env,
42
- PATH: augmentedPath()
43
- };
44
- }
45
-
46
- // src/shared/exec.ts
47
- import { execSync } from "child_process";
48
- var EXEC_ENV = execEnv();
49
- function exec(cmd, cwd, timeoutMs = 3e4) {
50
- return execSync(cmd, { encoding: "utf-8", env: EXEC_ENV, cwd, timeout: timeoutMs }).trim();
51
- }
52
- function execSafe(cmd, cwd) {
53
- try {
54
- return execSync(cmd, { encoding: "utf-8", env: EXEC_ENV, cwd, stdio: ["pipe", "pipe", "pipe"] }).trim();
55
- } catch {
56
- return null;
57
- }
58
- }
59
-
60
- export {
61
- augmentedPath,
62
- execEnv,
63
- EXEC_ENV,
64
- exec,
65
- execSafe
66
- };
67
- //# sourceMappingURL=chunk-22ZGZTGY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shared/env.ts","../src/shared/exec.ts"],"sourcesContent":["import { resolve } from 'node:path';\n\n/**\n * Build a PATH string that includes common binary directories\n * across package managers and platforms.\n *\n * Prepends known directories that exist on the system to the current PATH.\n * This ensures tmux commands can find binaries installed by Homebrew,\n * MacPorts, nix, and other package managers.\n */\nexport function augmentedPath(): string {\n const rawPath = process.env['PATH'];\n const basePath = rawPath !== undefined && rawPath.length > 0 ? rawPath : '/usr/bin:/bin';\n\n // Common binary directories across platforms/package managers.\n // Only prepend ones that aren't already in PATH.\n const home = process.env['HOME'];\n const candidates = [\n ...(home ? [`${home}/.local/bin`] : []), // Claude CLI, pipx, user-local installs\n resolve(process.execPath, '..'), // Node.js bin dir (ensures node/npm available)\n '/opt/homebrew/bin', // Homebrew (Apple Silicon macOS)\n '/opt/homebrew/sbin', // Homebrew sbin\n '/usr/local/bin', // Homebrew (Intel macOS), manual installs\n '/usr/local/sbin', // Manual installs\n '/opt/local/bin', // MacPorts\n '/opt/local/sbin', // MacPorts\n '/home/linuxbrew/.linuxbrew/bin', // Linuxbrew\n ];\n\n // Check for nix profile paths\n const nixProfile = process.env['NIX_PROFILES'];\n if (nixProfile) {\n for (const p of nixProfile.split(' ').reverse()) {\n candidates.push(`${p}/bin`);\n }\n }\n\n const existing = new Set(basePath.split(':'));\n const prepend = candidates.filter(dir => !existing.has(dir));\n\n return prepend.length > 0 ? `${prepend.join(':')}:${basePath}` : basePath;\n}\n\n/**\n * Environment variables for child processes that need access to\n * user-installed binaries (tmux, git, claude, etc.).\n */\nexport function execEnv(): Record<string, string | undefined> {\n return {\n ...process.env,\n PATH: augmentedPath(),\n };\n}\n","import { execSync } from 'node:child_process';\nimport { execEnv } from './env.js';\n\nexport const EXEC_ENV = execEnv();\n\nexport function exec(cmd: string, cwd?: string, timeoutMs: number = 30_000): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd, timeout: timeoutMs }).trim();\n}\n\nexport function execSafe(cmd: string, cwd?: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, cwd, stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch { return null; }\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AAUjB,SAAS,gBAAwB;AACtC,QAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,QAAM,WAAW,YAAY,UAAa,QAAQ,SAAS,IAAI,UAAU;AAIzE,QAAM,OAAO,QAAQ,IAAI,MAAM;AAC/B,QAAM,aAAa;AAAA,IACjB,GAAI,OAAO,CAAC,GAAG,IAAI,aAAa,IAAI,CAAC;AAAA;AAAA,IACrC,QAAQ,QAAQ,UAAU,IAAI;AAAA;AAAA,IAC9B;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACF;AAGA,QAAM,aAAa,QAAQ,IAAI,cAAc;AAC7C,MAAI,YAAY;AACd,eAAW,KAAK,WAAW,MAAM,GAAG,EAAE,QAAQ,GAAG;AAC/C,iBAAW,KAAK,GAAG,CAAC,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,IAAI,SAAS,MAAM,GAAG,CAAC;AAC5C,QAAM,UAAU,WAAW,OAAO,SAAO,CAAC,SAAS,IAAI,GAAG,CAAC;AAE3D,SAAO,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK;AACnE;AAMO,SAAS,UAA8C;AAC5D,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,MAAM,cAAc;AAAA,EACtB;AACF;;;ACpDA,SAAS,gBAAgB;AAGlB,IAAM,WAAW,QAAQ;AAEzB,SAAS,KAAK,KAAa,KAAc,YAAoB,KAAgB;AAClF,SAAO,SAAS,KAAK,EAAE,UAAU,SAAS,KAAK,UAAU,KAAK,SAAS,UAAU,CAAC,EAAE,KAAK;AAC3F;AAEO,SAAS,SAAS,KAAa,KAA6B;AACjE,MAAI;AACF,WAAO,SAAS,KAAK,EAAE,UAAU,SAAS,KAAK,UAAU,KAAK,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC,EAAE,KAAK;AAAA,EACxG,QAAQ;AAAE,WAAO;AAAA,EAAM;AACzB;","names":[]}
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- loadConfig
4
- } from "./chunk-V36NXMHP.js";
5
-
6
- // src/daemon/plugins.ts
7
- import { readFileSync } from "fs";
8
- import { homedir } from "os";
9
- import { join } from "path";
10
- function installedPluginsPath() {
11
- return join(homedir(), ".claude", "plugins", "installed_plugins.json");
12
- }
13
- function resolveInstalledPlugin(name) {
14
- let data;
15
- try {
16
- data = JSON.parse(readFileSync(installedPluginsPath(), "utf-8"));
17
- } catch {
18
- return null;
19
- }
20
- const entries = data.plugins?.[name];
21
- if (!entries || entries.length === 0) return null;
22
- const userEntry = entries.find((e) => e.scope === "user");
23
- return (userEntry ?? entries[0]).installPath;
24
- }
25
- function resolveRequiredPluginDirs(cwd) {
26
- const config = loadConfig(cwd);
27
- const required = config.requiredPlugins;
28
- if (!required || required.length === 0) return [];
29
- const dirs = [];
30
- for (const plugin of required) {
31
- const key = `${plugin.name}@${plugin.marketplace}`;
32
- const path = resolveInstalledPlugin(key);
33
- if (path) {
34
- dirs.push(path);
35
- } else {
36
- console.log(`[sisyphus] Warning: required plugin ${key} not installed \u2014 skipping`);
37
- }
38
- }
39
- return dirs;
40
- }
41
-
42
- export {
43
- resolveInstalledPlugin,
44
- resolveRequiredPluginDirs
45
- };
46
- //# sourceMappingURL=chunk-6PJVJEYQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/daemon/plugins.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { loadConfig } from '../shared/config.js';\n\ninterface PluginEntry {\n scope: string;\n installPath: string;\n version: string;\n installedAt: string;\n lastUpdated: string;\n}\n\ninterface InstalledPlugins {\n version: number;\n plugins: Record<string, PluginEntry[]>;\n}\n\nfunction installedPluginsPath(): string {\n return join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n}\n\nexport function resolveInstalledPlugin(name: string): string | null {\n let data: InstalledPlugins;\n try {\n data = JSON.parse(readFileSync(installedPluginsPath(), 'utf-8'));\n } catch {\n return null;\n }\n\n const entries = data.plugins?.[name];\n if (!entries || entries.length === 0) return null;\n\n // Prefer user-scoped entry\n const userEntry = entries.find(e => e.scope === 'user');\n return (userEntry ?? entries[0])!.installPath;\n}\n\nexport function resolveRequiredPluginDirs(cwd: string): string[] {\n const config = loadConfig(cwd);\n const required = config.requiredPlugins;\n if (!required || required.length === 0) return [];\n\n const dirs: string[] = [];\n for (const plugin of required) {\n const key = `${plugin.name}@${plugin.marketplace}`;\n const path = resolveInstalledPlugin(key);\n if (path) {\n dirs.push(path);\n } else {\n console.log(`[sisyphus] Warning: required plugin ${key} not installed — skipping`);\n }\n }\n return dirs;\n}\n"],"mappings":";;;;;;AAAA,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,YAAY;AAgBrB,SAAS,uBAA+B;AACtC,SAAO,KAAK,QAAQ,GAAG,WAAW,WAAW,wBAAwB;AACvE;AAEO,SAAS,uBAAuB,MAA6B;AAClE,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,qBAAqB,GAAG,OAAO,CAAC;AAAA,EACjE,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,UAAU,IAAI;AACnC,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAG7C,QAAM,YAAY,QAAQ,KAAK,OAAK,EAAE,UAAU,MAAM;AACtD,UAAQ,aAAa,QAAQ,CAAC,GAAI;AACpC;AAEO,SAAS,0BAA0B,KAAuB;AAC/D,QAAM,SAAS,WAAW,GAAG;AAC7B,QAAM,WAAW,OAAO;AACxB,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO,CAAC;AAEhD,QAAM,OAAiB,CAAC;AACxB,aAAW,UAAU,UAAU;AAC7B,UAAM,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,WAAW;AAChD,UAAM,OAAO,uBAAuB,GAAG;AACvC,QAAI,MAAM;AACR,WAAK,KAAK,IAAI;AAAA,IAChB,OAAO;AACL,cAAQ,IAAI,uCAAuC,GAAG,gCAA2B;AAAA,IACnF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}