@juangcarmona/lighthouse-sdlc 0.11.0 → 0.13.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.
Files changed (34) hide show
  1. package/README.md +45 -9
  2. package/completion.md +48 -0
  3. package/host-contract.md +2 -0
  4. package/package.json +2 -1
  5. package/skills/integrate/SKILL.md +7 -1
  6. package/skills/propose/SKILL.md +1 -1
  7. package/skills/refine/SKILL.md +1 -1
  8. package/skills/review/SKILL.md +7 -1
  9. package/src/completion-actions.mjs +114 -0
  10. package/src/completion.mjs +169 -0
  11. package/src/github-profile.mjs +9 -1
  12. package/src/host-contract.mjs +8 -4
  13. package/src/implementation-runtime.mjs +66 -0
  14. package/src/implementation.mjs +143 -0
  15. package/src/install-workflows.mjs +30 -0
  16. package/src/integration-evidence.mjs +56 -0
  17. package/src/issue-actions.mjs +189 -0
  18. package/src/observe-protection.mjs +24 -0
  19. package/src/opencode-execute.mjs +188 -0
  20. package/src/opencode-progress.mjs +48 -0
  21. package/src/process-publication.mjs +90 -0
  22. package/src/proposal.mjs +96 -0
  23. package/workflows/lighthouse-sdlc-implement.lock.yml +251 -1085
  24. package/workflows/lighthouse-sdlc-implement.md +165 -29
  25. package/workflows/lighthouse-sdlc-integrate.lock.yml +257 -1076
  26. package/workflows/lighthouse-sdlc-integrate.md +175 -29
  27. package/workflows/lighthouse-sdlc-propose.lock.yml +241 -1085
  28. package/workflows/lighthouse-sdlc-propose.md +155 -29
  29. package/workflows/lighthouse-sdlc-refine.lock.yml +239 -1085
  30. package/workflows/lighthouse-sdlc-refine.md +151 -29
  31. package/workflows/lighthouse-sdlc-review.lock.yml +257 -1076
  32. package/workflows/lighthouse-sdlc-review.md +175 -29
  33. package/workflows/lighthouse-sdlc-router.yml +84 -145
  34. package/workflows/shared/lighthouse-opencode.md +22 -0
@@ -1,41 +1,187 @@
1
1
  ---
2
- # Owned by @juangcarmona/lighthouse-sdlc. Compile with `gh aw compile`; do not edit the lock file.
2
+ # Owned by lighthouse-sdlc. Regenerate the lock with gh aw v0.93.2.
3
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
4
+ description: Assess review with OpenCode and retain a verified delivery record.
12
5
  on:
13
6
  workflow_call:
14
7
  inputs:
15
- route:
16
- description: Lighthouse route selected by the host.
8
+ issue:
17
9
  required: true
18
10
  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
11
+ needs: [prepare]
12
+ runs-on: [self-hosted, linux, lighthouse-workflow]
13
+ runs-on-slim: ubuntu-24.04
14
+ timeout-minutes: 15
15
+ env:
16
+ LIGHTHOUSE_STAGE: review
17
+ permissions:
18
+ contents: read
19
+ engine:
20
+ id: opencode
21
+ command: node
33
22
  imports:
34
- - shared/lighthouse-sdlc-stage.md
23
+ - shared/lighthouse-opencode.md
24
+ # Subscription authentication runs inside the operator's Docker engine sandbox.
25
+ # This profile does not claim AWF network isolation or API-proxy credential isolation.
26
+ strict: false
27
+ features:
28
+ dangerously-disable-sandbox-agent: true
29
+ sandbox:
30
+ agent: false
31
+ tools:
32
+ github: false
33
+ safe-outputs:
34
+ create-issue: false
35
+ report-incomplete: false
36
+ threat-detection: false
37
+ report-failure-as-issue: false
38
+ report-missing-tool: false
39
+ report-missing-data: false
40
+ noop:
41
+ report-as-issue: false
42
+ network:
43
+ allowed: []
44
+ steps:
45
+ - name: Check out the authorized product revision
46
+ uses: actions/checkout@v5
47
+ with:
48
+ ref: ${{ needs.prepare.outputs.revision }}
49
+ persist-credentials: false
50
+ - name: Load the pinned harness package
51
+ uses: actions/checkout@v5
52
+ with:
53
+ repository: juangcarmona/lighthouse
54
+ ref: __LIGHTHOUSE_REF__
55
+ path: tools
56
+ persist-credentials: false
57
+ - name: Load the authorized issue context
58
+ uses: actions/download-artifact@v8
59
+ with:
60
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
61
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
62
+ post-steps:
63
+ - name: Validate the Lighthouse result
64
+ run: node tools/src/packages/sdlc/src/completion-actions.mjs validate
65
+ - name: Preserve the result and runtime receipt
66
+ if: always()
67
+ uses: actions/upload-artifact@v7
68
+ with:
69
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
70
+ path: |
71
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/envelope.json
72
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/runtime.json
73
+ if-no-files-found: error
74
+ retention-days: 14
75
+ - name: Preserve OpenCode diagnostic events
76
+ if: always()
77
+ uses: actions/upload-artifact@v7
78
+ with:
79
+ name: opencode-events-${{ inputs.issue }}-${{ github.run_attempt }}
80
+ path: ${{ runner.temp }}/gh-aw/opencode-events-${{ github.run_id }}-${{ github.run_attempt }}.jsonl
81
+ if-no-files-found: ignore
82
+ retention-days: 14
83
+ jobs:
84
+ prepare:
85
+ outputs:
86
+ revision: ${{ steps.prepare.outputs.revision }}
87
+ name: Verify accepted commit, checks and evidence protection
88
+ runs-on: ubuntu-24.04
89
+ permissions:
90
+ actions: read
91
+ checks: read
92
+ contents: read
93
+ pull-requests: read
94
+ issues: write
95
+ env:
96
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
97
+ steps:
98
+ - uses: actions/checkout@v5
99
+ with:
100
+ repository: juangcarmona/lighthouse
101
+ ref: __LIGHTHOUSE_REF__
102
+ persist-credentials: false
103
+ - uses: actions/setup-node@v5
104
+ with:
105
+ node-version: 24
106
+ - name: Collect verified owner intent and reserve the issue
107
+ id: prepare
108
+ env:
109
+ GH_TOKEN: ${{ github.token }}
110
+ run: node src/packages/sdlc/src/completion-actions.mjs prepare
111
+ - name: Preserve the execution request
112
+ uses: actions/upload-artifact@v7
113
+ with:
114
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
115
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/
116
+ if-no-files-found: error
117
+ retention-days: 14
118
+ - name: Release reservation if preparation failed
119
+ if: failure()
120
+ env:
121
+ GH_TOKEN: ${{ github.token }}
122
+ run: node src/packages/sdlc/src/completion-actions.mjs cleanup
123
+ publish:
124
+ concurrency:
125
+ group: lighthouse-process-publication
126
+ cancel-in-progress: false
127
+ name: Validate, publish and release
128
+ needs: [prepare, agent]
129
+ if: always() && needs.prepare.result == 'success'
130
+ runs-on: ubuntu-24.04
131
+ permissions:
132
+ actions: write
133
+ checks: read
134
+ contents: write
135
+ pull-requests: write
136
+ issues: write
137
+ env:
138
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
139
+ steps:
140
+ - uses: actions/checkout@v5
141
+ with:
142
+ repository: juangcarmona/lighthouse
143
+ ref: __LIGHTHOUSE_REF__
144
+ persist-credentials: false
145
+ - uses: actions/setup-node@v5
146
+ with:
147
+ node-version: 24
148
+ - name: Load the execution request
149
+ uses: actions/download-artifact@v8
150
+ with:
151
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
152
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
153
+ - name: Load the candidate result
154
+ if: needs.agent.result == 'success'
155
+ uses: actions/download-artifact@v8
156
+ with:
157
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
158
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
159
+ - name: Recheck authority and publish the validated result
160
+ if: needs.agent.result == 'success'
161
+ env:
162
+ GH_TOKEN: ${{ github.token }}
163
+ run: node src/packages/sdlc/src/completion-actions.mjs publish
164
+ - name: Preserve merge and publication receipts
165
+ if: always()
166
+ uses: actions/upload-artifact@v7
167
+ with:
168
+ name: lighthouse-completion-${{ inputs.issue }}-${{ github.run_attempt }}
169
+ path: |
170
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/integration-receipt.json
171
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/publication-receipt.json
172
+ if-no-files-found: warn
173
+ retention-days: 30
174
+ - name: Release the issue reservation
175
+ if: always()
176
+ env:
177
+ GH_TOKEN: ${{ github.token }}
178
+ run: node src/packages/sdlc/src/completion-actions.mjs cleanup
35
179
  ---
36
180
 
37
- # Lighthouse SDLC review worker
181
+ # Review the accepted delivery
182
+
183
+ Follow `/harness/skills/review/SKILL.md` using `/input/context.json`. The host supplies the accepted PR revision, intent and policy fingerprints, changed paths and authenticated GitHub check results. Source under `/workspace` is read-only. Inspect affected guidance and acceptance evidence; a green check alone does not establish intended behavior. Distinguish missing verification from a failed check.
38
184
 
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.
185
+ Explain each decision and finding in public progress messages. Write `/output/envelope.json` with the supplied identity. Return `blocked` for unresolved current-stage evidence or decisions. For review, include `output.retrospective` as concise Markdown: what went well, what went wrong, start doing, stop doing and improvement candidates with evidence and an owner. Do not infer recurrence from retries of a single issue. Separate actual source defects from process gaps; proposed guards need their own review and regression proof.
40
186
 
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.
187
+ The publisher rechecks current authority, GitHub checks and reservation. Only an explicit owner dispatch with `merge: true` can authorize integration, and GitHub still enforces merge rules. A passed assessment never proves a merge occurred. Review records learning without changing permissions, opening issues or starting another stage. The host validates the envelope and records the gh-aw completion signal.
@@ -1,181 +1,120 @@
1
+ # Optional GitHub-native stage adapter; source owned by lighthouse-sdlc.
1
2
  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.
3
+ run-name: "${{ inputs.stage || github.event.label.name || 'refine' }} #${{ github.event.issue.number || inputs.issue }} · ${{ github.actor }}"
5
4
  on:
5
+ issues:
6
+ types: [labeled]
7
+ issue_comment:
8
+ types: [created]
6
9
  workflow_dispatch:
7
10
  inputs:
8
- route:
9
- description: Lighthouse route from the installed SDLC package.
11
+ issue:
12
+ description: Work item to process
10
13
  required: true
11
- type: choice
12
- options: [supervised, plan-only, unattended, hotfix, stacked]
14
+ type: string
13
15
  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.
16
+ description: Authorized lifecycle stage
21
17
  required: true
22
- default: stage
18
+ default: refine
23
19
  type: choice
24
- options: [stage, ff]
25
- available:
26
- description: Comma-separated route prerequisites already available to the host.
20
+ options: [refine, propose, implement, integrate, review]
21
+ pull_request:
22
+ description: PR number for integrate or review
27
23
  required: false
28
- default: ''
29
24
  type: string
30
- run-id:
31
- description: Stable Lighthouse run identifier; defaults to the GitHub run id.
25
+ head:
26
+ description: Full accepted PR head SHA for integrate or review
32
27
  required: false
33
- default: ''
34
28
  type: string
35
- input:
36
- description: Compact JSON input for the first stage.
29
+ merge:
30
+ description: Explicitly authorize integrating this accepted PR head
37
31
  required: false
38
- default: '{}'
39
- type: string
40
-
32
+ default: false
33
+ type: boolean
41
34
  permissions:
42
35
  contents: read
43
-
44
36
  concurrency:
45
- group: lighthouse-sdlc-${{ inputs.run-id || github.run_id }}
37
+ group: lighthouse-issue-${{ github.event.issue.number || inputs.issue }}
46
38
  cancel-in-progress: false
47
-
48
39
  jobs:
49
- validate:
50
- name: Validate Lighthouse route
40
+ route:
41
+ if: >-
42
+ vars.LIGHTHOUSE_AUTOMATION_ENABLED == 'true' &&
43
+ github.actor == github.repository_owner &&
44
+ !github.event.issue.pull_request &&
45
+ (github.event_name == 'workflow_dispatch' ||
46
+ (github.event_name == 'issues' && (github.event.label.name == 'refine' || github.event.label.name == 'propose' || github.event.label.name == 'implement')) ||
47
+ (github.event_name == 'issue_comment' && contains(github.event.issue.labels.*.name, 'needs-info')))
51
48
  runs-on: ubuntu-24.04
52
49
  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 }}
50
+ run: ${{ steps.route.outputs.run }}
51
+ issue: ${{ steps.route.outputs.issue }}
52
+ stage: ${{ steps.route.outputs.stage }}
60
53
  steps:
61
54
  - uses: actions/checkout@v5
55
+ with:
56
+ repository: juangcarmona/lighthouse
57
+ ref: __LIGHTHOUSE_REF__
58
+ persist-credentials: false
62
59
  - uses: actions/setup-node@v5
63
60
  with:
64
61
  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
62
+ - name: Route the authorized event
68
63
  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'))
64
+ run: node src/packages/sdlc/src/issue-actions.mjs route
65
+ refine:
66
+ needs: route
67
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'refine'
68
+ permissions:
69
+ actions: read
70
+ contents: read
71
+ issues: write
107
72
  uses: ./.github/workflows/lighthouse-sdlc-refine.lock.yml
108
- permissions: write-all
109
73
  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'))
74
+ issue: ${{ needs.route.outputs.issue }}
75
+ propose:
76
+ needs: route
77
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'propose'
78
+ permissions:
79
+ actions: read
80
+ contents: write
81
+ issues: write
82
+ pull-requests: write
122
83
  uses: ./.github/workflows/lighthouse-sdlc-propose.lock.yml
123
- permissions: write-all
124
84
  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')))
85
+ issue: ${{ needs.route.outputs.issue }}
86
+ implement:
87
+ needs: route
88
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'implement'
89
+ permissions:
90
+ actions: read
91
+ contents: write
92
+ issues: write
93
+ pull-requests: write
139
94
  uses: ./.github/workflows/lighthouse-sdlc-implement.lock.yml
140
- permissions: write-all
141
95
  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'))
96
+ issue: ${{ needs.route.outputs.issue }}
97
+ integrate:
98
+ needs: route
99
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'integrate'
100
+ permissions:
101
+ actions: write
102
+ checks: read
103
+ contents: write
104
+ issues: write
105
+ pull-requests: write
157
106
  uses: ./.github/workflows/lighthouse-sdlc-integrate.lock.yml
158
- permissions: write-all
159
107
  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'))
108
+ issue: ${{ needs.route.outputs.issue }}
109
+ review:
110
+ needs: route
111
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'review'
112
+ permissions:
113
+ actions: write
114
+ checks: read
115
+ contents: write
116
+ issues: write
117
+ pull-requests: write
175
118
  uses: ./.github/workflows/lighthouse-sdlc-review.lock.yml
176
- permissions: write-all
177
119
  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' || '' }}
120
+ issue: ${{ needs.route.outputs.issue }}
@@ -0,0 +1,22 @@
1
+ ---
2
+ engine:
3
+ id: opencode
4
+ runtime-id: opencode
5
+ version: "2.1.0"
6
+ display-name: OpenCode
7
+ description: OpenCode in an operator-provisioned Docker sandbox
8
+ behaviors:
9
+ capabilities:
10
+ tools-allowlist: true
11
+ execution:
12
+ command-name: node
13
+ args: [tools/src/packages/sdlc/src/opencode-execute.mjs]
14
+ step-name: OpenCode progress and result
15
+ write-timestamp: true
16
+ log-parser: |
17
+ function parseLog(logContent) {
18
+ const fs = require("fs");
19
+ const events = require("path").join(process.env.RUNNER_TEMP, "gh-aw", `opencode-events-${process.env.GITHUB_RUN_ID}-${process.env.GITHUB_RUN_ATTEMPT}.jsonl`);
20
+ return require("./parse_opencode_log.cjs").parseOpenCodeLog(fs.existsSync(events) ? fs.readFileSync(events, "utf8") : logContent);
21
+ }
22
+ ---