@codyswann/lisa 1.88.0 → 1.89.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.
@@ -3,6 +3,21 @@ name: 🔍 CI Quality Checks
3
3
  on:
4
4
  pull_request:
5
5
  workflow_dispatch:
6
+ # Optional knobs forwarded to the reusable quality workflow. Both default
7
+ # to values that preserve pre-SE-4551/SE-4552 behavior (single runner, no
8
+ # build cache), so omitting them produces a byte-identical effective
9
+ # workflow. Override via the "Run workflow" UI or a calling workflow.
10
+ inputs:
11
+ playwright_shards:
12
+ description: 'Parallel Playwright shards (default 1 = unchanged single runner)'
13
+ required: false
14
+ default: 1
15
+ type: number
16
+ cache_build:
17
+ description: 'Cache Expo web build output between runs (default false = full rebuild)'
18
+ required: false
19
+ default: false
20
+ type: boolean
6
21
 
7
22
  concurrency:
8
23
  group: ci-${{ github.event.pull_request.number || github.ref }}
@@ -17,6 +32,12 @@ jobs:
17
32
  node_version: '22.21.1'
18
33
  package_manager: 'bun'
19
34
  skip_jobs: 'test,test:integration,test:e2e'
35
+ # Forward SE-4551 / SE-4552 inputs. `|| fromJSON('...')` falls back to
36
+ # the unchanged defaults when the workflow is triggered by pull_request
37
+ # (which doesn't supply workflow_dispatch inputs), keeping behavior
38
+ # byte-identical to pre-SE-4551/SE-4552 for PR runs.
39
+ playwright_shards: ${{ inputs.playwright_shards || 1 }}
40
+ cache_build: ${{ inputs.cache_build || false }}
20
41
  secrets:
21
42
  SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
22
43
  SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
package/package.json CHANGED
@@ -78,7 +78,7 @@
78
78
  "lodash": ">=4.18.1"
79
79
  },
80
80
  "name": "@codyswann/lisa",
81
- "version": "1.88.0",
81
+ "version": "1.89.0",
82
82
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
83
83
  "main": "dist/index.js",
84
84
  "exports": {
@@ -185,6 +185,8 @@
185
185
  },
186
186
  "devDependencies": {
187
187
  "@codyswann/lisa": "^1.81.3",
188
+ "@types/js-yaml": "^4.0.9",
189
+ "js-yaml": "^4.1.1",
188
190
  "vite": "^8.0.5"
189
191
  },
190
192
  "type": "module"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "1.88.0",
3
+ "version": "1.89.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "1.88.0",
3
+ "version": "1.89.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "1.88.0",
3
+ "version": "1.89.0",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "1.88.0",
3
+ "version": "1.89.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "1.88.0",
3
+ "version": "1.89.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "1.88.0",
3
+ "version": "1.89.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -43,26 +43,27 @@ esac
43
43
  # Change to the project directory to ensure package manager commands work
44
44
  cd "$CLAUDE_PROJECT_DIR" || exit 0
45
45
 
46
- # Detect package manager based on lock file presence
47
- detect_package_manager() {
48
- if [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
49
- echo "bun"
50
- elif [ -f "pnpm-lock.yaml" ]; then
51
- echo "pnpm"
52
- elif [ -f "yarn.lock" ]; then
53
- echo "yarn"
54
- elif [ -f "package-lock.json" ]; then
55
- echo "npm"
56
- else
57
- echo "npm" # Default fallback
58
- fi
59
- }
60
-
61
- PKG_MANAGER=$(detect_package_manager)
46
+ # Resolve Prettier binary prefer local node_modules/.bin, then package-manager exec
47
+ if [ -x "./node_modules/.bin/prettier" ]; then
48
+ PRETTIER_CMD="./node_modules/.bin/prettier"
49
+ PKG_MANAGER="npm"
50
+ elif [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
51
+ PRETTIER_CMD="bunx prettier"
52
+ PKG_MANAGER="bun"
53
+ elif [ -f "pnpm-lock.yaml" ]; then
54
+ PRETTIER_CMD="pnpm exec prettier"
55
+ PKG_MANAGER="pnpm"
56
+ elif [ -f "yarn.lock" ]; then
57
+ PRETTIER_CMD="yarn exec prettier"
58
+ PKG_MANAGER="yarn"
59
+ else
60
+ PRETTIER_CMD="npx prettier"
61
+ PKG_MANAGER="npm"
62
+ fi
62
63
 
63
64
  # Run Prettier on the specific file
64
65
  echo "🎨 Running Prettier on: $FILE_PATH"
65
- $PKG_MANAGER prettier --write "$FILE_PATH" 2>&1 | grep -v "run v" | grep -v "Done in"
66
+ $PRETTIER_CMD --write "$FILE_PATH" 2>&1 | grep -v "run v" | grep -v "Done in"
66
67
 
67
68
  # Check the exit status
68
69
  if [ ${PIPESTATUS[0]} -eq 0 ]; then
@@ -41,15 +41,17 @@ esac
41
41
 
42
42
  cd "$CLAUDE_PROJECT_DIR" || exit 0
43
43
 
44
- # Detect package manager
45
- if [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
46
- PKG_MANAGER="bun"
44
+ # Resolve ESLint binary — prefer local node_modules/.bin, then package-manager exec
45
+ if [ -x "./node_modules/.bin/eslint" ]; then
46
+ ESLINT_CMD="./node_modules/.bin/eslint"
47
+ elif [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
48
+ ESLINT_CMD="bunx eslint"
47
49
  elif [ -f "pnpm-lock.yaml" ]; then
48
- PKG_MANAGER="pnpm"
50
+ ESLINT_CMD="pnpm exec eslint"
49
51
  elif [ -f "yarn.lock" ]; then
50
- PKG_MANAGER="yarn"
52
+ ESLINT_CMD="yarn exec eslint"
51
53
  else
52
- PKG_MANAGER="npm"
54
+ ESLINT_CMD="npx eslint"
53
55
  fi
54
56
 
55
57
  # Run ESLint with --fix --quiet --cache on the specific file
@@ -60,7 +62,7 @@ fi
60
62
  echo "Running ESLint --fix on: $FILE_PATH"
61
63
 
62
64
  # First pass: attempt auto-fix
63
- OUTPUT=$($PKG_MANAGER eslint --fix --quiet --cache --rule '@typescript-eslint/no-unused-vars: off' "$FILE_PATH" 2>&1)
65
+ OUTPUT=$($ESLINT_CMD --fix --quiet --cache --rule '@typescript-eslint/no-unused-vars: off' "$FILE_PATH" 2>&1)
64
66
  FIX_EXIT=$?
65
67
 
66
68
  if [ $FIX_EXIT -eq 0 ]; then
@@ -69,7 +71,7 @@ if [ $FIX_EXIT -eq 0 ]; then
69
71
  fi
70
72
 
71
73
  # Auto-fix resolved some issues but errors remain — re-run to get remaining errors
72
- OUTPUT=$($PKG_MANAGER eslint --quiet --cache "$FILE_PATH" 2>&1)
74
+ OUTPUT=$($ESLINT_CMD --quiet --cache "$FILE_PATH" 2>&1)
73
75
  LINT_EXIT=$?
74
76
 
75
77
  if [ $LINT_EXIT -eq 0 ]; then
@@ -43,26 +43,27 @@ esac
43
43
  # Change to the project directory to ensure package manager commands work
44
44
  cd "$CLAUDE_PROJECT_DIR" || exit 0
45
45
 
46
- # Detect package manager based on lock file presence
47
- detect_package_manager() {
48
- if [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
49
- echo "bun"
50
- elif [ -f "pnpm-lock.yaml" ]; then
51
- echo "pnpm"
52
- elif [ -f "yarn.lock" ]; then
53
- echo "yarn"
54
- elif [ -f "package-lock.json" ]; then
55
- echo "npm"
56
- else
57
- echo "npm" # Default fallback
58
- fi
59
- }
60
-
61
- PKG_MANAGER=$(detect_package_manager)
46
+ # Resolve Prettier binary prefer local node_modules/.bin, then package-manager exec
47
+ if [ -x "./node_modules/.bin/prettier" ]; then
48
+ PRETTIER_CMD="./node_modules/.bin/prettier"
49
+ PKG_MANAGER="npm"
50
+ elif [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
51
+ PRETTIER_CMD="bunx prettier"
52
+ PKG_MANAGER="bun"
53
+ elif [ -f "pnpm-lock.yaml" ]; then
54
+ PRETTIER_CMD="pnpm exec prettier"
55
+ PKG_MANAGER="pnpm"
56
+ elif [ -f "yarn.lock" ]; then
57
+ PRETTIER_CMD="yarn exec prettier"
58
+ PKG_MANAGER="yarn"
59
+ else
60
+ PRETTIER_CMD="npx prettier"
61
+ PKG_MANAGER="npm"
62
+ fi
62
63
 
63
64
  # Run Prettier on the specific file
64
65
  echo "🎨 Running Prettier on: $FILE_PATH"
65
- $PKG_MANAGER prettier --write "$FILE_PATH" 2>&1 | grep -v "run v" | grep -v "Done in"
66
+ $PRETTIER_CMD --write "$FILE_PATH" 2>&1 | grep -v "run v" | grep -v "Done in"
66
67
 
67
68
  # Check the exit status
68
69
  if [ ${PIPESTATUS[0]} -eq 0 ]; then
@@ -41,15 +41,17 @@ esac
41
41
 
42
42
  cd "$CLAUDE_PROJECT_DIR" || exit 0
43
43
 
44
- # Detect package manager
45
- if [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
46
- PKG_MANAGER="bun"
44
+ # Resolve ESLint binary — prefer local node_modules/.bin, then package-manager exec
45
+ if [ -x "./node_modules/.bin/eslint" ]; then
46
+ ESLINT_CMD="./node_modules/.bin/eslint"
47
+ elif [ -f "bun.lockb" ] || [ -f "bun.lock" ]; then
48
+ ESLINT_CMD="bunx eslint"
47
49
  elif [ -f "pnpm-lock.yaml" ]; then
48
- PKG_MANAGER="pnpm"
50
+ ESLINT_CMD="pnpm exec eslint"
49
51
  elif [ -f "yarn.lock" ]; then
50
- PKG_MANAGER="yarn"
52
+ ESLINT_CMD="yarn exec eslint"
51
53
  else
52
- PKG_MANAGER="npm"
54
+ ESLINT_CMD="npx eslint"
53
55
  fi
54
56
 
55
57
  # Run ESLint with --fix --quiet --cache on the specific file
@@ -60,7 +62,7 @@ fi
60
62
  echo "Running ESLint --fix on: $FILE_PATH"
61
63
 
62
64
  # First pass: attempt auto-fix
63
- OUTPUT=$($PKG_MANAGER eslint --fix --quiet --cache --rule '@typescript-eslint/no-unused-vars: off' "$FILE_PATH" 2>&1)
65
+ OUTPUT=$($ESLINT_CMD --fix --quiet --cache --rule '@typescript-eslint/no-unused-vars: off' "$FILE_PATH" 2>&1)
64
66
  FIX_EXIT=$?
65
67
 
66
68
  if [ $FIX_EXIT -eq 0 ]; then
@@ -69,7 +71,7 @@ if [ $FIX_EXIT -eq 0 ]; then
69
71
  fi
70
72
 
71
73
  # Auto-fix resolved some issues but errors remain — re-run to get remaining errors
72
- OUTPUT=$($PKG_MANAGER eslint --quiet --cache "$FILE_PATH" 2>&1)
74
+ OUTPUT=$($ESLINT_CMD --quiet --cache "$FILE_PATH" 2>&1)
73
75
  LINT_EXIT=$?
74
76
 
75
77
  if [ $LINT_EXIT -eq 0 ]; then