@juangcarmona/lighthouse-sdlc 0.17.1 → 0.18.1

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.
Files changed (61) hide show
  1. package/README.md +15 -3
  2. package/capabilities.json +2 -1
  3. package/epic-delivery.md +35 -0
  4. package/github-actions.md +21 -3
  5. package/host-contract.md +2 -0
  6. package/package.json +4 -1
  7. package/schemas/product-change.schema.json +23 -4
  8. package/schemas/stage-result.schema.json +23 -1
  9. package/skills/product-change/SKILL.md +3 -3
  10. package/skills/refine/SKILL.md +3 -2
  11. package/src/completion-actions.mjs +49 -12
  12. package/src/completion.mjs +1 -1
  13. package/src/contracts.mjs +10 -0
  14. package/src/decompose.mjs +5 -2
  15. package/src/epic-dispatch.mjs +59 -0
  16. package/src/epic-github.mjs +111 -0
  17. package/src/epic-journal.mjs +104 -0
  18. package/src/epic-merge.mjs +91 -0
  19. package/src/epic-native.mjs +465 -0
  20. package/src/epic.mjs +86 -0
  21. package/src/handoff.mjs +97 -0
  22. package/src/host-contract.mjs +22 -6
  23. package/src/implementation.mjs +33 -5
  24. package/src/install-workflows.mjs +1 -1
  25. package/src/issue-actions.mjs +368 -78
  26. package/src/opencode-execute.mjs +20 -0
  27. package/src/pr-state-actions.mjs +21 -7
  28. package/src/pr-state.mjs +18 -1
  29. package/src/product-change-actions.mjs +158 -46
  30. package/src/product-change.mjs +92 -11
  31. package/src/proposal-review.mjs +16 -6
  32. package/src/proposal.mjs +13 -1
  33. package/src/stacked.mjs +14 -3
  34. package/src/stage-dispatch.mjs +66 -19
  35. package/src/stage-transition.mjs +151 -2
  36. package/src/triage.mjs +4 -2
  37. package/src/unattended-actions.mjs +39 -12
  38. package/src/unattended.mjs +1 -1
  39. package/src/worker-maintenance.mjs +15 -3
  40. package/src/worker-recovery.mjs +209 -8
  41. package/workflows/lighthouse-sdlc-apply-product-change.lock.yml +97 -11
  42. package/workflows/lighthouse-sdlc-apply-product-change.md +75 -6
  43. package/workflows/lighthouse-sdlc-apply-review.lock.yml +33 -2
  44. package/workflows/lighthouse-sdlc-apply-review.md +29 -1
  45. package/workflows/lighthouse-sdlc-epic.yml +79 -0
  46. package/workflows/lighthouse-sdlc-implement.lock.yml +38 -2
  47. package/workflows/lighthouse-sdlc-implement.md +33 -2
  48. package/workflows/lighthouse-sdlc-integrate.lock.yml +4 -1
  49. package/workflows/lighthouse-sdlc-integrate.md +3 -0
  50. package/workflows/lighthouse-sdlc-product-change.lock.yml +39 -4
  51. package/workflows/lighthouse-sdlc-product-change.md +39 -6
  52. package/workflows/lighthouse-sdlc-propose.lock.yml +13 -1
  53. package/workflows/lighthouse-sdlc-propose.md +11 -1
  54. package/workflows/lighthouse-sdlc-refine.lock.yml +29 -2
  55. package/workflows/lighthouse-sdlc-refine.md +25 -2
  56. package/workflows/lighthouse-sdlc-review.lock.yml +4 -1
  57. package/workflows/lighthouse-sdlc-review.md +3 -0
  58. package/workflows/lighthouse-sdlc-router.yml +47 -3
  59. package/workflows/lighthouse-sdlc-triage.lock.yml +30 -3
  60. package/workflows/lighthouse-sdlc-triage.md +26 -3
  61. package/workflows/lighthouse-worker-maintenance.yml +70 -1
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2ef374e6036e86ca382e1352ebbbe6367c0836d172b705f4fe450d24ad7921f7","body_hash":"b6819b09222b408b8140fdc320e7270d45149ccb70442e528ef4f0ffa86e985c","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
1
+ # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"00b2d57d1b7519c4eeb8f10176673c2f626856b7050d2c6f41377d67866ba7b0","body_hash":"b6819b09222b408b8140fdc320e7270d45149ccb70442e528ef4f0ffa86e985c","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
2
2
  # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/checkout","sha":"fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09","version":"v5"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"949feb2413d6458794dcd2491c4babbbce0c15c1","version":"v7.1.0"},{"repo":"actions/setup-node","sha":"a0853c24544627f65ddf259abe73b1d18a591444","version":"v5"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"d9128eb3ea40c18b77c76184eda03c0ff2608d79","version":"v0.93.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382","pinned_image":"ghcr.io/github/gh-aw-node@sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382"}],"mcp_servers":[{"name":"safeoutputs","tools":["noop"]}],"threat_detection":{"mode":"disabled"},"admission":false}
3
3
  # This file was automatically generated by gh-aw (v0.93.2). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
4
4
  #
@@ -69,6 +69,10 @@ on:
69
69
  description: Authenticated owner admission receipt
70
70
  required: true
71
71
  type: string
72
+ epic-parent:
73
+ description: Authenticated parent issue for shared epic serialization
74
+ required: false
75
+ type: string
72
76
  issue:
73
77
  description: Source issue
74
78
  required: true
@@ -79,7 +83,7 @@ permissions: {}
79
83
 
80
84
  concurrency:
81
85
  cancel-in-progress: false
82
- group: lighthouse-issue-${{ inputs.issue }}
86
+ group: ${{ inputs.epic-parent && format('lighthouse-epic-child-{0}', inputs.issue) || format('lighthouse-issue-{0}', inputs.issue) }}
83
87
  queue: max
84
88
 
85
89
  run-name: "triage #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
@@ -1221,6 +1225,12 @@ jobs:
1221
1225
  actions: read
1222
1226
  contents: read
1223
1227
  issues: write
1228
+ pull-requests: read
1229
+ concurrency:
1230
+ cancel-in-progress: false
1231
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-prepare-{0}', github.run_id) }}
1232
+ queue: max
1233
+
1224
1234
  env:
1225
1235
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
1226
1236
  outputs:
@@ -1262,19 +1272,28 @@ jobs:
1262
1272
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1263
1273
  env:
1264
1274
  GH_TOKEN: ${{ github.token }}
1275
+ LIGHTHOUSE_PREPARE_FAILED: "true"
1265
1276
 
1266
1277
  publish:
1267
1278
  name: Validate, publish and release
1268
1279
  needs:
1280
+ - activation
1269
1281
  - agent
1282
+ - pre_activation
1270
1283
  - prepare
1271
1284
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
1272
1285
  runs-on: ubuntu-24.04
1273
1286
  # Permissions for the publish job (workflow permissions default to none).
1274
1287
  permissions:
1275
- actions: read
1288
+ actions: write
1276
1289
  contents: read
1277
1290
  issues: write
1291
+ pull-requests: read
1292
+ concurrency:
1293
+ cancel-in-progress: false
1294
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-publish-{0}', github.run_id) }}
1295
+ queue: max
1296
+
1278
1297
  env:
1279
1298
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
1280
1299
  steps:
@@ -1319,3 +1338,11 @@ jobs:
1319
1338
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1320
1339
  env:
1321
1340
  GH_TOKEN: ${{ github.token }}
1341
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
1342
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
1343
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
1344
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
1345
+ - name: Request the verified product prerequisite
1346
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
1347
+ env:
1348
+ GH_TOKEN: ${{ github.token }}
@@ -4,7 +4,7 @@ name: triage
4
4
  description: Assess an owner-admitted request without starting refinement.
5
5
  run-name: "triage #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
6
6
  concurrency:
7
- group: lighthouse-issue-${{ inputs.issue }}
7
+ group: ${{ inputs.epic-parent && format('lighthouse-epic-child-{0}', inputs.issue) || format('lighthouse-issue-{0}', inputs.issue) }}
8
8
  cancel-in-progress: false
9
9
  queue: max
10
10
  job-discriminator: ${{ github.run_id }}
@@ -20,6 +20,10 @@ on:
20
20
  description: Authenticated owner admission receipt
21
21
  required: true
22
22
  type: string
23
+ epic-parent:
24
+ description: Authenticated parent issue for shared epic serialization
25
+ required: false
26
+ type: string
23
27
  needs: [prepare]
24
28
  if: needs.prepare.outputs.eligible == 'true'
25
29
  runs-on: [self-hosted, linux, lighthouse-workflow]
@@ -96,6 +100,10 @@ post-steps:
96
100
  retention-days: 14
97
101
  jobs:
98
102
  prepare:
103
+ concurrency:
104
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-prepare-{0}', github.run_id) }}
105
+ cancel-in-progress: false
106
+ queue: max
99
107
  name: Authorize and reserve issue
100
108
  runs-on: ubuntu-24.04
101
109
  outputs:
@@ -105,6 +113,7 @@ jobs:
105
113
  actions: read
106
114
  contents: read
107
115
  issues: write
116
+ pull-requests: read
108
117
  env:
109
118
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
110
119
  steps:
@@ -133,16 +142,22 @@ jobs:
133
142
  if: failure()
134
143
  env:
135
144
  GH_TOKEN: ${{ github.token }}
145
+ LIGHTHOUSE_PREPARE_FAILED: "true"
136
146
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
137
147
  publish:
148
+ concurrency:
149
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-publish-{0}', github.run_id) }}
150
+ cancel-in-progress: false
151
+ queue: max
138
152
  name: Validate, publish and release
139
- needs: [prepare, agent]
153
+ needs: [prepare, pre_activation, activation, agent]
140
154
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
141
155
  runs-on: ubuntu-24.04
142
156
  permissions:
143
- actions: read
157
+ actions: write
144
158
  contents: read
145
159
  issues: write
160
+ pull-requests: read
146
161
  env:
147
162
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
148
163
  steps:
@@ -177,7 +192,15 @@ jobs:
177
192
  if: always()
178
193
  env:
179
194
  GH_TOKEN: ${{ github.token }}
195
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
196
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
197
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
198
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
180
199
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
200
+ - name: Request the verified product prerequisite
201
+ env:
202
+ GH_TOKEN: ${{ github.token }}
203
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
181
204
  ---
182
205
 
183
206
  # Triage the admitted request
@@ -36,6 +36,43 @@ jobs:
36
36
  env:
37
37
  GH_TOKEN: ${{ github.token }}
38
38
  run: node src/packages/sdlc/src/worker-maintenance.mjs scan
39
+ observe:
40
+ needs: scan
41
+ if: needs.scan.outputs.issues != '[]'
42
+ strategy:
43
+ fail-fast: false
44
+ max-parallel: 5
45
+ matrix:
46
+ issue: ${{ fromJSON(needs.scan.outputs.issues) }}
47
+ runs-on: ubuntu-24.04
48
+ permissions:
49
+ contents: read
50
+ actions: read
51
+ issues: read
52
+ pull-requests: read
53
+ env:
54
+ LIGHTHOUSE_ISSUE: ${{ matrix.issue }}
55
+ steps:
56
+ - uses: actions/checkout@v5
57
+ with:
58
+ repository: juangcarmona/lighthouse
59
+ ref: __LIGHTHOUSE_REF__
60
+ persist-credentials: false
61
+ - uses: actions/setup-node@v5
62
+ with:
63
+ node-version: 24
64
+ - name: Observe workers without changing issue state
65
+ env:
66
+ GH_TOKEN: ${{ github.token }}
67
+ run: node src/packages/sdlc/src/worker-maintenance.mjs observe
68
+ - name: Preserve observations
69
+ if: always()
70
+ uses: actions/upload-artifact@v7
71
+ with:
72
+ name: lighthouse-observation-${{ matrix.issue }}
73
+ path: ${{ runner.temp }}/lighthouse-maintenance-${{ github.run_id }}-${{ matrix.issue }}/observations.json
74
+ retention-days: 14
75
+ if-no-files-found: error
39
76
  reconcile:
40
77
  needs: scan
41
78
  if: needs.scan.outputs.issues != '[]'
@@ -45,7 +82,7 @@ jobs:
45
82
  matrix:
46
83
  issue: ${{ fromJSON(needs.scan.outputs.issues) }}
47
84
  concurrency:
48
- group: lighthouse-dispatch-${{ matrix.issue }}
85
+ group: lighthouse-issue-${{ matrix.issue }}
49
86
  cancel-in-progress: false
50
87
  queue: max
51
88
  runs-on: ubuntu-24.04
@@ -124,3 +161,35 @@ jobs:
124
161
  env:
125
162
  GH_TOKEN: ${{ github.token }}
126
163
  run: node src/packages/sdlc/src/worker-maintenance.mjs report
164
+ report-stalled:
165
+ needs: [scan, observe]
166
+ if: always() && needs.scan.result == 'success' && needs.scan.outputs.issues != '[]' && vars.LIGHTHOUSE_REPORT_INDEX_ISSUE != ''
167
+ concurrency:
168
+ group: lighthouse-worker-reports
169
+ cancel-in-progress: false
170
+ queue: max
171
+ runs-on: ubuntu-24.04
172
+ permissions:
173
+ contents: read
174
+ actions: read
175
+ issues: write
176
+ env:
177
+ LIGHTHOUSE_REPORT_INDEX_ISSUE: ${{ vars.LIGHTHOUSE_REPORT_INDEX_ISSUE }}
178
+ LIGHTHOUSE_OBSERVED_ISSUES: ${{ needs.scan.outputs.issues }}
179
+ steps:
180
+ - uses: actions/checkout@v5
181
+ with:
182
+ repository: juangcarmona/lighthouse
183
+ ref: __LIGHTHOUSE_REF__
184
+ persist-credentials: false
185
+ - uses: actions/setup-node@v5
186
+ with:
187
+ node-version: 24
188
+ - uses: actions/download-artifact@v8
189
+ with:
190
+ pattern: lighthouse-observation-*
191
+ path: ${{ runner.temp }}/worker-observations
192
+ - name: Reconcile and update worker error reports
193
+ env:
194
+ GH_TOKEN: ${{ github.token }}
195
+ run: node src/packages/sdlc/src/worker-maintenance.mjs report