소스 정보
- 저장소
- ForceInjection/domain-driven-design-skills
- 최근 소스 활동
- 2026년 5월 8일 03:07
- 감지된 SKILL.md 언어
- 영어
- 스타
- 25
- 포크
- 7
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/ForceInjection/domain-driven-design-skills --skill faber-state명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | faber-state |
| description | Manage FABER workflow state (CRUD operations) |
| model | claude-opus-4-5 |
State is stored at:
.fractary/plugins/faber/runs/{run_id}/state.json.fractary/plugins/faber/state.jsonState tracks: current phase, phase statuses, artifacts, retry counts, errors, last_event_id
<CRITICAL_RULES> YOU MUST:
../core/scripts/)YOU MUST NOT:
<STATE_STRUCTURE>
{
"run_id": "fractary/my-project/a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"plan_id": "fractary-claude-plugins-csv-export-20251208T160000",
"work_id": "123",
"workflow_id": "default",
"workflow_version": "2.1",
"status": "in_progress",
"current_phase": "build",
"current_step_index": 2,
"steps_completed": ["generate-spec", "create-branch"],
"last_event_id": 15,
"started_at": "2025-12-03T10:00:00Z",
"updated_at": "2025-12-03T10:30:00Z",
"completed_at": null,
"phases": {
"frame": {
"status": "completed",
"started_at": "2025-12-03T10:00:00Z",
"completed_at": "2025-12-03T10:05:00Z",
"steps": [],
"retry_count": 0
},
"architect": {
"status": "completed",
"started_at": "2025-12-03T10:05:00Z",
"completed_at": "2025-12-03T10:15:00Z",
"steps": [
{"id": "generate-spec", "status": "completed", "started_at": "...", "completed_at": "...", "duration_ms": 5000}
],
"retry_count": 0
},
"build": {
"status": "in_progress",
"started_at": "2025-12-03T10:15:00Z",
"steps": [
{"id": "implement", "status": "in_progress", "started_at": "..."},
{"id": "commit", "status": "pending"}
],
"retry_count": 0
},
"evaluate": {"status": "pending", "steps": [], "retry_count": 0},
"release": {"status": "pending", "steps": [], "retry_count": 0}
},
"artifacts": {
"spec_path": "specs/WORK-00123-feature.md",
"branch_name": "feat/123-add-feature",
"pr_url": null,
"pr_number": null
},
"errors": []
}
Note: Steps in state use id field for identification. For backward compatibility with existing state files, name field is also supported during reads.
</STATE_STRUCTURE>
Initialize a new workflow state file.
Script: ../core/scripts/state-init.sh
Parameters:
work_id (required): Work item identifierrun_id (optional): Run identifier (format: org/project/uuid). If provided, state is stored in per-run directory.workflow_id (optional): Workflow to use (default: "default")state_path (optional): Path to state file (computed from run_id if provided)Returns:
{
"status": "success",
"operation": "init-state",
"work_id": "123",
"run_id": "fractary/my-project/a1b2c3d4-...",
"workflow_id": "default",
"state_path": ".fractary/plugins/faber/runs/fractary/my-project/a1b2c3d4-.../state.json"
}
Execution:
# With run_id (preferred for new workflows)
../core/scripts/state-init.sh --run-id "$RUN_ID" "$WORK_ID" "$WORKFLOW_ID"
# Legacy (without run_id)
../core/scripts/state-init.sh "$WORK_ID" "$WORKFLOW_ID" "$STATE_PATH"
Read current workflow state.
Script: ../core/scripts/state-read.sh
Parameters:
run_id (optional): Run identifier. If provided, reads from per-run directory.state_path (optional): Path to state file (computed from run_id if provided)query (optional): jq query for specific field (e.g., .current_phase)Returns:
{
"status": "success",
"operation": "read-state",
"state": { ... full state object ... }
}
Or with query:
{
"status": "success",
"operation": "read-state",
"query": ".current_phase",
"result": "build"
}
Execution:
# With run_id (preferred)
../core/scripts/state-read.sh --run-id "$RUN_ID" "$QUERY"
# Legacy
../core/scripts/state-read.sh "$STATE_PATH" "$QUERY"
Update a phase's status and data.
Script: ../core/scripts/state-update-phase.sh
Parameters:
run_id (optional): Run identifier. If provided, updates per-run state.phase (required): Phase name (frame, architect, build, evaluate, release)status (required): New status (pending, in_progress, completed, failed, skipped)data (optional): Additional phase data as JSONReturns:
{
"status": "success",
"operation": "update-phase",
"phase": "build",
"phase_status": "in_progress",
"current_phase": "build"
}
Execution:
# With run_id (preferred)
../core/scripts/state-update-phase.sh --run-id "$RUN_ID" "$PHASE" "$STATUS" "$DATA_JSON"
# Legacy
../core/scripts/state-update-phase.sh "$PHASE" "$STATUS" "$DATA_JSON"
Update a step's status within a phase.
Parameters:
run_id (optional): Run identifier. If provided, updates per-run state.phase (required): Phase containing the stepstep_id (required): Unique identifier of the step (uses id field, falls back to name for backward compatibility)status (required): New status (pending, in_progress, completed, failed, skipped)data (optional): Step result dataReturns:
{
"status": "success",
"operation": "update-step",
"phase": "build",
"step_id": "implement",
"step_status": "completed"
}
Execution:
step_id (check id field first, then name for backward compatibility)Note: Step identification uses the id field (preferred) or name field (deprecated, backward compatible). This ensures consistent step tracking across logging, state management, and step targeting.
Record an artifact in state (spec, branch, PR, etc.).
Parameters:
run_id (optional): Run identifier. If provided, updates per-run state.artifact_type (required): Type of artifact (spec_path, branch_name, pr_url, pr_number, custom)artifact_value (required): Value to recordReturns:
{
"status": "success",
"operation": "record-artifact",
"artifact_type": "branch_name",
"artifact_value": "feat/123-add-feature"
}
Execution:
state.artifacts[artifact_type] = artifact_valueupdated_at timestampMark the workflow as completed or failed.
Parameters:
run_id (optional): Run identifier. If provided, updates per-run state.final_status (required): Final status (completed, failed, cancelled)summary (optional): Completion summaryerrors (optional): Error details if failedReturns:
{
"status": "success",
"operation": "mark-complete",
"final_status": "completed",
"completed_at": "2025-12-03T11:00:00Z"
}
Execution:
state.status = final_statusstate.completed_at = now()Track exact step progress within a phase (for resume support).
Parameters:
run_id (optional): Run identifier. If provided, updates per-run state.phase (required): Current phase being executedcurrent_step_index (required): Index of the current/next step in the phasesteps_completed (required): Array of step names/IDs that have been completedReturns:
{
"status": "success",
"operation": "update-step-progress",
"phase": "build",
"current_step_index": 2,
"steps_completed": ["generate-spec", "create-branch"],
"resumable": true
}
Execution:
state.current_phase = phasestate.current_step_index = current_step_indexstate.steps_completed = steps_completedupdated_at timestampPurpose: This operation enables exact-step resume by tracking:
When resuming with --resume, the executor reads this state and passes it
to faber-manager as resume_context, allowing the manager to skip completed
steps and continue from the exact position.
Increment the retry counter for the current phase (for Build-Evaluate loop).
Parameters:
run_id (optional): Run identifier. If provided, updates per-run state.phase (optional): Phase to increment retry for (default: current_phase)Returns:
{
"status": "success",
"operation": "increment-retry",
"phase": "evaluate",
"retry_count": 2,
"max_retries": 3,
"can_retry": true
}
Execution:
state.phases[phase].retry_countCheck if a state file exists for a run or work item.
Parameters:
run_id (optional): Run identifier. If provided, checks per-run state.work_id (optional): Work ID to check (legacy)state_path (optional): Specific state file path (computed from run_id if provided)Returns:
{
"status": "success",
"operation": "check-exists",
"exists": true,
"run_id": "fractary/my-project/a1b2c3d4-...",
"state_path": ".fractary/plugins/faber/runs/fractary/my-project/a1b2c3d4-.../state.json",
"work_id": "123",
"current_phase": "build"
}
Validate state file structure.
Script: ../core/scripts/state-validate.sh
Parameters:
run_id (optional): Run identifier. If provided, validates per-run state.state_path (optional): Path to state file (computed from run_id if provided)Returns:
{
"status": "success",
"operation": "validate-state",
"valid": true,
"run_id": "fractary/my-project/a1b2c3d4-..."
}
Create a backup of current state.
Script: ../core/scripts/state-backup.sh
Parameters:
run_id (optional): Run identifier. If provided, backs up per-run state.state_path (optional): Path to state file (computed from run_id if provided)Returns:
{
"status": "success",
"operation": "backup-state",
"backup_path": ".fractary/plugins/faber/runs/fractary/my-project/a1b2c3d4-.../state.json.backup.20251203T110000Z"
}
When invoked with an operation:
Parse Request
Execute Operation
Return Result
<ERROR_HANDLING>
| Error | Code | Action |
|---|---|---|
| State file not found | STATE_NOT_FOUND | Return error (for read operations) or create (for init) |
| Invalid state JSON | STATE_INVALID | Return error with parse details |
| Invalid phase name | INVALID_PHASE | Return error with valid phase names |
| Invalid status | INVALID_STATUS | Return error with valid statuses |
| Write failed | STATE_WRITE_ERROR | Return error, state unchanged |
| Max retries exceeded | MAX_RETRIES | Return with can_retry: false |
| </ERROR_HANDLING> |
<OUTPUT_FORMAT> Always output start/end messages for visibility:
🎯 STARTING: FABER State
Operation: update-phase
Phase: build
Status: in_progress
───────────────────────────────────────
[... execution ...]
✅ COMPLETED: FABER State
Phase: build → in_progress
Current Phase: build
───────────────────────────────────────
</OUTPUT_FORMAT>
- `jq` for JSON parsing and manipulation - Existing scripts in `../core/scripts/`<FILE_LOCATIONS> With run_id (preferred):
.fractary/plugins/faber/runs/{run_id}/state.json.fractary/plugins/faber/runs/{run_id}/metadata.json.fractary/plugins/faber/runs/{run_id}/events/.fractary/plugins/faber/runs/{run_id}/state.json.backup.<timestamp>Legacy (no run_id):
.fractary/plugins/faber/state.json.fractary/plugins/faber/state.json.backup.<timestamp>Helper function to compute state path:
get_state_path() {
local run_id="$1"
if [ -n "$run_id" ]; then
echo ".fractary/plugins/faber/runs/$run_id/state.json"
else
echo ".fractary/plugins/faber/state.json"
fi
}
</FILE_LOCATIONS>
State operations are designed for idempotency: - `init-state`: Only creates if not exists, otherwise returns existing - `update-phase`: Same status update is a no-op - `record-artifact`: Overwrites existing value (idempotent) - `mark-complete`: No-op if already in terminal state