rdev/cookbooks/trees/sdlc-flow.yaml
jordan 56e3f83955 feat: add auth scopes, OpenAPI docs, SDLC guides, and code quality improvements
- Add auth.RequireScope() to all handler routes for proper authorization
- Add SDLC OpenAPI endpoint documentation (state, features, tasks, branches, merge, archive, orchestrator)
- Add SDLC documentation guides (getting-started, cli-reference, api-reference, command-catalog)
- Add artifact_test.go for SDLC artifact coverage
- Add CLAUDE.md rules: auth scopes requirement, error wrapping with %w
- Fix error wrapping to use %w instead of %v throughout codebase
- Improve CLI merge command with conflict detection and resolution
- Fix handler tests to include auth middleware for RequireScope
- Add cookbook tree runner scripts for automated testing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 13:55:50 -07:00

142 lines
4.2 KiB
YAML

name: sdlc-flow
description: Test SDLC orchestration lifecycle endpoints
version: 1
vars:
project_id: "" # Required - existing project with SDLC initialized
feature_slug: "" # Optional - auto-generated if empty
steps:
get-state:
description: Get SDLC state (verify endpoint works)
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/state"
outputs:
- version: .data.version
create-feature:
description: Create a test feature
depends_on: [get-state]
action: shell
command: |
slug="{{ .vars.feature_slug }}"
if [ -z "$slug" ]; then
slug="sdlc-test-$(date +%s)"
fi
curl -s -X POST "$RDEV_API_URL/projects/{{ .vars.project_id }}/sdlc/features" \
-H "X-API-Key: $RDEV_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"slug\": \"$slug\", \"title\": \"SDLC E2E Test Feature\"}" | \
jq --arg slug "$slug" '. + {created_slug: $slug}'
outputs:
- feature_slug: .created_slug
list-features:
description: List all features
depends_on: [create-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features"
outputs:
- feature_count: ".data | length"
get-feature:
description: Get feature detail
depends_on: [create-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}"
outputs:
- phase: .data.phase
get-next:
description: Get classifier recommendation
depends_on: [get-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/next?feature={{ .outputs.create-feature.feature_slug }}"
outputs:
- action: .data.action
- message: .data.message
get-artifacts:
description: Check artifact status
depends_on: [get-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}/artifacts"
add-task:
description: Add a task to the feature
depends_on: [create-feature]
action: api
method: POST
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}/tasks"
body:
title: "Test task for E2E validation"
outputs:
- task_id: .data.id
list-tasks:
description: List feature tasks
depends_on: [add-task]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}/tasks"
outputs:
- task_count: ".data | length"
block-feature:
description: Block the feature
depends_on: [list-tasks]
action: api
method: POST
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}/block"
body:
reason: "E2E test blocker"
query-blocked:
description: Query blocked features
depends_on: [block-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/query/blocked"
outputs:
- blocked_count: ".data | length"
unblock-feature:
description: Unblock the feature
depends_on: [query-blocked]
action: api
method: POST
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}/unblock"
query-ready:
description: Query ready features
depends_on: [unblock-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/query/ready"
query-needs-approval:
description: Query features needing approval
depends_on: [unblock-feature]
action: api
method: GET
endpoint: "/projects/{{ .vars.project_id }}/sdlc/query/needs-approval"
cleanup:
description: Delete the test feature
depends_on: [query-ready, query-needs-approval]
action: api
method: DELETE
endpoint: "/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}"
teardown:
- description: Delete test feature (if still exists)
action: shell
command: |
curl -s -X DELETE "$RDEV_API_URL/projects/{{ .vars.project_id }}/sdlc/features/{{ .outputs.create-feature.feature_slug }}" \
-H "X-API-Key: $RDEV_API_KEY" || true