jostlebot Claude Opus 4.5 commited on
Commit
9a43c4b
ยท
1 Parent(s): c23c3fa

Reorganize tools into categories + add APPRECIATE

Browse files

Categories with rainbow colors:
- Regulate: SOMA (orange), LOVE (pink)
- Understand: FEEL (yellow), NEED (green), STORY (cyan)
- Express: SEND (red), TEND (orange-red), PRACTICE NVC (teal)
- Reconnect: REPAIR (blue), APPRECIATE (violet), WISDOM (indigo)

APPRECIATE tool (Gottman's 5:1):
- Helps catch the good stuff
- Finds genuine appreciation even in hard moments
- "Thank you for telling me where you're at"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Files changed (3) hide show
  1. README.md +14 -4
  2. app.py +34 -1
  3. static/index.html +113 -46
README.md CHANGED
@@ -16,16 +16,24 @@ license: mit
16
 
17
  ## The ARI Toolkit
18
 
19
- - **SEND** - Send your message to your partner
20
- - **TEND** - Transform your message with clarity and warmth
21
  - **SOMA** - Body check-in. What does your body know?
 
 
 
22
  - **FEEL** - Identify feelings in the conversation
23
  - **NEED** - Extract underlying needs
24
- - **PRACTICE NVC** - Guided I-statement builder
25
  - **STORY** - "The story I'm making up..." Own your narrative
 
 
 
 
 
 
 
26
  - **REPAIR** - Craft genuine repair after ruptures
 
27
  - **WISDOM** - Draw from sacred texts and grounded wisdom
28
- - **LOVE** - Slow down, breathe, return to presence
29
 
30
  ## Practice Conversations
31
 
@@ -37,7 +45,9 @@ license: mit
37
 
38
  Informed by:
39
  - Nonviolent Communication (Marshall Rosenberg)
 
40
  - Attachment Theory
 
41
  - Somatic awareness practices
42
  - Trauma-informed design principles
43
 
 
16
 
17
  ## The ARI Toolkit
18
 
19
+ ### Regulate
 
20
  - **SOMA** - Body check-in. What does your body know?
21
+ - **LOVE** - Slow down, breathe, return to presence
22
+
23
+ ### Understand
24
  - **FEEL** - Identify feelings in the conversation
25
  - **NEED** - Extract underlying needs
 
26
  - **STORY** - "The story I'm making up..." Own your narrative
27
+
28
+ ### Express
29
+ - **SEND** - Send your message to your partner
30
+ - **TEND** - Transform your message with clarity and warmth
31
+ - **PRACTICE NVC** - Guided I-statement builder
32
+
33
+ ### Reconnect
34
  - **REPAIR** - Craft genuine repair after ruptures
35
+ - **APPRECIATE** - Catch the good. What's working?
36
  - **WISDOM** - Draw from sacred texts and grounded wisdom
 
37
 
38
  ## Practice Conversations
39
 
 
45
 
46
  Informed by:
47
  - Nonviolent Communication (Marshall Rosenberg)
48
+ - Gottman Method (5:1 ratio, bids for connection)
49
  - Attachment Theory
50
+ - Brenรฉ Brown (vulnerability, "the story I'm making up")
51
  - Somatic awareness practices
52
  - Trauma-informed design principles
53
 
app.py CHANGED
@@ -399,7 +399,40 @@ Never:
399
  - Push them to apologize more than they mean
400
  - Make it about being "right\"""",
401
 
402
- # TOOL 12: STORY (The story I'm making up)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
  "story": """Help surface the narrative/story someone is making up about their partner's behavior.
404
 
405
  ABSOLUTE RULE - NO FIRST PERSON:
 
399
  - Push them to apologize more than they mean
400
  - Make it about being "right\"""",
401
 
402
+ # TOOL 12: APPRECIATE (Gottman's 5:1 - catch the good)
403
+ "appreciate": """Help someone find and express genuine appreciation for their partner.
404
+
405
+ ABSOLUTE RULE - NO FIRST PERSON:
406
+ - NEVER say "I notice", "I see", "I hear"
407
+ - Use: "What stands out is...", "There's something here...", "Consider..."
408
+
409
+ THE CONCEPT (Gottman's 5:1 ratio):
410
+ Healthy relationships need 5 positive interactions for every 1 negative.
411
+ This tool helps catch the good stuff - especially during hard times.
412
+
413
+ APPROACH:
414
+ 1. If they shared something their partner did/said, find what's genuinely appreciable (effort, intention, vulnerability, showing up)
415
+ 2. Help them express it simply and specifically
416
+ 3. Don't force positivity - find what's REAL
417
+
418
+ FORMAT (be concise, 3-5 sentences):
419
+ - Name what's appreciable (be specific, not generic)
420
+ - Suggest a simple way to express it
421
+ - Keep it genuine, not performative
422
+
423
+ EXAMPLE:
424
+ Partner said: "I'm too tired to talk about this"
425
+ โ†’ "Even in saying that, they're being honest about their limits rather than pretending. That's real. You might simply say: 'Thank you for telling me where you're at.'"
426
+
427
+ Help them see the good without dismissing the hard.
428
+
429
+ Never:
430
+ - Use first-person language
431
+ - Force toxic positivity
432
+ - Dismiss real concerns
433
+ - Make them feel wrong for struggling""",
434
+
435
+ # TOOL 13: STORY (The story I'm making up)
436
  "story": """Help surface the narrative/story someone is making up about their partner's behavior.
437
 
438
  ABSOLUTE RULE - NO FIRST PERSON:
static/index.html CHANGED
@@ -81,6 +81,19 @@
81
  margin-bottom: 12px;
82
  }
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  .tool-desc {
85
  padding: 12px;
86
  margin-bottom: 10px;
@@ -148,6 +161,10 @@
148
  border-left-color: #3b82f6;
149
  background: rgba(59, 130, 246, 0.1);
150
  }
 
 
 
 
151
  .tool-desc.wisdom-desc {
152
  border-left-color: #6366f1;
153
  background: rgba(99, 102, 241, 0.1);
@@ -435,15 +452,30 @@
435
 
436
  @keyframes spin { to { transform: rotate(360deg); } }
437
 
438
- /* Tool Buttons Row */
439
- .tool-buttons {
440
- display: flex;
441
- gap: 6px;
442
- padding: 12px 20px;
443
  background: var(--bg-card);
444
  border-top: 1px solid var(--border);
 
 
 
 
 
 
 
 
 
445
  flex-wrap: wrap;
446
- justify-content: center;
 
 
 
 
 
 
 
 
447
  }
448
 
449
  .tool-btn {
@@ -534,6 +566,15 @@
534
  color: white;
535
  }
536
 
 
 
 
 
 
 
 
 
 
537
  .tool-btn.wisdom {
538
  border-color: #6366f1;
539
  color: #6366f1;
@@ -841,8 +882,9 @@
841
  @media (max-width: 700px) {
842
  .app-container { flex-direction: column; }
843
  .left-panel { width: 100%; max-height: 40vh; }
844
- .tool-buttons { padding: 10px; }
845
- .tool-btn { padding: 6px 10px; font-size: 0.75rem; }
 
846
  }
847
  </style>
848
  </head>
@@ -858,54 +900,56 @@
858
  <div class="tool-list">
859
  <h3>ARI Tools</h3>
860
 
861
- <div class="tool-desc send-desc">
862
- <h4>SEND</h4>
863
- <p>Send your message to your partner.</p>
864
- </div>
865
-
866
- <div class="tool-desc tend-desc" onclick="showToolInfo('tend')">
867
- <h4>TEND</h4>
868
- <p>Transform your message with clarity and warmth. Preserves your authentic voice.</p>
869
- </div>
870
-
871
  <div class="tool-desc soma-desc" onclick="showToolInfo('soma')">
872
  <h4>SOMA</h4>
873
  <p>Body check-in. What does your body know?</p>
874
  </div>
 
 
 
 
875
 
 
876
  <div class="tool-desc feel-desc" onclick="showToolInfo('feel')">
877
  <h4>FEEL</h4>
878
- <p>Identify feelings in the conversation. What emotions are present?</p>
879
  </div>
880
-
881
  <div class="tool-desc need-desc" onclick="showToolInfo('need')">
882
  <h4>NEED</h4>
883
  <p>Extract underlying needs. What's really being asked for?</p>
884
  </div>
 
 
 
 
885
 
 
 
 
 
 
 
 
 
 
886
  <div class="tool-desc nvc-desc" onclick="showToolInfo('nvc')">
887
  <h4>PRACTICE NVC</h4>
888
- <p>Guided I-statement builder. Step-by-step help crafting what you want to say.</p>
889
- </div>
890
-
891
- <div class="tool-desc story-desc" onclick="showToolInfo('story')">
892
- <h4>STORY</h4>
893
- <p>"The story I'm making up..." Own your narrative before it becomes accusation.</p>
894
  </div>
895
 
 
896
  <div class="tool-desc repair-desc" onclick="showToolInfo('repair')">
897
  <h4>REPAIR</h4>
898
- <p>After ruptures. Help craft genuine reconnection.</p>
 
 
 
 
899
  </div>
900
-
901
  <div class="tool-desc wisdom-desc" onclick="showToolInfo('wisdom')">
902
  <h4>WISDOM</h4>
903
- <p>Draw from sacred texts. Choose your tradition for grounded wisdom.</p>
904
- </div>
905
-
906
- <div class="tool-desc love-desc" onclick="showToolInfo('love')">
907
- <h4>LOVE</h4>
908
- <p>Slow down. Take a breath. Return to presence.</p>
909
  </div>
910
  </div>
911
 
@@ -988,18 +1032,31 @@
988
  <!-- Conversation Messages -->
989
  <div class="conversation-area" id="conversation"></div>
990
 
991
- <!-- Tool Buttons Row -->
992
- <div class="tool-buttons">
993
- <button class="tool-btn send" onclick="sendMessage()">SEND</button>
994
- <button class="tool-btn tend" onclick="useTool('tend')">TEND</button>
995
- <button class="tool-btn soma" onclick="useTool('soma')">SOMA</button>
996
- <button class="tool-btn feel" onclick="useTool('feel')">FEEL</button>
997
- <button class="tool-btn need" onclick="useTool('need')">NEED</button>
998
- <button class="tool-btn nvc" onclick="useTool('nvc')">PRACTICE NVC</button>
999
- <button class="tool-btn story" onclick="useTool('story')">STORY</button>
1000
- <button class="tool-btn repair" onclick="useTool('repair')">REPAIR</button>
1001
- <button class="tool-btn wisdom" onclick="useTool('wisdom')">WISDOM</button>
1002
- <button class="tool-btn love" onclick="useTool('love')">LOVE</button>
 
 
 
 
 
 
 
 
 
 
 
 
 
1003
  </div>
1004
 
1005
  <!-- Message Input -->
@@ -1050,6 +1107,7 @@
1050
  nvc: { name: 'Practice NVC', icon: '๐Ÿ“', api: 'guided_nvc' },
1051
  story: { name: 'The Story', icon: '๐Ÿ“–', api: 'story' },
1052
  repair: { name: 'Repair Support', icon: '๐Ÿ™', api: 'repair_support' },
 
1053
  wisdom: { name: 'Sacred Wisdom', icon: '๐Ÿ•Š๏ธ', api: 'wisdom', interactive: true },
1054
  love: { name: 'Slow Down', icon: '๐Ÿ’—', api: null }
1055
  };
@@ -1450,6 +1508,15 @@ Real grief, real limits. 1-2 sentences.`
1450
  case 'repair':
1451
  inputText = userInput || 'Help me craft a genuine repair.';
1452
  break;
 
 
 
 
 
 
 
 
 
1453
  case 'story':
1454
  if (userInput) {
1455
  inputText = `Help me surface the story I'm making up about this: "${userInput}"`;
 
81
  margin-bottom: 12px;
82
  }
83
 
84
+ .category-label {
85
+ font-size: 0.65rem;
86
+ text-transform: uppercase;
87
+ letter-spacing: 0.08em;
88
+ color: var(--text-muted);
89
+ margin: 16px 0 8px 0;
90
+ padding-left: 4px;
91
+ }
92
+
93
+ .category-label:first-of-type {
94
+ margin-top: 0;
95
+ }
96
+
97
  .tool-desc {
98
  padding: 12px;
99
  margin-bottom: 10px;
 
161
  border-left-color: #3b82f6;
162
  background: rgba(59, 130, 246, 0.1);
163
  }
164
+ .tool-desc.appreciate-desc {
165
+ border-left-color: #8b5cf6;
166
+ background: rgba(139, 92, 246, 0.1);
167
+ }
168
  .tool-desc.wisdom-desc {
169
  border-left-color: #6366f1;
170
  background: rgba(99, 102, 241, 0.1);
 
452
 
453
  @keyframes spin { to { transform: rotate(360deg); } }
454
 
455
+ /* Tool Buttons - Categorized Rows */
456
+ .tool-buttons-container {
457
+ padding: 12px 16px;
 
 
458
  background: var(--bg-card);
459
  border-top: 1px solid var(--border);
460
+ display: flex;
461
+ flex-direction: column;
462
+ gap: 8px;
463
+ }
464
+
465
+ .tool-row {
466
+ display: flex;
467
+ align-items: center;
468
+ gap: 6px;
469
  flex-wrap: wrap;
470
+ }
471
+
472
+ .row-label {
473
+ font-size: 0.65rem;
474
+ color: var(--text-muted);
475
+ text-transform: uppercase;
476
+ letter-spacing: 0.5px;
477
+ width: 70px;
478
+ flex-shrink: 0;
479
  }
480
 
481
  .tool-btn {
 
566
  color: white;
567
  }
568
 
569
+ .tool-btn.appreciate {
570
+ border-color: #8b5cf6;
571
+ color: #8b5cf6;
572
+ }
573
+ .tool-btn.appreciate:hover, .tool-btn.appreciate.active {
574
+ background: #8b5cf6;
575
+ color: white;
576
+ }
577
+
578
  .tool-btn.wisdom {
579
  border-color: #6366f1;
580
  color: #6366f1;
 
882
  @media (max-width: 700px) {
883
  .app-container { flex-direction: column; }
884
  .left-panel { width: 100%; max-height: 40vh; }
885
+ .tool-buttons-container { padding: 8px 10px; gap: 6px; }
886
+ .row-label { width: 55px; font-size: 0.6rem; }
887
+ .tool-btn { padding: 5px 8px; font-size: 0.7rem; }
888
  }
889
  </style>
890
  </head>
 
900
  <div class="tool-list">
901
  <h3>ARI Tools</h3>
902
 
903
+ <div class="category-label">Regulate</div>
 
 
 
 
 
 
 
 
 
904
  <div class="tool-desc soma-desc" onclick="showToolInfo('soma')">
905
  <h4>SOMA</h4>
906
  <p>Body check-in. What does your body know?</p>
907
  </div>
908
+ <div class="tool-desc love-desc" onclick="showToolInfo('love')">
909
+ <h4>LOVE</h4>
910
+ <p>Slow down. Take a breath. Return to presence.</p>
911
+ </div>
912
 
913
+ <div class="category-label">Understand</div>
914
  <div class="tool-desc feel-desc" onclick="showToolInfo('feel')">
915
  <h4>FEEL</h4>
916
+ <p>Identify feelings. What emotions are present?</p>
917
  </div>
 
918
  <div class="tool-desc need-desc" onclick="showToolInfo('need')">
919
  <h4>NEED</h4>
920
  <p>Extract underlying needs. What's really being asked for?</p>
921
  </div>
922
+ <div class="tool-desc story-desc" onclick="showToolInfo('story')">
923
+ <h4>STORY</h4>
924
+ <p>"The story I'm making up..." Own your narrative.</p>
925
+ </div>
926
 
927
+ <div class="category-label">Express</div>
928
+ <div class="tool-desc send-desc">
929
+ <h4>SEND</h4>
930
+ <p>Send your message to your partner.</p>
931
+ </div>
932
+ <div class="tool-desc tend-desc" onclick="showToolInfo('tend')">
933
+ <h4>TEND</h4>
934
+ <p>Transform with clarity and warmth.</p>
935
+ </div>
936
  <div class="tool-desc nvc-desc" onclick="showToolInfo('nvc')">
937
  <h4>PRACTICE NVC</h4>
938
+ <p>Guided I-statement builder.</p>
 
 
 
 
 
939
  </div>
940
 
941
+ <div class="category-label">Reconnect</div>
942
  <div class="tool-desc repair-desc" onclick="showToolInfo('repair')">
943
  <h4>REPAIR</h4>
944
+ <p>After ruptures. Craft genuine reconnection.</p>
945
+ </div>
946
+ <div class="tool-desc appreciate-desc" onclick="showToolInfo('appreciate')">
947
+ <h4>APPRECIATE</h4>
948
+ <p>Catch the good. What's working?</p>
949
  </div>
 
950
  <div class="tool-desc wisdom-desc" onclick="showToolInfo('wisdom')">
951
  <h4>WISDOM</h4>
952
+ <p>Draw from sacred texts for grounded wisdom.</p>
 
 
 
 
 
953
  </div>
954
  </div>
955
 
 
1032
  <!-- Conversation Messages -->
1033
  <div class="conversation-area" id="conversation"></div>
1034
 
1035
+ <!-- Tool Buttons - Categorized -->
1036
+ <div class="tool-buttons-container">
1037
+ <div class="tool-row">
1038
+ <span class="row-label">Regulate</span>
1039
+ <button class="tool-btn soma" onclick="useTool('soma')">SOMA</button>
1040
+ <button class="tool-btn love" onclick="useTool('love')">LOVE</button>
1041
+ </div>
1042
+ <div class="tool-row">
1043
+ <span class="row-label">Understand</span>
1044
+ <button class="tool-btn feel" onclick="useTool('feel')">FEEL</button>
1045
+ <button class="tool-btn need" onclick="useTool('need')">NEED</button>
1046
+ <button class="tool-btn story" onclick="useTool('story')">STORY</button>
1047
+ </div>
1048
+ <div class="tool-row">
1049
+ <span class="row-label">Express</span>
1050
+ <button class="tool-btn send" onclick="sendMessage()">SEND</button>
1051
+ <button class="tool-btn tend" onclick="useTool('tend')">TEND</button>
1052
+ <button class="tool-btn nvc" onclick="useTool('nvc')">PRACTICE NVC</button>
1053
+ </div>
1054
+ <div class="tool-row">
1055
+ <span class="row-label">Reconnect</span>
1056
+ <button class="tool-btn repair" onclick="useTool('repair')">REPAIR</button>
1057
+ <button class="tool-btn appreciate" onclick="useTool('appreciate')">APPRECIATE</button>
1058
+ <button class="tool-btn wisdom" onclick="useTool('wisdom')">WISDOM</button>
1059
+ </div>
1060
  </div>
1061
 
1062
  <!-- Message Input -->
 
1107
  nvc: { name: 'Practice NVC', icon: '๐Ÿ“', api: 'guided_nvc' },
1108
  story: { name: 'The Story', icon: '๐Ÿ“–', api: 'story' },
1109
  repair: { name: 'Repair Support', icon: '๐Ÿ™', api: 'repair_support' },
1110
+ appreciate: { name: 'Appreciate', icon: 'โœจ', api: 'appreciate' },
1111
  wisdom: { name: 'Sacred Wisdom', icon: '๐Ÿ•Š๏ธ', api: 'wisdom', interactive: true },
1112
  love: { name: 'Slow Down', icon: '๐Ÿ’—', api: null }
1113
  };
 
1508
  case 'repair':
1509
  inputText = userInput || 'Help me craft a genuine repair.';
1510
  break;
1511
+ case 'appreciate':
1512
+ if (userInput) {
1513
+ inputText = `Help me express appreciation for this: "${userInput}"`;
1514
+ } else if (lastPartnerMessage) {
1515
+ inputText = `My partner said: "${lastPartnerMessage}"\n\nHelp me find something to genuinely appreciate here, even if it's small.`;
1516
+ } else {
1517
+ inputText = 'Help me identify something to appreciate about my partner or our relationship right now.';
1518
+ }
1519
+ break;
1520
  case 'story':
1521
  if (userInput) {
1522
  inputText = `Help me surface the story I'm making up about this: "${userInput}"`;