用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ForceInjection/domain-driven-design-skills --skill feedback-handler命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | feedback-handler |
| description | Handles FABER workflow feedback requests - posting to issues and tracking responses |
| model | claude-opus-4-5 |
You work with the work plugin (comment-creator) to post comments and the run-manager to update state.
<CRITICAL_RULES>
Request feedback from user and optionally post to issue.
{
"operation": "request-feedback",
"parameters": {
"run_id": "fractary/claude-plugins/abc-123-...",
"work_id": "258",
"phase": "architect",
"step": "design-review",
"feedback_type": "approval",
"prompt": "Please review the architectural design and approve to proceed.",
"options": ["approve", "reject", "request_changes"],
"context": {
"artifact_path": "/specs/WORK-00258-design.md",
"summary": "Design proposes 3-layer architecture with handler pattern"
},
"post_to_issue": true,
"cli_prompt": true
}
}
Parameters:
run_id (required): FABER run identifierwork_id (optional): Issue ID for posting commentphase (required): Current workflow phasestep (required): Current workflow stepfeedback_type (required): Type of feedback (see FEEDBACK_TYPES)prompt (required): Human-readable question/requestoptions (required): Array of valid response optionscontext (optional): Additional context for the decisionpost_to_issue (optional, default: true if work_id present): Post as issue commentcli_prompt (optional, default: true): Show prompt in CLIProcess a feedback response and update state.
{
"operation": "process-response",
"parameters": {
"run_id": "fractary/claude-plugins/abc-123-...",
"request_id": "fr-20251206-001",
"response": "approve",
"comment": "Looks good, proceed with implementation",
"source": "cli",
"user": "jmcwilliam"
}
}
<FEEDBACK_TYPES>
| Type | Description | Default Options |
|---|---|---|
approval | Binary approval decision | ["approve", "reject"] |
confirmation | Confirm destructive action | ["confirm", "cancel"] |
selection | Choose from options | [custom list required] |
clarification | Request information | [free text accepted] |
review | Review with feedback option | ["approve", "request_changes", "reject"] |
error_resolution | Error occurred, decide action | ["retry", "skip", "abort"] |
| </FEEDBACK_TYPES> |
Generate request ID
request_id = "fr-" + timestamp + "-" + short_uuid
Example: fr-20251206-a1b2c3
Build feedback request object
{
"request_id": "fr-20251206-a1b2c3",
"type": "approval",
"prompt": "Please review the design...",
"options": ["approve", "reject", "request_changes"],
"context": { ... },
"requested_at": "2025-12-06T18:00:00Z",
"notification_sent": {
"cli": false,
"issue_comment": false,
"comment_url": null
}
}
Load current state
Validate response
Emit feedback_received event
plugins/faber/skills/run-manager/scripts/emit-event.sh \
--run-id "{run_id}" \
--type "feedback_received" \
--phase "{phase}" \
--step "{step}" \
--message "Feedback received: {response}" \
--metadata '{"request_id": "{request_id}", "response": "{response}", "user": "{user}", "source": "{source}"}'
Update state
Return processed response
{
"status": "success",
"operation": "process-response",
"result": {
"request_id": "fr-20251206-a1b2c3",
"response": "approve",
"action": "continue",
"resume_point": { ... }
}
<ISSUE_COMMENT_TEMPLATE> When posting feedback requests to GitHub issues:
## Feedback Requested
**Workflow Run**: `{run_id}`
**Phase**: {phase}
**Step**: {step}
**Requested**: {timestamp} UTC
### Decision Needed
{prompt}
{#if context.summary}
**Summary**:
{context.summary}
{/if}
{#if context.artifact_path}
**Artifact**: [{artifact_filename}]({context.artifact_path})
{/if}
### Options
{#each options}
{index}. **{option}** - {option_description}
{/each}
### How to Respond
Reply to this issue with your decision. Include `@faber resume` in your comment to trigger workflow continuation.
**Example response:**
I approve this design. The approach looks good.
@faber resume
---
_This feedback request will remain open until addressed._
_Run ID: `{run_id}` | Request ID: `{request_id}`_
Option Descriptions (based on type):
For approval:
For review:
For error_resolution:
For confirmation:
{
"status": "success",
"operation": "request-feedback",
"message": "Feedback request created",
"details": {
"request_id": "fr-20251206-a1b2c3",
"type": "approval",
"phase": "architect",
"step": "design-review"
},
"notifications": {
"cli": true,
"issue_comment": true,
"comment_url": "https://github.com/fractary/claude-plugins/issues/258#issuecomment-xyz"
}
}
{
"status": "success",
"operation": "process-response",
"message": "Feedback processed: approve",
"details": {
"request_id": "fr-20251206-a1b2c3",
"response": "approve",
"action": "continue",
"resume_point": {
"phase": "architect",
"step": "design-review"
}
}
}
<ERROR_HANDLING>
| Error | Code | Action |
|---|---|---|
| Missing run_id | 1 | Return error, cannot proceed |
| Invalid feedback_type | 2 | Return error, list valid types |
| State not awaiting_feedback | 3 | Return error, nothing to process |
| Request ID mismatch | 4 | Return error, may be stale request |
| Invalid response option | 5 | Re-prompt with valid options |
| Issue comment failed | 6 | Warn but continue (non-critical) |
| State update failed | 7 | Return error (critical) |
| </ERROR_HANDLING> |
<COMPLETION_CRITERIA> request-feedback complete when:
process-response complete when:
request-feedback Start:
🎯 STARTING: Feedback Handler (request-feedback)
Run ID: fractary/claude-plugins/abc-123-...
Type: approval
Phase: architect
Step: design-review
───────────────────────────────────────
request-feedback End:
✅ COMPLETED: Feedback Handler (request-feedback)
Request ID: fr-20251206-a1b2c3
Notifications: CLI ✓, Issue Comment ✓
Comment URL: https://github.com/...
───────────────────────────────────────
Status: awaiting_feedback
Next: User must provide feedback to continue
process-response Start:
🎯 STARTING: Feedback Handler (process-response)
Request ID: fr-20251206-a1b2c3
Response: approve
───────────────────────────────────────
process-response End:
✅ COMPLETED: Feedback Handler (process-response)
Action: continue
Resume Point: architect:design-review
───────────────────────────────────────
Next: Workflow will resume from design-review
Called By:
Invokes:
State Files:
.fractary/plugins/faber/runs/{run_id}/state.jsonScripts:
scripts/generate-request-id.sh - Generate unique feedback request IDscripts/format-feedback-comment.sh - Format feedback request as markdownscripts/update-feedback-state.sh - Update run state with feedback details# Generate a new request ID
./scripts/generate-request-id.sh
# Output: fr-20251206-a1b2c3
./scripts/format-feedback-comment.sh \
--run-id "fractary/claude-plugins/abc-123" \
--request-id "fr-20251206-a1b2c3" \
--type "approval" \
--phase "architect" \
--step "design-review" \
--prompt "Please review the design" \
--options '["approve", "reject"]' \
--context '{"summary": "3-layer architecture"}'
# Outputs formatted markdown comment to stdout
# Set awaiting_feedback status
./scripts/update-feedback-state.sh \
--run-id "fractary/claude-plugins/abc-123" \
--operation set-awaiting \
--request-id "fr-20251206-a1b2c3" \
--type "approval" \
--prompt "Please review" \
--options '["approve", "reject"]' \
--phase "architect" \
--step "design-review"
# Clear awaiting status after feedback
./scripts/update-feedback-state.sh \
--run-id "fractary/claude-plugins/abc-123" \
--operation clear-awaiting \
--phase "architect" \
--step "design-review"
# Add to feedback history
./scripts/update-feedback-state.sh \
--run-id "fractary/claude-plugins/abc-123" \
--operation add-history \
--request-id "fr-20251206-a1b2c3" \
--type "approval" \
--response "approve" \
--user "jmcwilliam" \
--source "cli"
To post feedback request to issue:
Invoke Skill: fractary-work:comment-creator
Operation: create-comment
Parameters:
issue_id: "{work_id}"
message: "{formatted_markdown}" # From format-feedback-comment.sh output
author_context: "ops"
The comment-creator returns comment_url which should be stored in the run state via update-feedback-state.sh --comment-url.
plugins/faber/skills/run-manager/scripts/emit-event.sh \
--run-id "{run_id}" \
--type "decision_point" \
--phase "{phase}" \
--step "{step}" \
--message "Awaiting feedback: {prompt}" \
--metadata '{"request_id": "{request_id}", "type": "{feedback_type}", "options": {options}}'
Update run state
{
"status": "awaiting_feedback",
"current_phase": "{phase}",
"current_step": "{step}",
"feedback_request": { ... request object ... },
"resume_point": {
"phase": "{phase}",
"step": "{step}",
"step_index": {current_step_index}
}
}
Post to issue (if work_id present and post_to_issue=true)
Show CLI prompt (if cli_prompt=true)
Return request details
{
"status": "success",
"operation": "request-feedback",
"result": {
"request_id": "fr-20251206-a1b2c3",
"state_updated": true,
"notifications": {
"cli": true,
"issue_comment": true,
"comment_url": "https://..."
}
}
}