vibe-forge 0.1.0
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/LICENSE +21 -0
- package/README.md +211 -0
- package/agents/aegis/personality.md +249 -0
- package/agents/anvil/personality.md +192 -0
- package/agents/crucible/personality.md +265 -0
- package/agents/ember/personality.md +226 -0
- package/agents/forge-master/capabilities.md +144 -0
- package/agents/forge-master/context-template.md +128 -0
- package/agents/forge-master/personality.md +138 -0
- package/agents/furnace/personality.md +243 -0
- package/agents/herald/personality.md +227 -0
- package/agents/planning-hub/personality.md +198 -0
- package/agents/scribe/personality.md +213 -0
- package/agents/sentinel/personality.md +194 -0
- package/bin/cli.js +269 -0
- package/bin/forge-daemon.sh +345 -0
- package/bin/forge-setup.sh +458 -0
- package/bin/forge-spawn.sh +132 -0
- package/bin/forge.cmd +83 -0
- package/bin/forge.sh +367 -0
- package/config/agent-manifest.yaml +230 -0
- package/config/task-template.md +87 -0
- package/config/task-types.yaml +106 -0
- package/context/forge-state.yaml +19 -0
- package/context/project-context-template.md +122 -0
- package/package.json +39 -0
- package/tasks/review/task-001.md +78 -0
package/bin/forge.sh
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Vibe Forge - Main Launcher
|
|
4
|
+
# Starts the Planning Hub or specific worker agents
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# forge - Start Planning Hub (main session)
|
|
8
|
+
# forge init - Initialize Vibe Forge
|
|
9
|
+
# forge start <agent> - Start a specific worker agent
|
|
10
|
+
# forge spawn <agent> - Spawn agent in new terminal window/tab
|
|
11
|
+
# forge status - Show forge status
|
|
12
|
+
# forge test - Validate setup
|
|
13
|
+
# forge daemon - Start/stop the background daemon
|
|
14
|
+
# forge help - Show help
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
set -e
|
|
18
|
+
|
|
19
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
20
|
+
FORGE_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
21
|
+
CONFIG_FILE="$FORGE_ROOT/.forge/config.json"
|
|
22
|
+
|
|
23
|
+
# Colors
|
|
24
|
+
RED='\033[0;31m'
|
|
25
|
+
GREEN='\033[0;32m'
|
|
26
|
+
YELLOW='\033[1;33m'
|
|
27
|
+
BLUE='\033[0;34m'
|
|
28
|
+
NC='\033[0m'
|
|
29
|
+
|
|
30
|
+
# =============================================================================
|
|
31
|
+
# Helper Functions
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
load_config() {
|
|
35
|
+
if [[ ! -f "$CONFIG_FILE" ]]; then
|
|
36
|
+
echo -e "${RED}Error: Vibe Forge not initialized.${NC}"
|
|
37
|
+
echo "Run 'forge init' first."
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# Parse JSON config (basic extraction)
|
|
42
|
+
PLATFORM=$(grep -o '"platform": *"[^"]*"' "$CONFIG_FILE" | cut -d'"' -f4)
|
|
43
|
+
GIT_BASH_PATH=$(grep -o '"git_bash_path": *"[^"]*"' "$CONFIG_FILE" | cut -d'"' -f4)
|
|
44
|
+
|
|
45
|
+
# Set environment for Windows
|
|
46
|
+
# Claude Code on Windows needs backslashes in the path
|
|
47
|
+
if [[ "$PLATFORM" == "windows" && -n "$GIT_BASH_PATH" ]]; then
|
|
48
|
+
# Convert forward slashes to backslashes for Windows
|
|
49
|
+
GIT_BASH_PATH_WIN="${GIT_BASH_PATH//\//\\}"
|
|
50
|
+
export CLAUDE_CODE_GIT_BASH_PATH="$GIT_BASH_PATH_WIN"
|
|
51
|
+
|
|
52
|
+
# Add common Windows paths that Git Bash might miss
|
|
53
|
+
# npm global path (where claude is typically installed)
|
|
54
|
+
NPM_PATH="/c/Users/$USER/AppData/Roaming/npm"
|
|
55
|
+
if [[ -d "$NPM_PATH" ]] && [[ ":$PATH:" != *":$NPM_PATH:"* ]]; then
|
|
56
|
+
export PATH="$NPM_PATH:$PATH"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Also try with USERPROFILE
|
|
60
|
+
if [[ -n "$USERPROFILE" ]]; then
|
|
61
|
+
NPM_PATH_ALT="$USERPROFILE/AppData/Roaming/npm"
|
|
62
|
+
NPM_PATH_ALT="${NPM_PATH_ALT//\\//}" # Convert backslashes
|
|
63
|
+
if [[ -d "$NPM_PATH_ALT" ]] && [[ ":$PATH:" != *":$NPM_PATH_ALT:"* ]]; then
|
|
64
|
+
export PATH="$NPM_PATH_ALT:$PATH"
|
|
65
|
+
fi
|
|
66
|
+
fi
|
|
67
|
+
fi
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
get_personality_path() {
|
|
71
|
+
local agent="$1"
|
|
72
|
+
local personality_file=""
|
|
73
|
+
|
|
74
|
+
case "$agent" in
|
|
75
|
+
"hub"|"planning"|"master"|"forge-master"|"")
|
|
76
|
+
personality_file="$FORGE_ROOT/agents/planning-hub/personality.md"
|
|
77
|
+
;;
|
|
78
|
+
"anvil")
|
|
79
|
+
personality_file="$FORGE_ROOT/agents/anvil/personality.md"
|
|
80
|
+
;;
|
|
81
|
+
"furnace")
|
|
82
|
+
personality_file="$FORGE_ROOT/agents/furnace/personality.md"
|
|
83
|
+
;;
|
|
84
|
+
"crucible")
|
|
85
|
+
personality_file="$FORGE_ROOT/agents/crucible/personality.md"
|
|
86
|
+
;;
|
|
87
|
+
"sentinel")
|
|
88
|
+
personality_file="$FORGE_ROOT/agents/sentinel/personality.md"
|
|
89
|
+
;;
|
|
90
|
+
"scribe")
|
|
91
|
+
personality_file="$FORGE_ROOT/agents/scribe/personality.md"
|
|
92
|
+
;;
|
|
93
|
+
"herald")
|
|
94
|
+
personality_file="$FORGE_ROOT/agents/herald/personality.md"
|
|
95
|
+
;;
|
|
96
|
+
"ember")
|
|
97
|
+
personality_file="$FORGE_ROOT/agents/ember/personality.md"
|
|
98
|
+
;;
|
|
99
|
+
"aegis")
|
|
100
|
+
personality_file="$FORGE_ROOT/agents/aegis/personality.md"
|
|
101
|
+
;;
|
|
102
|
+
*)
|
|
103
|
+
echo -e "${RED}Unknown agent: $agent${NC}"
|
|
104
|
+
echo "Available agents: anvil, furnace, crucible, sentinel, scribe, herald, ember, aegis"
|
|
105
|
+
exit 1
|
|
106
|
+
;;
|
|
107
|
+
esac
|
|
108
|
+
|
|
109
|
+
if [[ ! -f "$personality_file" ]]; then
|
|
110
|
+
echo -e "${RED}Error: Personality file not found: $personality_file${NC}"
|
|
111
|
+
exit 1
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
echo "$personality_file"
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# =============================================================================
|
|
118
|
+
# Commands
|
|
119
|
+
# =============================================================================
|
|
120
|
+
|
|
121
|
+
cmd_init() {
|
|
122
|
+
"$SCRIPT_DIR/forge-setup.sh" "$@"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
cmd_start() {
|
|
126
|
+
local agent="${1:-hub}"
|
|
127
|
+
load_config
|
|
128
|
+
|
|
129
|
+
local personality_path
|
|
130
|
+
personality_path=$(get_personality_path "$agent")
|
|
131
|
+
|
|
132
|
+
local agent_name
|
|
133
|
+
if [[ "$agent" == "hub" || "$agent" == "" ]]; then
|
|
134
|
+
agent_name="Planning Hub"
|
|
135
|
+
else
|
|
136
|
+
agent_name="$agent"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
echo -e "${YELLOW}🔥 Starting $agent_name...${NC}"
|
|
140
|
+
echo ""
|
|
141
|
+
|
|
142
|
+
# Build the system prompt from personality file
|
|
143
|
+
local system_prompt
|
|
144
|
+
system_prompt=$(cat "$personality_path")
|
|
145
|
+
|
|
146
|
+
# Add project context if it exists
|
|
147
|
+
local project_context="$FORGE_ROOT/context/project-context.md"
|
|
148
|
+
if [[ -f "$project_context" ]]; then
|
|
149
|
+
system_prompt="$system_prompt
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
# Project Context
|
|
154
|
+
|
|
155
|
+
$(cat "$project_context")"
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# Add startup instructions based on agent type
|
|
159
|
+
if [[ "$agent" == "hub" || "$agent" == "planning" || "$agent" == "" ]]; then
|
|
160
|
+
# Planning Hub startup - Party Mode Team
|
|
161
|
+
system_prompt="$system_prompt
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
# Startup Instructions
|
|
166
|
+
|
|
167
|
+
On startup, you MUST immediately display the team assembly welcome as shown in the Startup Behavior section of your personality. Show the forge council members assembling with their icons and roles. Then check for any current work status.
|
|
168
|
+
"
|
|
169
|
+
else
|
|
170
|
+
# Worker agent startup
|
|
171
|
+
system_prompt="$system_prompt
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
# Startup Instructions
|
|
176
|
+
|
|
177
|
+
On startup: Announce yourself (name, icon, role), check tasks/pending/ and tasks/needs-changes/ for your work, summarize what you find, and ask if you should begin.
|
|
178
|
+
"
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# Launch Claude Code with the personality
|
|
182
|
+
# --dangerously-skip-permissions avoids repeated prompts when starting agents
|
|
183
|
+
# Use --resume with initial prompt to trigger welcome but stay interactive
|
|
184
|
+
if [[ "$agent" == "hub" || "$agent" == "planning" || "$agent" == "" ]]; then
|
|
185
|
+
claude --dangerously-skip-permissions --system-prompt "$system_prompt" "begin"
|
|
186
|
+
else
|
|
187
|
+
claude --dangerously-skip-permissions --system-prompt "$system_prompt" "startup"
|
|
188
|
+
fi
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
cmd_status() {
|
|
192
|
+
load_config
|
|
193
|
+
|
|
194
|
+
local state_file="$FORGE_ROOT/context/forge-state.yaml"
|
|
195
|
+
|
|
196
|
+
echo ""
|
|
197
|
+
echo -e "${YELLOW}🔥 Forge Status${NC}"
|
|
198
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
199
|
+
|
|
200
|
+
if [[ -f "$state_file" ]]; then
|
|
201
|
+
cat "$state_file"
|
|
202
|
+
else
|
|
203
|
+
echo "No active forge state."
|
|
204
|
+
echo ""
|
|
205
|
+
echo "Start the forge with: forge"
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
209
|
+
echo ""
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
cmd_test() {
|
|
213
|
+
load_config
|
|
214
|
+
|
|
215
|
+
echo ""
|
|
216
|
+
echo -e "${YELLOW}🧪 Testing Vibe Forge setup...${NC}"
|
|
217
|
+
echo ""
|
|
218
|
+
|
|
219
|
+
# Test Claude Code
|
|
220
|
+
echo "Testing Claude Code..."
|
|
221
|
+
if claude --version &> /dev/null; then
|
|
222
|
+
echo -e "${GREEN}✅ Claude Code working${NC}"
|
|
223
|
+
else
|
|
224
|
+
echo -e "${RED}❌ Claude Code not working${NC}"
|
|
225
|
+
exit 1
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
# Test personality loading
|
|
229
|
+
echo ""
|
|
230
|
+
echo "Testing personality loading..."
|
|
231
|
+
local test_output
|
|
232
|
+
test_output=$(claude --system-prompt "You are a test. Respond with only: FORGE_TEST_OK" --print "test" 2>&1 | head -1)
|
|
233
|
+
|
|
234
|
+
if [[ "$test_output" == *"FORGE_TEST_OK"* || "$test_output" == *"test"* ]]; then
|
|
235
|
+
echo -e "${GREEN}✅ Personality loading working${NC}"
|
|
236
|
+
else
|
|
237
|
+
echo -e "${YELLOW}⚠️ Personality loading may have issues${NC}"
|
|
238
|
+
echo " Output: $test_output"
|
|
239
|
+
fi
|
|
240
|
+
|
|
241
|
+
echo ""
|
|
242
|
+
echo -e "${GREEN}🔥 Setup validated!${NC}"
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
cmd_spawn() {
|
|
246
|
+
local agent="${1:-}"
|
|
247
|
+
|
|
248
|
+
if [[ -z "$agent" ]]; then
|
|
249
|
+
echo -e "${RED}Error: No agent specified.${NC}"
|
|
250
|
+
echo "Usage: forge spawn <agent>"
|
|
251
|
+
echo ""
|
|
252
|
+
echo "Available agents: anvil, furnace, crucible, sentinel, scribe, herald, ember, aegis"
|
|
253
|
+
exit 1
|
|
254
|
+
fi
|
|
255
|
+
|
|
256
|
+
"$SCRIPT_DIR/forge-spawn.sh" "$agent"
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
cmd_daemon() {
|
|
260
|
+
local action="${1:-status}"
|
|
261
|
+
|
|
262
|
+
case "$action" in
|
|
263
|
+
"start")
|
|
264
|
+
echo "Starting forge daemon..."
|
|
265
|
+
"$SCRIPT_DIR/forge-daemon.sh" start
|
|
266
|
+
;;
|
|
267
|
+
"stop")
|
|
268
|
+
echo "Stopping forge daemon..."
|
|
269
|
+
"$SCRIPT_DIR/forge-daemon.sh" stop
|
|
270
|
+
;;
|
|
271
|
+
"status")
|
|
272
|
+
"$SCRIPT_DIR/forge-daemon.sh" status
|
|
273
|
+
;;
|
|
274
|
+
"notifications"|"notify")
|
|
275
|
+
shift
|
|
276
|
+
"$SCRIPT_DIR/forge-daemon.sh" notifications "$@"
|
|
277
|
+
;;
|
|
278
|
+
"clear")
|
|
279
|
+
"$SCRIPT_DIR/forge-daemon.sh" clear
|
|
280
|
+
;;
|
|
281
|
+
*)
|
|
282
|
+
echo "Usage: forge daemon [start|stop|status|notifications|clear]"
|
|
283
|
+
;;
|
|
284
|
+
esac
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
cmd_help() {
|
|
288
|
+
echo ""
|
|
289
|
+
echo -e "${YELLOW}🔥 Vibe Forge${NC}"
|
|
290
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
291
|
+
echo ""
|
|
292
|
+
echo "Usage: forge [command] [options]"
|
|
293
|
+
echo ""
|
|
294
|
+
echo "Commands:"
|
|
295
|
+
echo " (none) Start the Planning Hub (main session)"
|
|
296
|
+
echo " init Initialize Vibe Forge for this project"
|
|
297
|
+
echo " start <agent> Start a specific worker agent (in current terminal)"
|
|
298
|
+
echo " spawn <agent> Spawn agent in new terminal window/tab"
|
|
299
|
+
echo " status Show current forge status"
|
|
300
|
+
echo " test Validate setup is working"
|
|
301
|
+
echo " daemon <action> Manage background daemon (start|stop|status|notifications|clear)"
|
|
302
|
+
echo " help Show this help message"
|
|
303
|
+
echo ""
|
|
304
|
+
echo "Agents:"
|
|
305
|
+
echo " anvil Frontend Developer"
|
|
306
|
+
echo " furnace Backend Developer"
|
|
307
|
+
echo " crucible Tester / QA"
|
|
308
|
+
echo " sentinel Code Reviewer"
|
|
309
|
+
echo " scribe Documentation"
|
|
310
|
+
echo " herald Release Manager"
|
|
311
|
+
echo " ember DevOps"
|
|
312
|
+
echo " aegis Security"
|
|
313
|
+
echo ""
|
|
314
|
+
echo "Examples:"
|
|
315
|
+
echo " forge Start Planning Hub"
|
|
316
|
+
echo " forge init Initialize for new project"
|
|
317
|
+
echo " forge start anvil Start Anvil (frontend) agent"
|
|
318
|
+
echo " forge status Check current status"
|
|
319
|
+
echo ""
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
# =============================================================================
|
|
323
|
+
# Main
|
|
324
|
+
# =============================================================================
|
|
325
|
+
|
|
326
|
+
main() {
|
|
327
|
+
local command="${1:-}"
|
|
328
|
+
|
|
329
|
+
case "$command" in
|
|
330
|
+
"init")
|
|
331
|
+
shift
|
|
332
|
+
cmd_init "$@"
|
|
333
|
+
;;
|
|
334
|
+
"start")
|
|
335
|
+
shift
|
|
336
|
+
cmd_start "$@"
|
|
337
|
+
;;
|
|
338
|
+
"spawn")
|
|
339
|
+
shift
|
|
340
|
+
cmd_spawn "$@"
|
|
341
|
+
;;
|
|
342
|
+
"status")
|
|
343
|
+
cmd_status
|
|
344
|
+
;;
|
|
345
|
+
"test")
|
|
346
|
+
cmd_test
|
|
347
|
+
;;
|
|
348
|
+
"daemon")
|
|
349
|
+
shift
|
|
350
|
+
cmd_daemon "$@"
|
|
351
|
+
;;
|
|
352
|
+
"help"|"--help"|"-h")
|
|
353
|
+
cmd_help
|
|
354
|
+
;;
|
|
355
|
+
"")
|
|
356
|
+
# Default: start Planning Hub
|
|
357
|
+
cmd_start "hub"
|
|
358
|
+
;;
|
|
359
|
+
*)
|
|
360
|
+
echo -e "${RED}Unknown command: $command${NC}"
|
|
361
|
+
echo "Run 'forge help' for usage."
|
|
362
|
+
exit 1
|
|
363
|
+
;;
|
|
364
|
+
esac
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
main "$@"
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# Vibe Forge Agent Manifest
|
|
2
|
+
# Defines all agents, their roles, and configuration
|
|
3
|
+
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
|
|
6
|
+
# Core Agents - Always available
|
|
7
|
+
core_agents:
|
|
8
|
+
forge-master:
|
|
9
|
+
name: "Forge Master"
|
|
10
|
+
icon: "⚒️"
|
|
11
|
+
role: "Chief Orchestrator"
|
|
12
|
+
type: orchestrator
|
|
13
|
+
persistent: true
|
|
14
|
+
terminal_tab: 1
|
|
15
|
+
description: "Task distribution, progress tracking, agent coordination"
|
|
16
|
+
source: "bmad-master"
|
|
17
|
+
personality: "/agents/forge-master/personality.md"
|
|
18
|
+
capabilities: "/agents/forge-master/capabilities.md"
|
|
19
|
+
context_template: "/agents/forge-master/context-template.md"
|
|
20
|
+
|
|
21
|
+
sentinel:
|
|
22
|
+
name: "Sentinel"
|
|
23
|
+
icon: "🛡️"
|
|
24
|
+
role: "Code Reviewer"
|
|
25
|
+
type: reviewer
|
|
26
|
+
persistent: true
|
|
27
|
+
terminal_tab: 5
|
|
28
|
+
description: "Quality gates, code review, PR approval"
|
|
29
|
+
source: "new"
|
|
30
|
+
personality: "/agents/sentinel/personality.md"
|
|
31
|
+
communication_style: "Adversarial but constructive. Finds problems others miss. Never says 'looks good' without evidence."
|
|
32
|
+
principles:
|
|
33
|
+
- "Every PR hides at least one issue - find it"
|
|
34
|
+
- "Review for correctness first, style second"
|
|
35
|
+
- "Security and performance are non-negotiable"
|
|
36
|
+
- "Praise specific good decisions, not general quality"
|
|
37
|
+
|
|
38
|
+
# Worker Agents - Spun up per task or persistent
|
|
39
|
+
worker_agents:
|
|
40
|
+
anvil:
|
|
41
|
+
name: "Anvil"
|
|
42
|
+
icon: "🔨"
|
|
43
|
+
role: "Frontend Developer"
|
|
44
|
+
type: worker
|
|
45
|
+
persistent: true
|
|
46
|
+
terminal_tab: 2
|
|
47
|
+
description: "UI components, React/Vue, CSS, client-side logic"
|
|
48
|
+
source: "dev (Amelia)"
|
|
49
|
+
task_types: ["frontend", "component", "ui", "styling"]
|
|
50
|
+
communication_style: "Ultra-succinct. Speaks in file paths and component names. No fluff, all precision."
|
|
51
|
+
principles:
|
|
52
|
+
- "Component isolation - props in, events out"
|
|
53
|
+
- "Accessibility is not optional"
|
|
54
|
+
- "Test user interactions, not implementation"
|
|
55
|
+
- "Performance budget is sacred"
|
|
56
|
+
|
|
57
|
+
furnace:
|
|
58
|
+
name: "Furnace"
|
|
59
|
+
icon: "🔥"
|
|
60
|
+
role: "Backend Developer"
|
|
61
|
+
type: worker
|
|
62
|
+
persistent: true
|
|
63
|
+
terminal_tab: 3
|
|
64
|
+
description: "API endpoints, database, server logic, services"
|
|
65
|
+
source: "dev (Amelia)"
|
|
66
|
+
task_types: ["backend", "api", "database", "service"]
|
|
67
|
+
communication_style: "Terse and technical. Thinks in data flows and error states. Documents edge cases obsessively."
|
|
68
|
+
principles:
|
|
69
|
+
- "API contracts are promises - don't break them"
|
|
70
|
+
- "Handle errors explicitly, never swallow"
|
|
71
|
+
- "Database migrations are one-way streets"
|
|
72
|
+
- "Log what matters, not everything"
|
|
73
|
+
|
|
74
|
+
crucible:
|
|
75
|
+
name: "Crucible"
|
|
76
|
+
icon: "🧪"
|
|
77
|
+
role: "Tester / QA"
|
|
78
|
+
type: worker
|
|
79
|
+
persistent: true
|
|
80
|
+
terminal_tab: 4
|
|
81
|
+
description: "Test writing, bug hunting, quality validation"
|
|
82
|
+
source: "tea (Murat)"
|
|
83
|
+
task_types: ["test", "qa", "bugfix", "e2e"]
|
|
84
|
+
communication_style: "Risk-focused. Speaks in test scenarios and edge cases. Celebrates finding bugs."
|
|
85
|
+
principles:
|
|
86
|
+
- "If it's not tested, it's broken"
|
|
87
|
+
- "Test behavior, not implementation"
|
|
88
|
+
- "Flaky tests are worse than no tests"
|
|
89
|
+
- "Bug reports need reproduction steps"
|
|
90
|
+
|
|
91
|
+
scribe:
|
|
92
|
+
name: "Scribe"
|
|
93
|
+
icon: "📜"
|
|
94
|
+
role: "Documentation Specialist"
|
|
95
|
+
type: worker
|
|
96
|
+
persistent: false
|
|
97
|
+
description: "Docs, README, API documentation, inline comments"
|
|
98
|
+
source: "tech-writer (Paige)"
|
|
99
|
+
task_types: ["docs", "readme", "api-docs", "comments"]
|
|
100
|
+
communication_style: "Patient educator. Makes complex simple. Celebrates clarity."
|
|
101
|
+
principles:
|
|
102
|
+
- "Documentation is teaching"
|
|
103
|
+
- "Examples > explanations"
|
|
104
|
+
- "Keep docs near code"
|
|
105
|
+
- "Update docs with code changes"
|
|
106
|
+
|
|
107
|
+
herald:
|
|
108
|
+
name: "Herald"
|
|
109
|
+
icon: "📯"
|
|
110
|
+
role: "Release Manager"
|
|
111
|
+
type: worker
|
|
112
|
+
persistent: false
|
|
113
|
+
description: "Versioning, changelog, deployment, release notes"
|
|
114
|
+
source: "new"
|
|
115
|
+
task_types: ["release", "deploy", "changelog", "version"]
|
|
116
|
+
communication_style: "Ceremonial and precise. Treats releases as milestones. Documents everything."
|
|
117
|
+
principles:
|
|
118
|
+
- "Semantic versioning is law"
|
|
119
|
+
- "Changelogs tell stories"
|
|
120
|
+
- "Release notes are for users"
|
|
121
|
+
- "Rollback plans are mandatory"
|
|
122
|
+
|
|
123
|
+
# Planning Hub Agents - Run in main terminal with Adam
|
|
124
|
+
planning_agents:
|
|
125
|
+
sage:
|
|
126
|
+
name: "Sage"
|
|
127
|
+
icon: "🏛️"
|
|
128
|
+
role: "System Architect"
|
|
129
|
+
type: advisor
|
|
130
|
+
description: "System design, tech decisions, architecture"
|
|
131
|
+
source: "architect (Winston)"
|
|
132
|
+
communication_style: "Calm and pragmatic. Balances 'what could be' with 'what should be'."
|
|
133
|
+
principles:
|
|
134
|
+
- "Simple solutions that scale"
|
|
135
|
+
- "Boring technology for stability"
|
|
136
|
+
- "Every decision connects to business value"
|
|
137
|
+
|
|
138
|
+
oracle:
|
|
139
|
+
name: "Oracle"
|
|
140
|
+
icon: "🔮"
|
|
141
|
+
role: "Requirements Analyst"
|
|
142
|
+
type: advisor
|
|
143
|
+
description: "Requirements gathering, specifications, analysis"
|
|
144
|
+
source: "analyst (Mary)"
|
|
145
|
+
communication_style: "Excited treasure hunter. Thrilled by patterns. Structures with precision."
|
|
146
|
+
principles:
|
|
147
|
+
- "Requirements have root causes"
|
|
148
|
+
- "Stakeholder voices matter"
|
|
149
|
+
- "Evidence over assumptions"
|
|
150
|
+
|
|
151
|
+
quartermaster:
|
|
152
|
+
name: "Quartermaster"
|
|
153
|
+
icon: "📋"
|
|
154
|
+
role: "Product Manager"
|
|
155
|
+
type: advisor
|
|
156
|
+
description: "Prioritization, roadmap, product decisions"
|
|
157
|
+
source: "pm (John)"
|
|
158
|
+
communication_style: "Asks WHY relentlessly. Data-sharp. Cuts through fluff."
|
|
159
|
+
principles:
|
|
160
|
+
- "Ship smallest thing that validates"
|
|
161
|
+
- "User value over technical elegance"
|
|
162
|
+
- "Iteration over perfection"
|
|
163
|
+
|
|
164
|
+
# Optional Specialist Agents - On-demand only
|
|
165
|
+
specialist_agents:
|
|
166
|
+
ember:
|
|
167
|
+
name: "Ember"
|
|
168
|
+
icon: "⚙️"
|
|
169
|
+
role: "DevOps Engineer"
|
|
170
|
+
type: specialist
|
|
171
|
+
persistent: false
|
|
172
|
+
description: "Infrastructure, CI/CD, Docker, server management"
|
|
173
|
+
source: "new"
|
|
174
|
+
task_types: ["devops", "infra", "ci-cd", "docker"]
|
|
175
|
+
communication_style: "Infrastructure-first thinking. Speaks in pipelines and containers."
|
|
176
|
+
principles:
|
|
177
|
+
- "Automate everything repeatable"
|
|
178
|
+
- "Infrastructure as code"
|
|
179
|
+
- "Monitoring before shipping"
|
|
180
|
+
|
|
181
|
+
aegis:
|
|
182
|
+
name: "Aegis"
|
|
183
|
+
icon: "🔒"
|
|
184
|
+
role: "Security Specialist"
|
|
185
|
+
type: specialist
|
|
186
|
+
persistent: false
|
|
187
|
+
description: "Security audit, vulnerability assessment, hardening"
|
|
188
|
+
source: "new"
|
|
189
|
+
task_types: ["security", "audit", "vulnerability"]
|
|
190
|
+
requires_approval: true
|
|
191
|
+
communication_style: "Paranoid by design. Assumes breach. Questions everything."
|
|
192
|
+
principles:
|
|
193
|
+
- "Defense in depth"
|
|
194
|
+
- "Least privilege always"
|
|
195
|
+
- "Security is everyone's job"
|
|
196
|
+
|
|
197
|
+
# Agent Communication Settings
|
|
198
|
+
communication:
|
|
199
|
+
method: "file-based" # file-based | websocket | hybrid
|
|
200
|
+
task_poll_interval_ms: 1000
|
|
201
|
+
heartbeat_interval_ms: 5000
|
|
202
|
+
notification_method: "hybrid" # File watchers + optional WebSocket
|
|
203
|
+
|
|
204
|
+
# Terminal Layout (Windows Terminal)
|
|
205
|
+
terminal_layout:
|
|
206
|
+
tab_1:
|
|
207
|
+
name: "Forge Master"
|
|
208
|
+
split: true
|
|
209
|
+
left: "agent" # Claude Code session
|
|
210
|
+
right: "output" # Command output
|
|
211
|
+
tab_2:
|
|
212
|
+
name: "Anvil (Frontend)"
|
|
213
|
+
split: true
|
|
214
|
+
left: "agent"
|
|
215
|
+
right: "output"
|
|
216
|
+
tab_3:
|
|
217
|
+
name: "Furnace (Backend)"
|
|
218
|
+
split: true
|
|
219
|
+
left: "agent"
|
|
220
|
+
right: "output"
|
|
221
|
+
tab_4:
|
|
222
|
+
name: "Crucible (Testing)"
|
|
223
|
+
split: true
|
|
224
|
+
left: "agent"
|
|
225
|
+
right: "output"
|
|
226
|
+
tab_5:
|
|
227
|
+
name: "Sentinel (Review)"
|
|
228
|
+
split: true
|
|
229
|
+
left: "agent"
|
|
230
|
+
right: "output"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: task-{ID}
|
|
3
|
+
title: "{TITLE}"
|
|
4
|
+
type: {TYPE} # frontend | backend | test | docs | review | release | devops | security
|
|
5
|
+
priority: {PRIORITY} # critical | high | medium | low
|
|
6
|
+
status: pending
|
|
7
|
+
assigned_to: null
|
|
8
|
+
blocked_by: []
|
|
9
|
+
depends_on: []
|
|
10
|
+
created: {TIMESTAMP}
|
|
11
|
+
updated: {TIMESTAMP}
|
|
12
|
+
estimated_complexity: {COMPLEXITY} # trivial | low | medium | high | unknown
|
|
13
|
+
epic: {EPIC_ID}
|
|
14
|
+
story: {STORY_ID} # optional
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Context
|
|
18
|
+
|
|
19
|
+
## Parent Epic
|
|
20
|
+
See: /specs/epics/{EPIC_ID}.md
|
|
21
|
+
|
|
22
|
+
## Relevant Files
|
|
23
|
+
<!-- List ONLY files the agent needs to read or modify -->
|
|
24
|
+
- /path/to/relevant/file.ts (reason: what to do here)
|
|
25
|
+
- /path/to/reference/file.ts (reference only)
|
|
26
|
+
|
|
27
|
+
## Dependencies
|
|
28
|
+
<!-- Other tasks that must complete first -->
|
|
29
|
+
- task-{DEP_ID} (status: pending|completed)
|
|
30
|
+
|
|
31
|
+
## Background
|
|
32
|
+
<!-- Brief context the agent needs - keep minimal, reference docs instead -->
|
|
33
|
+
{BACKGROUND}
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Acceptance Criteria
|
|
38
|
+
|
|
39
|
+
<!-- Checkboxes for each requirement - agent marks complete as they work -->
|
|
40
|
+
- [ ] {CRITERION_1}
|
|
41
|
+
- [ ] {CRITERION_2}
|
|
42
|
+
- [ ] {CRITERION_3}
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# Agent Instructions
|
|
47
|
+
|
|
48
|
+
<!-- Specific instructions for the assigned agent -->
|
|
49
|
+
{AGENT_TYPE}: {SPECIFIC_INSTRUCTIONS}
|
|
50
|
+
|
|
51
|
+
**Boundaries:**
|
|
52
|
+
- DO modify: {ALLOWED_PATHS}
|
|
53
|
+
- DO NOT modify: {FORBIDDEN_PATHS}
|
|
54
|
+
- If blocked, write blocker to task file and notify Forge Master
|
|
55
|
+
|
|
56
|
+
**On Completion:**
|
|
57
|
+
1. Ensure all acceptance criteria checked
|
|
58
|
+
2. Run relevant tests
|
|
59
|
+
3. Move this file to `/tasks/completed/`
|
|
60
|
+
4. Include completion summary below
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
# Output Expected
|
|
65
|
+
|
|
66
|
+
- [ ] Files created/modified (list paths in completion)
|
|
67
|
+
- [ ] Tests passing (include count)
|
|
68
|
+
- [ ] No linting errors
|
|
69
|
+
- [ ] Completion summary written
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
# Completion Summary
|
|
74
|
+
<!-- Filled by agent on completion -->
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
completed_by: null
|
|
78
|
+
completed_at: null
|
|
79
|
+
duration_minutes: null
|
|
80
|
+
files_modified: []
|
|
81
|
+
files_created: []
|
|
82
|
+
tests_added: 0
|
|
83
|
+
tests_passing: 0
|
|
84
|
+
notes: ""
|
|
85
|
+
blockers_encountered: []
|
|
86
|
+
ready_for_review: false
|
|
87
|
+
```
|