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/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
+ ```