vibe-forge 0.8.1 → 0.8.2

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 (51) hide show
  1. package/.claude/commands/configure-vcs.md +102 -102
  2. package/.claude/commands/forge.md +218 -218
  3. package/.claude/hooks/worker-loop.js +220 -217
  4. package/.claude/settings.json +89 -89
  5. package/README.md +149 -191
  6. package/agents/aegis/personality.md +303 -303
  7. package/agents/anvil/personality.md +278 -278
  8. package/agents/architect/personality.md +260 -260
  9. package/agents/crucible/personality.md +362 -362
  10. package/agents/crucible-x/personality.md +210 -210
  11. package/agents/ember/personality.md +293 -293
  12. package/agents/flux/personality.md +248 -248
  13. package/agents/furnace/personality.md +342 -342
  14. package/agents/herald/personality.md +249 -249
  15. package/agents/oracle/personality.md +284 -284
  16. package/agents/pixel/personality.md +140 -140
  17. package/agents/planning-hub/personality.md +473 -473
  18. package/agents/scribe/personality.md +253 -253
  19. package/agents/slag/personality.md +268 -268
  20. package/agents/temper/personality.md +270 -270
  21. package/bin/cli.js +372 -372
  22. package/bin/forge-daemon.sh +477 -477
  23. package/bin/forge-setup.sh +662 -661
  24. package/bin/forge-spawn.sh +164 -164
  25. package/bin/forge.sh +566 -566
  26. package/docs/commands.md +8 -8
  27. package/package.json +77 -77
  28. package/{bin → src}/lib/agents.sh +177 -177
  29. package/{bin → src}/lib/check-aliases.js +50 -50
  30. package/{bin → src}/lib/colors.sh +45 -44
  31. package/{bin → src}/lib/config.sh +347 -347
  32. package/{bin → src}/lib/constants.sh +241 -241
  33. package/{bin → src}/lib/daemon/budgets.sh +107 -107
  34. package/{bin → src}/lib/daemon/dependencies.sh +146 -146
  35. package/{bin → src}/lib/daemon/display.sh +128 -128
  36. package/{bin → src}/lib/daemon/notifications.sh +273 -273
  37. package/{bin → src}/lib/daemon/routing.sh +93 -93
  38. package/{bin → src}/lib/daemon/state.sh +163 -163
  39. package/{bin → src}/lib/daemon/sync.sh +103 -103
  40. package/{bin → src}/lib/database.sh +357 -357
  41. package/{bin → src}/lib/frontmatter.js +106 -106
  42. package/{bin → src}/lib/heimdall-setup.js +113 -113
  43. package/{bin → src}/lib/heimdall.js +265 -265
  44. package/src/lib/index.sh +25 -0
  45. package/{bin → src}/lib/json.sh +264 -264
  46. package/{bin → src}/lib/terminal.js +452 -452
  47. package/{bin → src}/lib/util.sh +126 -126
  48. package/{bin → src}/lib/vcs.js +349 -349
  49. package/{context → templates}/project-context-template.md +122 -122
  50. package/config/task-template.md +0 -159
  51. package/config/templates/handoff-template.md +0 -40
@@ -1,241 +1,241 @@
1
- #!/usr/bin/env bash
2
- #
3
- # Vibe Forge - Shared Constants
4
- # Source this file in other scripts: source "$SCRIPT_DIR/lib/constants.sh"
5
- #
6
- # NOTE: Agent configuration should be loaded from config/agents.json via
7
- # load_agents_from_json() in config.sh. The hardcoded values below are
8
- # fallback defaults for when JSON loading is not possible (e.g., tests).
9
- #
10
-
11
- # =============================================================================
12
- # Exit Codes
13
- # =============================================================================
14
- # Standardized exit codes for consistent error handling across scripts
15
- # Based on BSD sysexits.h conventions with project-specific additions
16
-
17
- EXIT_SUCCESS=0 # Successful execution
18
- EXIT_GENERAL_ERROR=1 # Generic/unspecified error
19
- EXIT_CONFIG_ERROR=2 # Configuration file missing/invalid
20
- EXIT_DEPENDENCY_MISSING=3 # Required dependency not found (Claude Code, Git Bash, etc.)
21
- EXIT_INVALID_ARGUMENT=4 # Invalid argument (unknown agent, unknown command)
22
- EXIT_RUNTIME_ERROR=5 # Runtime error (daemon conflict, spawn failed, etc.)
23
-
24
- # Timing
25
- POLL_INTERVAL=2 # seconds between daemon task checks
26
- NOTIFICATION_DEBOUNCE=1 # seconds to avoid notification spam
27
-
28
- # Daemon Configuration
29
- MAX_LOG_SIZE=1048576 # 1MB - log rotation threshold
30
- MAX_NOTIFY_ENTRIES=1000 # Maximum notification log entries before trimming
31
- STALE_STATUS_THRESHOLD=300 # 5 minutes - when worker status is considered stale
32
- MAINTENANCE_INTERVAL=100 # Daemon iterations between maintenance runs
33
- STALE_CLEANUP_MINUTES=30 # Remove agent status older than this (minutes)
34
- HISTORY_PRUNE_DAYS=7 # Remove status history older than this (days)
35
-
36
- # Directory structure (relative to FORGE_ROOT)
37
- CONFIG_DIR=".forge"
38
- TASKS_DIR="tasks"
39
- TASKS_PENDING="$TASKS_DIR/pending"
40
- TASKS_IN_PROGRESS="$TASKS_DIR/in-progress"
41
- TASKS_COMPLETED="$TASKS_DIR/completed"
42
- TASKS_REVIEW="$TASKS_DIR/review"
43
- TASKS_APPROVED="$TASKS_DIR/approved"
44
- TASKS_NEEDS_CHANGES="$TASKS_DIR/needs-changes"
45
- TASKS_MERGED="$TASKS_DIR/merged"
46
- TASKS_ATTENTION="$TASKS_DIR/attention"
47
- CONTEXT_DIR="context"
48
- AGENT_STATUS_DIR="$CONTEXT_DIR/agent-status"
49
- AGENTS_DIR="agents"
50
-
51
- # Config files
52
- AGENTS_CONFIG="config/agents.json"
53
-
54
- # =============================================================================
55
- # Agent Configuration (Fallback Defaults)
56
- # =============================================================================
57
- # These values are overwritten when load_agents_from_json() is called.
58
- # They exist as fallback for contexts where JSON loading isn't available.
59
-
60
- # Flag to track if agents were loaded from JSON
61
- AGENTS_LOADED="${AGENTS_LOADED:-false}"
62
-
63
- # Valid agent names (whitelist for security)
64
- # These are the ONLY valid canonical agent names
65
- # NOTE: Must stay in sync with config/agents.json (which is the source of truth)
66
- # Last sync: 2026-04-03 (added loki, renamed sentinel→temper)
67
- VALID_AGENTS=(
68
- "hub"
69
- "temper"
70
- "anvil"
71
- "furnace"
72
- "crucible"
73
- "scribe"
74
- "herald"
75
- "ember"
76
- "aegis"
77
- "architect"
78
- "pixel"
79
- "oracle"
80
- "loki"
81
- )
82
-
83
- # Agent aliases map (for resolve_agent)
84
- # Format: alias=canonical
85
- # NOTE: Must stay in sync with config/agents.json (which is the source of truth)
86
- declare -A AGENT_ALIASES=(
87
- # Hub aliases (Chief Orchestrator)
88
- ["hub"]="hub"
89
- ["planning"]="hub"
90
- ["master"]="hub"
91
- ["forge-master"]="hub"
92
- # Temper aliases (Code Reviewer)
93
- ["temper"]="temper"
94
- ["review"]="temper"
95
- ["reviewer"]="temper"
96
- ["cr"]="temper"
97
- # Anvil aliases (Frontend)
98
- ["anvil"]="anvil"
99
- ["frontend"]="anvil"
100
- ["ui"]="anvil"
101
- ["fe"]="anvil"
102
- # Furnace aliases (Backend)
103
- ["furnace"]="furnace"
104
- ["backend"]="furnace"
105
- ["api"]="furnace"
106
- ["be"]="furnace"
107
- # Crucible aliases (Testing)
108
- ["crucible"]="crucible"
109
- ["test"]="crucible"
110
- ["testing"]="crucible"
111
- ["qa"]="crucible"
112
- ["tester"]="crucible"
113
- # Scribe aliases (Documentation)
114
- ["scribe"]="scribe"
115
- ["docs"]="scribe"
116
- ["documentation"]="scribe"
117
- ["doc"]="scribe"
118
- # Herald aliases (Release)
119
- ["herald"]="herald"
120
- ["release"]="herald"
121
- ["deploy"]="herald"
122
- ["deployment"]="herald"
123
- # Ember aliases (DevOps)
124
- ["ember"]="ember"
125
- ["devops"]="ember"
126
- ["ops"]="ember"
127
- ["infra"]="ember"
128
- ["infrastructure"]="ember"
129
- # Aegis aliases (Security)
130
- ["aegis"]="aegis"
131
- ["security"]="aegis"
132
- ["sec"]="aegis"
133
- ["appsec"]="aegis"
134
- # Architect aliases (System Design)
135
- ["architect"]="architect"
136
- ["arch"]="architect"
137
- ["sage"]="architect"
138
- # Pixel aliases (UX Design)
139
- # NOTE: "design" intentionally removed — ambiguous with architect's technical design domain
140
- ["pixel"]="pixel"
141
- ["ux"]="pixel"
142
- ["ui-design"]="pixel"
143
- ["user-experience"]="pixel"
144
- # Oracle aliases (Product / Requirements)
145
- ["oracle"]="oracle"
146
- ["product"]="oracle"
147
- ["po"]="oracle"
148
- ["requirements"]="oracle"
149
- ["req"]="oracle"
150
- ["analyst"]="oracle"
151
- # Loki aliases (Lateral Thinker)
152
- ["loki"]="loki"
153
- ["trickster"]="loki"
154
- ["contrarian"]="loki"
155
- ["brainstorm"]="loki"
156
- )
157
-
158
- # Agent display names
159
- declare -A AGENT_DISPLAY_NAMES=(
160
- ["hub"]="Planning Hub"
161
- ["temper"]="Temper"
162
- ["anvil"]="Anvil"
163
- ["furnace"]="Furnace"
164
- ["crucible"]="Crucible"
165
- ["scribe"]="Scribe"
166
- ["herald"]="Herald"
167
- ["ember"]="Ember"
168
- ["aegis"]="Aegis"
169
- ["architect"]="Architect"
170
- ["pixel"]="Pixel"
171
- ["oracle"]="Oracle"
172
- ["loki"]="Loki"
173
- )
174
-
175
- # Agent roles
176
- declare -A AGENT_ROLES=(
177
- ["hub"]="Chief Orchestrator"
178
- ["temper"]="Code Reviewer"
179
- ["anvil"]="Frontend Developer"
180
- ["furnace"]="Backend Developer"
181
- ["crucible"]="Tester / QA"
182
- ["scribe"]="Documentation Specialist"
183
- ["herald"]="Release Manager"
184
- ["ember"]="DevOps Engineer"
185
- ["aegis"]="Security Specialist"
186
- ["architect"]="System Architect"
187
- ["pixel"]="UX Designer"
188
- ["oracle"]="Product Owner / Requirements Analyst"
189
- ["loki"]="Lateral Thinker"
190
- )
191
-
192
- # Agent personality files (relative to FORGE_ROOT)
193
- declare -A AGENT_PERSONALITY_FILES=(
194
- ["hub"]="agents/planning-hub/personality.md"
195
- ["temper"]="agents/temper/personality.md"
196
- ["anvil"]="agents/anvil/personality.md"
197
- ["furnace"]="agents/furnace/personality.md"
198
- ["crucible"]="agents/crucible/personality.md"
199
- ["scribe"]="agents/scribe/personality.md"
200
- ["herald"]="agents/herald/personality.md"
201
- ["ember"]="agents/ember/personality.md"
202
- ["aegis"]="agents/aegis/personality.md"
203
- ["architect"]="agents/architect/personality.md"
204
- ["pixel"]="agents/pixel/personality.md"
205
- ["oracle"]="agents/oracle/personality.md"
206
- ["loki"]="agents/loki/personality.md"
207
- )
208
-
209
- # Agent icons
210
- declare -A AGENT_ICONS=(
211
- ["hub"]="⚒️"
212
- ["temper"]="⚖️"
213
- ["anvil"]="🔨"
214
- ["furnace"]="🔥"
215
- ["crucible"]="🧪"
216
- ["scribe"]="📜"
217
- ["herald"]="📯"
218
- ["ember"]="⚙️"
219
- ["aegis"]="🔒"
220
- ["architect"]="🏛️"
221
- ["pixel"]="🎨"
222
- ["oracle"]="🔮"
223
- ["loki"]="🎭"
224
- )
225
-
226
- # Agent tab colors for Windows Terminal (hex format)
227
- declare -A AGENT_TAB_COLORS=(
228
- ["hub"]="#FF6B35"
229
- ["temper"]="#8B5CF6"
230
- ["anvil"]="#3B82F6"
231
- ["furnace"]="#EF4444"
232
- ["crucible"]="#10B981"
233
- ["scribe"]="#F59E0B"
234
- ["herald"]="#EC4899"
235
- ["ember"]="#F97316"
236
- ["aegis"]="#06B6D4"
237
- ["architect"]="#6366F1"
238
- ["pixel"]="#D946EF"
239
- ["oracle"]="#FBBF24"
240
- ["loki"]="#7C3AED"
241
- )
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Vibe Forge - Shared Constants
4
+ # Source this file in other scripts: source "$SCRIPT_DIR/lib/constants.sh"
5
+ #
6
+ # NOTE: Agent configuration should be loaded from config/agents.json via
7
+ # load_agents_from_json() in config.sh. The hardcoded values below are
8
+ # fallback defaults for when JSON loading is not possible (e.g., tests).
9
+ #
10
+
11
+ # =============================================================================
12
+ # Exit Codes
13
+ # =============================================================================
14
+ # Standardized exit codes for consistent error handling across scripts
15
+ # Based on BSD sysexits.h conventions with project-specific additions
16
+
17
+ EXIT_SUCCESS=0 # Successful execution
18
+ EXIT_GENERAL_ERROR=1 # Generic/unspecified error
19
+ EXIT_CONFIG_ERROR=2 # Configuration file missing/invalid
20
+ EXIT_DEPENDENCY_MISSING=3 # Required dependency not found (Claude Code, Git Bash, etc.)
21
+ EXIT_INVALID_ARGUMENT=4 # Invalid argument (unknown agent, unknown command)
22
+ EXIT_RUNTIME_ERROR=5 # Runtime error (daemon conflict, spawn failed, etc.)
23
+
24
+ # Timing
25
+ POLL_INTERVAL=2 # seconds between daemon task checks
26
+ NOTIFICATION_DEBOUNCE=1 # seconds to avoid notification spam
27
+
28
+ # Daemon Configuration
29
+ MAX_LOG_SIZE=1048576 # 1MB - log rotation threshold
30
+ MAX_NOTIFY_ENTRIES=1000 # Maximum notification log entries before trimming
31
+ STALE_STATUS_THRESHOLD=300 # 5 minutes - when worker status is considered stale
32
+ MAINTENANCE_INTERVAL=100 # Daemon iterations between maintenance runs
33
+ STALE_CLEANUP_MINUTES=30 # Remove agent status older than this (minutes)
34
+ HISTORY_PRUNE_DAYS=7 # Remove status history older than this (days)
35
+
36
+ # Directory structure (relative to FORGE_ROOT)
37
+ CONFIG_DIR=".forge"
38
+ TASKS_DIR="tasks"
39
+ TASKS_PENDING="$TASKS_DIR/pending"
40
+ TASKS_IN_PROGRESS="$TASKS_DIR/in-progress"
41
+ TASKS_COMPLETED="$TASKS_DIR/completed"
42
+ TASKS_REVIEW="$TASKS_DIR/review"
43
+ TASKS_APPROVED="$TASKS_DIR/approved"
44
+ TASKS_NEEDS_CHANGES="$TASKS_DIR/needs-changes"
45
+ TASKS_MERGED="$TASKS_DIR/merged"
46
+ TASKS_ATTENTION="$TASKS_DIR/attention"
47
+ CONTEXT_DIR="context"
48
+ AGENT_STATUS_DIR="$CONTEXT_DIR/agent-status"
49
+ AGENTS_DIR="agents"
50
+
51
+ # Config files
52
+ AGENTS_CONFIG="config/agents.json"
53
+
54
+ # =============================================================================
55
+ # Agent Configuration (Fallback Defaults)
56
+ # =============================================================================
57
+ # These values are overwritten when load_agents_from_json() is called.
58
+ # They exist as fallback for contexts where JSON loading isn't available.
59
+
60
+ # Flag to track if agents were loaded from JSON
61
+ AGENTS_LOADED="${AGENTS_LOADED:-false}"
62
+
63
+ # Valid agent names (whitelist for security)
64
+ # These are the ONLY valid canonical agent names
65
+ # NOTE: Must stay in sync with config/agents.json (which is the source of truth)
66
+ # Last sync: 2026-04-03 (added loki, renamed sentinel→temper)
67
+ VALID_AGENTS=(
68
+ "hub"
69
+ "temper"
70
+ "anvil"
71
+ "furnace"
72
+ "crucible"
73
+ "scribe"
74
+ "herald"
75
+ "ember"
76
+ "aegis"
77
+ "architect"
78
+ "pixel"
79
+ "oracle"
80
+ "loki"
81
+ )
82
+
83
+ # Agent aliases map (for resolve_agent)
84
+ # Format: alias=canonical
85
+ # NOTE: Must stay in sync with config/agents.json (which is the source of truth)
86
+ declare -A AGENT_ALIASES=(
87
+ # Hub aliases (Chief Orchestrator)
88
+ ["hub"]="hub"
89
+ ["planning"]="hub"
90
+ ["master"]="hub"
91
+ ["forge-master"]="hub"
92
+ # Temper aliases (Code Reviewer)
93
+ ["temper"]="temper"
94
+ ["review"]="temper"
95
+ ["reviewer"]="temper"
96
+ ["cr"]="temper"
97
+ # Anvil aliases (Frontend)
98
+ ["anvil"]="anvil"
99
+ ["frontend"]="anvil"
100
+ ["ui"]="anvil"
101
+ ["fe"]="anvil"
102
+ # Furnace aliases (Backend)
103
+ ["furnace"]="furnace"
104
+ ["backend"]="furnace"
105
+ ["api"]="furnace"
106
+ ["be"]="furnace"
107
+ # Crucible aliases (Testing)
108
+ ["crucible"]="crucible"
109
+ ["test"]="crucible"
110
+ ["testing"]="crucible"
111
+ ["qa"]="crucible"
112
+ ["tester"]="crucible"
113
+ # Scribe aliases (Documentation)
114
+ ["scribe"]="scribe"
115
+ ["docs"]="scribe"
116
+ ["documentation"]="scribe"
117
+ ["doc"]="scribe"
118
+ # Herald aliases (Release)
119
+ ["herald"]="herald"
120
+ ["release"]="herald"
121
+ ["deploy"]="herald"
122
+ ["deployment"]="herald"
123
+ # Ember aliases (DevOps)
124
+ ["ember"]="ember"
125
+ ["devops"]="ember"
126
+ ["ops"]="ember"
127
+ ["infra"]="ember"
128
+ ["infrastructure"]="ember"
129
+ # Aegis aliases (Security)
130
+ ["aegis"]="aegis"
131
+ ["security"]="aegis"
132
+ ["sec"]="aegis"
133
+ ["appsec"]="aegis"
134
+ # Architect aliases (System Design)
135
+ ["architect"]="architect"
136
+ ["arch"]="architect"
137
+ ["sage"]="architect"
138
+ # Pixel aliases (UX Design)
139
+ # NOTE: "design" intentionally removed — ambiguous with architect's technical design domain
140
+ ["pixel"]="pixel"
141
+ ["ux"]="pixel"
142
+ ["ui-design"]="pixel"
143
+ ["user-experience"]="pixel"
144
+ # Oracle aliases (Product / Requirements)
145
+ ["oracle"]="oracle"
146
+ ["product"]="oracle"
147
+ ["po"]="oracle"
148
+ ["requirements"]="oracle"
149
+ ["req"]="oracle"
150
+ ["analyst"]="oracle"
151
+ # Loki aliases (Lateral Thinker)
152
+ ["loki"]="loki"
153
+ ["trickster"]="loki"
154
+ ["contrarian"]="loki"
155
+ ["brainstorm"]="loki"
156
+ )
157
+
158
+ # Agent display names
159
+ declare -A AGENT_DISPLAY_NAMES=(
160
+ ["hub"]="Planning Hub"
161
+ ["temper"]="Temper"
162
+ ["anvil"]="Anvil"
163
+ ["furnace"]="Furnace"
164
+ ["crucible"]="Crucible"
165
+ ["scribe"]="Scribe"
166
+ ["herald"]="Herald"
167
+ ["ember"]="Ember"
168
+ ["aegis"]="Aegis"
169
+ ["architect"]="Architect"
170
+ ["pixel"]="Pixel"
171
+ ["oracle"]="Oracle"
172
+ ["loki"]="Loki"
173
+ )
174
+
175
+ # Agent roles
176
+ declare -A AGENT_ROLES=(
177
+ ["hub"]="Chief Orchestrator"
178
+ ["temper"]="Code Reviewer"
179
+ ["anvil"]="Frontend Developer"
180
+ ["furnace"]="Backend Developer"
181
+ ["crucible"]="Tester / QA"
182
+ ["scribe"]="Documentation Specialist"
183
+ ["herald"]="Release Manager"
184
+ ["ember"]="DevOps Engineer"
185
+ ["aegis"]="Security Specialist"
186
+ ["architect"]="System Architect"
187
+ ["pixel"]="UX Designer"
188
+ ["oracle"]="Product Owner / Requirements Analyst"
189
+ ["loki"]="Lateral Thinker"
190
+ )
191
+
192
+ # Agent personality files (relative to FORGE_ROOT)
193
+ declare -A AGENT_PERSONALITY_FILES=(
194
+ ["hub"]="agents/planning-hub/personality.md"
195
+ ["temper"]="agents/temper/personality.md"
196
+ ["anvil"]="agents/anvil/personality.md"
197
+ ["furnace"]="agents/furnace/personality.md"
198
+ ["crucible"]="agents/crucible/personality.md"
199
+ ["scribe"]="agents/scribe/personality.md"
200
+ ["herald"]="agents/herald/personality.md"
201
+ ["ember"]="agents/ember/personality.md"
202
+ ["aegis"]="agents/aegis/personality.md"
203
+ ["architect"]="agents/architect/personality.md"
204
+ ["pixel"]="agents/pixel/personality.md"
205
+ ["oracle"]="agents/oracle/personality.md"
206
+ ["loki"]="agents/loki/personality.md"
207
+ )
208
+
209
+ # Agent icons
210
+ declare -A AGENT_ICONS=(
211
+ ["hub"]="⚒️"
212
+ ["temper"]="⚖️"
213
+ ["anvil"]="🔨"
214
+ ["furnace"]="🔥"
215
+ ["crucible"]="🧪"
216
+ ["scribe"]="📜"
217
+ ["herald"]="📯"
218
+ ["ember"]="⚙️"
219
+ ["aegis"]="🔒"
220
+ ["architect"]="🏛️"
221
+ ["pixel"]="🎨"
222
+ ["oracle"]="🔮"
223
+ ["loki"]="🎭"
224
+ )
225
+
226
+ # Agent tab colors for Windows Terminal (hex format)
227
+ declare -A AGENT_TAB_COLORS=(
228
+ ["hub"]="#FF6B35"
229
+ ["temper"]="#8B5CF6"
230
+ ["anvil"]="#3B82F6"
231
+ ["furnace"]="#EF4444"
232
+ ["crucible"]="#10B981"
233
+ ["scribe"]="#F59E0B"
234
+ ["herald"]="#EC4899"
235
+ ["ember"]="#F97316"
236
+ ["aegis"]="#06B6D4"
237
+ ["architect"]="#6366F1"
238
+ ["pixel"]="#D946EF"
239
+ ["oracle"]="#FBBF24"
240
+ ["loki"]="#7C3AED"
241
+ )