forge-pipeline 0.5.0 → 0.6.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/forge +3 -3
- package/lib/agent.sh +35 -1
- package/lib/phases/00_spec.sh +37 -0
- package/package.json +1 -1
package/forge
CHANGED
|
@@ -691,12 +691,12 @@ run_pipeline() {
|
|
|
691
691
|
continue
|
|
692
692
|
fi
|
|
693
693
|
|
|
694
|
-
# Save feedback and
|
|
694
|
+
# Save feedback and run single revision pass
|
|
695
695
|
printf '%b\n' "$feedback" > "$FORGE_ROOT/.forge/spec/user-feedback.md"
|
|
696
|
-
log_info "Feedback saved.
|
|
696
|
+
log_info "Feedback saved. Revising spec..."
|
|
697
697
|
echo ""
|
|
698
698
|
|
|
699
|
-
|
|
699
|
+
run_phase_spec_revise || { log_error "Spec revision failed"; exit 1; }
|
|
700
700
|
check_global_timeout
|
|
701
701
|
done
|
|
702
702
|
else
|
package/lib/agent.sh
CHANGED
|
@@ -56,7 +56,41 @@ spawn_agent_foreground() {
|
|
|
56
56
|
local done_file="${forge_root}/.forge/status/${name}.done"
|
|
57
57
|
|
|
58
58
|
cd "$worktree_path" && \
|
|
59
|
-
claude -p "$(cat /tmp/forge-prompt-"${name}".md)" --allowedTools "$allowed_tools" 2>&1 |
|
|
59
|
+
claude -p "$(cat /tmp/forge-prompt-"${name}".md)" --output-format stream-json --allowedTools "$allowed_tools" 2>&1 | \
|
|
60
|
+
while IFS= read -r line; do
|
|
61
|
+
# Extract text content from stream-json and display in real-time
|
|
62
|
+
local type
|
|
63
|
+
type="$(echo "$line" | jq -r '.type // empty' 2>/dev/null)"
|
|
64
|
+
case "$type" in
|
|
65
|
+
assistant)
|
|
66
|
+
echo "$line" >> "$log_file"
|
|
67
|
+
local content
|
|
68
|
+
content="$(echo "$line" | jq -r '.message.content[]? | select(.type=="text") | .text // empty' 2>/dev/null)"
|
|
69
|
+
if [ -n "$content" ]; then
|
|
70
|
+
printf '%s\n' "$content"
|
|
71
|
+
fi
|
|
72
|
+
;;
|
|
73
|
+
content_block_delta)
|
|
74
|
+
echo "$line" >> "$log_file"
|
|
75
|
+
local delta
|
|
76
|
+
delta="$(echo "$line" | jq -r '.delta.text // empty' 2>/dev/null)"
|
|
77
|
+
if [ -n "$delta" ]; then
|
|
78
|
+
printf '%s' "$delta"
|
|
79
|
+
fi
|
|
80
|
+
;;
|
|
81
|
+
result)
|
|
82
|
+
echo "$line" >> "$log_file"
|
|
83
|
+
local result_text
|
|
84
|
+
result_text="$(echo "$line" | jq -r '.result // empty' 2>/dev/null)"
|
|
85
|
+
if [ -n "$result_text" ]; then
|
|
86
|
+
printf '\n%s\n' "$result_text"
|
|
87
|
+
fi
|
|
88
|
+
;;
|
|
89
|
+
*)
|
|
90
|
+
echo "$line" >> "$log_file"
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
93
|
+
done
|
|
60
94
|
|
|
61
95
|
echo "done" > "$done_file"
|
|
62
96
|
log_agent "$name" "Foreground agent completed"
|
package/lib/phases/00_spec.sh
CHANGED
|
@@ -107,3 +107,40 @@ run_phase_spec() {
|
|
|
107
107
|
|
|
108
108
|
return 0
|
|
109
109
|
}
|
|
110
|
+
|
|
111
|
+
##
|
|
112
|
+
# Single-pass spec revision from user feedback.
|
|
113
|
+
# Runs one architect pass (with user feedback) + one challenger pass.
|
|
114
|
+
##
|
|
115
|
+
run_phase_spec_revise() {
|
|
116
|
+
log_phase "0" "SPEC REVISION (user feedback)"
|
|
117
|
+
|
|
118
|
+
# ── Architect revision with user feedback ─────────────────────
|
|
119
|
+
local prompt
|
|
120
|
+
prompt="$(generate_architect_revision_prompt)"
|
|
121
|
+
|
|
122
|
+
spawn_agent_foreground "architect" "$FORGE_ROOT" "$prompt" "$(build_allowed_tools architect)"
|
|
123
|
+
|
|
124
|
+
if [[ ! -f "${FORGE_ROOT}/.forge/spec/spec.md" ]]; then
|
|
125
|
+
log_error "Architect did not produce spec.md during revision"
|
|
126
|
+
return 1
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
# ── Challenger validation ─────────────────────────────────────
|
|
130
|
+
local challenger_prompt
|
|
131
|
+
challenger_prompt="$(generate_challenger_prompt)"
|
|
132
|
+
|
|
133
|
+
spawn_agent_foreground "challenger" "$FORGE_ROOT" "$challenger_prompt" "$(build_allowed_tools challenger)"
|
|
134
|
+
|
|
135
|
+
if [[ -f "${FORGE_ROOT}/.forge/spec/review.json" ]]; then
|
|
136
|
+
local verdict
|
|
137
|
+
verdict="$(json_get "${FORGE_ROOT}/.forge/spec/review.json" "verdict")"
|
|
138
|
+
if [[ "$verdict" == "approved" ]]; then
|
|
139
|
+
log_success "Revised spec approved by challenger"
|
|
140
|
+
else
|
|
141
|
+
log_warn "Challenger flagged issues but proceeding (user-driven revision)"
|
|
142
|
+
fi
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
return 0
|
|
146
|
+
}
|