ui-chan-mcp 0.5.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 (151) hide show
  1. package/.claude-plugin/marketplace.json +13 -0
  2. package/.claude-plugin/plugin.json +6 -0
  3. package/.env.example +13 -0
  4. package/LICENSE +36 -0
  5. package/README.md +214 -0
  6. package/agents/mode.md +47 -0
  7. package/agents/talk.md +23 -0
  8. package/bin/ui-chan-mcp.mjs +11 -0
  9. package/bin/ui-chan-node +35 -0
  10. package/bin/ui-chan.mjs +350 -0
  11. package/context/AFFINITY.md +94 -0
  12. package/context/SOUL.md +79 -0
  13. package/context/VOCABULARY.md +108 -0
  14. package/cue.schema.json +109 -0
  15. package/cues/default.json +21 -0
  16. package/cues/emo_anger.json +14 -0
  17. package/cues/emo_anger_hi.json +19 -0
  18. package/cues/emo_anger_lo.json +16 -0
  19. package/cues/emo_antic.json +18 -0
  20. package/cues/emo_antic_hi.json +16 -0
  21. package/cues/emo_antic_lo.json +6 -0
  22. package/cues/emo_disgust.json +19 -0
  23. package/cues/emo_disgust_hi.json +20 -0
  24. package/cues/emo_disgust_lo.json +6 -0
  25. package/cues/emo_fear.json +19 -0
  26. package/cues/emo_fear_hi.json +19 -0
  27. package/cues/emo_fear_lo.json +19 -0
  28. package/cues/emo_joy.json +17 -0
  29. package/cues/emo_joy_hi.json +15 -0
  30. package/cues/emo_joy_lo.json +13 -0
  31. package/cues/emo_sad.json +15 -0
  32. package/cues/emo_sad_hi.json +18 -0
  33. package/cues/emo_sad_lo.json +14 -0
  34. package/cues/emo_surprise.json +15 -0
  35. package/cues/emo_surprise_hi.json +14 -0
  36. package/cues/emo_surprise_lo.json +11 -0
  37. package/cues/emo_trust.json +16 -0
  38. package/cues/emo_trust_hi.json +20 -0
  39. package/cues/emo_trust_lo.json +6 -0
  40. package/cues/idling_doze_1.json +9 -0
  41. package/cues/idling_doze_2.json +9 -0
  42. package/cues/idling_doze_3.json +9 -0
  43. package/cues/idling_giggle_1.json +9 -0
  44. package/cues/idling_giggle_2.json +9 -0
  45. package/cues/idling_lookaround_1.json +10 -0
  46. package/cues/idling_lookaround_2.json +10 -0
  47. package/cues/idling_lookaround_3.json +10 -0
  48. package/cues/idling_ponder.json +9 -0
  49. package/cues/idling_sigh_1.json +11 -0
  50. package/cues/idling_sigh_2.json +11 -0
  51. package/cues/idling_yawn_1.json +9 -0
  52. package/cues/idling_yawn_2.json +12 -0
  53. package/cues/idling_yawn_3.json +12 -0
  54. package/cues/mix_anger_antic.json +16 -0
  55. package/cues/mix_antic_joy.json +16 -0
  56. package/cues/mix_disgust_anger.json +17 -0
  57. package/cues/mix_fear_surprise.json +18 -0
  58. package/cues/mix_joy_trust.json +19 -0
  59. package/cues/mix_joy_trust_hi.json +18 -0
  60. package/cues/mix_sad_disgust.json +12 -0
  61. package/cues/mix_surprise_sad.json +21 -0
  62. package/cues/mix_surprise_sad_hi.json +14 -0
  63. package/cues/mix_trust_fear.json +18 -0
  64. package/cues/pose_arms_crossed.json +9 -0
  65. package/cues/pose_banzai.json +17 -0
  66. package/cues/pose_smug_arms.json +11 -0
  67. package/cues/pose_smug_hips.json +11 -0
  68. package/cues/pose_think.json +8 -0
  69. package/cues/pose_umbrella.json +9 -0
  70. package/cues/self_guilt.json +20 -0
  71. package/cues/self_pride.json +10 -0
  72. package/cues/self_shame.json +19 -0
  73. package/cues/self_shy.json +16 -0
  74. package/cues/self_shy_hi.json +17 -0
  75. package/cues/sys_address.json +9 -0
  76. package/cues/sys_awkward.json +18 -0
  77. package/cues/sys_beam.json +18 -0
  78. package/cues/sys_blank.json +11 -0
  79. package/cues/sys_care.json +18 -0
  80. package/cues/sys_confused.json +12 -0
  81. package/cues/sys_dazed.json +10 -0
  82. package/cues/sys_dread.json +21 -0
  83. package/cues/sys_fluster.json +20 -0
  84. package/cues/sys_intro.json +15 -0
  85. package/cues/sys_laugh.json +20 -0
  86. package/cues/sys_neutral.json +5 -0
  87. package/cues/sys_present.json +9 -0
  88. package/cues/sys_rain.json +15 -0
  89. package/cues/sys_refuse.json +18 -0
  90. package/cues/sys_relief.json +15 -0
  91. package/cues/sys_sleepy.json +8 -0
  92. package/cues/sys_smirk.json +10 -0
  93. package/cues/sys_stream.json +15 -0
  94. package/cues/sys_success.json +15 -0
  95. package/cues/sys_think.json +9 -0
  96. package/dist/app/assets.js +54 -0
  97. package/dist/app/cues.js +130 -0
  98. package/dist/app/editor-main.js +199 -0
  99. package/dist/app/editor-preload.js +17 -0
  100. package/dist/app/main.js +527 -0
  101. package/dist/app/persona.js +136 -0
  102. package/dist/app/preload.js +14 -0
  103. package/dist/app/state.js +850 -0
  104. package/dist/app/tts.js +257 -0
  105. package/dist/mcp-server.js +408 -0
  106. package/dist/renderer/bundle.js +17983 -0
  107. package/dist/renderer/editor.html +150 -0
  108. package/dist/renderer/editor.js +17917 -0
  109. package/dist/renderer/index.html +425 -0
  110. package/dist/shared/paths.js +169 -0
  111. package/dist/shared/set-cue-schema.js +66 -0
  112. package/dist/shared/types.js +14 -0
  113. package/docs/CLIENTS.md +110 -0
  114. package/docs/CUE_AUTHORING.md +76 -0
  115. package/docs/DEVELOPMENT.md +129 -0
  116. package/docs/PERSONA.md +61 -0
  117. package/docs/PSD_LAYERS.md +123 -0
  118. package/docs/README.md +43 -0
  119. package/docs/SETUP.html +684 -0
  120. package/docs/STYLE.md +107 -0
  121. package/docs/TOOLS.md +33 -0
  122. package/docs/TROUBLESHOOTING.md +122 -0
  123. package/docs/TTS.md +61 -0
  124. package/docs/design/CUE_CATALOG.md +259 -0
  125. package/docs/images/faces.png +0 -0
  126. package/docs/images/panel.png +0 -0
  127. package/hooks/fire-event.js +14 -0
  128. package/hooks/hooks.json +77 -0
  129. package/hooks/lib/mascot.js +76 -0
  130. package/hooks/notify.js +15 -0
  131. package/hooks/reaction.js +46 -0
  132. package/hooks/session-start.js +80 -0
  133. package/package.json +96 -0
  134. package/persona/ui-chan.md +111 -0
  135. package/plugins/hermes/ui-chan/__init__.py +98 -0
  136. package/plugins/hermes/ui-chan/plugin.yaml +7 -0
  137. package/plugins/opencode/ui-chan.mjs +105 -0
  138. package/skills/beam/SKILL.md +37 -0
  139. package/skills/eli14/SKILL.md +139 -0
  140. package/skills/eli14/references/base.html +495 -0
  141. package/skills/mode/SKILL.md +67 -0
  142. package/skills/talk/SKILL.md +27 -0
  143. package/tools/setup/check-package.mjs +47 -0
  144. package/tools/setup/clients.mjs +399 -0
  145. package/tools/setup/doctor.mjs +105 -0
  146. package/tools/setup/home.mjs +126 -0
  147. package/tools/setup/prompt.mjs +134 -0
  148. package/tools/setup/update-check.mjs +8 -0
  149. package/tools/setup/update.mjs +350 -0
  150. package/tools/stop-app.mjs +22 -0
  151. package/ui-chan.config.json +973 -0
@@ -0,0 +1,150 @@
1
+ <!doctype html>
2
+ <html lang="ja">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; media-src blob:" />
6
+ <title>雨衣ちゃんのデバッグルーム</title>
7
+ <style>
8
+ :root {
9
+ --bg: #1e1f26;
10
+ --panel: #262832;
11
+ --panel2: #2e313d;
12
+ --line: #3a3d4a;
13
+ --fg: #e6e6ee;
14
+ --muted: #9aa0b0;
15
+ --accent: #4e5bb5;
16
+ --ok: #4caf7d;
17
+ --err: #e06b7a;
18
+ }
19
+ * { box-sizing: border-box; }
20
+ html, body {
21
+ margin: 0; height: 100%; background: var(--bg); color: var(--fg);
22
+ font-family: 'Hiragino Maru Gothic ProN', 'Hiragino Sans', system-ui, sans-serif;
23
+ font-size: 13px;
24
+ }
25
+ #app { display: grid; grid-template-columns: 260px 1fr 300px; height: 100vh; }
26
+ .col { overflow: auto; padding: 10px; }
27
+ /* Left column: cue list and layer tree each scroll on their own so the
28
+ tree (the pose/expression selector) is always reachable no matter how
29
+ long the cue list gets. */
30
+ #left { border-right: 1px solid var(--line); background: var(--panel); display: flex; flex-direction: column; overflow: hidden; }
31
+ .left-pane { overflow: auto; padding: 10px; }
32
+ #list-pane { flex: 0 0 auto; max-height: 40%; border-bottom: 1px solid var(--line); }
33
+ #tree-pane { flex: 1 1 auto; }
34
+ #center {
35
+ display: flex; align-items: stretch; justify-content: center;
36
+ background: repeating-conic-gradient(#24252c 0% 25%, #1b1c22 0% 50%) 50% / 24px 24px;
37
+ }
38
+ #right { border-left: 1px solid var(--line); background: var(--panel); }
39
+ h2 { font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); margin: 4px 0 8px; }
40
+ #preview-wrap { flex: 1; position: relative; min-width: 0; }
41
+ #canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
42
+
43
+ /* cue list */
44
+ #cue-list { display: flex; flex-direction: column; gap: 2px; margin-bottom: 6px; }
45
+ .cue-group {
46
+ font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--muted);
47
+ margin: 10px 0 3px; padding-bottom: 2px; border-bottom: 1px solid var(--line);
48
+ }
49
+ .cue-item {
50
+ display: flex; flex-direction: column; text-align: left; padding: 4px 8px;
51
+ border: 1px solid var(--line); border-radius: 6px; background: var(--panel2);
52
+ color: var(--fg); cursor: pointer;
53
+ }
54
+ .cue-item:hover { border-color: var(--accent); }
55
+ .cue-item.internal { color: var(--muted); font-style: italic; }
56
+ .cue-label { font-size: 13px; }
57
+ .cue-id { font-size: 10px; color: var(--muted); font-family: monospace; }
58
+ .filter { color: var(--muted); margin: 6px 0 12px; display: flex; align-items: center; gap: 5px; }
59
+
60
+ /* tree */
61
+ .tree-group { margin-left: 12px; }
62
+ .tree-node { line-height: 1.7; white-space: nowrap; }
63
+ .tree-node > label { cursor: pointer; }
64
+ details > summary { cursor: pointer; color: var(--muted); }
65
+ details > summary:hover { color: var(--fg); }
66
+
67
+ /* form */
68
+ .field { margin-bottom: 10px; }
69
+ .field > label { display: block; color: var(--muted); margin-bottom: 3px; }
70
+ input[type=text] {
71
+ width: 100%; padding: 5px 7px; background: var(--panel2); border: 1px solid var(--line);
72
+ border-radius: 6px; color: var(--fg); font: inherit;
73
+ }
74
+ .check { display: flex; align-items: center; gap: 6px; }
75
+ .slider-row { display: grid; grid-template-columns: 90px 1fr 42px; align-items: center; gap: 6px; margin-bottom: 4px; }
76
+ .slider-row label { color: var(--muted); overflow: hidden; text-overflow: ellipsis; }
77
+ .slider-row input[type=range] { width: 100%; }
78
+ .slider-val { color: var(--muted); text-align: right; font-variant-numeric: tabular-nums; }
79
+ .muted { color: var(--muted); font-size: 12px; line-height: 1.4; }
80
+ .row { display: flex; gap: 6px; }
81
+ button.action {
82
+ flex: 1; padding: 7px; border: 1px solid var(--line); border-radius: 6px;
83
+ background: var(--panel2); color: var(--fg); cursor: pointer; font: inherit;
84
+ }
85
+ button.action:hover { border-color: var(--accent); }
86
+ button.action:disabled { opacity: .4; cursor: not-allowed; }
87
+ #save { background: var(--accent); border-color: var(--accent); }
88
+ hr { border: none; border-top: 1px solid var(--line); margin: 12px 0; }
89
+ #status { min-height: 18px; margin-top: 8px; font-size: 12px; }
90
+ #status.ok { color: var(--ok); }
91
+ #status.err { color: var(--err); }
92
+ </style>
93
+ </head>
94
+ <body>
95
+ <div id="app">
96
+ <div id="left">
97
+ <div id="list-pane" class="left-pane">
98
+ <h2>Cue一覧</h2>
99
+ <div id="cue-list"></div>
100
+ <label class="filter"><input type="checkbox" id="show-internal" /> 内部Cueも表示</label>
101
+ </div>
102
+ <div id="tree-pane" class="left-pane">
103
+ <h2>レイヤー(ポーズ・表情)</h2>
104
+ <div id="tree"></div>
105
+ </div>
106
+ </div>
107
+
108
+ <div id="center" class="col">
109
+ <div id="preview-wrap"><canvas id="canvas"></canvas></div>
110
+ </div>
111
+
112
+ <div id="right" class="col">
113
+ <div class="field">
114
+ <label for="cue-name">Cue名 / ファイル名(構造的・ソート可能)</label>
115
+ <input type="text" id="cue-name" placeholder="例: emo_joy_hi" />
116
+ </div>
117
+ <div class="field">
118
+ <label for="label">論理名 label(読みやすい呼び名)</label>
119
+ <input type="text" id="label" placeholder="例: 大喜び" />
120
+ </div>
121
+ <div class="field">
122
+ <label for="description">description</label>
123
+ <input type="text" id="description" placeholder="どんな場面・気持ちのCueか" />
124
+ </div>
125
+ <div class="field check"><input type="checkbox" id="blink" /> <label for="blink">まばたき (blink)</label></div>
126
+ <div class="field check"><input type="checkbox" id="internal" /> <label for="internal">内部Cue (internal)</label></div>
127
+
128
+ <hr />
129
+ <h2>声色 (voice)</h2>
130
+ <div id="voice-styles"></div>
131
+ <div id="static-voice"></div>
132
+ <div class="field" style="margin-top:8px">
133
+ <label for="test-text">試し喋り</label>
134
+ <input type="text" id="test-text" placeholder="喋らせるセリフを入力" />
135
+ </div>
136
+ <button type="button" class="action" id="test-speak">🔊 試し喋り</button>
137
+
138
+ <hr />
139
+ <div class="row">
140
+ <button type="button" class="action" id="new">新規</button>
141
+ <button type="button" class="action" id="duplicate">複製</button>
142
+ <button type="button" class="action" id="delete" disabled>削除</button>
143
+ <button type="button" class="action" id="save">保存</button>
144
+ </div>
145
+ <div id="status"></div>
146
+ </div>
147
+ </div>
148
+ <script src="editor.js"></script>
149
+ </body>
150
+ </html>