vibe-forge 0.3.12 → 0.8.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.
Files changed (85) hide show
  1. package/.claude/commands/clear-attention.md +63 -63
  2. package/.claude/commands/compact-context.md +52 -0
  3. package/.claude/commands/configure-vcs.md +102 -0
  4. package/.claude/commands/forge.md +218 -171
  5. package/.claude/commands/need-help.md +77 -77
  6. package/.claude/commands/update-status.md +64 -64
  7. package/.claude/commands/worker-loop.md +106 -106
  8. package/.claude/hooks/worker-loop.js +217 -0
  9. package/.claude/scripts/setup-worker-loop.sh +45 -45
  10. package/.claude/settings.json +89 -0
  11. package/LICENSE +21 -21
  12. package/README.md +253 -230
  13. package/agents/aegis/personality.md +303 -269
  14. package/agents/anvil/personality.md +278 -211
  15. package/agents/architect/personality.md +260 -0
  16. package/agents/crucible/personality.md +362 -285
  17. package/agents/crucible-x/personality.md +210 -0
  18. package/agents/ember/personality.md +293 -245
  19. package/agents/flux/personality.md +248 -0
  20. package/agents/furnace/personality.md +342 -262
  21. package/agents/herald/personality.md +249 -247
  22. package/agents/loki/personality.md +108 -0
  23. package/agents/oracle/personality.md +284 -0
  24. package/agents/pixel/personality.md +140 -0
  25. package/agents/planning-hub/personality.md +473 -251
  26. package/agents/scribe/personality.md +253 -231
  27. package/agents/slag/personality.md +268 -0
  28. package/agents/temper/personality.md +270 -0
  29. package/bin/cli.js +372 -325
  30. package/bin/dashboard/api/agents.js +333 -0
  31. package/bin/dashboard/api/dispatch.js +507 -0
  32. package/bin/dashboard/api/tasks.js +416 -0
  33. package/bin/dashboard/public/assets/index-BpHfsx1r.js +2 -0
  34. package/bin/dashboard/public/assets/index-QODv4Zn9.css +1 -0
  35. package/bin/dashboard/public/index.html +14 -0
  36. package/bin/dashboard/server.js +645 -0
  37. package/bin/forge-daemon.sh +477 -775
  38. package/bin/forge-setup.sh +661 -532
  39. package/bin/forge-spawn.sh +164 -159
  40. package/bin/forge.cmd +83 -83
  41. package/bin/forge.sh +566 -393
  42. package/bin/lib/agents.sh +177 -177
  43. package/bin/lib/check-aliases.js +50 -0
  44. package/bin/lib/colors.sh +44 -44
  45. package/bin/lib/config.sh +347 -271
  46. package/bin/lib/constants.sh +241 -171
  47. package/bin/lib/daemon/budgets.sh +107 -0
  48. package/bin/lib/daemon/dependencies.sh +146 -0
  49. package/bin/lib/daemon/display.sh +128 -0
  50. package/bin/lib/daemon/notifications.sh +273 -0
  51. package/bin/lib/daemon/routing.sh +93 -0
  52. package/bin/lib/daemon/state.sh +163 -0
  53. package/bin/lib/daemon/sync.sh +103 -0
  54. package/bin/lib/database.sh +357 -224
  55. package/bin/lib/frontmatter.js +106 -0
  56. package/bin/lib/heimdall-setup.js +113 -0
  57. package/bin/lib/heimdall.js +265 -0
  58. package/bin/lib/json.sh +264 -0
  59. package/bin/lib/terminal.js +452 -0
  60. package/bin/lib/util.sh +126 -0
  61. package/bin/lib/vcs.js +349 -0
  62. package/config/agent-manifest.yaml +237 -230
  63. package/config/agents.json +207 -85
  64. package/config/task-template.md +159 -87
  65. package/config/task-types.yaml +111 -106
  66. package/config/templates/handoff-template.md +40 -0
  67. package/context/agent-overrides/README.md +41 -0
  68. package/context/architecture.md +42 -0
  69. package/context/modern-conventions.md +129 -129
  70. package/context/project-context-template.md +122 -122
  71. package/docs/agents.md +473 -0
  72. package/docs/architecture.md +194 -0
  73. package/docs/commands.md +451 -0
  74. package/docs/security.md +195 -144
  75. package/package.json +77 -48
  76. package/.claude/hooks/worker-loop.sh +0 -141
  77. package/.claude/settings.local.json +0 -29
  78. package/agents/forge-master/capabilities.md +0 -144
  79. package/agents/forge-master/context-template.md +0 -128
  80. package/agents/forge-master/personality.md +0 -138
  81. package/agents/sentinel/personality.md +0 -194
  82. package/context/forge-state.yaml +0 -19
  83. package/docs/TODO.md +0 -176
  84. package/docs/npm-publishing.md +0 -95
  85. package/tasks/review/task-001.md +0 -78
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # bin/lib/daemon/sync.sh
4
+ #
5
+ # Agent status synchronization functions - JSON files to SQLite
6
+ #
7
+ # Dependencies: json.sh, database.sh, constants.sh
8
+ # Globals required: FORGE_ROOT, FORGE_DB, AGENT_STATUS_DIR, LOG_FILE,
9
+ # STALE_STATUS_THRESHOLD
10
+
11
+ # Prevent double-sourcing
12
+ [[ -n "${_DAEMON_SYNC_LOADED:-}" ]] && return 0
13
+ _DAEMON_SYNC_LOADED=1
14
+
15
+ # Sync agent status from JSON files to SQLite (with mtime filtering)
16
+ sync_agent_status_to_db() {
17
+ local status_dir="$FORGE_ROOT/$AGENT_STATUS_DIR"
18
+
19
+ if [[ ! -d "$status_dir" ]]; then
20
+ return 0
21
+ fi
22
+
23
+ for status_file in "$status_dir"/*.json; do
24
+ if [[ -f "$status_file" && ! -L "$status_file" ]]; then
25
+ # Get file modification time
26
+ local file_mtime
27
+ file_mtime=$(stat -c %Y "$status_file" 2>/dev/null || stat -f %m "$status_file" 2>/dev/null || echo "0")
28
+
29
+ # Get agent name from filename
30
+ local agent_name
31
+ agent_name=$(basename "$status_file" .json)
32
+
33
+ # Check if file has changed since last read
34
+ local stored_mtime
35
+ stored_mtime=$(db_get_agent_mtime "$agent_name")
36
+
37
+ if [[ "$file_mtime" -gt "$stored_mtime" ]]; then
38
+ # File changed - parse and update DB
39
+ local agent status task message updated
40
+ agent=$(json_read "$status_file" "agent" "unknown")
41
+ status=$(json_read "$status_file" "status" "unknown")
42
+ task=$(json_read "$status_file" "task" "")
43
+ message=$(json_read "$status_file" "message" "" | head -c 80)
44
+ updated=$(json_read "$status_file" "updated" "")
45
+
46
+ # Check if status actually changed (T1-D3: record transitions)
47
+ local old_status
48
+ old_status=$(sqlite3 "$FORGE_DB" \
49
+ "SELECT status FROM agent_status WHERE agent = '$(db_escape "$agent")';" 2>/dev/null || echo "")
50
+ if [[ "$old_status" != "$status" && -n "$status" ]]; then
51
+ db_record_status_history "$agent" "$status" "$task"
52
+ fi
53
+
54
+ # Upsert to database
55
+ db_upsert_agent_status "$agent" "$status" "$task" "$message" "$updated" "$file_mtime"
56
+
57
+ echo "[$(date -Iseconds)] Synced status for $agent: $status" >> "$LOG_FILE"
58
+ fi
59
+ fi
60
+ done
61
+ }
62
+
63
+ # Build worker status from SQLite (for YAML output)
64
+ build_worker_status() {
65
+ local now_epoch
66
+ now_epoch=$(date +%s)
67
+ local stale_threshold=$STALE_STATUS_THRESHOLD
68
+
69
+ # Check if we have any agent status in DB
70
+ local agent_count
71
+ agent_count=$(sqlite3 "$FORGE_DB" "SELECT COUNT(*) FROM agent_status;" 2>/dev/null || echo "0")
72
+
73
+ if [[ "$agent_count" -eq 0 ]]; then
74
+ return 0
75
+ fi
76
+
77
+ echo "workers:"
78
+
79
+ # Read from database
80
+ while IFS='|' read -r agent status task message updated; do
81
+ local stale_marker=""
82
+
83
+ # Check if stale
84
+ if [[ -n "$updated" ]]; then
85
+ local updated_epoch age
86
+ 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")
87
+ age=$((now_epoch - updated_epoch))
88
+ if [[ "$age" -gt "$stale_threshold" ]]; then
89
+ stale_marker=" (stale)"
90
+ fi
91
+ fi
92
+
93
+ echo " - agent: $agent"
94
+ echo " status: $status$stale_marker"
95
+ if [[ -n "$task" ]]; then
96
+ echo " task: $task"
97
+ fi
98
+ if [[ -n "$message" ]]; then
99
+ echo " message: \"$message\""
100
+ fi
101
+ echo " updated: $updated"
102
+ done < <(db_get_all_agent_statuses)
103
+ }