@codyswann/lisa 3.45.4 → 3.45.6

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 (66) hide show
  1. package/all/copy-overwrite/scripts/check-state-classification.mjs +61 -9
  2. package/all/copy-overwrite/scripts/lisa-environment-prepare.mjs +25 -2
  3. package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +12 -2
  4. package/all/copy-overwrite/scripts/lisa-work-item.mjs +28 -2
  5. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  6. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  7. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  8. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  9. package/dist/core/upstream-evidence-manifest.js +7 -6
  10. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  11. package/package.json +1 -1
  12. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa/hooks/block-managed-file-edits.sh +12 -2
  15. package/plugins/lisa-agy/plugin.json +1 -1
  16. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  19. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +12 -2
  23. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +12 -2
  25. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo-agy/plugin.json +1 -1
  28. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  48. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails-agy/plugin.json +1 -1
  53. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  58. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  63. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/src/base/hooks/block-managed-file-edits.sh +12 -2
  66. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +25 -1
package/package.json CHANGED
@@ -132,7 +132,7 @@
132
132
  "ws": ">=8.21.0"
133
133
  },
134
134
  "name": "@codyswann/lisa",
135
- "version": "3.45.4",
135
+ "version": "3.45.6",
136
136
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
137
137
  "main": "dist/index.js",
138
138
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -141,14 +141,24 @@ lisaignored() {
141
141
  ;;
142
142
  esac
143
143
  if [ "$selected" -ne 0 ]; then
144
- # shellcheck disable=SC2254 -- the pattern is a glob on purpose.
144
+ # The pattern is a glob on purpose, so it is deliberately unquoted.
145
+ #
146
+ # The reason sits on its own line because a shellcheck directive is
147
+ # `key=value` pairs and NOTHING else. Written as
148
+ # `disable=SC2254 -- <prose>`, the trailing words are read as more
149
+ # directive keys: the directive fails with SC1072/SC1073, shellcheck
150
+ # stops checking the rest of THIS FILE, and SC2254 is left unsuppressed
151
+ # as well. Measured with shellcheck 0.11.0. Do not rejoin these lines.
152
+ # shellcheck disable=SC2254
145
153
  case "$rel" in $pattern) selected=0 ;; esac
146
154
  fi
147
155
  if [ "$selected" -ne 0 ]; then
148
156
  case "$pattern" in
149
157
  */*) ;;
150
158
  *)
151
- # shellcheck disable=SC2254 -- ditto, matched against the basename.
159
+ # Ditto, matched against the basename — and ditto about the reason
160
+ # living on its own line rather than after the directive.
161
+ # shellcheck disable=SC2254
152
162
  case "${rel##*/}" in $pattern) selected=0 ;; esac
153
163
  ;;
154
164
  esac
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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": "3.45.4",
3
+ "version": "3.45.6",
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-cdk",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-cdk",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-cdk",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -141,14 +141,24 @@ lisaignored() {
141
141
  ;;
142
142
  esac
143
143
  if [ "$selected" -ne 0 ]; then
144
- # shellcheck disable=SC2254 -- the pattern is a glob on purpose.
144
+ # The pattern is a glob on purpose, so it is deliberately unquoted.
145
+ #
146
+ # The reason sits on its own line because a shellcheck directive is
147
+ # `key=value` pairs and NOTHING else. Written as
148
+ # `disable=SC2254 -- <prose>`, the trailing words are read as more
149
+ # directive keys: the directive fails with SC1072/SC1073, shellcheck
150
+ # stops checking the rest of THIS FILE, and SC2254 is left unsuppressed
151
+ # as well. Measured with shellcheck 0.11.0. Do not rejoin these lines.
152
+ # shellcheck disable=SC2254
145
153
  case "$rel" in $pattern) selected=0 ;; esac
146
154
  fi
147
155
  if [ "$selected" -ne 0 ]; then
148
156
  case "$pattern" in
149
157
  */*) ;;
150
158
  *)
151
- # shellcheck disable=SC2254 -- ditto, matched against the basename.
159
+ # Ditto, matched against the basename — and ditto about the reason
160
+ # living on its own line rather than after the directive.
161
+ # shellcheck disable=SC2254
152
162
  case "${rel##*/}" in $pattern) selected=0 ;; esac
153
163
  ;;
154
164
  esac
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -141,14 +141,24 @@ lisaignored() {
141
141
  ;;
142
142
  esac
143
143
  if [ "$selected" -ne 0 ]; then
144
- # shellcheck disable=SC2254 -- the pattern is a glob on purpose.
144
+ # The pattern is a glob on purpose, so it is deliberately unquoted.
145
+ #
146
+ # The reason sits on its own line because a shellcheck directive is
147
+ # `key=value` pairs and NOTHING else. Written as
148
+ # `disable=SC2254 -- <prose>`, the trailing words are read as more
149
+ # directive keys: the directive fails with SC1072/SC1073, shellcheck
150
+ # stops checking the rest of THIS FILE, and SC2254 is left unsuppressed
151
+ # as well. Measured with shellcheck 0.11.0. Do not rejoin these lines.
152
+ # shellcheck disable=SC2254
145
153
  case "$rel" in $pattern) selected=0 ;; esac
146
154
  fi
147
155
  if [ "$selected" -ne 0 ]; then
148
156
  case "$pattern" in
149
157
  */*) ;;
150
158
  *)
151
- # shellcheck disable=SC2254 -- ditto, matched against the basename.
159
+ # Ditto, matched against the basename — and ditto about the reason
160
+ # living on its own line rather than after the directive.
161
+ # shellcheck disable=SC2254
152
162
  case "${rel##*/}" in $pattern) selected=0 ;; esac
153
163
  ;;
154
164
  esac
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-expo",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Expo and 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-expo",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-expo",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-expo",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-harper-fabric",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-nestjs",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-nestjs",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-nestjs",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-openclaw",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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": "3.45.4",
3
+ "version": "3.45.6",
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": "3.45.4",
3
+ "version": "3.45.6",
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": "3.45.4",
3
+ "version": "3.45.6",
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": "3.45.4",
3
+ "version": "3.45.6",
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-phaser",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-rails",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-rails",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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-rails",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
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": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, 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": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.45.4",
3
+ "version": "3.45.6",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -141,14 +141,24 @@ lisaignored() {
141
141
  ;;
142
142
  esac
143
143
  if [ "$selected" -ne 0 ]; then
144
- # shellcheck disable=SC2254 -- the pattern is a glob on purpose.
144
+ # The pattern is a glob on purpose, so it is deliberately unquoted.
145
+ #
146
+ # The reason sits on its own line because a shellcheck directive is
147
+ # `key=value` pairs and NOTHING else. Written as
148
+ # `disable=SC2254 -- <prose>`, the trailing words are read as more
149
+ # directive keys: the directive fails with SC1072/SC1073, shellcheck
150
+ # stops checking the rest of THIS FILE, and SC2254 is left unsuppressed
151
+ # as well. Measured with shellcheck 0.11.0. Do not rejoin these lines.
152
+ # shellcheck disable=SC2254
145
153
  case "$rel" in $pattern) selected=0 ;; esac
146
154
  fi
147
155
  if [ "$selected" -ne 0 ]; then
148
156
  case "$pattern" in
149
157
  */*) ;;
150
158
  *)
151
- # shellcheck disable=SC2254 -- ditto, matched against the basename.
159
+ # Ditto, matched against the basename — and ditto about the reason
160
+ # living on its own line rather than after the directive.
161
+ # shellcheck disable=SC2254
152
162
  case "${rel##*/}" in $pattern) selected=0 ;; esac
153
163
  ;;
154
164
  esac
@@ -2342,6 +2342,19 @@ export async function fetchAllJobs(api, runId, wait) {
2342
2342
  export async function fetchRequiredness(api, branch, gateContext, wait) {
2343
2343
  const unknown = detail =>
2344
2344
  Object.freeze({ state: REQUIREDNESS.unknown, detail, contexts: [] });
2345
+ // No context, no measurement. `resolveSettings` can no longer produce an
2346
+ // empty one, but this is the place where an empty one does its damage, and a
2347
+ // guard belongs where the harm lands as well as where it originates: matching
2348
+ // every required check against `""` yields zero matches, which is
2349
+ // indistinguishable from a branch that genuinely does not require this gate.
2350
+ // It is not a throw — §10.4 forbids the reporter becoming an outage — and it
2351
+ // is not `not_required`, because "nobody told me which check to look for" is
2352
+ // the third state this function already has.
2353
+ if (typeof gateContext !== "string" || gateContext.trim().length === 0) {
2354
+ return unknown(
2355
+ "no gate context was configured, so there is nothing to match required checks against — an unmatched empty context is not evidence that this gate is unrequired"
2356
+ );
2357
+ }
2345
2358
  let result;
2346
2359
  try {
2347
2360
  result = await apiGet(
@@ -2931,7 +2944,18 @@ export function resolveSettings(env) {
2931
2944
  // configured into silence by omitting a variable is the shape this file
2932
2945
  // refuses, but the REPORTER's equivalent risk is the opposite one: a
2933
2946
  // missing decoration must not stop the notification going out.
2934
- gateContext: (env.NIGHTLY_GATE_CONTEXT || DEFAULT_GATE_CONTEXT).trim(),
2947
+ // TRIMMED BEFORE THE FALLBACK, never after. `(env.X || DEFAULT).trim()`
2948
+ // read `NIGHTLY_GATE_CONTEXT=" "` as a configured value — whitespace is
2949
+ // truthy — so the fallback never fired and the context resolved to `""`.
2950
+ // An empty context matches no required check (`contextMatchesGate` can
2951
+ // satisfy neither half of its ` / ` test against it), so `fetchRequiredness`
2952
+ // answered `not_required` for a branch the gate really does guard, and the
2953
+ // run still exited successfully: a gate switching itself off and printing
2954
+ // green. Unset and whitespace-only come from the same place — an unfilled
2955
+ // workflow input — and now resolve the same way, which is what `branch` and
2956
+ // `suites` above already do.
2957
+ gateContext:
2958
+ (env.NIGHTLY_GATE_CONTEXT ?? "").trim() || DEFAULT_GATE_CONTEXT,
2935
2959
  // Opt-in. Pinning writes to a repository-wide, three-slot surface that
2936
2960
  // nothing else in this file touches, so it stays off until a caller asks.
2937
2961
  pinIssues: /^(1|true|yes)$/i.test(String(env.NIGHTLY_PIN_ISSUES ?? "")),