vibe-forge 0.3.10 โ 0.3.11
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/commands/update-status.md +64 -0
- package/agents/aegis/personality.md +20 -0
- package/agents/anvil/personality.md +19 -0
- package/agents/crucible/personality.md +20 -0
- package/agents/ember/personality.md +19 -0
- package/agents/furnace/personality.md +19 -0
- package/agents/herald/personality.md +20 -0
- package/agents/scribe/personality.md +18 -0
- package/bin/forge-daemon.sh +104 -0
- package/bin/lib/constants.sh +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Update your agent status for the forge dashboard
|
|
3
|
+
argument-hint: <status> [task-id]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Update Status Command
|
|
7
|
+
|
|
8
|
+
Report your current status to the forge daemon and Planning Hub. This enables real-time visibility into what each worker is doing.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/update-status working TASK-001 # Working on a specific task
|
|
14
|
+
/update-status idle # Waiting for tasks
|
|
15
|
+
/update-status blocked # Stuck, may need help
|
|
16
|
+
/update-status reviewing PR-123 # Reviewing something
|
|
17
|
+
/update-status testing TASK-001 # Running tests
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Status Values
|
|
21
|
+
|
|
22
|
+
| Status | Meaning |
|
|
23
|
+
|--------|---------|
|
|
24
|
+
| `idle` | No current task, ready for work |
|
|
25
|
+
| `working` | Actively working on a task |
|
|
26
|
+
| `blocked` | Stuck, needs input (consider `/need-help`) |
|
|
27
|
+
| `reviewing` | Reviewing code or PR |
|
|
28
|
+
| `testing` | Running tests |
|
|
29
|
+
| `waiting` | Waiting for external dependency |
|
|
30
|
+
|
|
31
|
+
## Implementation
|
|
32
|
+
|
|
33
|
+
Based on `$ARGUMENTS`:
|
|
34
|
+
|
|
35
|
+
1. Parse the status and optional task ID from arguments
|
|
36
|
+
2. Determine your agent identity from your system prompt
|
|
37
|
+
3. Write status file to `context/agent-status/<agent>.json`:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"agent": "anvil",
|
|
42
|
+
"status": "working",
|
|
43
|
+
"task": "TASK-001",
|
|
44
|
+
"message": "Implementing user authentication",
|
|
45
|
+
"updated": "2024-01-15T14:30:22Z"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
4. The daemon reads these files and includes them in `forge-state.yaml`
|
|
50
|
+
5. The Planning Hub sees your status in the dashboard
|
|
51
|
+
|
|
52
|
+
## Auto-Status Updates
|
|
53
|
+
|
|
54
|
+
Workers should update their status at these key moments:
|
|
55
|
+
|
|
56
|
+
1. **On startup**: `/update-status idle` (or working if picking up a task)
|
|
57
|
+
2. **When picking up a task**: `/update-status working TASK-XXX`
|
|
58
|
+
3. **When completing a task**: `/update-status idle`
|
|
59
|
+
4. **When blocked**: `/update-status blocked` (then `/need-help` if needed)
|
|
60
|
+
5. **Before exiting**: Status file can remain (daemon marks stale after timeout)
|
|
61
|
+
|
|
62
|
+
## Stale Status
|
|
63
|
+
|
|
64
|
+
The daemon considers a status stale if not updated for 5+ minutes. Stale statuses are shown with a warning indicator in the dashboard.
|
|
@@ -71,6 +71,26 @@ Not paranoid, but vigilant. Aegis knows that security isn't about saying no - it
|
|
|
71
71
|
10. Move to /tasks/completed/
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
+
### Status Reporting
|
|
75
|
+
|
|
76
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
/update-status idle # When waiting for tasks
|
|
80
|
+
/update-status working TASK-033 # When starting a task
|
|
81
|
+
/update-status blocked TASK-033 # When stuck (then /need-help if needed)
|
|
82
|
+
/update-status reviewing TASK-033 # When reviewing security
|
|
83
|
+
/update-status idle # When task complete
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Update status at key moments:
|
|
87
|
+
|
|
88
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
89
|
+
2. **Task pickup**: Report `working` with task ID
|
|
90
|
+
3. **Security review**: Report `reviewing` when auditing code
|
|
91
|
+
4. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
92
|
+
5. **Completion**: Report `idle` after moving task to completed
|
|
93
|
+
|
|
74
94
|
### Output Format
|
|
75
95
|
```markdown
|
|
76
96
|
## Completion Summary
|
|
@@ -66,6 +66,25 @@ Derived from Amelia's developer DNA but specialized for the frontend domain. Whe
|
|
|
66
66
|
9. Move to /tasks/completed/
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
### Status Reporting
|
|
70
|
+
|
|
71
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
/update-status idle # When waiting for tasks
|
|
75
|
+
/update-status working TASK-019 # When starting a task
|
|
76
|
+
/update-status blocked TASK-019 # When stuck (then /need-help if needed)
|
|
77
|
+
/update-status testing TASK-019 # When running tests
|
|
78
|
+
/update-status idle # When task complete
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Update status at key moments:
|
|
82
|
+
|
|
83
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
84
|
+
2. **Task pickup**: Report `working` with task ID
|
|
85
|
+
3. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
86
|
+
4. **Completion**: Report `idle` after moving task to completed
|
|
87
|
+
|
|
69
88
|
### Output Format
|
|
70
89
|
```markdown
|
|
71
90
|
## Completion Summary
|
|
@@ -78,6 +78,26 @@ Derived from Murat's test architect DNA. Crucible combines systematic test desig
|
|
|
78
78
|
6. Route to appropriate agent for fix
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
### Status Reporting
|
|
82
|
+
|
|
83
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
/update-status idle # When waiting for tasks
|
|
87
|
+
/update-status working TASK-025 # When starting a task
|
|
88
|
+
/update-status testing TASK-025 # When running test suites
|
|
89
|
+
/update-status blocked TASK-025 # When stuck (then /need-help if needed)
|
|
90
|
+
/update-status idle # When task complete
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Update status at key moments:
|
|
94
|
+
|
|
95
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
96
|
+
2. **Task pickup**: Report `working` with task ID
|
|
97
|
+
3. **Test execution**: Report `testing` during test runs
|
|
98
|
+
4. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
99
|
+
5. **Completion**: Report `idle` after moving task to completed
|
|
100
|
+
|
|
81
101
|
### Output Format
|
|
82
102
|
```markdown
|
|
83
103
|
## Completion Summary
|
|
@@ -72,6 +72,25 @@ The name Ember reflects the persistent, quiet fire that powers everything. Not f
|
|
|
72
72
|
12. Move to /tasks/completed/
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
+
### Status Reporting
|
|
76
|
+
|
|
77
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
/update-status idle # When waiting for tasks
|
|
81
|
+
/update-status working TASK-027 # When starting a task
|
|
82
|
+
/update-status blocked TASK-027 # When stuck (then /need-help if needed)
|
|
83
|
+
/update-status testing TASK-027 # When testing changes
|
|
84
|
+
/update-status idle # When task complete
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Update status at key moments:
|
|
88
|
+
|
|
89
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
90
|
+
2. **Task pickup**: Report `working` with task ID
|
|
91
|
+
3. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
92
|
+
4. **Completion**: Report `idle` after moving task to completed
|
|
93
|
+
|
|
75
94
|
### Output Format
|
|
76
95
|
```markdown
|
|
77
96
|
## Completion Summary
|
|
@@ -67,6 +67,25 @@ Like Anvil, derived from Amelia's developer DNA but specialized for the backend
|
|
|
67
67
|
10. Move to /tasks/completed/
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
+
### Status Reporting
|
|
71
|
+
|
|
72
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
/update-status idle # When waiting for tasks
|
|
76
|
+
/update-status working TASK-021 # When starting a task
|
|
77
|
+
/update-status blocked TASK-021 # When stuck (then /need-help if needed)
|
|
78
|
+
/update-status testing TASK-021 # When running tests
|
|
79
|
+
/update-status idle # When task complete
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Update status at key moments:
|
|
83
|
+
|
|
84
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
85
|
+
2. **Task pickup**: Report `working` with task ID
|
|
86
|
+
3. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
87
|
+
4. **Completion**: Report `idle` after moving task to completed
|
|
88
|
+
|
|
70
89
|
### Output Format
|
|
71
90
|
```markdown
|
|
72
91
|
## Completion Summary
|
|
@@ -74,6 +74,26 @@ Not just a button-pusher - Herald understands semantic versioning, changelog man
|
|
|
74
74
|
9. Move task to /tasks/completed/
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
+
### Status Reporting
|
|
78
|
+
|
|
79
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
/update-status idle # When waiting for tasks
|
|
83
|
+
/update-status working TASK-031 # When starting a release task
|
|
84
|
+
/update-status blocked TASK-031 # When release blocked (then /need-help if needed)
|
|
85
|
+
/update-status waiting TASK-031 # When waiting for CI/deployment
|
|
86
|
+
/update-status idle # When release complete
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Update status at key moments:
|
|
90
|
+
|
|
91
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
92
|
+
2. **Release prep**: Report `working` with task ID
|
|
93
|
+
3. **Waiting on CI**: Report `waiting` during long CI runs or deployments
|
|
94
|
+
4. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
95
|
+
5. **Completion**: Report `idle` after release announced
|
|
96
|
+
|
|
77
97
|
### Output Format
|
|
78
98
|
```markdown
|
|
79
99
|
## Completion Summary
|
|
@@ -66,6 +66,24 @@ Where other agents create, Scribe preserves. The README that saves a future deve
|
|
|
66
66
|
9. Move to /tasks/completed/
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
### Status Reporting
|
|
70
|
+
|
|
71
|
+
Keep the Planning Hub and daemon informed of your status:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
/update-status idle # When waiting for tasks
|
|
75
|
+
/update-status working TASK-024 # When starting a task
|
|
76
|
+
/update-status blocked TASK-024 # When stuck (then /need-help if needed)
|
|
77
|
+
/update-status idle # When task complete
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Update status at key moments:
|
|
81
|
+
|
|
82
|
+
1. **Startup**: Report `idle` (ready for work)
|
|
83
|
+
2. **Task pickup**: Report `working` with task ID
|
|
84
|
+
3. **Blocked**: Report `blocked`, then use `/need-help` if human input needed
|
|
85
|
+
4. **Completion**: Report `idle` after moving task to completed
|
|
86
|
+
|
|
69
87
|
### Output Format
|
|
70
88
|
```markdown
|
|
71
89
|
## Completion Summary
|
package/bin/forge-daemon.sh
CHANGED
|
@@ -259,6 +259,53 @@ check_attention_needed() {
|
|
|
259
259
|
done
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
+
# Build worker status from agent-status files
|
|
263
|
+
build_worker_status() {
|
|
264
|
+
local status_dir="$FORGE_ROOT/$AGENT_STATUS_DIR"
|
|
265
|
+
local now_epoch
|
|
266
|
+
now_epoch=$(date +%s)
|
|
267
|
+
local stale_threshold=300 # 5 minutes
|
|
268
|
+
|
|
269
|
+
if [[ ! -d "$status_dir" ]]; then
|
|
270
|
+
return 0
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
echo "workers:"
|
|
274
|
+
for status_file in "$status_dir"/*.json; do
|
|
275
|
+
if [[ -f "$status_file" && ! -L "$status_file" ]]; then
|
|
276
|
+
local agent status task message updated updated_epoch age stale_marker
|
|
277
|
+
|
|
278
|
+
# Parse JSON status file
|
|
279
|
+
agent=$(jq -r '.agent // "unknown"' "$status_file" 2>/dev/null)
|
|
280
|
+
status=$(jq -r '.status // "unknown"' "$status_file" 2>/dev/null)
|
|
281
|
+
task=$(jq -r '.task // ""' "$status_file" 2>/dev/null)
|
|
282
|
+
message=$(jq -r '.message // ""' "$status_file" 2>/dev/null | head -c 80)
|
|
283
|
+
updated=$(jq -r '.updated // ""' "$status_file" 2>/dev/null)
|
|
284
|
+
|
|
285
|
+
# Check if stale (not updated in 5+ minutes)
|
|
286
|
+
stale_marker=""
|
|
287
|
+
if [[ -n "$updated" ]]; then
|
|
288
|
+
# Convert ISO timestamp to epoch (cross-platform)
|
|
289
|
+
updated_epoch=$(date -d "$updated" +%s 2>/dev/null || date -j -f "%Y-%m-%dT%H:%M:%S" "${updated%Z}" +%s 2>/dev/null || echo "0")
|
|
290
|
+
age=$((now_epoch - updated_epoch))
|
|
291
|
+
if [[ "$age" -gt "$stale_threshold" ]]; then
|
|
292
|
+
stale_marker=" (stale)"
|
|
293
|
+
fi
|
|
294
|
+
fi
|
|
295
|
+
|
|
296
|
+
echo " - agent: $agent"
|
|
297
|
+
echo " status: $status$stale_marker"
|
|
298
|
+
if [[ -n "$task" ]]; then
|
|
299
|
+
echo " task: $task"
|
|
300
|
+
fi
|
|
301
|
+
if [[ -n "$message" ]]; then
|
|
302
|
+
echo " message: \"$message\""
|
|
303
|
+
fi
|
|
304
|
+
echo " updated: $updated"
|
|
305
|
+
fi
|
|
306
|
+
done
|
|
307
|
+
}
|
|
308
|
+
|
|
262
309
|
# =============================================================================
|
|
263
310
|
# Daemon Functions
|
|
264
311
|
# =============================================================================
|
|
@@ -283,6 +330,12 @@ update_state() {
|
|
|
283
330
|
attention_details=$(build_attention_details)
|
|
284
331
|
fi
|
|
285
332
|
|
|
333
|
+
# Build worker status from agent-status files
|
|
334
|
+
local worker_status=""
|
|
335
|
+
if [[ -d "$FORGE_ROOT/$AGENT_STATUS_DIR" ]]; then
|
|
336
|
+
worker_status=$(build_worker_status)
|
|
337
|
+
fi
|
|
338
|
+
|
|
286
339
|
# Write state file atomically (write to temp, then move)
|
|
287
340
|
local temp_state="${STATE_FILE}.tmp.$$"
|
|
288
341
|
cat > "$temp_state" << EOF
|
|
@@ -306,6 +359,7 @@ tasks:
|
|
|
306
359
|
attention_needed: $attention
|
|
307
360
|
|
|
308
361
|
$attention_details
|
|
362
|
+
$worker_status
|
|
309
363
|
last_updated: $(date -Iseconds)
|
|
310
364
|
EOF
|
|
311
365
|
mv "$temp_state" "$STATE_FILE"
|
|
@@ -433,6 +487,7 @@ cmd_start() {
|
|
|
433
487
|
mkdir -p "$FORGE_ROOT/$TASKS_NEEDS_CHANGES"
|
|
434
488
|
mkdir -p "$FORGE_ROOT/$TASKS_MERGED"
|
|
435
489
|
mkdir -p "$FORGE_ROOT/$TASKS_ATTENTION"
|
|
490
|
+
mkdir -p "$FORGE_ROOT/$AGENT_STATUS_DIR"
|
|
436
491
|
|
|
437
492
|
# Start daemon in background
|
|
438
493
|
daemon_loop &
|
|
@@ -514,6 +569,55 @@ cmd_status() {
|
|
|
514
569
|
echo ""
|
|
515
570
|
fi
|
|
516
571
|
|
|
572
|
+
# Show worker status
|
|
573
|
+
if [[ -d "$FORGE_ROOT/$AGENT_STATUS_DIR" ]]; then
|
|
574
|
+
local status_count
|
|
575
|
+
status_count=$(find "$FORGE_ROOT/$AGENT_STATUS_DIR" -maxdepth 1 -name "*.json" -type f 2>/dev/null | wc -l)
|
|
576
|
+
if [[ "$status_count" -gt 0 ]]; then
|
|
577
|
+
echo "Active Workers:"
|
|
578
|
+
local now_epoch stale_threshold
|
|
579
|
+
now_epoch=$(date +%s)
|
|
580
|
+
stale_threshold=300
|
|
581
|
+
for status_file in "$FORGE_ROOT/$AGENT_STATUS_DIR"/*.json; do
|
|
582
|
+
if [[ -f "$status_file" && ! -L "$status_file" ]]; then
|
|
583
|
+
local agent status task updated stale_marker icon
|
|
584
|
+
agent=$(jq -r '.agent // "unknown"' "$status_file" 2>/dev/null)
|
|
585
|
+
status=$(jq -r '.status // "unknown"' "$status_file" 2>/dev/null)
|
|
586
|
+
task=$(jq -r '.task // ""' "$status_file" 2>/dev/null)
|
|
587
|
+
updated=$(jq -r '.updated // ""' "$status_file" 2>/dev/null)
|
|
588
|
+
|
|
589
|
+
# Check staleness
|
|
590
|
+
stale_marker=""
|
|
591
|
+
if [[ -n "$updated" ]]; then
|
|
592
|
+
local updated_epoch age
|
|
593
|
+
updated_epoch=$(date -d "$updated" +%s 2>/dev/null || date -j -f "%Y-%m-%dT%H:%M:%S" "${updated%Z}" +%s 2>/dev/null || echo "0")
|
|
594
|
+
age=$((now_epoch - updated_epoch))
|
|
595
|
+
if [[ "$age" -gt "$stale_threshold" ]]; then
|
|
596
|
+
stale_marker=" ${YELLOW}(stale)${NC}"
|
|
597
|
+
fi
|
|
598
|
+
fi
|
|
599
|
+
|
|
600
|
+
# Status icon
|
|
601
|
+
case "$status" in
|
|
602
|
+
"working") icon="๐จ" ;;
|
|
603
|
+
"idle") icon="๐ค" ;;
|
|
604
|
+
"blocked") icon="๐ซ" ;;
|
|
605
|
+
"testing") icon="๐งช" ;;
|
|
606
|
+
"reviewing") icon="๐๏ธ" ;;
|
|
607
|
+
*) icon="โ" ;;
|
|
608
|
+
esac
|
|
609
|
+
|
|
610
|
+
if [[ -n "$task" ]]; then
|
|
611
|
+
echo -e " $icon ${CYAN}$agent${NC}: $status ($task)$stale_marker"
|
|
612
|
+
else
|
|
613
|
+
echo -e " $icon ${CYAN}$agent${NC}: $status$stale_marker"
|
|
614
|
+
fi
|
|
615
|
+
fi
|
|
616
|
+
done
|
|
617
|
+
echo ""
|
|
618
|
+
fi
|
|
619
|
+
fi
|
|
620
|
+
|
|
517
621
|
# Show recent notifications
|
|
518
622
|
if [[ -f "$NOTIFY_FILE" ]]; then
|
|
519
623
|
local notify_count
|
package/bin/lib/constants.sh
CHANGED