@juangcarmona/lighthouse-sdlc 0.7.0 → 0.9.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: node_modules/@juangcarmona/lighthouse-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,181 @@
1
+ name: Lighthouse SDLC router
2
+
3
+ # This router owns the only automatic composition boundary. A normal dispatch calls exactly one
4
+ # worker. `ff` is blocked for routes with human gates until approvals can be verified.
5
+ on:
6
+ workflow_dispatch:
7
+ inputs:
8
+ route:
9
+ description: Lighthouse route from the installed SDLC package.
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
+ - uses: actions/setup-node@v5
63
+ with:
64
+ node-version: 24
65
+ - run: npm ci --ignore-scripts
66
+ - run: node node_modules/@juangcarmona/lighthouse-sdlc/src/installation.mjs
67
+ - name: Validate route, prerequisites and selected composition
68
+ id: route
69
+ env:
70
+ ROUTE: ${{ inputs.route }}
71
+ STAGE: ${{ inputs.stage }}
72
+ COMPOSITION: ${{ inputs.composition }}
73
+ AVAILABLE: ${{ inputs.available }}
74
+ run: |
75
+ set -euo pipefail
76
+ node node_modules/@juangcarmona/lighthouse-sdlc/src/sdlc.mjs route --route "$ROUTE" --available "$AVAILABLE" --composition "$COMPOSITION" --format json > route.json
77
+ jq -e '.valid == true and .canRun == true' route.json >/dev/null
78
+ jq -e --arg stage "$STAGE" '.stages | index($stage) != null' route.json >/dev/null
79
+ if [ "$COMPOSITION" = ff ]; then
80
+ first_stage=$(jq -r '.stages[0]' route.json)
81
+ [ "$STAGE" = "$first_stage" ] || { echo "ff must start at $first_stage" >&2; exit 1; }
82
+ fi
83
+ echo 'valid=true' >> "$GITHUB_OUTPUT"
84
+ for stage in triage refine propose implement integrate review; do
85
+ printf '%s=%s\n' "$stage" "$(jq -r --arg stage "$stage" 'if (.stages | index($stage)) then "true" else "false" end' route.json)" >> "$GITHUB_OUTPUT"
86
+ done
87
+
88
+ call-triage:
89
+ needs: validate
90
+ if: >-
91
+ always() && needs.validate.outputs.valid == 'true' &&
92
+ ((inputs.composition == 'stage' && inputs.stage == 'triage') || inputs.composition == 'ff')
93
+ uses: ./.github/workflows/lighthouse-sdlc-triage.lock.yml
94
+ permissions: write-all # gh-aw workers request read-all; the reusable-workflow caller must satisfy it.
95
+ with:
96
+ route: ${{ inputs.route }}
97
+ run-id: ${{ inputs.run-id || github.run_id }}
98
+ input: ${{ inputs.input }}
99
+ previous-stage: ''
100
+
101
+ call-refine:
102
+ needs: [validate, call-triage]
103
+ if: >-
104
+ always() && needs.validate.outputs.valid == 'true' &&
105
+ ((inputs.composition == 'stage' && inputs.stage == 'refine') ||
106
+ (inputs.composition == 'ff' && needs.validate.outputs.refine == 'true' && needs.call-triage.result == 'success'))
107
+ uses: ./.github/workflows/lighthouse-sdlc-refine.lock.yml
108
+ permissions: write-all
109
+ with:
110
+ route: ${{ inputs.route }}
111
+ run-id: ${{ inputs.run-id || github.run_id }}
112
+ input: ${{ inputs.input }}
113
+ previous-stage: ${{ inputs.composition == 'ff' && 'triage' || '' }}
114
+
115
+ call-propose:
116
+ needs: [validate, call-triage, call-refine]
117
+ if: >-
118
+ always() && needs.validate.outputs.valid == 'true' &&
119
+ ((inputs.composition == 'stage' && inputs.stage == 'propose') ||
120
+ (inputs.composition == 'ff' && needs.validate.outputs.propose == 'true' &&
121
+ needs.call-triage.result == 'success' && needs.call-refine.result == 'success'))
122
+ uses: ./.github/workflows/lighthouse-sdlc-propose.lock.yml
123
+ permissions: write-all
124
+ with:
125
+ route: ${{ inputs.route }}
126
+ run-id: ${{ inputs.run-id || github.run_id }}
127
+ input: ${{ inputs.input }}
128
+ previous-stage: ${{ inputs.composition == 'ff' && 'refine' || '' }}
129
+
130
+ call-implement:
131
+ needs: [validate, call-triage, call-refine, call-propose]
132
+ if: >-
133
+ always() && needs.validate.outputs.valid == 'true' &&
134
+ ((inputs.composition == 'stage' && inputs.stage == 'implement') ||
135
+ (inputs.composition == 'ff' && needs.validate.outputs.implement == 'true' &&
136
+ needs.call-triage.result == 'success' &&
137
+ (needs.validate.outputs.refine != 'true' || needs.call-refine.result == 'success') &&
138
+ (needs.validate.outputs.propose != 'true' || needs.call-propose.result == 'success')))
139
+ uses: ./.github/workflows/lighthouse-sdlc-implement.lock.yml
140
+ permissions: write-all
141
+ with:
142
+ route: ${{ inputs.route }}
143
+ run-id: ${{ inputs.run-id || github.run_id }}
144
+ input: ${{ inputs.input }}
145
+ previous-stage: ${{ inputs.composition == 'ff' && 'propose' || '' }}
146
+
147
+ call-integrate:
148
+ needs: [validate, call-triage, call-refine, call-propose, call-implement]
149
+ if: >-
150
+ always() && needs.validate.outputs.valid == 'true' &&
151
+ ((inputs.composition == 'stage' && inputs.stage == 'integrate') ||
152
+ (inputs.composition == 'ff' && needs.validate.outputs.integrate == 'true' &&
153
+ needs.call-triage.result == 'success' &&
154
+ (needs.validate.outputs.refine != 'true' || needs.call-refine.result == 'success') &&
155
+ (needs.validate.outputs.propose != 'true' || needs.call-propose.result == 'success') &&
156
+ needs.call-implement.result == 'success'))
157
+ uses: ./.github/workflows/lighthouse-sdlc-integrate.lock.yml
158
+ permissions: write-all
159
+ with:
160
+ route: ${{ inputs.route }}
161
+ run-id: ${{ inputs.run-id || github.run_id }}
162
+ input: ${{ inputs.input }}
163
+ previous-stage: ${{ inputs.composition == 'ff' && 'implement' || '' }}
164
+
165
+ call-review:
166
+ needs: [validate, call-triage, call-refine, call-propose, call-implement, call-integrate]
167
+ if: >-
168
+ always() && needs.validate.outputs.valid == 'true' &&
169
+ ((inputs.composition == 'stage' && inputs.stage == 'review') ||
170
+ (inputs.composition == 'ff' && needs.validate.outputs.review == 'true' &&
171
+ needs.call-triage.result == 'success' &&
172
+ (needs.validate.outputs.refine != 'true' || needs.call-refine.result == 'success') &&
173
+ (needs.validate.outputs.propose != 'true' || needs.call-propose.result == 'success') &&
174
+ needs.call-implement.result == 'success' && needs.call-integrate.result == 'success'))
175
+ uses: ./.github/workflows/lighthouse-sdlc-review.lock.yml
176
+ permissions: write-all
177
+ with:
178
+ route: ${{ inputs.route }}
179
+ run-id: ${{ inputs.run-id || github.run_id }}
180
+ input: ${{ inputs.input }}
181
+ previous-stage: ${{ inputs.composition == 'ff' && 'integrate' || '' }}