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.
- package/.claude-plugin/marketplace.json +13 -0
- package/.claude-plugin/plugin.json +6 -0
- package/.env.example +13 -0
- package/LICENSE +36 -0
- package/README.md +214 -0
- package/agents/mode.md +47 -0
- package/agents/talk.md +23 -0
- package/bin/ui-chan-mcp.mjs +11 -0
- package/bin/ui-chan-node +35 -0
- package/bin/ui-chan.mjs +350 -0
- package/context/AFFINITY.md +94 -0
- package/context/SOUL.md +79 -0
- package/context/VOCABULARY.md +108 -0
- package/cue.schema.json +109 -0
- package/cues/default.json +21 -0
- package/cues/emo_anger.json +14 -0
- package/cues/emo_anger_hi.json +19 -0
- package/cues/emo_anger_lo.json +16 -0
- package/cues/emo_antic.json +18 -0
- package/cues/emo_antic_hi.json +16 -0
- package/cues/emo_antic_lo.json +6 -0
- package/cues/emo_disgust.json +19 -0
- package/cues/emo_disgust_hi.json +20 -0
- package/cues/emo_disgust_lo.json +6 -0
- package/cues/emo_fear.json +19 -0
- package/cues/emo_fear_hi.json +19 -0
- package/cues/emo_fear_lo.json +19 -0
- package/cues/emo_joy.json +17 -0
- package/cues/emo_joy_hi.json +15 -0
- package/cues/emo_joy_lo.json +13 -0
- package/cues/emo_sad.json +15 -0
- package/cues/emo_sad_hi.json +18 -0
- package/cues/emo_sad_lo.json +14 -0
- package/cues/emo_surprise.json +15 -0
- package/cues/emo_surprise_hi.json +14 -0
- package/cues/emo_surprise_lo.json +11 -0
- package/cues/emo_trust.json +16 -0
- package/cues/emo_trust_hi.json +20 -0
- package/cues/emo_trust_lo.json +6 -0
- package/cues/idling_doze_1.json +9 -0
- package/cues/idling_doze_2.json +9 -0
- package/cues/idling_doze_3.json +9 -0
- package/cues/idling_giggle_1.json +9 -0
- package/cues/idling_giggle_2.json +9 -0
- package/cues/idling_lookaround_1.json +10 -0
- package/cues/idling_lookaround_2.json +10 -0
- package/cues/idling_lookaround_3.json +10 -0
- package/cues/idling_ponder.json +9 -0
- package/cues/idling_sigh_1.json +11 -0
- package/cues/idling_sigh_2.json +11 -0
- package/cues/idling_yawn_1.json +9 -0
- package/cues/idling_yawn_2.json +12 -0
- package/cues/idling_yawn_3.json +12 -0
- package/cues/mix_anger_antic.json +16 -0
- package/cues/mix_antic_joy.json +16 -0
- package/cues/mix_disgust_anger.json +17 -0
- package/cues/mix_fear_surprise.json +18 -0
- package/cues/mix_joy_trust.json +19 -0
- package/cues/mix_joy_trust_hi.json +18 -0
- package/cues/mix_sad_disgust.json +12 -0
- package/cues/mix_surprise_sad.json +21 -0
- package/cues/mix_surprise_sad_hi.json +14 -0
- package/cues/mix_trust_fear.json +18 -0
- package/cues/pose_arms_crossed.json +9 -0
- package/cues/pose_banzai.json +17 -0
- package/cues/pose_smug_arms.json +11 -0
- package/cues/pose_smug_hips.json +11 -0
- package/cues/pose_think.json +8 -0
- package/cues/pose_umbrella.json +9 -0
- package/cues/self_guilt.json +20 -0
- package/cues/self_pride.json +10 -0
- package/cues/self_shame.json +19 -0
- package/cues/self_shy.json +16 -0
- package/cues/self_shy_hi.json +17 -0
- package/cues/sys_address.json +9 -0
- package/cues/sys_awkward.json +18 -0
- package/cues/sys_beam.json +18 -0
- package/cues/sys_blank.json +11 -0
- package/cues/sys_care.json +18 -0
- package/cues/sys_confused.json +12 -0
- package/cues/sys_dazed.json +10 -0
- package/cues/sys_dread.json +21 -0
- package/cues/sys_fluster.json +20 -0
- package/cues/sys_intro.json +15 -0
- package/cues/sys_laugh.json +20 -0
- package/cues/sys_neutral.json +5 -0
- package/cues/sys_present.json +9 -0
- package/cues/sys_rain.json +15 -0
- package/cues/sys_refuse.json +18 -0
- package/cues/sys_relief.json +15 -0
- package/cues/sys_sleepy.json +8 -0
- package/cues/sys_smirk.json +10 -0
- package/cues/sys_stream.json +15 -0
- package/cues/sys_success.json +15 -0
- package/cues/sys_think.json +9 -0
- package/dist/app/assets.js +54 -0
- package/dist/app/cues.js +130 -0
- package/dist/app/editor-main.js +199 -0
- package/dist/app/editor-preload.js +17 -0
- package/dist/app/main.js +527 -0
- package/dist/app/persona.js +136 -0
- package/dist/app/preload.js +14 -0
- package/dist/app/state.js +850 -0
- package/dist/app/tts.js +257 -0
- package/dist/mcp-server.js +408 -0
- package/dist/renderer/bundle.js +17983 -0
- package/dist/renderer/editor.html +150 -0
- package/dist/renderer/editor.js +17917 -0
- package/dist/renderer/index.html +425 -0
- package/dist/shared/paths.js +169 -0
- package/dist/shared/set-cue-schema.js +66 -0
- package/dist/shared/types.js +14 -0
- package/docs/CLIENTS.md +110 -0
- package/docs/CUE_AUTHORING.md +76 -0
- package/docs/DEVELOPMENT.md +129 -0
- package/docs/PERSONA.md +61 -0
- package/docs/PSD_LAYERS.md +123 -0
- package/docs/README.md +43 -0
- package/docs/SETUP.html +684 -0
- package/docs/STYLE.md +107 -0
- package/docs/TOOLS.md +33 -0
- package/docs/TROUBLESHOOTING.md +122 -0
- package/docs/TTS.md +61 -0
- package/docs/design/CUE_CATALOG.md +259 -0
- package/docs/images/faces.png +0 -0
- package/docs/images/panel.png +0 -0
- package/hooks/fire-event.js +14 -0
- package/hooks/hooks.json +77 -0
- package/hooks/lib/mascot.js +76 -0
- package/hooks/notify.js +15 -0
- package/hooks/reaction.js +46 -0
- package/hooks/session-start.js +80 -0
- package/package.json +96 -0
- package/persona/ui-chan.md +111 -0
- package/plugins/hermes/ui-chan/__init__.py +98 -0
- package/plugins/hermes/ui-chan/plugin.yaml +7 -0
- package/plugins/opencode/ui-chan.mjs +105 -0
- package/skills/beam/SKILL.md +37 -0
- package/skills/eli14/SKILL.md +139 -0
- package/skills/eli14/references/base.html +495 -0
- package/skills/mode/SKILL.md +67 -0
- package/skills/talk/SKILL.md +27 -0
- package/tools/setup/check-package.mjs +47 -0
- package/tools/setup/clients.mjs +399 -0
- package/tools/setup/doctor.mjs +105 -0
- package/tools/setup/home.mjs +126 -0
- package/tools/setup/prompt.mjs +134 -0
- package/tools/setup/update-check.mjs +8 -0
- package/tools/setup/update.mjs +350 -0
- package/tools/stop-app.mjs +22 -0
- 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>
|