@juangcarmona/lighthouse-sdlc 0.7.0 → 0.8.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.
@@ -0,0 +1,41 @@
1
+ ---
2
+ # Owned by @juangcarmona/lighthouse-sdlc. Compile with `gh aw compile`; do not edit the lock file.
3
+ name: Lighthouse SDLC review
4
+ description: Execute only the Lighthouse review stage and return its declared stage result.
5
+ private: true
6
+ runs-on: [self-hosted, linux, lighthouse-sdlc]
7
+ runs-on-slim: ubuntu-24.04
8
+ strict: true
9
+ env:
10
+ LIGHTHOUSE_STAGE: review
11
+ LIGHTHOUSE_SKILL: src/packages/sdlc/skills/review/SKILL.md
12
+ on:
13
+ workflow_call:
14
+ inputs:
15
+ route:
16
+ description: Lighthouse route selected by the host.
17
+ required: true
18
+ type: string
19
+ run-id:
20
+ description: Stable Lighthouse run identifier.
21
+ required: true
22
+ type: string
23
+ input:
24
+ description: Compact JSON input for this stage.
25
+ required: false
26
+ type: string
27
+ default: '{}'
28
+ previous-stage:
29
+ description: Previous stage artifact name.
30
+ required: false
31
+ type: string
32
+ default: integrate
33
+ imports:
34
+ - shared/lighthouse-sdlc-stage.md
35
+ ---
36
+
37
+ # Lighthouse SDLC review worker
38
+
39
+ Execute only `review` by following `${{ env.LIGHTHOUSE_SKILL }}` and reading the integration result from `/tmp/gh-aw/agent/previous/stage-result.json` when present; for a supervised run, use the predecessor context in `/tmp/gh-aw/agent/input.json`. Preserve ProductShape and ArcShape citations in the delivery evidence.
40
+
41
+ Classify findings, record the outcome and learning, and write one valid result to `/tmp/gh-aw/agent/stage-result.json` with `stage: review`, `gate: null`, the review record in `output`, and separate evidence arrays. Do not open another delivery gate or invoke another stage. Call `noop` exactly once after recording the closing result.
@@ -0,0 +1,176 @@
1
+ name: Lighthouse SDLC router
2
+
3
+ # This router owns the only automatic composition boundary. A normal dispatch calls exactly one
4
+ # worker. `ff` follows the selected route and stops when a worker fails; it never adds a stage.
5
+ on:
6
+ workflow_dispatch:
7
+ inputs:
8
+ route:
9
+ description: Lighthouse route from src/packages/sdlc/routes.json.
10
+ required: true
11
+ type: choice
12
+ options: [supervised, plan-only, unattended, hotfix, stacked]
13
+ stage:
14
+ description: One declared stage to run, or the first stage when composition is ff.
15
+ required: true
16
+ default: triage
17
+ type: choice
18
+ options: [triage, refine, propose, implement, integrate, review]
19
+ composition:
20
+ description: Run one stage, or explicitly compose the selected route through ff.
21
+ required: true
22
+ default: stage
23
+ type: choice
24
+ options: [stage, ff]
25
+ available:
26
+ description: Comma-separated route prerequisites already available to the host.
27
+ required: false
28
+ default: ''
29
+ type: string
30
+ run-id:
31
+ description: Stable Lighthouse run identifier; defaults to the GitHub run id.
32
+ required: false
33
+ default: ''
34
+ type: string
35
+ input:
36
+ description: Compact JSON input for the first stage.
37
+ required: false
38
+ default: '{}'
39
+ type: string
40
+
41
+ permissions:
42
+ contents: read
43
+
44
+ concurrency:
45
+ group: lighthouse-sdlc-${{ inputs.run-id || github.run_id }}
46
+ cancel-in-progress: false
47
+
48
+ jobs:
49
+ validate:
50
+ name: Validate Lighthouse route
51
+ runs-on: ubuntu-24.04
52
+ outputs:
53
+ valid: ${{ steps.route.outputs.valid }}
54
+ triage: ${{ steps.route.outputs.triage }}
55
+ refine: ${{ steps.route.outputs.refine }}
56
+ propose: ${{ steps.route.outputs.propose }}
57
+ implement: ${{ steps.route.outputs.implement }}
58
+ integrate: ${{ steps.route.outputs.integrate }}
59
+ review: ${{ steps.route.outputs.review }}
60
+ steps:
61
+ - uses: actions/checkout@v5
62
+ - name: Validate route, prerequisites and selected composition
63
+ id: route
64
+ env:
65
+ ROUTE: ${{ inputs.route }}
66
+ STAGE: ${{ inputs.stage }}
67
+ COMPOSITION: ${{ inputs.composition }}
68
+ AVAILABLE: ${{ inputs.available }}
69
+ run: |
70
+ set -euo pipefail
71
+ node src/packages/sdlc/src/sdlc.mjs route --route "$ROUTE" --available "$AVAILABLE" --format json > route.json
72
+ jq -e '.valid == true and .canRun == true' route.json >/dev/null
73
+ jq -e --arg stage "$STAGE" '.stages | index($stage) != null' route.json >/dev/null
74
+ if [ "$COMPOSITION" = ff ]; then
75
+ first_stage=$(jq -r '.stages[0]' route.json)
76
+ [ "$STAGE" = "$first_stage" ] || { echo "ff must start at $first_stage" >&2; exit 1; }
77
+ fi
78
+ echo 'valid=true' >> "$GITHUB_OUTPUT"
79
+ for stage in triage refine propose implement integrate review; do
80
+ printf '%s=%s\n' "$stage" "$(jq -r --arg stage "$stage" 'if (.stages | index($stage)) then "true" else "false" end' route.json)" >> "$GITHUB_OUTPUT"
81
+ done
82
+
83
+ call-triage:
84
+ needs: validate
85
+ if: >-
86
+ always() && needs.validate.outputs.valid == 'true' &&
87
+ ((inputs.composition == 'stage' && inputs.stage == 'triage') || inputs.composition == 'ff')
88
+ uses: ./.github/workflows/lighthouse-sdlc-triage.lock.yml
89
+ permissions: write-all # gh-aw workers request read-all; the reusable-workflow caller must satisfy it.
90
+ with:
91
+ route: ${{ inputs.route }}
92
+ run-id: ${{ inputs.run-id || github.run_id }}
93
+ input: ${{ inputs.input }}
94
+ previous-stage: ''
95
+
96
+ call-refine:
97
+ needs: [validate, call-triage]
98
+ if: >-
99
+ always() && needs.validate.outputs.valid == 'true' &&
100
+ ((inputs.composition == 'stage' && inputs.stage == 'refine') ||
101
+ (inputs.composition == 'ff' && needs.validate.outputs.refine == 'true' && needs.call-triage.result == 'success'))
102
+ uses: ./.github/workflows/lighthouse-sdlc-refine.lock.yml
103
+ permissions: write-all
104
+ with:
105
+ route: ${{ inputs.route }}
106
+ run-id: ${{ inputs.run-id || github.run_id }}
107
+ input: ${{ inputs.input }}
108
+ previous-stage: ${{ inputs.composition == 'ff' && 'triage' || '' }}
109
+
110
+ call-propose:
111
+ needs: [validate, call-triage, call-refine]
112
+ if: >-
113
+ always() && needs.validate.outputs.valid == 'true' &&
114
+ ((inputs.composition == 'stage' && inputs.stage == 'propose') ||
115
+ (inputs.composition == 'ff' && needs.validate.outputs.propose == 'true' &&
116
+ needs.call-triage.result == 'success' && needs.call-refine.result == 'success'))
117
+ uses: ./.github/workflows/lighthouse-sdlc-propose.lock.yml
118
+ permissions: write-all
119
+ with:
120
+ route: ${{ inputs.route }}
121
+ run-id: ${{ inputs.run-id || github.run_id }}
122
+ input: ${{ inputs.input }}
123
+ previous-stage: ${{ inputs.composition == 'ff' && 'refine' || '' }}
124
+
125
+ call-implement:
126
+ needs: [validate, call-triage, call-refine, call-propose]
127
+ if: >-
128
+ always() && needs.validate.outputs.valid == 'true' &&
129
+ ((inputs.composition == 'stage' && inputs.stage == 'implement') ||
130
+ (inputs.composition == 'ff' && needs.validate.outputs.implement == 'true' &&
131
+ needs.call-triage.result == 'success' &&
132
+ (needs.validate.outputs.refine != 'true' || needs.call-refine.result == 'success') &&
133
+ (needs.validate.outputs.propose != 'true' || needs.call-propose.result == 'success')))
134
+ uses: ./.github/workflows/lighthouse-sdlc-implement.lock.yml
135
+ permissions: write-all
136
+ with:
137
+ route: ${{ inputs.route }}
138
+ run-id: ${{ inputs.run-id || github.run_id }}
139
+ input: ${{ inputs.input }}
140
+ previous-stage: ${{ inputs.composition == 'ff' && 'propose' || '' }}
141
+
142
+ call-integrate:
143
+ needs: [validate, call-triage, call-refine, call-propose, call-implement]
144
+ if: >-
145
+ always() && needs.validate.outputs.valid == 'true' &&
146
+ ((inputs.composition == 'stage' && inputs.stage == 'integrate') ||
147
+ (inputs.composition == 'ff' && needs.validate.outputs.integrate == 'true' &&
148
+ needs.call-triage.result == 'success' &&
149
+ (needs.validate.outputs.refine != 'true' || needs.call-refine.result == 'success') &&
150
+ (needs.validate.outputs.propose != 'true' || needs.call-propose.result == 'success') &&
151
+ needs.call-implement.result == 'success'))
152
+ uses: ./.github/workflows/lighthouse-sdlc-integrate.lock.yml
153
+ permissions: write-all
154
+ with:
155
+ route: ${{ inputs.route }}
156
+ run-id: ${{ inputs.run-id || github.run_id }}
157
+ input: ${{ inputs.input }}
158
+ previous-stage: ${{ inputs.composition == 'ff' && 'implement' || '' }}
159
+
160
+ call-review:
161
+ needs: [validate, call-triage, call-refine, call-propose, call-implement, call-integrate]
162
+ if: >-
163
+ always() && needs.validate.outputs.valid == 'true' &&
164
+ ((inputs.composition == 'stage' && inputs.stage == 'review') ||
165
+ (inputs.composition == 'ff' && needs.validate.outputs.review == 'true' &&
166
+ needs.call-triage.result == 'success' &&
167
+ (needs.validate.outputs.refine != 'true' || needs.call-refine.result == 'success') &&
168
+ (needs.validate.outputs.propose != 'true' || needs.call-propose.result == 'success') &&
169
+ needs.call-implement.result == 'success' && needs.call-integrate.result == 'success'))
170
+ uses: ./.github/workflows/lighthouse-sdlc-review.lock.yml
171
+ permissions: write-all
172
+ with:
173
+ route: ${{ inputs.route }}
174
+ run-id: ${{ inputs.run-id || github.run_id }}
175
+ input: ${{ inputs.input }}
176
+ previous-stage: ${{ inputs.composition == 'ff' && 'integrate' || '' }}