@codyswann/lisa 3.23.0 → 3.23.2
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/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +20 -69
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-quality-caller-scopes.d.ts.map +1 -1
- package/dist/migrations/ensure-quality-caller-scopes.js +1 -2
- package/dist/migrations/ensure-quality-caller-scopes.js.map +1 -1
- 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/.codex-plugin/skills/lisa-doctor/SKILL.md +3 -5
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/SKILL.md +9 -16
- package/plugins/lisa/rules/reference/config-resolution.md +2 -2
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +3 -5
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa/skills/lisa-sync-down/SKILL.md +10 -17
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +3 -5
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/lisa-sync-down/SKILL.md +10 -17
- 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-copilot/rules/reference/config-resolution.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +3 -5
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/lisa-sync-down/SKILL.md +10 -17
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +2 -2
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +3 -5
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/lisa-sync-down/SKILL.md +10 -17
- 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/plugins/src/base/rules/reference/config-resolution.md +2 -2
- package/plugins/src/base/skills/lisa-doctor/SKILL.md +3 -5
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
- package/plugins/src/base/skills/lisa-sync-down/SKILL.md +10 -17
- package/rails/deletions.json +6 -1
- package/scripts/detect-stale-workflow-inputs.mjs +7 -7
- package/scripts/generate-upstream-evidence-manifest.mjs +1 -0
- package/scripts/verify-health-deterministic-built.mjs +1 -1
- package/typescript/copy-contents/.husky/commit-msg +4 -1
- package/typescript/copy-contents/.husky/pre-commit +4 -1
- package/typescript/copy-contents/.husky/pre-push +8 -2
- package/typescript/copy-contents/.husky/prepare-commit-msg +4 -1
- package/typescript/deletions.json +14 -1
- package/rails/create-only/.github/workflows/claude-code-review-response.yml +0 -31
- package/rails/create-only/.github/workflows/claude-nightly-code-complexity.yml +0 -22
- package/rails/create-only/.github/workflows/claude-nightly-test-coverage.yml +0 -30
- package/rails/create-only/.github/workflows/claude-nightly-test-improvement.yml +0 -33
- package/rails/create-only/.github/workflows/claude-sync-down-branches.yml +0 -46
- package/scripts/migrate-deploy-order.sh +0 -161
- package/typescript/create-only/.github/workflows/claude-ci-auto-fix.yml +0 -42
- package/typescript/create-only/.github/workflows/claude-code-review-response.yml +0 -31
- package/typescript/create-only/.github/workflows/claude-deploy-auto-fix.yml +0 -39
- package/typescript/create-only/.github/workflows/claude-nightly-code-complexity.yml +0 -24
- package/typescript/create-only/.github/workflows/claude-nightly-test-coverage.yml +0 -31
- package/typescript/create-only/.github/workflows/claude-nightly-test-improvement.yml +0 -34
- package/typescript/create-only/.github/workflows/claude-sync-down-branches.yml +0 -46
- package/typescript/create-only/.github/workflows/claude.yml +0 -37
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Nightly Code Complexity
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: '0 5 * * 1-5'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
|
|
12
|
-
permissions:
|
|
13
|
-
contents: write
|
|
14
|
-
issues: write
|
|
15
|
-
pull-requests: write
|
|
16
|
-
id-token: write
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
reduce-complexity:
|
|
20
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-nightly-code-complexity-rails.yml@main
|
|
21
|
-
secrets:
|
|
22
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Nightly Test Coverage
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: '0 4 * * 1-5'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
inputs:
|
|
12
|
-
coverage_increment:
|
|
13
|
-
description: 'Percentage points to increase coverage per run'
|
|
14
|
-
required: false
|
|
15
|
-
default: 5
|
|
16
|
-
type: number
|
|
17
|
-
|
|
18
|
-
permissions:
|
|
19
|
-
contents: write
|
|
20
|
-
issues: write
|
|
21
|
-
pull-requests: write
|
|
22
|
-
id-token: write
|
|
23
|
-
|
|
24
|
-
jobs:
|
|
25
|
-
improve-coverage:
|
|
26
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-nightly-test-coverage-rails.yml@main
|
|
27
|
-
with:
|
|
28
|
-
coverage_increment: ${{ github.event.inputs.coverage_increment || 5 }}
|
|
29
|
-
secrets:
|
|
30
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Nightly Test Improvement
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: '0 3 * * 1-5'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
inputs:
|
|
12
|
-
mode:
|
|
13
|
-
description: 'Analysis mode'
|
|
14
|
-
required: true
|
|
15
|
-
default: 'nightly'
|
|
16
|
-
type: choice
|
|
17
|
-
options:
|
|
18
|
-
- nightly
|
|
19
|
-
- general
|
|
20
|
-
|
|
21
|
-
permissions:
|
|
22
|
-
contents: write
|
|
23
|
-
issues: write
|
|
24
|
-
pull-requests: write
|
|
25
|
-
id-token: write
|
|
26
|
-
|
|
27
|
-
jobs:
|
|
28
|
-
improve-tests:
|
|
29
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-nightly-test-improvement-rails.yml@main
|
|
30
|
-
with:
|
|
31
|
-
mode: ${{ github.event.inputs.mode || 'nightly' }}
|
|
32
|
-
secrets:
|
|
33
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
#
|
|
5
|
-
# Back-syncs merges down the env chain so hotfixes propagate.
|
|
6
|
-
# Example: PR merged to main -> opens a sync PR to staging.
|
|
7
|
-
# PR merged to staging -> opens a sync PR to dev.
|
|
8
|
-
#
|
|
9
|
-
# The source -> target chain is DERIVED from .lisa.config.json:
|
|
10
|
-
# "deploy": {
|
|
11
|
-
# "branches": { "dev": "dev", "staging": "staging", "production": "main" },
|
|
12
|
-
# "order": ["dev", "staging", "production"] // low env -> high env
|
|
13
|
-
# }
|
|
14
|
-
# The reusable workflow walks deploy.order from the highest environment down,
|
|
15
|
-
# mapping each env's branch to the next-lower env's branch. The example above
|
|
16
|
-
# yields main -> staging and staging -> dev. Single-environment projects (one
|
|
17
|
-
# entry in deploy.branches) produce an empty chain and the workflow no-ops.
|
|
18
|
-
#
|
|
19
|
-
# Customize for your project:
|
|
20
|
-
# - `branches` (the trigger filter below): list each branch whose merged PRs
|
|
21
|
-
# should *trigger* a back-sync — i.e. every non-lowest branch in deploy.order.
|
|
22
|
-
# - To override the derived chain, pass it explicitly:
|
|
23
|
-
# with:
|
|
24
|
-
# chain: '{"main":"staging","staging":"dev"}'
|
|
25
|
-
# An explicit `chain` always wins over the config-derived one.
|
|
26
|
-
|
|
27
|
-
name: Claude Sync Down Branches
|
|
28
|
-
|
|
29
|
-
on:
|
|
30
|
-
pull_request:
|
|
31
|
-
types: [closed]
|
|
32
|
-
branches: [main, staging]
|
|
33
|
-
|
|
34
|
-
permissions:
|
|
35
|
-
contents: write
|
|
36
|
-
pull-requests: write
|
|
37
|
-
issues: write
|
|
38
|
-
actions: read
|
|
39
|
-
id-token: write
|
|
40
|
-
|
|
41
|
-
jobs:
|
|
42
|
-
sync:
|
|
43
|
-
if: github.event.pull_request.merged == true
|
|
44
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-sync-down-branches.yml@main
|
|
45
|
-
secrets:
|
|
46
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# migrate-deploy-order.sh — backfill `deploy.order` into workspace projects and,
|
|
4
|
-
# where provably safe, switch their back-sync wrapper from a hardcoded `chain`
|
|
5
|
-
# to the config-derived one.
|
|
6
|
-
#
|
|
7
|
-
# Context: `reusable-claude-sync-down-branches.yml` now derives its source->target
|
|
8
|
-
# chain from `.lisa.config.json` `deploy.order` + `deploy.branches`. An explicit
|
|
9
|
-
# `chain:` in a project's `claude-sync-down-branches.yml` wrapper still overrides
|
|
10
|
-
# the derived value, so this migration is OPT-IN and non-breaking.
|
|
11
|
-
#
|
|
12
|
-
# Per project (read from .lisa.workspaces.json):
|
|
13
|
-
# 1. If no wrapper file → SKIP.
|
|
14
|
-
# 2. If no deploy.branches in config → SKIP (cannot derive; keep explicit chain).
|
|
15
|
-
# 3. If single-env → propose removing the (redundant) wrapper chain ONLY when it
|
|
16
|
-
# derives to the same value; otherwise REVIEW (drift — chain targets envs the
|
|
17
|
-
# config doesn't declare).
|
|
18
|
-
# 4. If multi-env:
|
|
19
|
-
# - Determine deploy.order (existing, or derive conventionally dev<staging<production).
|
|
20
|
-
# - Compute the derived chain.
|
|
21
|
-
# - SAFE → derived chain == current wrapper chain: add deploy.order (if missing)
|
|
22
|
-
# and drop the wrapper `chain:` line. Behavior provably unchanged.
|
|
23
|
-
# - REVIEW → derived chain != wrapper chain, or env rank unknown: report, change nothing.
|
|
24
|
-
#
|
|
25
|
-
# Default mode is DRY RUN. Pass --apply to write changes.
|
|
26
|
-
#
|
|
27
|
-
# Usage:
|
|
28
|
-
# scripts/migrate-deploy-order.sh # dry run, all workspace projects
|
|
29
|
-
# scripts/migrate-deploy-order.sh --apply # write changes
|
|
30
|
-
# scripts/migrate-deploy-order.sh --workspaces /path/to/.lisa.workspaces.json
|
|
31
|
-
|
|
32
|
-
set -euo pipefail
|
|
33
|
-
|
|
34
|
-
APPLY=false
|
|
35
|
-
WS="${HOME}/workspace/lisa/.lisa.workspaces.json"
|
|
36
|
-
while [ $# -gt 0 ]; do
|
|
37
|
-
case "$1" in
|
|
38
|
-
--apply) APPLY=true; shift ;;
|
|
39
|
-
--workspaces) WS="$2"; shift 2 ;;
|
|
40
|
-
*) echo "Unknown arg: $1" >&2; exit 2 ;;
|
|
41
|
-
esac
|
|
42
|
-
done
|
|
43
|
-
|
|
44
|
-
command -v jq >/dev/null || { echo "jq is required" >&2; exit 1; }
|
|
45
|
-
[ -f "$WS" ] || { echo "Workspaces file not found: $WS" >&2; exit 1; }
|
|
46
|
-
|
|
47
|
-
# Conventional env rank (low -> high). Unknown env names => REVIEW.
|
|
48
|
-
env_rank() {
|
|
49
|
-
case "$1" in
|
|
50
|
-
dev|develop|development) echo 10 ;;
|
|
51
|
-
qa|test) echo 20 ;;
|
|
52
|
-
staging|stage|stg) echo 30 ;;
|
|
53
|
-
preprod|preproduction|uat) echo 40 ;;
|
|
54
|
-
prod|production|prd) echo 50 ;;
|
|
55
|
-
*) echo "" ;;
|
|
56
|
-
esac
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
# Derive deploy.order (JSON array, low->high) from deploy.branches keys by rank.
|
|
60
|
-
# Echoes the array on success, or "ERR_UNKNOWN:<env>" if a key has no known rank.
|
|
61
|
-
derive_order() {
|
|
62
|
-
local cfg="$1" envs e r pairs
|
|
63
|
-
envs=$(jq -r '(.deploy.branches // {}) | keys[]' "$cfg")
|
|
64
|
-
pairs=""
|
|
65
|
-
while IFS= read -r e; do
|
|
66
|
-
[ -z "$e" ] && continue
|
|
67
|
-
r=$(env_rank "$e")
|
|
68
|
-
[ -z "$r" ] && { echo "ERR_UNKNOWN:$e"; return 0; }
|
|
69
|
-
pairs+="$r $e"$'\n'
|
|
70
|
-
done <<< "$envs"
|
|
71
|
-
printf '%s' "$pairs" | sort -n | awk '{print $2}' | jq -R . | jq -sc .
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
# Compute derived chain JSON from a config that already has branches+order.
|
|
75
|
-
derive_chain() {
|
|
76
|
-
jq -e -r '
|
|
77
|
-
(.deploy.branches // {}) as $b | (.deploy.order // []) as $o
|
|
78
|
-
| ($b|keys|sort) as $bk | ($o|sort) as $ok
|
|
79
|
-
| if ($b|length)<=1 then "{}"
|
|
80
|
-
elif (($b|[.[]]|unique|length)<=1) then "{}"
|
|
81
|
-
elif ($o|length)==0 then "ERR_NO_ORDER"
|
|
82
|
-
elif ($bk!=$ok) then "ERR_MISMATCH"
|
|
83
|
-
else ($o|reverse) as $hl
|
|
84
|
-
| [ range(0;($hl|length)-1) | {($b[$hl[.]]):$b[$hl[.+1]]} ] | add | tojson end
|
|
85
|
-
' "$1" 2>/dev/null || echo "ERR_PARSE"
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
# Extract the explicit chain JSON from a wrapper file, or empty string if none.
|
|
89
|
-
wrapper_chain() {
|
|
90
|
-
grep -oE "chain:[[:space:]]*'[^']*'" "$1" 2>/dev/null | head -1 | sed -E "s/chain:[[:space:]]*'(.*)'/\1/" || true
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
SAFE=0; REVIEW=0; SKIP=0
|
|
94
|
-
echo "Mode: $([ "$APPLY" = true ] && echo APPLY || echo DRY-RUN)"
|
|
95
|
-
echo "Workspaces: $WS"
|
|
96
|
-
echo
|
|
97
|
-
|
|
98
|
-
while IFS= read -r proj; do
|
|
99
|
-
dir="${proj/#\~/$HOME}"
|
|
100
|
-
cfg="$dir/.lisa.config.json"
|
|
101
|
-
wrap="$dir/.github/workflows/claude-sync-down-branches.yml"
|
|
102
|
-
|
|
103
|
-
[ -f "$wrap" ] || { printf "SKIP %-45s (no wrapper)\n" "$proj"; SKIP=$((SKIP+1)); continue; }
|
|
104
|
-
[ -f "$cfg" ] || { printf "SKIP %-45s (no .lisa.config.json — keep explicit chain)\n" "$proj"; SKIP=$((SKIP+1)); continue; }
|
|
105
|
-
|
|
106
|
-
nb=$(jq -r '(.deploy.branches // {}) | length' "$cfg" 2>/dev/null || echo 0)
|
|
107
|
-
[ "$nb" -ge 1 ] 2>/dev/null || { printf "SKIP %-45s (no deploy.branches — keep explicit chain)\n" "$proj"; SKIP=$((SKIP+1)); continue; }
|
|
108
|
-
|
|
109
|
-
cur_chain=$(wrapper_chain "$wrap")
|
|
110
|
-
has_order=$(jq -r 'has("deploy") and (.deploy|has("order"))' "$cfg" 2>/dev/null || echo false)
|
|
111
|
-
|
|
112
|
-
if [ "$has_order" = "true" ]; then
|
|
113
|
-
order_json=$(jq -c '.deploy.order' "$cfg")
|
|
114
|
-
else
|
|
115
|
-
order_json=$(derive_order "$cfg")
|
|
116
|
-
if [[ "$order_json" == ERR_UNKNOWN:* ]]; then
|
|
117
|
-
printf "REVIEW %-45s (unknown env name '%s' — set deploy.order manually)\n" "$proj" "${order_json#ERR_UNKNOWN:}"
|
|
118
|
-
REVIEW=$((REVIEW+1)); continue
|
|
119
|
-
fi
|
|
120
|
-
fi
|
|
121
|
-
|
|
122
|
-
# Compute derived chain against a config that has both branches and the order.
|
|
123
|
-
tmp=$(mktemp)
|
|
124
|
-
jq --argjson o "$order_json" '.deploy.order = $o' "$cfg" > "$tmp"
|
|
125
|
-
derived=$(derive_chain "$tmp")
|
|
126
|
-
|
|
127
|
-
case "$derived" in
|
|
128
|
-
ERR_*) printf "REVIEW %-45s (%s computing chain)\n" "$proj" "$derived"; REVIEW=$((REVIEW+1)); rm -f "$tmp"; continue ;;
|
|
129
|
-
esac
|
|
130
|
-
|
|
131
|
-
# Normalise both chains for comparison (sorted keys).
|
|
132
|
-
norm() { echo "$1" | jq -cS . 2>/dev/null || echo "$1"; }
|
|
133
|
-
d_norm=$(norm "$derived"); c_norm=$([ -n "$cur_chain" ] && norm "$cur_chain" || echo '""')
|
|
134
|
-
|
|
135
|
-
if [ -z "$cur_chain" ]; then
|
|
136
|
-
# No explicit wrapper chain already → just ensure deploy.order is present.
|
|
137
|
-
if [ "$has_order" = "true" ]; then
|
|
138
|
-
printf "SKIP %-45s (already config-driven, deploy.order set)\n" "$proj"; SKIP=$((SKIP+1))
|
|
139
|
-
else
|
|
140
|
-
printf "SAFE %-45s add deploy.order=%s (wrapper already chain-less)\n" "$proj" "$order_json"
|
|
141
|
-
SAFE=$((SAFE+1))
|
|
142
|
-
if [ "$APPLY" = true ]; then mv "$tmp" "$cfg"; tmp=""; fi
|
|
143
|
-
fi
|
|
144
|
-
elif [ "$d_norm" = "$c_norm" ]; then
|
|
145
|
-
printf "SAFE %-45s derived==wrapper (%s); add order + drop wrapper chain\n" "$proj" "$derived"
|
|
146
|
-
SAFE=$((SAFE+1))
|
|
147
|
-
if [ "$APPLY" = true ]; then
|
|
148
|
-
[ "$has_order" = "true" ] || { mv "$tmp" "$cfg"; tmp=""; }
|
|
149
|
-
# Drop the `chain:` line and the now-orphaned `with:` if it becomes empty.
|
|
150
|
-
perl -0pi -e 's/^[[:space:]]*with:\n[[:space:]]*chain:[[:space:]]*'"'"'[^'"'"']*'"'"'\n//m; s/^[[:space:]]*chain:[[:space:]]*'"'"'[^'"'"']*'"'"'\n//m;' "$wrap"
|
|
151
|
-
fi
|
|
152
|
-
else
|
|
153
|
-
printf "REVIEW %-45s derived=%s != wrapper=%s\n" "$proj" "$derived" "$cur_chain"
|
|
154
|
-
REVIEW=$((REVIEW+1))
|
|
155
|
-
fi
|
|
156
|
-
[ -n "${tmp:-}" ] && rm -f "$tmp" || true
|
|
157
|
-
done < <(jq -r 'keys[]' "$WS")
|
|
158
|
-
|
|
159
|
-
echo
|
|
160
|
-
echo "Summary: SAFE=$SAFE REVIEW=$REVIEW SKIP=$SKIP"
|
|
161
|
-
[ "$APPLY" = false ] && echo "(dry run — re-run with --apply to write)"
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude CI Auto-Fix
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
workflow_run:
|
|
9
|
-
workflows: ['🔍 CI Quality Checks']
|
|
10
|
-
types: [completed]
|
|
11
|
-
|
|
12
|
-
permissions:
|
|
13
|
-
actions: read
|
|
14
|
-
contents: write
|
|
15
|
-
issues: write
|
|
16
|
-
pull-requests: write
|
|
17
|
-
id-token: write
|
|
18
|
-
|
|
19
|
-
jobs:
|
|
20
|
-
auto-fix:
|
|
21
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-ci-auto-fix.yml@main
|
|
22
|
-
with:
|
|
23
|
-
workflow_run_conclusion: ${{ github.event.workflow_run.conclusion }}
|
|
24
|
-
head_repo_full_name: ${{ github.event.workflow_run.head_repository.full_name }}
|
|
25
|
-
repo_full_name: ${{ github.repository }}
|
|
26
|
-
head_branch: ${{ github.event.workflow_run.head_branch }}
|
|
27
|
-
run_id: ${{ github.event.workflow_run.id }}
|
|
28
|
-
package_manager: 'bun'
|
|
29
|
-
# Least-privilege mapping — exactly the secrets the auto-fix chain uses.
|
|
30
|
-
# The tracker tokens are load-bearing: the reusable workflow forwards them
|
|
31
|
-
# to the failure-issue dispatcher, which needs JIRA_API_TOKEN /
|
|
32
|
-
# LINEAR_API_KEY to file tickets in the tracker declared in
|
|
33
|
-
# .lisa.config.json. A CLAUDE_CODE_OAUTH_TOKEN-only mapping silently
|
|
34
|
-
# strands those tickets in GitHub Issues. Unset secrets pass as empty —
|
|
35
|
-
# safe on repos that don't use that tracker. (`secrets: inherit` would
|
|
36
|
-
# also work but hands the chain every repo secret and trips
|
|
37
|
-
# SonarCloud/security-scanner gates.)
|
|
38
|
-
secrets:
|
|
39
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
40
|
-
PAT: ${{ secrets.PAT }}
|
|
41
|
-
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
|
|
42
|
-
LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Code Review Response
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
pull_request_review:
|
|
9
|
-
types: [submitted]
|
|
10
|
-
|
|
11
|
-
permissions:
|
|
12
|
-
actions: write
|
|
13
|
-
checks: write
|
|
14
|
-
contents: write
|
|
15
|
-
issues: write
|
|
16
|
-
pull-requests: write
|
|
17
|
-
id-token: write
|
|
18
|
-
|
|
19
|
-
jobs:
|
|
20
|
-
respond-to-review:
|
|
21
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-code-review-response.yml@main
|
|
22
|
-
with:
|
|
23
|
-
review_user_login: ${{ github.event.review.user.login }}
|
|
24
|
-
pr_user_login: ${{ github.event.pull_request.user.login }}
|
|
25
|
-
pr_head_ref: ${{ github.event.pull_request.head.ref }}
|
|
26
|
-
pr_number: ${{ github.event.pull_request.number }}
|
|
27
|
-
repo_owner: ${{ github.repository_owner }}
|
|
28
|
-
repo_name: ${{ github.event.repository.name }}
|
|
29
|
-
package_manager: 'bun'
|
|
30
|
-
secrets:
|
|
31
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Deploy Auto-Fix
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
workflow_run:
|
|
9
|
-
workflows: ['Release and Deploy', '🚀 Release and Deploy']
|
|
10
|
-
types: [completed]
|
|
11
|
-
|
|
12
|
-
permissions:
|
|
13
|
-
actions: read
|
|
14
|
-
contents: write
|
|
15
|
-
issues: write
|
|
16
|
-
pull-requests: write
|
|
17
|
-
id-token: write
|
|
18
|
-
|
|
19
|
-
jobs:
|
|
20
|
-
auto-fix:
|
|
21
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-deploy-auto-fix.yml@main
|
|
22
|
-
with:
|
|
23
|
-
workflow_run_conclusion: ${{ github.event.workflow_run.conclusion }}
|
|
24
|
-
head_repo_full_name: ${{ github.event.workflow_run.head_repository.full_name }}
|
|
25
|
-
repo_full_name: ${{ github.repository }}
|
|
26
|
-
head_branch: ${{ github.event.workflow_run.head_branch }}
|
|
27
|
-
run_id: ${{ github.event.workflow_run.id }}
|
|
28
|
-
package_manager: 'bun'
|
|
29
|
-
# Least-privilege mapping — exactly the secrets the deploy-fix chain
|
|
30
|
-
# uses. The tracker tokens are load-bearing: the reusable workflow needs
|
|
31
|
-
# JIRA_API_TOKEN / LINEAR_API_KEY to reach the tracker declared in
|
|
32
|
-
# .lisa.config.json. Unset secrets pass as empty. (`secrets: inherit`
|
|
33
|
-
# would also work but hands the chain every repo secret and trips
|
|
34
|
-
# SonarCloud/security-scanner gates.)
|
|
35
|
-
secrets:
|
|
36
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
37
|
-
PAT: ${{ secrets.PAT }}
|
|
38
|
-
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
|
|
39
|
-
LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Nightly Code Complexity
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: '0 5 * * 1-5'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
|
|
12
|
-
permissions:
|
|
13
|
-
contents: write
|
|
14
|
-
issues: write
|
|
15
|
-
pull-requests: write
|
|
16
|
-
id-token: write
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
reduce-complexity:
|
|
20
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-nightly-code-complexity.yml@main
|
|
21
|
-
with:
|
|
22
|
-
package_manager: 'bun'
|
|
23
|
-
secrets:
|
|
24
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Nightly Test Coverage
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: '0 4 * * 1-5'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
inputs:
|
|
12
|
-
coverage_increment:
|
|
13
|
-
description: 'Percentage points to increase coverage per run'
|
|
14
|
-
required: false
|
|
15
|
-
default: 5
|
|
16
|
-
type: number
|
|
17
|
-
|
|
18
|
-
permissions:
|
|
19
|
-
contents: write
|
|
20
|
-
issues: write
|
|
21
|
-
pull-requests: write
|
|
22
|
-
id-token: write
|
|
23
|
-
|
|
24
|
-
jobs:
|
|
25
|
-
improve-coverage:
|
|
26
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-nightly-test-coverage.yml@main
|
|
27
|
-
with:
|
|
28
|
-
coverage_increment: ${{ github.event.inputs.coverage_increment || 5 }}
|
|
29
|
-
package_manager: 'bun'
|
|
30
|
-
secrets:
|
|
31
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Nightly Test Improvement
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: '0 3 * * 1-5'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
inputs:
|
|
12
|
-
mode:
|
|
13
|
-
description: 'Analysis mode'
|
|
14
|
-
required: true
|
|
15
|
-
default: 'nightly'
|
|
16
|
-
type: choice
|
|
17
|
-
options:
|
|
18
|
-
- nightly
|
|
19
|
-
- general
|
|
20
|
-
|
|
21
|
-
permissions:
|
|
22
|
-
contents: write
|
|
23
|
-
issues: write
|
|
24
|
-
pull-requests: write
|
|
25
|
-
id-token: write
|
|
26
|
-
|
|
27
|
-
jobs:
|
|
28
|
-
improve-tests:
|
|
29
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-nightly-test-improvement.yml@main
|
|
30
|
-
with:
|
|
31
|
-
mode: ${{ github.event.inputs.mode || 'nightly' }}
|
|
32
|
-
package_manager: 'bun'
|
|
33
|
-
secrets:
|
|
34
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
#
|
|
5
|
-
# Back-syncs merges down the env chain so hotfixes propagate.
|
|
6
|
-
# Example: PR merged to main -> opens a sync PR to staging.
|
|
7
|
-
# PR merged to staging -> opens a sync PR to dev.
|
|
8
|
-
#
|
|
9
|
-
# The source -> target chain is DERIVED from .lisa.config.json:
|
|
10
|
-
# "deploy": {
|
|
11
|
-
# "branches": { "dev": "dev", "staging": "staging", "production": "main" },
|
|
12
|
-
# "order": ["dev", "staging", "production"] // low env -> high env
|
|
13
|
-
# }
|
|
14
|
-
# The reusable workflow walks deploy.order from the highest environment down,
|
|
15
|
-
# mapping each env's branch to the next-lower env's branch. The example above
|
|
16
|
-
# yields main -> staging and staging -> dev. Single-environment projects (one
|
|
17
|
-
# entry in deploy.branches) produce an empty chain and the workflow no-ops.
|
|
18
|
-
#
|
|
19
|
-
# Customize for your project:
|
|
20
|
-
# - `branches` (the trigger filter below): list each branch whose merged PRs
|
|
21
|
-
# should *trigger* a back-sync — i.e. every non-lowest branch in deploy.order.
|
|
22
|
-
# - To override the derived chain, pass it explicitly:
|
|
23
|
-
# with:
|
|
24
|
-
# chain: '{"main":"staging","staging":"dev"}'
|
|
25
|
-
# An explicit `chain` always wins over the config-derived one.
|
|
26
|
-
|
|
27
|
-
name: Claude Sync Down Branches
|
|
28
|
-
|
|
29
|
-
on:
|
|
30
|
-
pull_request:
|
|
31
|
-
types: [closed]
|
|
32
|
-
branches: [main, staging]
|
|
33
|
-
|
|
34
|
-
permissions:
|
|
35
|
-
contents: write
|
|
36
|
-
pull-requests: write
|
|
37
|
-
issues: write
|
|
38
|
-
actions: read
|
|
39
|
-
id-token: write
|
|
40
|
-
|
|
41
|
-
jobs:
|
|
42
|
-
sync:
|
|
43
|
-
if: github.event.pull_request.merged == true
|
|
44
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude-sync-down-branches.yml@main
|
|
45
|
-
secrets:
|
|
46
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Seeded by Lisa on first setup — this file is YOURS.
|
|
2
|
-
# Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
|
|
3
|
-
# You can customize this file — Lisa will not overwrite it.
|
|
4
|
-
|
|
5
|
-
name: Claude Code
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
issue_comment:
|
|
9
|
-
types: [created]
|
|
10
|
-
pull_request_review_comment:
|
|
11
|
-
types: [created]
|
|
12
|
-
issues:
|
|
13
|
-
types: [opened, assigned]
|
|
14
|
-
pull_request_review:
|
|
15
|
-
types: [submitted]
|
|
16
|
-
|
|
17
|
-
permissions:
|
|
18
|
-
actions: read
|
|
19
|
-
contents: write
|
|
20
|
-
issues: write
|
|
21
|
-
pull-requests: write
|
|
22
|
-
id-token: write
|
|
23
|
-
|
|
24
|
-
jobs:
|
|
25
|
-
claude:
|
|
26
|
-
if: |
|
|
27
|
-
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association || github.event.issue.author_association || '')
|
|
28
|
-
uses: CodySwannGT/lisa/.github/workflows/reusable-claude.yml@main
|
|
29
|
-
with:
|
|
30
|
-
event_name: ${{ github.event_name }}
|
|
31
|
-
author_association: ${{ github.event.comment.author_association || github.event.review.author_association || github.event.issue.author_association || '' }}
|
|
32
|
-
comment_body: ${{ github.event.comment.body || '' }}
|
|
33
|
-
review_body: ${{ github.event.review.body || '' }}
|
|
34
|
-
issue_body: ${{ github.event.issue.body || '' }}
|
|
35
|
-
issue_title: ${{ github.event.issue.title || '' }}
|
|
36
|
-
secrets:
|
|
37
|
-
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|