@codyswann/lisa 2.294.0 → 2.295.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.
- package/cdk/create-only/.github/workflows/deploy.yml +19 -0
- package/dist/core/upstream-evidence-manifest.js +6 -6
- package/expo/create-only/.github/workflows/deploy.yml +13 -0
- package/harper-fabric/create-only/.github/workflows/deploy.yml +5 -0
- package/nestjs/create-only/.github/workflows/deploy.yml +14 -0
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/rails/create-only/.github/workflows/deploy.yml +5 -0
- package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +28 -0
|
@@ -91,3 +91,22 @@ jobs:
|
|
|
91
91
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
|
92
92
|
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
|
93
93
|
# Trigger staging deployment after CDK trust fix
|
|
94
|
+
#
|
|
95
|
+
# DSS-3 (deploy-status-sync substrate): this template ships NO deploy job —
|
|
96
|
+
# CDK deploys are project-owned. When you add your deploy job, declare the
|
|
97
|
+
# GitHub environment on it so deploy runs emit deployment/deployment_status
|
|
98
|
+
# events with the resolved friendly name (dev/staging/production).
|
|
99
|
+
# The snippet is indented to drop in under this file's `jobs:` key as-is:
|
|
100
|
+
#
|
|
101
|
+
# deploy:
|
|
102
|
+
# needs: [determine_environment, release]
|
|
103
|
+
# runs-on: ubuntu-latest
|
|
104
|
+
# # Mitigation A (double-approval): this job needs: release, which carries
|
|
105
|
+
# # the protected approval env; on approval-gated runs route the deploy job
|
|
106
|
+
# # to `<env>-deploy` (leave it unprotected) so the gate fires once at
|
|
107
|
+
# # release_approval, not again here. The suffix keeps the
|
|
108
|
+
# # dev/staging/production substring for GitHub-for-Jira classification.
|
|
109
|
+
# environment: ${{ needs.determine_environment.outputs.require_approval == 'true' && format('{0}-deploy', needs.determine_environment.outputs.approval_environment) || needs.determine_environment.outputs.approval_environment }}
|
|
110
|
+
# steps:
|
|
111
|
+
# - uses: actions/checkout@v6
|
|
112
|
+
# - run: npx cdk deploy --all --require-approval never
|
|
@@ -23,7 +23,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
23
23
|
"cdk/copy-overwrite/vitest.cdk.ts": "aea238d214b7eb4c532cebe5bf732dc30b9fd04d938a215bd34a5ec2eff17046",
|
|
24
24
|
"cdk/copy-overwrite/vitest.config.ts": "ce14179d4ab31011bb012ee1669af7d86b5189bdf2934e0bd9dd666a30e3d01e",
|
|
25
25
|
"cdk/create-only/.github/workflows/ci.yml": "04cca8fbcb7a5c6da1aeb2b2d00d7a328d15618e4252f1d9dd495052d264d0f5",
|
|
26
|
-
"cdk/create-only/.github/workflows/deploy.yml": "
|
|
26
|
+
"cdk/create-only/.github/workflows/deploy.yml": "49c68a12c197b750fc7d7d953a190cfecf3028c60a10ca1f18e148eb9a153ebf",
|
|
27
27
|
"cdk/create-only/cdk.json": "f89030d8fe145a1dbabd59d89ddee4e16984f222d737f7fcf6b778d911e9fe40",
|
|
28
28
|
"cdk/create-only/tsconfig.local.json": "d26253827e21fd7c41d30565fe3d339675f119e00bb24c5713a01f57ccd06602",
|
|
29
29
|
"cdk/create-only/vitest.config.local.ts": "476738b351114a0efbcd3ae4ce1cf016307b55ee41ed8e87c35e28e4639d98f5",
|
|
@@ -73,7 +73,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
73
73
|
"expo/copy-overwrite/tsconfig.expo.json": "55f3dfe80496f03152d40d364c5a9cabf3fdce3adc8cebea48ba5257d77b7aa9",
|
|
74
74
|
"expo/copy-overwrite/tsconfig.json": "c92e2c2c109e8794ee351f634361ef46297f5a0cd606aaf5c19911da836df307",
|
|
75
75
|
"expo/create-only/.github/workflows/ci.yml": "ba73a3d8c9195b6823525a396aef50809bbb3cab5cbdd24ce9ccf6e5efaf3d35",
|
|
76
|
-
"expo/create-only/.github/workflows/deploy.yml": "
|
|
76
|
+
"expo/create-only/.github/workflows/deploy.yml": "7307c772b0b841ad67102499b9ba86afc9ee925c55fb4eb0a6b0b520e8d62f92",
|
|
77
77
|
"expo/create-only/.github/workflows/maestro-e2e.yml": "444367a8cefaa81b484bc6eff5923c34177e10f6a67cbf1befec00c9d0d1d36b",
|
|
78
78
|
"expo/create-only/.zap/baseline.conf": "ab18d74ba5270dd5d795e740cd6b1292bb78dc36c79a20c1e7b752d14c0c55f5",
|
|
79
79
|
"expo/create-only/babel.config.js": "faaf96f0d43c724a240a7892584de54ae384eee9ef9d76430d081f37d9f92924",
|
|
@@ -106,7 +106,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
106
106
|
"harper-fabric/copy-overwrite/tsconfig.eslint.json": "63ddc31cbbdf91ba4def5f04ed76b2a8b61ced456d4472aea77a55cc037a62e1",
|
|
107
107
|
"harper-fabric/copy-overwrite/tsconfig.json": "64b9f2e919160568712e2641b125aa21bec486532249a7b17e4fb2f4bb3988cc",
|
|
108
108
|
"harper-fabric/copy-overwrite/vitest.config.ts": "d24cd8d91b9942d8e0bd205ac41e103d49f2cb1e961bcdab259a56f5112e0151",
|
|
109
|
-
"harper-fabric/create-only/.github/workflows/deploy.yml": "
|
|
109
|
+
"harper-fabric/create-only/.github/workflows/deploy.yml": "dc44723ac2ca6e5b2ba2c8ba1e07d06ef0772ba7a31232c861c1556e893bf5ba",
|
|
110
110
|
"harper-fabric/create-only/.github/workflows/zap-baseline.yml": "0315cd74dbe463da373b6a2fb75d48f46959df4232a31573fb84b1a4ed8e4e36",
|
|
111
111
|
"harper-fabric/create-only/.zap/baseline.conf": "68aae4b1b9b5b7253b5aeb792d72b58f64e5eda1dcf8f3062bd9d77494a5a22f",
|
|
112
112
|
"harper-fabric/create-only/scripts/zap-baseline.sh": "da139276b637080f9877362ce6f9667c1ffd57c9d18ec851999ce4328f309577",
|
|
@@ -147,7 +147,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
147
147
|
"nestjs/create-only/.github/k6/thresholds/relaxed.json": "350c18b2c588fd628db8a6e82fc5c0b3ffc8a09f1c89b64d1f530350bc64a9ca",
|
|
148
148
|
"nestjs/create-only/.github/k6/thresholds/strict.json": "e121ec72de4596b95c013a8c71f03653bcdf057cf7f8d1fec6f0e13c1381867f",
|
|
149
149
|
"nestjs/create-only/.github/workflows/ci.yml": "1cbe153a37e61cef21b0af8d7b2d41e6b59adbf8a4c289475439852896a531fc",
|
|
150
|
-
"nestjs/create-only/.github/workflows/deploy.yml": "
|
|
150
|
+
"nestjs/create-only/.github/workflows/deploy.yml": "0dc60efd66776bd86b365a7d956db6902f709ded4f06e034f9e9a1c4f510ca07",
|
|
151
151
|
"nestjs/create-only/.zap/baseline.conf": "a7cd559b014555ef2efe7a6ce129384ec376ce4d66d5bc3ae9e2f3f883172c4d",
|
|
152
152
|
"nestjs/create-only/scripts/zap-baseline.sh": "de3a66a780076f98d5c6306c03b5decac8afbc9ff37583e5e6463c56f3399e3e",
|
|
153
153
|
"nestjs/create-only/tsconfig.local.json": "0b720ddad0d18f52dadf33bdc4a0aec0eb65c506bc8ebb692f880bdf31d1011d",
|
|
@@ -892,7 +892,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
892
892
|
"rails/create-only/.github/workflows/claude-nightly-test-coverage.yml": "f7f2eeb05ddd18e196c4b292c0a846e765ed8b67ddeacfc6b19c3d676d91e459",
|
|
893
893
|
"rails/create-only/.github/workflows/claude-nightly-test-improvement.yml": "9195acb1564f960bc5831c82b1ad9ae2ce94460458e5b58d3b827e0eb1deb84b",
|
|
894
894
|
"rails/create-only/.github/workflows/claude-sync-down-branches.yml": "072cc8290eec15ef6d55c2583e94ae49cda4a56a0fea252556a8fce8170cc540",
|
|
895
|
-
"rails/create-only/.github/workflows/deploy.yml": "
|
|
895
|
+
"rails/create-only/.github/workflows/deploy.yml": "b24144ffa1b4dbb5087f48d4240e524aad850eb72d7c9c15fdfad8b582677fe5",
|
|
896
896
|
"rails/create-only/.mise.toml": "28be5746256a30ad2260da7d37244cc461f8963ce5d5a81ddce71b48f0ab6ef0",
|
|
897
897
|
"rails/create-only/.mutant.yml": "73dbc96f1370e2a5afa474b0a1063f6b752c60c620220c4b057d0a71c42cde1d",
|
|
898
898
|
"rails/create-only/.reek.yml": "383a70f946c0a2824a3f357623224d94c63ee9a8b8de924e8a3879a6017fc09f",
|
|
@@ -981,7 +981,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
981
981
|
"typescript/copy-contents/.husky/pre-push": "001b5c2a779cf242c8d49029651f92ebddebf4ab706d58269d46e2be88a9df5b",
|
|
982
982
|
"typescript/copy-contents/.husky/prepare-commit-msg": "58671fb61f6fcc1fc384a2d7295f16949faa58150a8213e0a39d3c70fad728b5",
|
|
983
983
|
"typescript/copy-overwrite/.claude/hooks/worktree-create.sh": "0185adc91889a7c2a41b3609fe529ac89ff8149600f8d00aa8065ea3c397c0d1",
|
|
984
|
-
"typescript/copy-overwrite/.github/GITHUB_ACTIONS.md": "
|
|
984
|
+
"typescript/copy-overwrite/.github/GITHUB_ACTIONS.md": "02f71566d0995c95db5ea0d34a74b71fdc95bd0337a97670f1d8abd25e3cc2b7",
|
|
985
985
|
"typescript/copy-overwrite/.github/dependabot.yml": "6db1f1e6469845da81d2d724a446cc3feb42c970907796d3a1dee1eabfc7ba6b",
|
|
986
986
|
"typescript/copy-overwrite/.lintstagedrc.json": "5a2f5f9ad454e7b9e1e065cb3b1768f6a9897e453b0afee508b98c96bfa67138",
|
|
987
987
|
"typescript/copy-overwrite/.nvmrc": "0775c6feb7638122e8b68d611cd709bf270f7b5adb5d0d2baa9afab8a6c0fc42",
|
|
@@ -177,6 +177,19 @@ jobs:
|
|
|
177
177
|
deploy:
|
|
178
178
|
name: 🚀 Deploy to EAS
|
|
179
179
|
runs-on: ubuntu-latest
|
|
180
|
+
# Declaring the environment makes GitHub emit deployment /
|
|
181
|
+
# deployment_status events for this run — the substrate that
|
|
182
|
+
# deploy-status-sync listens to. Friendly name resolution (dev/staging/
|
|
183
|
+
# production) comes from determine_environment; unconfigured branches
|
|
184
|
+
# degrade to the branch name, same as the approval gate.
|
|
185
|
+
# Mitigation A (double-approval): GitHub environment approvals are
|
|
186
|
+
# per-job, so if this job named the same protected env release_approval
|
|
187
|
+
# already gated, the operator would be prompted twice. On approval-gated
|
|
188
|
+
# runs the deploy job routes to `<env>-deploy` (host projects leave it
|
|
189
|
+
# unprotected — no required reviewers), giving exactly one prompt while
|
|
190
|
+
# still recording a deployment with a Jira-classifiable env name (the
|
|
191
|
+
# dev/staging/production substring is preserved).
|
|
192
|
+
environment: ${{ needs.determine_environment.outputs.require_approval == 'true' && format('{0}-deploy', needs.determine_environment.outputs.approval_environment) || needs.determine_environment.outputs.approval_environment }}
|
|
180
193
|
needs:
|
|
181
194
|
[
|
|
182
195
|
determine_environment,
|
|
@@ -18,6 +18,11 @@ jobs:
|
|
|
18
18
|
name: Build, deploy, and verify
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
timeout-minutes: 30
|
|
21
|
+
# Declaring the environment makes GitHub emit deployment /
|
|
22
|
+
# deployment_status events for this run — the substrate that
|
|
23
|
+
# deploy-status-sync listens to. No determine_environment job exists in
|
|
24
|
+
# this workflow; main deploys to production, other refs use the branch name.
|
|
25
|
+
environment: ${{ github.ref_name == 'main' && 'production' || github.ref_name }}
|
|
21
26
|
env:
|
|
22
27
|
HARPER_PROJECT: ${{ vars.HARPER_PROJECT || github.event.repository.name }}
|
|
23
28
|
HARPER_PACKAGE: ${{ vars.HARPER_PACKAGE || 'harper-app' }}
|
|
@@ -244,6 +244,20 @@ jobs:
|
|
|
244
244
|
)
|
|
245
245
|
name: Deploy
|
|
246
246
|
runs-on: ubuntu-latest
|
|
247
|
+
# Declaring the environment makes GitHub emit deployment /
|
|
248
|
+
# deployment_status events for this run — the substrate that
|
|
249
|
+
# deploy-status-sync listens to. url surfaces the deployed API in the
|
|
250
|
+
# GitHub deployments UI.
|
|
251
|
+
# Mitigation A (double-approval): GitHub environment approvals are
|
|
252
|
+
# per-job, so if this job named the same protected env release_approval
|
|
253
|
+
# already gated, the operator would be prompted twice. On approval-gated
|
|
254
|
+
# runs the deploy job routes to `<env>-deploy` (host projects leave it
|
|
255
|
+
# unprotected — no required reviewers), giving exactly one prompt while
|
|
256
|
+
# still recording a deployment with a Jira-classifiable env name (the
|
|
257
|
+
# dev/staging/production substring is preserved).
|
|
258
|
+
environment:
|
|
259
|
+
name: ${{ needs.determine_environment.outputs.require_approval == 'true' && format('{0}-deploy', needs.determine_environment.outputs.approval_environment) || needs.determine_environment.outputs.approval_environment }}
|
|
260
|
+
url: ${{ steps.deployment_outputs.outputs.environment_url }}
|
|
247
261
|
outputs:
|
|
248
262
|
environment_url: ${{ steps.deployment_outputs.outputs.environment_url }}
|
|
249
263
|
deployment_status: ${{ steps.deployment_outputs.outputs.deployment_status }}
|
package/package.json
CHANGED
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"brace-expansion": ">=5.0.6"
|
|
114
114
|
},
|
|
115
115
|
"name": "@codyswann/lisa",
|
|
116
|
-
"version": "2.
|
|
116
|
+
"version": "2.295.0",
|
|
117
117
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
118
118
|
"main": "dist/index.js",
|
|
119
119
|
"exports": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.295.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.295.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.295.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.295.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.295.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -32,6 +32,11 @@ jobs:
|
|
|
32
32
|
if: ${{ github.event_name != 'push' || !startsWith(github.event.head_commit.message, 'chore(release):') }}
|
|
33
33
|
runs-on: ubuntu-latest
|
|
34
34
|
timeout-minutes: 30
|
|
35
|
+
# Declaring the environment makes GitHub emit deployment /
|
|
36
|
+
# deployment_status events for this run — the substrate that
|
|
37
|
+
# deploy-status-sync listens to. No determine_environment job exists in
|
|
38
|
+
# this workflow; the ternary mirrors the APP_STAGE branch logic below.
|
|
39
|
+
environment: ${{ github.ref_name == 'main' && 'production' || github.ref_name }}
|
|
35
40
|
permissions:
|
|
36
41
|
id-token: write # needed to interact with GitHub's OIDC Token endpoint.
|
|
37
42
|
contents: read
|
|
@@ -149,6 +149,34 @@ an unprovisioned gate blocks nothing. Not yet wired for rails
|
|
|
149
149
|
(`release-rails.yml` doesn't thread approval inputs) or harper-fabric (no
|
|
150
150
|
release.yml call).
|
|
151
151
|
|
|
152
|
+
**Your deploy job declares a GitHub environment** (deploy-status-sync
|
|
153
|
+
substrate): the deploy job in this project's `deploy.yml` carries an
|
|
154
|
+
`environment:` declaration so every deploy run emits `deployment` /
|
|
155
|
+
`deployment_status` events — the substrate that deploy-status-sync (and
|
|
156
|
+
GitHub-for-Jira) listens to. Stacks with a `determine_environment` job reuse
|
|
157
|
+
its friendly-name resolution
|
|
158
|
+
(`needs.determine_environment.outputs.approval_environment`; unconfigured
|
|
159
|
+
branches degrade to the branch name, same as the approval gate); stacks
|
|
160
|
+
without one use the branch ternary
|
|
161
|
+
`github.ref_name == 'main' && 'production' || github.ref_name`. CDK projects
|
|
162
|
+
own their deploy job — declare the environment on it per the commented
|
|
163
|
+
snippet in the template `deploy.yml`. Exactly one deploy job per workflow
|
|
164
|
+
declares an environment (the job that mutates the target); release/build
|
|
165
|
+
bookkeeping jobs never do.
|
|
166
|
+
|
|
167
|
+
GitHub environment approvals are **per-job**. If your deploy job named the same
|
|
168
|
+
protected environment as the `release_approval` gate, an approval-gated run
|
|
169
|
+
would prompt you **twice**. To avoid that, on approval-gated runs
|
|
170
|
+
(`determine_environment` sets `require_approval`) the deploy job routes its
|
|
171
|
+
environment to `<env>-deploy` (`format('{0}-deploy', <env>)`) rather than the
|
|
172
|
+
bare env. Leave `<env>-deploy` **unprotected** (no required reviewers): the gate
|
|
173
|
+
fires once at `release_approval`, and the deploy job proceeds without a second
|
|
174
|
+
prompt. A gated run records two deployments — the gate against `<env>` and the
|
|
175
|
+
deploy job against `<env>-deploy` — and the `-deploy` suffix keeps the
|
|
176
|
+
`dev`/`staging`/`production` substring so GitHub-for-Jira still classifies it.
|
|
177
|
+
Ungated runs use the bare env; stacks without a `determine_environment` job
|
|
178
|
+
(rails, harper-fabric) are never gated and need no suffix.
|
|
179
|
+
|
|
152
180
|
**Blackout Periods** (configurable):
|
|
153
181
|
- Production: No weekends, no late nights (10 PM - 6 AM)
|
|
154
182
|
- Holiday blackouts: Dec 24 - Jan 2, Jul 3-5, Nov 27-29
|