clasp-ai 0.0.1 → 0.7.1

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.
@@ -0,0 +1,304 @@
1
+ #!/bin/bash
2
+ # CLASP Stream-JSON Parser
3
+ # Converts Claude Code stream-json output to human-readable format
4
+ # Based on MANA stream-parser.sh v4.0
5
+
6
+ # Colors
7
+ RED='\033[0;31m'
8
+ GREEN='\033[0;32m'
9
+ YELLOW='\033[1;33m'
10
+ BLUE='\033[0;34m'
11
+ CYAN='\033[0;36m'
12
+ MAGENTA='\033[0;35m'
13
+ WHITE='\033[1;37m'
14
+ GRAY='\033[0;90m'
15
+ NC='\033[0m' # No Color
16
+ BOLD='\033[1m'
17
+ DIM='\033[2m'
18
+
19
+ # Track state
20
+ CURRENT_TOOL=""
21
+ IN_THINKING=false
22
+
23
+ # Process each line
24
+ while IFS= read -r line; do
25
+ # Skip empty lines
26
+ [ -z "$line" ] && continue
27
+
28
+ # Try to parse as JSON
29
+ if ! echo "$line" | jq -e . >/dev/null 2>&1; then
30
+ # Not JSON, print as-is
31
+ echo "$line"
32
+ continue
33
+ fi
34
+
35
+ # Extract type
36
+ TYPE=$(echo "$line" | jq -r '.type // empty' 2>/dev/null)
37
+
38
+ case "$TYPE" in
39
+ "system")
40
+ # System init message - show abbreviated info
41
+ SUBTYPE=$(echo "$line" | jq -r '.subtype // empty' 2>/dev/null)
42
+ if [ "$SUBTYPE" = "init" ]; then
43
+ SESSION=$(echo "$line" | jq -r '.session_id // empty' 2>/dev/null)
44
+ MODEL=$(echo "$line" | jq -r '.model // empty' 2>/dev/null)
45
+ VERSION=$(echo "$line" | jq -r '.claude_code_version // empty' 2>/dev/null)
46
+ TOOL_COUNT=$(echo "$line" | jq -r '.tools | length // 0' 2>/dev/null)
47
+ MCP_SERVERS=$(echo "$line" | jq -r '.mcp_servers | map(.name) | join(", ") // empty' 2>/dev/null)
48
+ echo -e "${MAGENTA}${BOLD}╔══ CLASP Session ══╗${NC}"
49
+ echo -e "${MAGENTA}│ Session:${NC} ${SESSION:0:8}..."
50
+ echo -e "${MAGENTA}│ Model:${NC} $MODEL"
51
+ echo -e "${MAGENTA}│ Version:${NC} $VERSION"
52
+ echo -e "${MAGENTA}│ Tools:${NC} $TOOL_COUNT available"
53
+ echo -e "${MAGENTA}│ MCP:${NC} $MCP_SERVERS"
54
+ echo -e "${MAGENTA}╚════════════════════╝${NC}"
55
+ else
56
+ MSG=$(echo "$line" | jq -r '.message // empty' 2>/dev/null)
57
+ if [ -n "$MSG" ]; then
58
+ echo -e "${GRAY}[system] $MSG${NC}"
59
+ fi
60
+ fi
61
+ ;;
62
+
63
+ "assistant")
64
+ # Assistant messages - can contain text or tool_use in content array
65
+ CONTENT_TYPE=$(echo "$line" | jq -r '.message.content[0].type // empty' 2>/dev/null)
66
+
67
+ case "$CONTENT_TYPE" in
68
+ "text")
69
+ TEXT=$(echo "$line" | jq -r '.message.content[0].text // empty' 2>/dev/null)
70
+ if [ -n "$TEXT" ] && [ "$TEXT" != "null" ]; then
71
+ echo ""
72
+ echo -e "${WHITE}${BOLD}Claude:${NC}"
73
+ echo "$TEXT" | while IFS= read -r text_line; do
74
+ echo -e "${WHITE} $text_line${NC}"
75
+ done
76
+ fi
77
+ ;;
78
+ "tool_use")
79
+ # Tool call from assistant
80
+ TOOL_NAME=$(echo "$line" | jq -r '.message.content[0].name // empty' 2>/dev/null)
81
+ TOOL_ID=$(echo "$line" | jq -r '.message.content[0].id // empty' 2>/dev/null)
82
+ TOOL_INPUT=$(echo "$line" | jq -r '.message.content[0].input // {}' 2>/dev/null)
83
+
84
+ echo ""
85
+
86
+ # Format tool-specific output
87
+ case "$TOOL_NAME" in
88
+ "Bash")
89
+ CMD=$(echo "$TOOL_INPUT" | jq -r '.command // empty' 2>/dev/null)
90
+ DESC=$(echo "$TOOL_INPUT" | jq -r '.description // empty' 2>/dev/null)
91
+ echo -e "${CYAN}${BOLD}▶ Bash:${NC} ${WHITE}$CMD${NC}"
92
+ if [ -n "$DESC" ] && [ "$DESC" != "null" ]; then
93
+ echo -e "${GRAY} └─ $DESC${NC}"
94
+ fi
95
+ ;;
96
+ "Read")
97
+ FILE=$(echo "$TOOL_INPUT" | jq -r '.file_path // empty' 2>/dev/null)
98
+ echo -e "${CYAN}${BOLD}▶ Read:${NC} ${WHITE}$FILE${NC}"
99
+ ;;
100
+ "Write")
101
+ FILE=$(echo "$TOOL_INPUT" | jq -r '.file_path // empty' 2>/dev/null)
102
+ CONTENT=$(echo "$TOOL_INPUT" | jq -r '.content // empty' 2>/dev/null)
103
+ LINES=$(echo "$CONTENT" | wc -l)
104
+ echo -e "${CYAN}${BOLD}▶ Write:${NC} ${WHITE}$FILE${NC} ${GRAY}($LINES lines)${NC}"
105
+ ;;
106
+ "Edit")
107
+ FILE=$(echo "$TOOL_INPUT" | jq -r '.file_path // empty' 2>/dev/null)
108
+ OLD=$(echo "$TOOL_INPUT" | jq -r '.old_string // empty' 2>/dev/null | head -1)
109
+ echo -e "${CYAN}${BOLD}▶ Edit:${NC} ${WHITE}$FILE${NC}"
110
+ if [ -n "$OLD" ]; then
111
+ echo -e "${GRAY} └─ replacing: \"${OLD:0:60}...\"${NC}"
112
+ fi
113
+ ;;
114
+ "Glob")
115
+ PATTERN=$(echo "$TOOL_INPUT" | jq -r '.pattern // empty' 2>/dev/null)
116
+ echo -e "${CYAN}${BOLD}▶ Glob:${NC} ${WHITE}$PATTERN${NC}"
117
+ ;;
118
+ "Grep")
119
+ PATTERN=$(echo "$TOOL_INPUT" | jq -r '.pattern // empty' 2>/dev/null)
120
+ PATH_ARG=$(echo "$TOOL_INPUT" | jq -r '.path // empty' 2>/dev/null)
121
+ echo -e "${CYAN}${BOLD}▶ Grep:${NC} ${WHITE}$PATTERN${NC}"
122
+ if [ -n "$PATH_ARG" ] && [ "$PATH_ARG" != "null" ]; then
123
+ echo -e "${GRAY} └─ in: $PATH_ARG${NC}"
124
+ fi
125
+ ;;
126
+ "TodoWrite")
127
+ TODO_COUNT=$(echo "$TOOL_INPUT" | jq -r '.todos | length // 0' 2>/dev/null)
128
+ echo -e "${CYAN}${BOLD}▶ TodoWrite:${NC} ${WHITE}$TODO_COUNT items${NC}"
129
+ echo "$TOOL_INPUT" | jq -r '.todos[]? | " " + (if .status == "completed" then "✅" elif .status == "in_progress" then "🔄" else "⏳" end) + " " + .content' 2>/dev/null | head -8
130
+ ;;
131
+ "Task")
132
+ DESC=$(echo "$TOOL_INPUT" | jq -r '.description // empty' 2>/dev/null)
133
+ AGENT=$(echo "$TOOL_INPUT" | jq -r '.subagent_type // empty' 2>/dev/null)
134
+ echo -e "${CYAN}${BOLD}▶ Task:${NC} ${WHITE}$DESC${NC}"
135
+ if [ -n "$AGENT" ] && [ "$AGENT" != "null" ]; then
136
+ echo -e "${GRAY} └─ agent: $AGENT${NC}"
137
+ fi
138
+ ;;
139
+ *)
140
+ # Default: show tool name and formatted JSON
141
+ echo -e "${CYAN}${BOLD}▶ Tool: $TOOL_NAME${NC}"
142
+ if [ -n "$TOOL_INPUT" ] && [ "$TOOL_INPUT" != "{}" ]; then
143
+ echo -e "${GRAY}┌─ Input ─────────────────────────────────────────${NC}"
144
+ echo "$TOOL_INPUT" | jq -r '.' 2>/dev/null | while IFS= read -r input_line; do
145
+ echo -e "${GRAY}│ $input_line${NC}"
146
+ done
147
+ echo -e "${GRAY}└─────────────────────────────────────────────────${NC}"
148
+ fi
149
+ ;;
150
+ esac
151
+ ;;
152
+ esac
153
+ ;;
154
+
155
+ "user")
156
+ # User messages - usually tool results
157
+ TOOL_RESULT_TYPE=$(echo "$line" | jq -r '.message.content[0].type // empty' 2>/dev/null)
158
+ if [ "$TOOL_RESULT_TYPE" = "tool_result" ]; then
159
+ TOOL_ID=$(echo "$line" | jq -r '.message.content[0].tool_use_id // empty' 2>/dev/null)
160
+ IS_ERROR=$(echo "$line" | jq -r '.message.content[0].is_error // false' 2>/dev/null)
161
+ CONTENT=$(echo "$line" | jq -r '.message.content[0].content // empty' 2>/dev/null)
162
+
163
+ RESULT_TYPE=$(echo "$line" | jq -r '.tool_use_result.type // empty' 2>/dev/null)
164
+
165
+ if [ "$IS_ERROR" = "true" ]; then
166
+ echo -e "${RED}${BOLD}✗ Error:${NC}"
167
+ echo -e "${RED}┌─ Error Output ──────────────────────────────────${NC}"
168
+ echo "$CONTENT" | while IFS= read -r result_line; do
169
+ echo -e "${RED}│ $result_line${NC}"
170
+ done
171
+ echo -e "${RED}└─────────────────────────────────────────────────${NC}"
172
+ elif [ "$RESULT_TYPE" = "text" ]; then
173
+ FILE_PATH=$(echo "$line" | jq -r '.tool_use_result.file.filePath // empty' 2>/dev/null)
174
+ NUM_LINES=$(echo "$line" | jq -r '.tool_use_result.file.numLines // empty' 2>/dev/null)
175
+ echo -e "${GREEN}${BOLD}✓ Read: ${FILE_PATH}${NC} ${GRAY}(${NUM_LINES} lines)${NC}"
176
+ elif [ "$RESULT_TYPE" = "create" ]; then
177
+ FILE_PATH=$(echo "$line" | jq -r '.tool_use_result.filePath // empty' 2>/dev/null)
178
+ echo -e "${GREEN}${BOLD}✓ Created: ${FILE_PATH}${NC}"
179
+ elif [ "$RESULT_TYPE" = "edit" ] || [ "$RESULT_TYPE" = "replace" ]; then
180
+ FILE_PATH=$(echo "$line" | jq -r '.tool_use_result.filePath // empty' 2>/dev/null)
181
+ echo -e "${GREEN}${BOLD}✓ Edited: ${FILE_PATH}${NC}"
182
+ else
183
+ STDOUT=$(echo "$line" | jq -r '.tool_use_result.stdout // empty' 2>/dev/null)
184
+ OUTPUT="${STDOUT:-$CONTENT}"
185
+
186
+ if [ -n "$OUTPUT" ]; then
187
+ LINE_COUNT=$(echo "$OUTPUT" | wc -l)
188
+ echo -e "${GREEN}${BOLD}✓ Result:${NC} ${GRAY}($LINE_COUNT lines)${NC}"
189
+ # Show abbreviated output
190
+ echo "$OUTPUT" | head -5 | while IFS= read -r result_line; do
191
+ echo -e "${GRAY} $result_line${NC}"
192
+ done
193
+ if [ $LINE_COUNT -gt 5 ]; then
194
+ echo -e "${GRAY} ... ($((LINE_COUNT - 5)) more lines)${NC}"
195
+ fi
196
+ fi
197
+ fi
198
+ fi
199
+ ;;
200
+
201
+ "content_block_start")
202
+ BLOCK_TYPE=$(echo "$line" | jq -r '.content_block.type // empty' 2>/dev/null)
203
+ case "$BLOCK_TYPE" in
204
+ "tool_use")
205
+ TOOL_NAME=$(echo "$line" | jq -r '.content_block.name // empty' 2>/dev/null)
206
+ CURRENT_TOOL="$TOOL_NAME"
207
+ echo -e "\n${CYAN}${BOLD}▶ Tool: $TOOL_NAME${NC}"
208
+ ;;
209
+ "thinking")
210
+ IN_THINKING=true
211
+ echo -e "\n${MAGENTA}${DIM}💭 Thinking...${NC}"
212
+ ;;
213
+ esac
214
+ ;;
215
+
216
+ "content_block_delta")
217
+ DELTA_TYPE=$(echo "$line" | jq -r '.delta.type // empty' 2>/dev/null)
218
+ case "$DELTA_TYPE" in
219
+ "text_delta")
220
+ TEXT=$(echo "$line" | jq -r '.delta.text // empty' 2>/dev/null)
221
+ if [ -n "$TEXT" ]; then
222
+ if [ "$IN_THINKING" = true ]; then
223
+ echo -ne "${MAGENTA}${DIM}$TEXT${NC}"
224
+ else
225
+ echo -ne "${WHITE}$TEXT${NC}"
226
+ fi
227
+ fi
228
+ ;;
229
+ "input_json_delta")
230
+ JSON=$(echo "$line" | jq -r '.delta.partial_json // empty' 2>/dev/null)
231
+ if [ -n "$JSON" ]; then
232
+ echo -ne "${GRAY}$JSON${NC}"
233
+ fi
234
+ ;;
235
+ esac
236
+ ;;
237
+
238
+ "content_block_stop")
239
+ if [ "$IN_THINKING" = true ]; then
240
+ IN_THINKING=false
241
+ echo -e "\n${MAGENTA}${DIM}💭 Done thinking${NC}"
242
+ fi
243
+ echo ""
244
+ ;;
245
+
246
+ "result")
247
+ # Final result
248
+ echo -e "\n${GREEN}${BOLD}═══════════════════════════════════════════════════${NC}"
249
+ echo -e "${GREEN}${BOLD} RESULT ${NC}"
250
+ echo -e "${GREEN}${BOLD}═══════════════════════════════════════════════════${NC}"
251
+
252
+ RESULT=$(echo "$line" | jq -r '.result // empty' 2>/dev/null)
253
+ if [ -n "$RESULT" ]; then
254
+ echo "$RESULT" | while IFS= read -r result_line; do
255
+ echo -e "${WHITE}$result_line${NC}"
256
+ done
257
+ fi
258
+
259
+ # Show cost and tokens
260
+ COST=$(echo "$line" | jq -r '.cost_usd // empty' 2>/dev/null)
261
+ INPUT_TOKENS=$(echo "$line" | jq -r '.usage.input_tokens // empty' 2>/dev/null)
262
+ OUTPUT_TOKENS=$(echo "$line" | jq -r '.usage.output_tokens // empty' 2>/dev/null)
263
+ DURATION=$(echo "$line" | jq -r '.duration_ms // empty' 2>/dev/null)
264
+
265
+ echo ""
266
+ echo -e "${GRAY}───────────────────────────────────────────────────${NC}"
267
+ [ -n "$COST" ] && [ "$COST" != "null" ] && echo -e "${GRAY}💰 Cost: \$$COST${NC}"
268
+ [ -n "$INPUT_TOKENS" ] && [ "$INPUT_TOKENS" != "null" ] && echo -e "${GRAY}📥 Input: $INPUT_TOKENS tokens${NC}"
269
+ [ -n "$OUTPUT_TOKENS" ] && [ "$OUTPUT_TOKENS" != "null" ] && echo -e "${GRAY}📤 Output: $OUTPUT_TOKENS tokens${NC}"
270
+ [ -n "$DURATION" ] && [ "$DURATION" != "null" ] && echo -e "${GRAY}⏱️ Duration: ${DURATION}ms${NC}"
271
+ echo -e "${GRAY}───────────────────────────────────────────────────${NC}"
272
+ ;;
273
+
274
+ "error")
275
+ ERROR=$(echo "$line" | jq -r '.error.message // .message // empty' 2>/dev/null)
276
+ echo -e "\n${RED}${BOLD}╔══ ERROR ══════════════════════════════════════════╗${NC}"
277
+ echo -e "${RED}${BOLD}║ $ERROR${NC}"
278
+ echo -e "${RED}${BOLD}╚═══════════════════════════════════════════════════╝${NC}"
279
+ ;;
280
+
281
+ "message_start"|"message_delta"|"message_stop")
282
+ # Message lifecycle events - ignore silently
283
+ ;;
284
+
285
+ *)
286
+ # Handle custom events (iteration markers, etc)
287
+ EVENT=$(echo "$line" | jq -r '.event // empty' 2>/dev/null)
288
+ if [ -n "$EVENT" ]; then
289
+ case "$EVENT" in
290
+ "iteration_start")
291
+ ITER=$(echo "$line" | jq -r '.iteration // empty' 2>/dev/null)
292
+ TS=$(echo "$line" | jq -r '.timestamp // empty' 2>/dev/null)
293
+ echo -e "${YELLOW}${BOLD}🔄 Iteration $ITER started at $TS${NC}"
294
+ ;;
295
+ "iteration_end")
296
+ ITER=$(echo "$line" | jq -r '.iteration // empty' 2>/dev/null)
297
+ DUR=$(echo "$line" | jq -r '.duration_secs // empty' 2>/dev/null)
298
+ echo -e "${YELLOW}${BOLD}✅ Iteration $ITER ended (${DUR}s)${NC}"
299
+ ;;
300
+ esac
301
+ fi
302
+ ;;
303
+ esac
304
+ done
@@ -1 +0,0 @@
1
- {}
@@ -1,87 +0,0 @@
1
- {
2
- "startTime": 1764962870165,
3
- "sessionId": "session-1764962870165",
4
- "lastActivity": 1764962870165,
5
- "sessionDuration": 0,
6
- "totalTasks": 1,
7
- "successfulTasks": 1,
8
- "failedTasks": 0,
9
- "totalAgents": 0,
10
- "activeAgents": 0,
11
- "neuralEvents": 0,
12
- "memoryMode": {
13
- "reasoningbankOperations": 0,
14
- "basicOperations": 0,
15
- "autoModeSelections": 0,
16
- "modeOverrides": 0,
17
- "currentMode": "auto"
18
- },
19
- "operations": {
20
- "store": {
21
- "count": 0,
22
- "totalDuration": 0,
23
- "errors": 0
24
- },
25
- "retrieve": {
26
- "count": 0,
27
- "totalDuration": 0,
28
- "errors": 0
29
- },
30
- "query": {
31
- "count": 0,
32
- "totalDuration": 0,
33
- "errors": 0
34
- },
35
- "list": {
36
- "count": 0,
37
- "totalDuration": 0,
38
- "errors": 0
39
- },
40
- "delete": {
41
- "count": 0,
42
- "totalDuration": 0,
43
- "errors": 0
44
- },
45
- "search": {
46
- "count": 0,
47
- "totalDuration": 0,
48
- "errors": 0
49
- },
50
- "init": {
51
- "count": 0,
52
- "totalDuration": 0,
53
- "errors": 0
54
- }
55
- },
56
- "performance": {
57
- "avgOperationDuration": 0,
58
- "minOperationDuration": null,
59
- "maxOperationDuration": null,
60
- "slowOperations": 0,
61
- "fastOperations": 0,
62
- "totalOperationTime": 0
63
- },
64
- "storage": {
65
- "totalEntries": 0,
66
- "reasoningbankEntries": 0,
67
- "basicEntries": 0,
68
- "databaseSize": 0,
69
- "lastBackup": null,
70
- "growthRate": 0
71
- },
72
- "errors": {
73
- "total": 0,
74
- "byType": {},
75
- "byOperation": {},
76
- "recent": []
77
- },
78
- "reasoningbank": {
79
- "semanticSearches": 0,
80
- "sqlFallbacks": 0,
81
- "embeddingGenerated": 0,
82
- "consolidations": 0,
83
- "avgQueryTime": 0,
84
- "cacheHits": 0,
85
- "cacheMisses": 0
86
- }
87
- }
@@ -1,10 +0,0 @@
1
- [
2
- {
3
- "id": "cmd-hooks-1764962870434",
4
- "type": "hooks",
5
- "success": true,
6
- "duration": 67.44506799999999,
7
- "timestamp": 1764962870501,
8
- "metadata": {}
9
- }
10
- ]
package/bin/clasp DELETED
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env node
2
- console.log(`
3
- _____ _ _ ____ ____
4
- / ____| | / \\ / ___|| _ \\
5
- | | | | / _ \\ \\___ \\| |_) |
6
- | | | |___ / ___ \\ ___) | __/
7
- \\_____|_____/_/ \\_\\____/|_|
8
-
9
- Claude Language Agent Super Proxy
10
-
11
- Version: 0.0.1 (placeholder)
12
-
13
- Full implementation coming soon!
14
-
15
- This will allow you to run Claude Code with:
16
- - OpenAI (direct)
17
- - Azure OpenAI
18
- - OpenRouter (200+ models)
19
- - Any OpenAI-compatible endpoint (Ollama, vLLM, etc.)
20
-
21
- GitHub: https://github.com/yourname/clasp-ai
22
- `);
package/postinstall.js DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- // Placeholder postinstall script
3
- // Will download platform-specific Go binary in the full release
4
- console.log('clasp-ai installed successfully!');