@fifine/aim-studio 0.0.2 → 0.0.3
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/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +123 -101
- package/dist/commands/init.js.map +1 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +91 -65
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/templates/aim/scripts/common/paths.py +3 -2
- package/dist/templates/aim/scripts/export.py +427 -0
- package/dist/templates/claude/commands/aim/export.md +89 -115
- package/dist/templates/claude/commands/aim/onboard.md +10 -8
- package/dist/templates/claude/commands/aim/start.md +104 -37
- package/dist/templates/claude/hooks/inject-subagent-context.py +6 -10
- package/dist/templates/claude/hooks/session-start.py +134 -24
- package/dist/templates/markdown/index.d.ts +5 -0
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +6 -0
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/markdown/spec/cli/directory-structure.md.txt +71 -0
- package/dist/templates/markdown/spec/cli/error-handling.md.txt +91 -0
- package/dist/templates/markdown/spec/cli/index.md.txt +37 -0
- package/dist/templates/markdown/spec/cli/options-flags.md.txt +71 -0
- package/dist/templates/markdown/spec/cli/output-formatting.md.txt +93 -0
- package/dist/utils/project-detector.d.ts +1 -1
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +20 -0
- package/dist/utils/project-detector.js.map +1 -1
- package/package.json +1 -1
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +0 -13
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +0 -13
- package/dist/templates/claude/commands/trellis/break-loop.md +0 -125
- package/dist/templates/claude/commands/trellis/check-backend.md +0 -13
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +0 -153
- package/dist/templates/claude/commands/trellis/check-frontend.md +0 -13
- package/dist/templates/claude/commands/trellis/create-command.md +0 -154
- package/dist/templates/claude/commands/trellis/finish-work.md +0 -129
- package/dist/templates/claude/commands/trellis/integrate-skill.md +0 -219
- package/dist/templates/claude/commands/trellis/onboard.md +0 -358
- package/dist/templates/claude/commands/trellis/parallel.md +0 -193
- package/dist/templates/claude/commands/trellis/record-session.md +0 -62
- package/dist/templates/claude/commands/trellis/start.md +0 -280
- package/dist/templates/claude/commands/trellis/update-spec.md +0 -285
- package/dist/templates/trellis/gitignore.txt +0 -29
- package/dist/templates/trellis/index.d.ts +0 -49
- package/dist/templates/trellis/index.d.ts.map +0 -1
- package/dist/templates/trellis/index.js +0 -92
- package/dist/templates/trellis/index.js.map +0 -1
- package/dist/templates/trellis/scripts/__init__.py +0 -5
- package/dist/templates/trellis/scripts/add_session.py +0 -392
- package/dist/templates/trellis/scripts/common/__init__.py +0 -80
- package/dist/templates/trellis/scripts/common/cli_adapter.py +0 -435
- package/dist/templates/trellis/scripts/common/developer.py +0 -190
- package/dist/templates/trellis/scripts/common/git_context.py +0 -383
- package/dist/templates/trellis/scripts/common/paths.py +0 -347
- package/dist/templates/trellis/scripts/common/phase.py +0 -253
- package/dist/templates/trellis/scripts/common/registry.py +0 -366
- package/dist/templates/trellis/scripts/common/task_queue.py +0 -255
- package/dist/templates/trellis/scripts/common/task_utils.py +0 -178
- package/dist/templates/trellis/scripts/common/worktree.py +0 -219
- package/dist/templates/trellis/scripts/create_bootstrap.py +0 -290
- package/dist/templates/trellis/scripts/get_context.py +0 -16
- package/dist/templates/trellis/scripts/get_developer.py +0 -26
- package/dist/templates/trellis/scripts/init_developer.py +0 -51
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +0 -5
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +0 -403
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +0 -329
- package/dist/templates/trellis/scripts/multi_agent/plan.py +0 -233
- package/dist/templates/trellis/scripts/multi_agent/start.py +0 -461
- package/dist/templates/trellis/scripts/multi_agent/status.py +0 -817
- package/dist/templates/trellis/scripts/task.py +0 -1056
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +0 -384
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +0 -129
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +0 -263
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +0 -208
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +0 -150
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +0 -247
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +0 -142
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +0 -151
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +0 -128
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +0 -299
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +0 -7
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +0 -15
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +0 -34
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +0 -396
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +0 -241
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +0 -207
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +0 -317
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +0 -828
- package/dist/templates/trellis/scripts-shell-archive/task.sh +0 -1204
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +0 -416
- package/dist/templates/trellis/worktree.yaml +0 -47
|
@@ -1,828 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# =============================================================================
|
|
3
|
-
# Multi-Agent Pipeline: Status Monitor
|
|
4
|
-
# =============================================================================
|
|
5
|
-
# Usage:
|
|
6
|
-
# ./status.sh Show summary of all tasks (default)
|
|
7
|
-
# ./status.sh -a <assignee> Filter tasks by assignee
|
|
8
|
-
# ./status.sh --list List all worktrees and agents
|
|
9
|
-
# ./status.sh --detail <task> Detailed task status
|
|
10
|
-
# ./status.sh --watch <task> Watch agent log in real-time
|
|
11
|
-
# ./status.sh --log <task> Show recent log entries
|
|
12
|
-
# ./status.sh --registry Show agent registry
|
|
13
|
-
# =============================================================================
|
|
14
|
-
|
|
15
|
-
set -e
|
|
16
|
-
|
|
17
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
-
source "$SCRIPT_DIR/../common/paths.sh"
|
|
19
|
-
source "$SCRIPT_DIR/../common/worktree.sh"
|
|
20
|
-
source "$SCRIPT_DIR/../common/developer.sh"
|
|
21
|
-
source "$SCRIPT_DIR/../common/phase.sh"
|
|
22
|
-
source "$SCRIPT_DIR/../common/task-queue.sh"
|
|
23
|
-
|
|
24
|
-
# Colors
|
|
25
|
-
RED='\033[0;31m'
|
|
26
|
-
GREEN='\033[0;32m'
|
|
27
|
-
YELLOW='\033[1;33m'
|
|
28
|
-
BLUE='\033[0;34m'
|
|
29
|
-
CYAN='\033[0;36m'
|
|
30
|
-
DIM='\033[2m'
|
|
31
|
-
NC='\033[0m'
|
|
32
|
-
|
|
33
|
-
PROJECT_ROOT=$(get_repo_root)
|
|
34
|
-
|
|
35
|
-
# =============================================================================
|
|
36
|
-
# Parse Arguments
|
|
37
|
-
# =============================================================================
|
|
38
|
-
ACTION="summary"
|
|
39
|
-
TARGET=""
|
|
40
|
-
FILTER_ASSIGNEE=""
|
|
41
|
-
|
|
42
|
-
while [[ $# -gt 0 ]]; do
|
|
43
|
-
case $1 in
|
|
44
|
-
-a|--assignee)
|
|
45
|
-
FILTER_ASSIGNEE="$2"
|
|
46
|
-
shift 2
|
|
47
|
-
;;
|
|
48
|
-
--list)
|
|
49
|
-
ACTION="list"
|
|
50
|
-
shift
|
|
51
|
-
;;
|
|
52
|
-
--detail)
|
|
53
|
-
ACTION="detail"
|
|
54
|
-
TARGET="$2"
|
|
55
|
-
shift 2
|
|
56
|
-
;;
|
|
57
|
-
--watch)
|
|
58
|
-
ACTION="watch"
|
|
59
|
-
TARGET="$2"
|
|
60
|
-
shift 2
|
|
61
|
-
;;
|
|
62
|
-
--log)
|
|
63
|
-
ACTION="log"
|
|
64
|
-
TARGET="$2"
|
|
65
|
-
shift 2
|
|
66
|
-
;;
|
|
67
|
-
--progress)
|
|
68
|
-
ACTION="progress"
|
|
69
|
-
TARGET="$2"
|
|
70
|
-
shift 2
|
|
71
|
-
;;
|
|
72
|
-
--registry)
|
|
73
|
-
ACTION="registry"
|
|
74
|
-
shift
|
|
75
|
-
;;
|
|
76
|
-
-h|--help)
|
|
77
|
-
ACTION="help"
|
|
78
|
-
shift
|
|
79
|
-
;;
|
|
80
|
-
*)
|
|
81
|
-
TARGET="$1"
|
|
82
|
-
shift
|
|
83
|
-
;;
|
|
84
|
-
esac
|
|
85
|
-
done
|
|
86
|
-
|
|
87
|
-
# =============================================================================
|
|
88
|
-
# Helper Functions
|
|
89
|
-
# =============================================================================
|
|
90
|
-
|
|
91
|
-
# Check if PID is running
|
|
92
|
-
is_running() {
|
|
93
|
-
local pid="$1"
|
|
94
|
-
[ -n "$pid" ] && kill -0 "$pid" 2>/dev/null
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
# Get status color
|
|
98
|
-
status_color() {
|
|
99
|
-
local status="$1"
|
|
100
|
-
case "$status" in
|
|
101
|
-
completed) echo "${GREEN}" ;;
|
|
102
|
-
in_progress) echo "${BLUE}" ;;
|
|
103
|
-
planning) echo "${YELLOW}" ;;
|
|
104
|
-
*) echo "${DIM}" ;;
|
|
105
|
-
esac
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
# Find agent by task name or ID
|
|
109
|
-
find_agent() {
|
|
110
|
-
local search="$1"
|
|
111
|
-
AGENTS_DIR=$(get_agents_dir)
|
|
112
|
-
REGISTRY_FILE="${AGENTS_DIR}/registry.json"
|
|
113
|
-
|
|
114
|
-
if [ ! -f "$REGISTRY_FILE" ]; then
|
|
115
|
-
return 1
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
# Try exact ID match first (use -c for compact single-line JSON output)
|
|
119
|
-
local agent=$(jq -c --arg id "$search" '.agents[] | select(.id == $id)' "$REGISTRY_FILE" 2>/dev/null)
|
|
120
|
-
|
|
121
|
-
# Try partial match on task_dir (use -c for compact single-line JSON output)
|
|
122
|
-
if [ -z "$agent" ] || [ "$agent" = "null" ]; then
|
|
123
|
-
agent=$(jq -c --arg search "$search" '[.agents[] | select(.task_dir | contains($search))] | first' "$REGISTRY_FILE" 2>/dev/null)
|
|
124
|
-
fi
|
|
125
|
-
|
|
126
|
-
echo "$agent"
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
# Get the last tool call from agent log
|
|
130
|
-
get_last_tool() {
|
|
131
|
-
local log_file="$1"
|
|
132
|
-
if [ ! -f "$log_file" ]; then
|
|
133
|
-
echo ""
|
|
134
|
-
return
|
|
135
|
-
fi
|
|
136
|
-
# Use tail -r on macOS, tac on Linux
|
|
137
|
-
if command -v tac &>/dev/null; then
|
|
138
|
-
tac "$log_file" 2>/dev/null | head -100 | jq -r 'select(.type=="assistant") | .message.content[]? | select(.type=="tool_use") | .name' 2>/dev/null | head -1
|
|
139
|
-
else
|
|
140
|
-
tail -r "$log_file" 2>/dev/null | head -100 | jq -r 'select(.type=="assistant") | .message.content[]? | select(.type=="tool_use") | .name' 2>/dev/null | head -1
|
|
141
|
-
fi
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
# Get the last assistant text from agent log
|
|
145
|
-
get_last_message() {
|
|
146
|
-
local log_file="$1"
|
|
147
|
-
local max_len="${2:-100}"
|
|
148
|
-
if [ ! -f "$log_file" ]; then
|
|
149
|
-
echo ""
|
|
150
|
-
return
|
|
151
|
-
fi
|
|
152
|
-
local text
|
|
153
|
-
# Use tail -r on macOS, tac on Linux
|
|
154
|
-
if command -v tac &>/dev/null; then
|
|
155
|
-
text=$(tac "$log_file" 2>/dev/null | head -100 | jq -r 'select(.type=="assistant") | .message.content[]? | select(.type=="text") | .text' 2>/dev/null | head -1)
|
|
156
|
-
else
|
|
157
|
-
text=$(tail -r "$log_file" 2>/dev/null | head -100 | jq -r 'select(.type=="assistant") | .message.content[]? | select(.type=="text") | .text' 2>/dev/null | head -1)
|
|
158
|
-
fi
|
|
159
|
-
if [ -n "$text" ] && [ "$text" != "null" ]; then
|
|
160
|
-
echo "${text:0:$max_len}"
|
|
161
|
-
fi
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
# Get recent task notifications from agent log
|
|
165
|
-
# Looks for async_launched tasks and infers completion from current_phase
|
|
166
|
-
get_recent_tasks() {
|
|
167
|
-
local log_file="$1"
|
|
168
|
-
local count="${2:-5}"
|
|
169
|
-
local current_phase="${3:-0}"
|
|
170
|
-
if [ ! -f "$log_file" ]; then
|
|
171
|
-
return
|
|
172
|
-
fi
|
|
173
|
-
# Get async_launched tasks with phase number extracted from description
|
|
174
|
-
tail -500 "$log_file" 2>/dev/null | jq -r --argjson current_phase "$current_phase" '
|
|
175
|
-
select(.type=="user" and .tool_use_result.status == "async_launched" and .tool_use_result.description != null) |
|
|
176
|
-
.tool_use_result.description as $desc |
|
|
177
|
-
# Extract phase number from "Phase N:" pattern
|
|
178
|
-
($desc | capture("Phase (?<num>[0-9]+)") | .num | tonumber) as $phase_num |
|
|
179
|
-
# If current_phase > this phase, it is completed
|
|
180
|
-
(if $phase_num < $current_phase then "completed" else "async_launched" end) as $status |
|
|
181
|
-
"\($status)|\($desc)"
|
|
182
|
-
' 2>/dev/null | tail -"$count"
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
# =============================================================================
|
|
186
|
-
# Commands
|
|
187
|
-
# =============================================================================
|
|
188
|
-
|
|
189
|
-
cmd_help() {
|
|
190
|
-
cat << EOF
|
|
191
|
-
Multi-Agent Pipeline: Status Monitor
|
|
192
|
-
|
|
193
|
-
Usage:
|
|
194
|
-
$0 Show summary of all tasks
|
|
195
|
-
$0 -a <assignee> Filter tasks by assignee
|
|
196
|
-
$0 --list List all worktrees and agents
|
|
197
|
-
$0 --detail <task> Detailed task status
|
|
198
|
-
$0 --progress <task> Quick progress view with recent activity
|
|
199
|
-
$0 --watch <task> Watch agent log in real-time
|
|
200
|
-
$0 --log <task> Show recent log entries
|
|
201
|
-
$0 --registry Show agent registry
|
|
202
|
-
|
|
203
|
-
Examples:
|
|
204
|
-
$0 -a john
|
|
205
|
-
$0 --detail my-task
|
|
206
|
-
$0 --progress my-task
|
|
207
|
-
$0 --watch 01-16-worktree-support
|
|
208
|
-
$0 --log worktree-support
|
|
209
|
-
EOF
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
cmd_list() {
|
|
213
|
-
echo -e "${BLUE}=== Git Worktrees ===${NC}"
|
|
214
|
-
echo ""
|
|
215
|
-
cd "$PROJECT_ROOT"
|
|
216
|
-
git worktree list
|
|
217
|
-
echo ""
|
|
218
|
-
|
|
219
|
-
echo -e "${BLUE}=== Registered Agents ===${NC}"
|
|
220
|
-
echo ""
|
|
221
|
-
|
|
222
|
-
AGENTS_DIR=$(get_agents_dir)
|
|
223
|
-
REGISTRY_FILE="${AGENTS_DIR}/registry.json"
|
|
224
|
-
|
|
225
|
-
if [ ! -f "$REGISTRY_FILE" ]; then
|
|
226
|
-
echo " (no registry found)"
|
|
227
|
-
return
|
|
228
|
-
fi
|
|
229
|
-
|
|
230
|
-
local agents=$(jq -r '.agents[]' "$REGISTRY_FILE" 2>/dev/null)
|
|
231
|
-
if [ -z "$agents" ]; then
|
|
232
|
-
echo " (no agents registered)"
|
|
233
|
-
return
|
|
234
|
-
fi
|
|
235
|
-
|
|
236
|
-
jq -r '.agents[] | "\(.id)|\(.pid)|\(.worktree_path)|\(.started_at)"' "$REGISTRY_FILE" 2>/dev/null | while IFS='|' read -r id pid wt started; do
|
|
237
|
-
local status_icon
|
|
238
|
-
if is_running "$pid"; then
|
|
239
|
-
status_icon="${GREEN}●${NC}"
|
|
240
|
-
else
|
|
241
|
-
status_icon="${RED}○${NC}"
|
|
242
|
-
fi
|
|
243
|
-
echo -e " $status_icon $id (PID: $pid)"
|
|
244
|
-
echo -e " ${DIM}Worktree: $wt${NC}"
|
|
245
|
-
echo -e " ${DIM}Started: $started${NC}"
|
|
246
|
-
echo ""
|
|
247
|
-
done
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
# Calculate elapsed time from ISO timestamp
|
|
251
|
-
calc_elapsed() {
|
|
252
|
-
local started="$1"
|
|
253
|
-
if [ -z "$started" ] || [ "$started" = "null" ]; then
|
|
254
|
-
echo "N/A"
|
|
255
|
-
return
|
|
256
|
-
fi
|
|
257
|
-
|
|
258
|
-
# Parse started time (handle both formats: with and without timezone)
|
|
259
|
-
local start_epoch
|
|
260
|
-
if command -v gdate &>/dev/null; then
|
|
261
|
-
start_epoch=$(gdate -d "$started" +%s 2>/dev/null)
|
|
262
|
-
else
|
|
263
|
-
# Try to parse ISO format
|
|
264
|
-
start_epoch=$(date -j -f "%Y-%m-%dT%H:%M:%S" "${started%%+*}" +%s 2>/dev/null || date -d "$started" +%s 2>/dev/null)
|
|
265
|
-
fi
|
|
266
|
-
|
|
267
|
-
if [ -z "$start_epoch" ]; then
|
|
268
|
-
echo "N/A"
|
|
269
|
-
return
|
|
270
|
-
fi
|
|
271
|
-
|
|
272
|
-
local now_epoch=$(date +%s)
|
|
273
|
-
local elapsed=$((now_epoch - start_epoch))
|
|
274
|
-
|
|
275
|
-
if [ $elapsed -lt 60 ]; then
|
|
276
|
-
echo "${elapsed}s"
|
|
277
|
-
elif [ $elapsed -lt 3600 ]; then
|
|
278
|
-
echo "$((elapsed / 60))m $((elapsed % 60))s"
|
|
279
|
-
else
|
|
280
|
-
echo "$((elapsed / 3600))h $((elapsed % 3600 / 60))m"
|
|
281
|
-
fi
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
# Note: get_phase_info is now in common/phase.sh
|
|
285
|
-
|
|
286
|
-
# Count modified files in worktree
|
|
287
|
-
count_modified_files() {
|
|
288
|
-
local worktree="$1"
|
|
289
|
-
if [ -d "$worktree" ]; then
|
|
290
|
-
cd "$worktree" && git status --short 2>/dev/null | wc -l | tr -d ' '
|
|
291
|
-
else
|
|
292
|
-
echo "0"
|
|
293
|
-
fi
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
cmd_summary() {
|
|
297
|
-
ensure_developer
|
|
298
|
-
|
|
299
|
-
local tasks_dir=$(get_tasks_dir)
|
|
300
|
-
if [ ! -d "$tasks_dir" ]; then
|
|
301
|
-
echo "No tasks directory found"
|
|
302
|
-
exit 0
|
|
303
|
-
fi
|
|
304
|
-
|
|
305
|
-
AGENTS_DIR=$(get_agents_dir)
|
|
306
|
-
REGISTRY_FILE="${AGENTS_DIR}/registry.json"
|
|
307
|
-
|
|
308
|
-
# Count running agents
|
|
309
|
-
local running_count=0
|
|
310
|
-
local total_agents=0
|
|
311
|
-
if [ -f "$REGISTRY_FILE" ]; then
|
|
312
|
-
total_agents=$(jq -r '.agents | length' "$REGISTRY_FILE" 2>/dev/null || echo "0")
|
|
313
|
-
while read -r pid; do
|
|
314
|
-
is_running "$pid" && ((running_count++))
|
|
315
|
-
done < <(jq -r '.agents[].pid' "$REGISTRY_FILE" 2>/dev/null)
|
|
316
|
-
fi
|
|
317
|
-
|
|
318
|
-
# Task queue stats
|
|
319
|
-
local task_stats=$(get_task_stats "$PROJECT_ROOT")
|
|
320
|
-
|
|
321
|
-
echo -e "${BLUE}=== Multi-Agent Status ===${NC}"
|
|
322
|
-
echo -e " Agents: ${GREEN}${running_count}${NC} running / ${total_agents} registered"
|
|
323
|
-
echo -e " Tasks: ${task_stats}"
|
|
324
|
-
echo ""
|
|
325
|
-
|
|
326
|
-
# Use temp files for grouping (compatible with old bash)
|
|
327
|
-
local tmp_dir=$(mktemp -d)
|
|
328
|
-
local running_file="$tmp_dir/running"
|
|
329
|
-
local stopped_file="$tmp_dir/stopped"
|
|
330
|
-
local tasks_file="$tmp_dir/tasks"
|
|
331
|
-
touch "$running_file" "$stopped_file" "$tasks_file"
|
|
332
|
-
|
|
333
|
-
local has_running_agent=false
|
|
334
|
-
|
|
335
|
-
for d in "$tasks_dir"/*/; do
|
|
336
|
-
[ ! -d "$d" ] && continue
|
|
337
|
-
[[ "$(basename "$d")" == "archive" ]] && continue
|
|
338
|
-
|
|
339
|
-
local name=$(basename "$d")
|
|
340
|
-
local task_json="$d/task.json"
|
|
341
|
-
local status="unknown"
|
|
342
|
-
local assignee="unassigned"
|
|
343
|
-
local priority="P2"
|
|
344
|
-
|
|
345
|
-
if [ -f "$task_json" ]; then
|
|
346
|
-
status=$(jq -r '.status // "unknown"' "$task_json")
|
|
347
|
-
assignee=$(jq -r '.assignee // "unassigned"' "$task_json")
|
|
348
|
-
priority=$(jq -r '.priority // "P2"' "$task_json")
|
|
349
|
-
fi
|
|
350
|
-
|
|
351
|
-
# Filter by assignee if specified
|
|
352
|
-
if [ -n "$FILTER_ASSIGNEE" ] && [ "$assignee" != "$FILTER_ASSIGNEE" ]; then
|
|
353
|
-
continue
|
|
354
|
-
fi
|
|
355
|
-
|
|
356
|
-
# Check agent status
|
|
357
|
-
local agent_info=""
|
|
358
|
-
local pid=""
|
|
359
|
-
local worktree=""
|
|
360
|
-
local started=""
|
|
361
|
-
local is_agent_running=false
|
|
362
|
-
|
|
363
|
-
if [ -f "$REGISTRY_FILE" ]; then
|
|
364
|
-
agent_info=$(jq -c --arg name "$name" '[.agents[] | select(.task_dir | contains($name))] | first' "$REGISTRY_FILE" 2>/dev/null)
|
|
365
|
-
if [ -n "$agent_info" ] && [ "$agent_info" != "null" ]; then
|
|
366
|
-
pid=$(echo "$agent_info" | jq -r '.pid')
|
|
367
|
-
worktree=$(echo "$agent_info" | jq -r '.worktree_path')
|
|
368
|
-
started=$(echo "$agent_info" | jq -r '.started_at')
|
|
369
|
-
if is_running "$pid"; then
|
|
370
|
-
is_agent_running=true
|
|
371
|
-
has_running_agent=true
|
|
372
|
-
fi
|
|
373
|
-
fi
|
|
374
|
-
fi
|
|
375
|
-
|
|
376
|
-
local color=$(status_color "$status")
|
|
377
|
-
|
|
378
|
-
# Color priority
|
|
379
|
-
local priority_color="${NC}"
|
|
380
|
-
case "$priority" in
|
|
381
|
-
P0) priority_color="${RED}" ;;
|
|
382
|
-
P1) priority_color="${YELLOW}" ;;
|
|
383
|
-
P2) priority_color="${BLUE}" ;;
|
|
384
|
-
esac
|
|
385
|
-
|
|
386
|
-
if [ "$is_agent_running" = true ]; then
|
|
387
|
-
# Running agent
|
|
388
|
-
local task_dir_rel=$(echo "$agent_info" | jq -r '.task_dir')
|
|
389
|
-
local worktree_task_json="$worktree/$task_dir_rel/task.json"
|
|
390
|
-
local phase_source="$task_json"
|
|
391
|
-
[ -f "$worktree_task_json" ] && phase_source="$worktree_task_json"
|
|
392
|
-
|
|
393
|
-
local phase_info=$(get_phase_info "$phase_source")
|
|
394
|
-
local elapsed=$(calc_elapsed "$started")
|
|
395
|
-
local modified=$(count_modified_files "$worktree")
|
|
396
|
-
local branch=$(jq -r '.branch // "N/A"' "$phase_source" 2>/dev/null)
|
|
397
|
-
local log_file="$worktree/.agent-log"
|
|
398
|
-
local last_tool=$(get_last_tool "$log_file")
|
|
399
|
-
|
|
400
|
-
{
|
|
401
|
-
echo -e "${GREEN}▶${NC} ${CYAN}${name}${NC} ${GREEN}[running]${NC} ${priority_color}[${priority}]${NC} @${assignee}"
|
|
402
|
-
echo -e " Phase: ${phase_info}"
|
|
403
|
-
echo -e " Elapsed: ${elapsed}"
|
|
404
|
-
echo -e " Branch: ${DIM}${branch}${NC}"
|
|
405
|
-
echo -e " Modified: ${modified} file(s)"
|
|
406
|
-
[ -n "$last_tool" ] && echo -e " Activity: ${YELLOW}${last_tool}${NC}"
|
|
407
|
-
echo -e " PID: ${DIM}${pid}${NC}"
|
|
408
|
-
echo ""
|
|
409
|
-
} >> "$running_file"
|
|
410
|
-
|
|
411
|
-
elif [ -n "$agent_info" ] && [ "$agent_info" != "null" ]; then
|
|
412
|
-
# Stopped agent - check if completed or interrupted
|
|
413
|
-
local task_dir_rel=$(echo "$agent_info" | jq -r '.task_dir')
|
|
414
|
-
local worktree_task_json="$worktree/$task_dir_rel/task.json"
|
|
415
|
-
local worktree_status="unknown"
|
|
416
|
-
if [ -f "$worktree_task_json" ]; then
|
|
417
|
-
worktree_status=$(jq -r '.status // "unknown"' "$worktree_task_json")
|
|
418
|
-
fi
|
|
419
|
-
|
|
420
|
-
if [ "$worktree_status" = "completed" ]; then
|
|
421
|
-
# Agent completed successfully
|
|
422
|
-
{
|
|
423
|
-
echo -e "${GREEN}✓${NC} ${name} ${GREEN}[completed]${NC}"
|
|
424
|
-
echo ""
|
|
425
|
-
} >> "$stopped_file"
|
|
426
|
-
else
|
|
427
|
-
# Agent was interrupted/blocked
|
|
428
|
-
{
|
|
429
|
-
local session_id_file="${worktree}/.session-id"
|
|
430
|
-
local log_file="$worktree/.agent-log"
|
|
431
|
-
local last_msg=$(get_last_message "$log_file" 150)
|
|
432
|
-
|
|
433
|
-
if [ -f "$session_id_file" ]; then
|
|
434
|
-
local session_id=$(cat "$session_id_file")
|
|
435
|
-
echo -e "${RED}○${NC} ${name} ${RED}[stopped]${NC}"
|
|
436
|
-
if [ -n "$last_msg" ]; then
|
|
437
|
-
echo -e "${DIM}\"${last_msg}\"${NC}"
|
|
438
|
-
fi
|
|
439
|
-
echo -e "${YELLOW}cd ${worktree} && claude --resume ${session_id}${NC}"
|
|
440
|
-
else
|
|
441
|
-
echo -e "${RED}○${NC} ${name} ${RED}[stopped]${NC} ${DIM}(no session-id)${NC}"
|
|
442
|
-
fi
|
|
443
|
-
echo ""
|
|
444
|
-
} >> "$stopped_file"
|
|
445
|
-
fi
|
|
446
|
-
|
|
447
|
-
else
|
|
448
|
-
# Normal task - store with assignee + priority_order + status_order + date for sorting
|
|
449
|
-
# Priority order: P0=0, P1=1, P2=2, P3=3 (lower = higher priority)
|
|
450
|
-
local priority_order="2"
|
|
451
|
-
case "$priority" in
|
|
452
|
-
P0) priority_order="0" ;;
|
|
453
|
-
P1) priority_order="1" ;;
|
|
454
|
-
P2) priority_order="2" ;;
|
|
455
|
-
P3) priority_order="3" ;;
|
|
456
|
-
esac
|
|
457
|
-
# Status order: in_progress=0, planning=1, completed=2 (lower = show first)
|
|
458
|
-
local status_order="1"
|
|
459
|
-
case "$status" in
|
|
460
|
-
in_progress) status_order="0" ;;
|
|
461
|
-
planning) status_order="1" ;;
|
|
462
|
-
completed) status_order="2" ;;
|
|
463
|
-
esac
|
|
464
|
-
# Extract date from name (MM-DD) for sorting, use reverse for desc
|
|
465
|
-
# Name format: MM-DD-xxx, extract MM-DD part and invert for desc sort
|
|
466
|
-
local date_part=$(echo "$name" | grep -oE '^[0-9]{2}-[0-9]{2}' || echo "00-00")
|
|
467
|
-
echo -e "${assignee}\t${priority_order}\t${status_order}\t${date_part}\t${color}●${NC} ${name} (${status}) ${priority_color}[${priority}]${NC}" >> "$tasks_file"
|
|
468
|
-
fi
|
|
469
|
-
done
|
|
470
|
-
|
|
471
|
-
# Output running agents first
|
|
472
|
-
if [ -s "$running_file" ]; then
|
|
473
|
-
echo -e "${CYAN}Running Agents:${NC}"
|
|
474
|
-
cat "$running_file"
|
|
475
|
-
fi
|
|
476
|
-
|
|
477
|
-
# Output stopped agents
|
|
478
|
-
if [ -s "$stopped_file" ]; then
|
|
479
|
-
echo -e "${RED}Stopped Agents:${NC}"
|
|
480
|
-
cat "$stopped_file"
|
|
481
|
-
fi
|
|
482
|
-
|
|
483
|
-
# Separator between agents and tasks
|
|
484
|
-
if [ -s "$running_file" ] || [ -s "$stopped_file" ]; then
|
|
485
|
-
if [ -s "$tasks_file" ]; then
|
|
486
|
-
echo -e "${DIM}───────────────────────────────────────${NC}"
|
|
487
|
-
echo ""
|
|
488
|
-
fi
|
|
489
|
-
fi
|
|
490
|
-
|
|
491
|
-
# Output tasks grouped by assignee, sorted by priority > status > date(desc)
|
|
492
|
-
if [ -s "$tasks_file" ]; then
|
|
493
|
-
local current_assignee=""
|
|
494
|
-
# Sort: assignee(asc), priority(asc), status(asc), date(desc/reverse)
|
|
495
|
-
sort -t$'\t' -k1,1 -k2,2n -k3,3n -k4,4r "$tasks_file" | while IFS=$'\t' read -r assignee priority_order status_order date_part task_line; do
|
|
496
|
-
if [ "$assignee" != "$current_assignee" ]; then
|
|
497
|
-
[ -n "$current_assignee" ] && echo ""
|
|
498
|
-
echo -e "${CYAN}@${assignee}:${NC}"
|
|
499
|
-
current_assignee="$assignee"
|
|
500
|
-
fi
|
|
501
|
-
echo -e " $task_line"
|
|
502
|
-
done
|
|
503
|
-
fi
|
|
504
|
-
|
|
505
|
-
# Cleanup
|
|
506
|
-
rm -rf "$tmp_dir"
|
|
507
|
-
|
|
508
|
-
if [ "$has_running_agent" = true ]; then
|
|
509
|
-
echo ""
|
|
510
|
-
echo -e "${DIM}─────────────────────────────────────${NC}"
|
|
511
|
-
echo -e "${DIM}Use --progress <name> for quick activity view${NC}"
|
|
512
|
-
echo -e "${DIM}Use --detail <name> for more info${NC}"
|
|
513
|
-
fi
|
|
514
|
-
echo ""
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
cmd_progress() {
|
|
518
|
-
if [ -z "$TARGET" ]; then
|
|
519
|
-
echo "Usage: $0 --progress <task>"
|
|
520
|
-
exit 1
|
|
521
|
-
fi
|
|
522
|
-
|
|
523
|
-
local agent=$(find_agent "$TARGET")
|
|
524
|
-
if [ -z "$agent" ] || [ "$agent" = "null" ]; then
|
|
525
|
-
echo "Agent not found: $TARGET"
|
|
526
|
-
exit 1
|
|
527
|
-
fi
|
|
528
|
-
|
|
529
|
-
local id=$(echo "$agent" | jq -r '.id')
|
|
530
|
-
local pid=$(echo "$agent" | jq -r '.pid')
|
|
531
|
-
local worktree=$(echo "$agent" | jq -r '.worktree_path')
|
|
532
|
-
local task_dir=$(echo "$agent" | jq -r '.task_dir')
|
|
533
|
-
local started=$(echo "$agent" | jq -r '.started_at')
|
|
534
|
-
local log_file="$worktree/.agent-log"
|
|
535
|
-
|
|
536
|
-
if [ ! -f "$log_file" ]; then
|
|
537
|
-
echo "Log file not found: $log_file"
|
|
538
|
-
exit 1
|
|
539
|
-
fi
|
|
540
|
-
|
|
541
|
-
# Get phase info from worktree's task.json
|
|
542
|
-
local worktree_task_json="$worktree/$task_dir/task.json"
|
|
543
|
-
local phase_info="N/A"
|
|
544
|
-
local current_phase=0
|
|
545
|
-
if [ -f "$worktree_task_json" ]; then
|
|
546
|
-
phase_info=$(get_phase_info "$worktree_task_json")
|
|
547
|
-
current_phase=$(jq -r '.current_phase // 0' "$worktree_task_json")
|
|
548
|
-
fi
|
|
549
|
-
|
|
550
|
-
local elapsed=$(calc_elapsed "$started")
|
|
551
|
-
local modified=$(count_modified_files "$worktree")
|
|
552
|
-
|
|
553
|
-
# Check if running
|
|
554
|
-
local status_str
|
|
555
|
-
if is_running "$pid"; then
|
|
556
|
-
status_str="${GREEN}running${NC}"
|
|
557
|
-
else
|
|
558
|
-
status_str="${RED}stopped${NC}"
|
|
559
|
-
fi
|
|
560
|
-
|
|
561
|
-
echo ""
|
|
562
|
-
echo -e "${BLUE}=== Progress: ${id} ===${NC}"
|
|
563
|
-
echo ""
|
|
564
|
-
|
|
565
|
-
# Basic info (like summary)
|
|
566
|
-
echo -e "${CYAN}Status:${NC}"
|
|
567
|
-
echo -e " State: ${status_str}"
|
|
568
|
-
echo -e " Phase: ${phase_info}"
|
|
569
|
-
echo -e " Elapsed: ${elapsed}"
|
|
570
|
-
echo -e " Modified: ${modified} file(s)"
|
|
571
|
-
echo ""
|
|
572
|
-
|
|
573
|
-
# Recent task notifications
|
|
574
|
-
echo -e "${CYAN}Recent Tasks:${NC}"
|
|
575
|
-
local has_tasks=false
|
|
576
|
-
while IFS='|' read -r status summary; do
|
|
577
|
-
[ -z "$status" ] && continue
|
|
578
|
-
has_tasks=true
|
|
579
|
-
local icon
|
|
580
|
-
case "$status" in
|
|
581
|
-
completed) icon="${GREEN}✓${NC}" ;;
|
|
582
|
-
failed) icon="${RED}✗${NC}" ;;
|
|
583
|
-
async_launched) icon="${BLUE}▶${NC}" ;;
|
|
584
|
-
*) icon="${YELLOW}○${NC}" ;;
|
|
585
|
-
esac
|
|
586
|
-
echo -e " ${icon} ${summary}"
|
|
587
|
-
done < <(get_recent_tasks "$log_file" 5 "$current_phase")
|
|
588
|
-
|
|
589
|
-
if [ "$has_tasks" = false ]; then
|
|
590
|
-
echo -e " ${DIM}(no task notifications yet)${NC}"
|
|
591
|
-
fi
|
|
592
|
-
echo ""
|
|
593
|
-
|
|
594
|
-
# Current activity
|
|
595
|
-
echo -e "${CYAN}Current Activity:${NC}"
|
|
596
|
-
local last_tool=$(get_last_tool "$log_file")
|
|
597
|
-
if [ -n "$last_tool" ]; then
|
|
598
|
-
echo -e " Tool: ${YELLOW}${last_tool}${NC}"
|
|
599
|
-
else
|
|
600
|
-
echo -e " ${DIM}(no recent tool calls)${NC}"
|
|
601
|
-
fi
|
|
602
|
-
echo ""
|
|
603
|
-
|
|
604
|
-
# Last message
|
|
605
|
-
echo -e "${CYAN}Last Message:${NC}"
|
|
606
|
-
local last_msg=$(get_last_message "$log_file" 200)
|
|
607
|
-
if [ -n "$last_msg" ]; then
|
|
608
|
-
echo -e " \"${last_msg}...\""
|
|
609
|
-
else
|
|
610
|
-
echo -e " ${DIM}(no recent messages)${NC}"
|
|
611
|
-
fi
|
|
612
|
-
echo ""
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
cmd_detail() {
|
|
616
|
-
if [ -z "$TARGET" ]; then
|
|
617
|
-
echo "Usage: $0 --detail <task>"
|
|
618
|
-
exit 1
|
|
619
|
-
fi
|
|
620
|
-
|
|
621
|
-
local agent=$(find_agent "$TARGET")
|
|
622
|
-
if [ -z "$agent" ] || [ "$agent" = "null" ]; then
|
|
623
|
-
echo "Agent not found: $TARGET"
|
|
624
|
-
exit 1
|
|
625
|
-
fi
|
|
626
|
-
|
|
627
|
-
local id=$(echo "$agent" | jq -r '.id')
|
|
628
|
-
local pid=$(echo "$agent" | jq -r '.pid')
|
|
629
|
-
local worktree=$(echo "$agent" | jq -r '.worktree_path')
|
|
630
|
-
local task_dir=$(echo "$agent" | jq -r '.task_dir')
|
|
631
|
-
local started=$(echo "$agent" | jq -r '.started_at')
|
|
632
|
-
|
|
633
|
-
# Check for session-id
|
|
634
|
-
local session_id=""
|
|
635
|
-
local session_id_file="${worktree}/.session-id"
|
|
636
|
-
if [ -f "$session_id_file" ]; then
|
|
637
|
-
session_id=$(cat "$session_id_file")
|
|
638
|
-
fi
|
|
639
|
-
|
|
640
|
-
echo -e "${BLUE}=== Agent Detail: $id ===${NC}"
|
|
641
|
-
echo ""
|
|
642
|
-
echo " ID: $id"
|
|
643
|
-
echo " PID: $pid"
|
|
644
|
-
echo " Session: ${session_id:-N/A}"
|
|
645
|
-
echo " Worktree: $worktree"
|
|
646
|
-
echo " Task Dir: $task_dir"
|
|
647
|
-
echo " Started: $started"
|
|
648
|
-
echo ""
|
|
649
|
-
|
|
650
|
-
# Status
|
|
651
|
-
if is_running "$pid"; then
|
|
652
|
-
echo -e " Status: ${GREEN}Running${NC}"
|
|
653
|
-
else
|
|
654
|
-
echo -e " Status: ${RED}Stopped${NC}"
|
|
655
|
-
if [ -n "$session_id" ]; then
|
|
656
|
-
echo ""
|
|
657
|
-
echo -e " ${YELLOW}Resume:${NC} cd ${worktree} && claude --resume ${session_id}"
|
|
658
|
-
fi
|
|
659
|
-
fi
|
|
660
|
-
|
|
661
|
-
# Task info
|
|
662
|
-
local task_json="$PROJECT_ROOT/$task_dir/task.json"
|
|
663
|
-
if [ -f "$task_json" ]; then
|
|
664
|
-
echo ""
|
|
665
|
-
echo -e "${BLUE}=== Task Info ===${NC}"
|
|
666
|
-
echo ""
|
|
667
|
-
local status=$(jq -r '.status // "unknown"' "$task_json")
|
|
668
|
-
local branch=$(jq -r '.branch // "N/A"' "$task_json")
|
|
669
|
-
local base=$(jq -r '.base_branch // "N/A"' "$task_json")
|
|
670
|
-
echo " Status: $status"
|
|
671
|
-
echo " Branch: $branch"
|
|
672
|
-
echo " Base Branch: $base"
|
|
673
|
-
fi
|
|
674
|
-
|
|
675
|
-
# Git changes
|
|
676
|
-
if [ -d "$worktree" ]; then
|
|
677
|
-
echo ""
|
|
678
|
-
echo -e "${BLUE}=== Git Changes ===${NC}"
|
|
679
|
-
echo ""
|
|
680
|
-
cd "$worktree"
|
|
681
|
-
local changes=$(git status --short 2>/dev/null | head -10)
|
|
682
|
-
if [ -n "$changes" ]; then
|
|
683
|
-
echo "$changes" | sed 's/^/ /'
|
|
684
|
-
local total=$(git status --short 2>/dev/null | wc -l | tr -d ' ')
|
|
685
|
-
if [ "$total" -gt 10 ]; then
|
|
686
|
-
echo " ... and $((total - 10)) more"
|
|
687
|
-
fi
|
|
688
|
-
else
|
|
689
|
-
echo " (no changes)"
|
|
690
|
-
fi
|
|
691
|
-
fi
|
|
692
|
-
|
|
693
|
-
echo ""
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
cmd_watch() {
|
|
697
|
-
if [ -z "$TARGET" ]; then
|
|
698
|
-
echo "Usage: $0 --watch <task>"
|
|
699
|
-
exit 1
|
|
700
|
-
fi
|
|
701
|
-
|
|
702
|
-
local agent=$(find_agent "$TARGET")
|
|
703
|
-
if [ -z "$agent" ] || [ "$agent" = "null" ]; then
|
|
704
|
-
echo "Agent not found: $TARGET"
|
|
705
|
-
exit 1
|
|
706
|
-
fi
|
|
707
|
-
|
|
708
|
-
local worktree=$(echo "$agent" | jq -r '.worktree_path')
|
|
709
|
-
local log_file="$worktree/.agent-log"
|
|
710
|
-
|
|
711
|
-
if [ ! -f "$log_file" ]; then
|
|
712
|
-
echo "Log file not found: $log_file"
|
|
713
|
-
exit 1
|
|
714
|
-
fi
|
|
715
|
-
|
|
716
|
-
echo -e "${BLUE}Watching:${NC} $log_file"
|
|
717
|
-
echo -e "${DIM}Press Ctrl+C to stop${NC}"
|
|
718
|
-
echo ""
|
|
719
|
-
|
|
720
|
-
tail -f "$log_file"
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
cmd_log() {
|
|
724
|
-
if [ -z "$TARGET" ]; then
|
|
725
|
-
echo "Usage: $0 --log <task>"
|
|
726
|
-
exit 1
|
|
727
|
-
fi
|
|
728
|
-
|
|
729
|
-
local agent=$(find_agent "$TARGET")
|
|
730
|
-
if [ -z "$agent" ] || [ "$agent" = "null" ]; then
|
|
731
|
-
echo "Agent not found: $TARGET"
|
|
732
|
-
exit 1
|
|
733
|
-
fi
|
|
734
|
-
|
|
735
|
-
local worktree=$(echo "$agent" | jq -r '.worktree_path')
|
|
736
|
-
local log_file="$worktree/.agent-log"
|
|
737
|
-
|
|
738
|
-
if [ ! -f "$log_file" ]; then
|
|
739
|
-
echo "Log file not found: $log_file"
|
|
740
|
-
exit 1
|
|
741
|
-
fi
|
|
742
|
-
|
|
743
|
-
echo -e "${BLUE}=== Recent Log: $TARGET ===${NC}"
|
|
744
|
-
echo ""
|
|
745
|
-
|
|
746
|
-
# Parse and format JSON log entries
|
|
747
|
-
tail -50 "$log_file" | while IFS= read -r line; do
|
|
748
|
-
local type=$(echo "$line" | jq -r '.type // empty' 2>/dev/null)
|
|
749
|
-
[ -z "$type" ] && continue
|
|
750
|
-
|
|
751
|
-
case "$type" in
|
|
752
|
-
system)
|
|
753
|
-
local subtype=$(echo "$line" | jq -r '.subtype // ""' 2>/dev/null)
|
|
754
|
-
echo -e "${CYAN}[SYSTEM]${NC} $subtype"
|
|
755
|
-
;;
|
|
756
|
-
user)
|
|
757
|
-
local content=$(echo "$line" | jq -r '.message.content // empty' 2>/dev/null)
|
|
758
|
-
if [ -n "$content" ] && [ "$content" != "null" ]; then
|
|
759
|
-
echo -e "${GREEN}[USER]${NC} ${content:0:200}"
|
|
760
|
-
fi
|
|
761
|
-
;;
|
|
762
|
-
assistant)
|
|
763
|
-
# Extract text or tool use
|
|
764
|
-
local text=$(echo "$line" | jq -r '.message.content[0].text // empty' 2>/dev/null)
|
|
765
|
-
local tool=$(echo "$line" | jq -r '.message.content[0].name // empty' 2>/dev/null)
|
|
766
|
-
|
|
767
|
-
if [ -n "$text" ] && [ "$text" != "null" ]; then
|
|
768
|
-
# Truncate long text
|
|
769
|
-
local display="${text:0:300}"
|
|
770
|
-
[ ${#text} -gt 300 ] && display="$display..."
|
|
771
|
-
echo -e "${BLUE}[ASSISTANT]${NC} $display"
|
|
772
|
-
elif [ -n "$tool" ] && [ "$tool" != "null" ]; then
|
|
773
|
-
echo -e "${YELLOW}[TOOL]${NC} $tool"
|
|
774
|
-
fi
|
|
775
|
-
;;
|
|
776
|
-
result)
|
|
777
|
-
local tool_name=$(echo "$line" | jq -r '.tool // "unknown"' 2>/dev/null)
|
|
778
|
-
echo -e "${DIM}[RESULT]${NC} $tool_name completed"
|
|
779
|
-
;;
|
|
780
|
-
esac
|
|
781
|
-
done
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
cmd_registry() {
|
|
785
|
-
AGENTS_DIR=$(get_agents_dir)
|
|
786
|
-
REGISTRY_FILE="${AGENTS_DIR}/registry.json"
|
|
787
|
-
|
|
788
|
-
echo -e "${BLUE}=== Agent Registry ===${NC}"
|
|
789
|
-
echo ""
|
|
790
|
-
echo "File: $REGISTRY_FILE"
|
|
791
|
-
echo ""
|
|
792
|
-
|
|
793
|
-
if [ -f "$REGISTRY_FILE" ]; then
|
|
794
|
-
jq '.' "$REGISTRY_FILE"
|
|
795
|
-
else
|
|
796
|
-
echo "(registry not found)"
|
|
797
|
-
fi
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
# =============================================================================
|
|
801
|
-
# Main
|
|
802
|
-
# =============================================================================
|
|
803
|
-
case "$ACTION" in
|
|
804
|
-
help)
|
|
805
|
-
cmd_help
|
|
806
|
-
;;
|
|
807
|
-
list)
|
|
808
|
-
cmd_list
|
|
809
|
-
;;
|
|
810
|
-
summary)
|
|
811
|
-
cmd_summary
|
|
812
|
-
;;
|
|
813
|
-
progress)
|
|
814
|
-
cmd_progress
|
|
815
|
-
;;
|
|
816
|
-
detail)
|
|
817
|
-
cmd_detail
|
|
818
|
-
;;
|
|
819
|
-
watch)
|
|
820
|
-
cmd_watch
|
|
821
|
-
;;
|
|
822
|
-
log)
|
|
823
|
-
cmd_log
|
|
824
|
-
;;
|
|
825
|
-
registry)
|
|
826
|
-
cmd_registry
|
|
827
|
-
;;
|
|
828
|
-
esac
|