@codyswann/lisa 4.38.7 → 4.39.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/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +23 -1
- package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +23 -0
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +30 -1
- package/all/deletions.json +136 -1
- package/cdk/deletions.json +8 -1
- package/dist/core/config.d.ts +33 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/deletion-basis.d.ts +107 -0
- package/dist/core/deletion-basis.d.ts.map +1 -0
- package/dist/core/deletion-basis.js +81 -0
- package/dist/core/deletion-basis.js.map +1 -0
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +6 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +18 -0
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +19 -12
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/parity-safety-net.sh +23 -0
- package/expo/deletions.json +37 -1
- package/harper-fabric/deletions.json +6 -1
- package/nestjs/deletions.json +12 -1
- package/package.json +6 -5
- package/phaser/deletions.json +6 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/parity-safety-net.sh +23 -0
- package/plugins/lisa-agy/hooks/parity-safety-net.sh +23 -0
- 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-copilot/hooks/parity-safety-net.sh +23 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +23 -0
- 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/hooks/parity-safety-net.sh +23 -0
- package/rails/deletions.json +18 -1
- package/scripts/check-deletion-basis.mjs +126 -0
- package/typescript/deletions.json +48 -0
|
@@ -901,6 +901,7 @@ follow_scan() {
|
|
|
901
901
|
redirected=""
|
|
902
902
|
heredoc=0
|
|
903
903
|
stdin_mode=0
|
|
904
|
+
noexec=0
|
|
904
905
|
j=$((i + 1))
|
|
905
906
|
while [ "$j" -lt "$n" ]; do
|
|
906
907
|
follow_unwrap "${toks[j]}"
|
|
@@ -931,13 +932,35 @@ follow_scan() {
|
|
|
931
932
|
*) j=$((j + 1)) ;;
|
|
932
933
|
esac
|
|
933
934
|
;;
|
|
935
|
+
# `-n` is NOEXEC: the shell reads and parses its operand, then exits
|
|
936
|
+
# without running a line of it. So a syntax check is the one shape
|
|
937
|
+
# that puts a path at a command position while provably executing
|
|
938
|
+
# nothing, and following it reads a file the command never runs.
|
|
939
|
+
#
|
|
940
|
+
# This guard hit that on ITSELF: its pattern list is destructive
|
|
941
|
+
# command literals living inside the guard, so `bash -n` on its own
|
|
942
|
+
# source was refused by its own patterns — and the same held for any
|
|
943
|
+
# file documenting destructive commands. See CodySwannGT/lisa#3803.
|
|
944
|
+
#
|
|
945
|
+
# `bash <file>` still executes and is still followed. Noexec is the
|
|
946
|
+
# distinction, not the program: this is not a read-only exemption.
|
|
947
|
+
--noexec) noexec=1; break ;;
|
|
934
948
|
--*) j=$((j + 1)) ;;
|
|
935
949
|
-*c*) inline=1; j=$((j + 1)) ;;
|
|
950
|
+
-*n*) noexec=1; break ;;
|
|
936
951
|
-s | -[a-zA-Z]*s[a-zA-Z]*) stdin_mode=1; j=$((j + 1)) ;;
|
|
937
952
|
-*) j=$((j + 1)) ;;
|
|
938
953
|
*) break ;;
|
|
939
954
|
esac
|
|
940
955
|
done
|
|
956
|
+
if [ "$noexec" -eq 1 ]; then
|
|
957
|
+
# Nothing runs, so there is no script to follow and nothing to fail
|
|
958
|
+
# closed about. Checked before the heredoc and dispatcher arms: those
|
|
959
|
+
# decide WHICH text to read, and here there is no execution at all.
|
|
960
|
+
cmd_pos=0
|
|
961
|
+
i=$((j + 1))
|
|
962
|
+
continue
|
|
963
|
+
fi
|
|
941
964
|
if [ "$heredoc" -eq 1 ] && [ "$inline" -eq 0 ]; then
|
|
942
965
|
cmd_pos=0
|
|
943
966
|
i=$((j + 1))
|
package/expo/deletions.json
CHANGED
|
@@ -41,5 +41,41 @@
|
|
|
41
41
|
".github/workflows/build.yml",
|
|
42
42
|
".github/workflows/lighthouse.yml",
|
|
43
43
|
".github/workflows/zap-baseline-expo.yml"
|
|
44
|
-
]
|
|
44
|
+
],
|
|
45
|
+
"basis": {
|
|
46
|
+
".claude/agents/ops-specialist.md": "needs-review",
|
|
47
|
+
".claude/rules/expo-verification.md": "needs-review",
|
|
48
|
+
".claude/skills/apollo-client": "needs-review",
|
|
49
|
+
".claude/skills/atomic-design-gluestack": "needs-review",
|
|
50
|
+
".claude/skills/container-view-pattern": "needs-review",
|
|
51
|
+
".claude/skills/cross-platform-compatibility": "needs-review",
|
|
52
|
+
".claude/skills/directory-structure": "needs-review",
|
|
53
|
+
".claude/skills/expo-env-config": "needs-review",
|
|
54
|
+
".claude/skills/expo-router-best-practices": "needs-review",
|
|
55
|
+
".claude/skills/gluestack-nativewind": "needs-review",
|
|
56
|
+
".claude/skills/jira-add-journey": "needs-review",
|
|
57
|
+
".claude/skills/jira-create": "needs-review",
|
|
58
|
+
".claude/skills/jira-evidence": "needs-review",
|
|
59
|
+
".claude/skills/jira-journey": "needs-review",
|
|
60
|
+
".claude/skills/jira-verify": "needs-review",
|
|
61
|
+
".claude/skills/local-state": "needs-review",
|
|
62
|
+
".claude/skills/ops-browser-uat": "needs-review",
|
|
63
|
+
".claude/skills/ops-check-logs": "needs-review",
|
|
64
|
+
".claude/skills/ops-db-ops": "needs-review",
|
|
65
|
+
".claude/skills/ops-deploy": "needs-review",
|
|
66
|
+
".claude/skills/ops-monitor-errors": "needs-review",
|
|
67
|
+
".claude/skills/ops-performance": "needs-review",
|
|
68
|
+
".claude/skills/ops-run-local": "needs-review",
|
|
69
|
+
".claude/skills/ops-verify-health": "needs-review",
|
|
70
|
+
".claude/skills/owasp-zap": "needs-review",
|
|
71
|
+
".claude/skills/playwright-selectors": "needs-review",
|
|
72
|
+
".claude/skills/reduce-complexity": "needs-review",
|
|
73
|
+
".claude/skills/testing-library": "needs-review",
|
|
74
|
+
".github/workflows/zap-baseline.yml": "needs-review",
|
|
75
|
+
"eslint-plugin-component-structure": "needs-review",
|
|
76
|
+
"eslint-plugin-ui-standards": "needs-review",
|
|
77
|
+
"vitest.config.ts": "needs-review",
|
|
78
|
+
"vitest.config.local.ts": "needs-review",
|
|
79
|
+
"vitest.thresholds.json": "needs-review"
|
|
80
|
+
}
|
|
45
81
|
}
|
package/nestjs/deletions.json
CHANGED
|
@@ -14,5 +14,16 @@
|
|
|
14
14
|
"keep": [
|
|
15
15
|
".github/workflows/zap-baseline-nestjs.yml",
|
|
16
16
|
".github/workflows/load-test.yml"
|
|
17
|
-
]
|
|
17
|
+
],
|
|
18
|
+
"basis": {
|
|
19
|
+
".claude/skills/nestjs-graphql": "needs-review",
|
|
20
|
+
".claude/skills/nestjs-rules": "needs-review",
|
|
21
|
+
".claude/skills/security-zap-scan": "needs-review",
|
|
22
|
+
".claude/skills/typeorm-patterns": "needs-review",
|
|
23
|
+
".github/workflows/zap-baseline.yml": "needs-review",
|
|
24
|
+
"jest.config.ts": "needs-review",
|
|
25
|
+
"jest.config.local.ts": "needs-review",
|
|
26
|
+
"jest.nestjs.ts": "needs-review",
|
|
27
|
+
"jest.thresholds.json": "needs-review"
|
|
28
|
+
}
|
|
18
29
|
}
|
package/package.json
CHANGED
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
"check:nightly-guard-certificate": "node scripts/generate-nightly-e2e-guard-certificate.mjs --check",
|
|
56
56
|
"generate:two-channel-couplings": "bun scripts/generate-two-channel-couplings.ts",
|
|
57
57
|
"check:two-channel-couplings": "bun scripts/generate-two-channel-couplings.ts --check",
|
|
58
|
-
"check:
|
|
58
|
+
"check:deletion-basis": "node scripts/check-deletion-basis.mjs",
|
|
59
|
+
"check:artifacts": "status=0; bun run check:upstream-evidence-manifest || status=1; bun run check:lisa-owned-hash-ledger || status=1; bun run check:nightly-guard-certificate || status=1; bun run check:two-channel-couplings || status=1; bun run check:deletion-basis || status=1; exit $status",
|
|
59
60
|
"refresh:upstream-public-commits": "node scripts/generate-upstream-evidence-manifest.mjs --refresh-public-commits",
|
|
60
61
|
"check:rules-pairing": "bash scripts/check-rules-pairing.sh",
|
|
61
62
|
"check:pipeline-status-reads": "node scripts/check-pipeline-status-reads.mjs",
|
|
@@ -170,7 +171,7 @@
|
|
|
170
171
|
"zod-validation-error": "^4.0.0"
|
|
171
172
|
},
|
|
172
173
|
"name": "@codyswann/lisa",
|
|
173
|
-
"version": "4.
|
|
174
|
+
"version": "4.39.0",
|
|
174
175
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
175
176
|
"main": "dist/index.js",
|
|
176
177
|
"exports": {
|
|
@@ -318,7 +319,7 @@
|
|
|
318
319
|
"test": "tests"
|
|
319
320
|
},
|
|
320
321
|
"types": "./dist/index.d.ts",
|
|
321
|
-
"lisaReleaseCommit": "
|
|
322
|
-
"gitHead": "
|
|
323
|
-
"lisaReleaseTag": "v4.
|
|
322
|
+
"lisaReleaseCommit": "e7d63c1fa3c6f7f706b013daa00901b4701ef8d9",
|
|
323
|
+
"gitHead": "e7d63c1fa3c6f7f706b013daa00901b4701ef8d9",
|
|
324
|
+
"lisaReleaseTag": "v4.39.0"
|
|
324
325
|
}
|
package/phaser/deletions.json
CHANGED
|
@@ -901,6 +901,7 @@ follow_scan() {
|
|
|
901
901
|
redirected=""
|
|
902
902
|
heredoc=0
|
|
903
903
|
stdin_mode=0
|
|
904
|
+
noexec=0
|
|
904
905
|
j=$((i + 1))
|
|
905
906
|
while [ "$j" -lt "$n" ]; do
|
|
906
907
|
follow_unwrap "${toks[j]}"
|
|
@@ -931,13 +932,35 @@ follow_scan() {
|
|
|
931
932
|
*) j=$((j + 1)) ;;
|
|
932
933
|
esac
|
|
933
934
|
;;
|
|
935
|
+
# `-n` is NOEXEC: the shell reads and parses its operand, then exits
|
|
936
|
+
# without running a line of it. So a syntax check is the one shape
|
|
937
|
+
# that puts a path at a command position while provably executing
|
|
938
|
+
# nothing, and following it reads a file the command never runs.
|
|
939
|
+
#
|
|
940
|
+
# This guard hit that on ITSELF: its pattern list is destructive
|
|
941
|
+
# command literals living inside the guard, so `bash -n` on its own
|
|
942
|
+
# source was refused by its own patterns — and the same held for any
|
|
943
|
+
# file documenting destructive commands. See CodySwannGT/lisa#3803.
|
|
944
|
+
#
|
|
945
|
+
# `bash <file>` still executes and is still followed. Noexec is the
|
|
946
|
+
# distinction, not the program: this is not a read-only exemption.
|
|
947
|
+
--noexec) noexec=1; break ;;
|
|
934
948
|
--*) j=$((j + 1)) ;;
|
|
935
949
|
-*c*) inline=1; j=$((j + 1)) ;;
|
|
950
|
+
-*n*) noexec=1; break ;;
|
|
936
951
|
-s | -[a-zA-Z]*s[a-zA-Z]*) stdin_mode=1; j=$((j + 1)) ;;
|
|
937
952
|
-*) j=$((j + 1)) ;;
|
|
938
953
|
*) break ;;
|
|
939
954
|
esac
|
|
940
955
|
done
|
|
956
|
+
if [ "$noexec" -eq 1 ]; then
|
|
957
|
+
# Nothing runs, so there is no script to follow and nothing to fail
|
|
958
|
+
# closed about. Checked before the heredoc and dispatcher arms: those
|
|
959
|
+
# decide WHICH text to read, and here there is no execution at all.
|
|
960
|
+
cmd_pos=0
|
|
961
|
+
i=$((j + 1))
|
|
962
|
+
continue
|
|
963
|
+
fi
|
|
941
964
|
if [ "$heredoc" -eq 1 ] && [ "$inline" -eq 0 ]; then
|
|
942
965
|
cmd_pos=0
|
|
943
966
|
i=$((j + 1))
|
|
@@ -901,6 +901,7 @@ follow_scan() {
|
|
|
901
901
|
redirected=""
|
|
902
902
|
heredoc=0
|
|
903
903
|
stdin_mode=0
|
|
904
|
+
noexec=0
|
|
904
905
|
j=$((i + 1))
|
|
905
906
|
while [ "$j" -lt "$n" ]; do
|
|
906
907
|
follow_unwrap "${toks[j]}"
|
|
@@ -931,13 +932,35 @@ follow_scan() {
|
|
|
931
932
|
*) j=$((j + 1)) ;;
|
|
932
933
|
esac
|
|
933
934
|
;;
|
|
935
|
+
# `-n` is NOEXEC: the shell reads and parses its operand, then exits
|
|
936
|
+
# without running a line of it. So a syntax check is the one shape
|
|
937
|
+
# that puts a path at a command position while provably executing
|
|
938
|
+
# nothing, and following it reads a file the command never runs.
|
|
939
|
+
#
|
|
940
|
+
# This guard hit that on ITSELF: its pattern list is destructive
|
|
941
|
+
# command literals living inside the guard, so `bash -n` on its own
|
|
942
|
+
# source was refused by its own patterns — and the same held for any
|
|
943
|
+
# file documenting destructive commands. See CodySwannGT/lisa#3803.
|
|
944
|
+
#
|
|
945
|
+
# `bash <file>` still executes and is still followed. Noexec is the
|
|
946
|
+
# distinction, not the program: this is not a read-only exemption.
|
|
947
|
+
--noexec) noexec=1; break ;;
|
|
934
948
|
--*) j=$((j + 1)) ;;
|
|
935
949
|
-*c*) inline=1; j=$((j + 1)) ;;
|
|
950
|
+
-*n*) noexec=1; break ;;
|
|
936
951
|
-s | -[a-zA-Z]*s[a-zA-Z]*) stdin_mode=1; j=$((j + 1)) ;;
|
|
937
952
|
-*) j=$((j + 1)) ;;
|
|
938
953
|
*) break ;;
|
|
939
954
|
esac
|
|
940
955
|
done
|
|
956
|
+
if [ "$noexec" -eq 1 ]; then
|
|
957
|
+
# Nothing runs, so there is no script to follow and nothing to fail
|
|
958
|
+
# closed about. Checked before the heredoc and dispatcher arms: those
|
|
959
|
+
# decide WHICH text to read, and here there is no execution at all.
|
|
960
|
+
cmd_pos=0
|
|
961
|
+
i=$((j + 1))
|
|
962
|
+
continue
|
|
963
|
+
fi
|
|
941
964
|
if [ "$heredoc" -eq 1 ] && [ "$inline" -eq 0 ]; then
|
|
942
965
|
cmd_pos=0
|
|
943
966
|
i=$((j + 1))
|
|
@@ -901,6 +901,7 @@ follow_scan() {
|
|
|
901
901
|
redirected=""
|
|
902
902
|
heredoc=0
|
|
903
903
|
stdin_mode=0
|
|
904
|
+
noexec=0
|
|
904
905
|
j=$((i + 1))
|
|
905
906
|
while [ "$j" -lt "$n" ]; do
|
|
906
907
|
follow_unwrap "${toks[j]}"
|
|
@@ -931,13 +932,35 @@ follow_scan() {
|
|
|
931
932
|
*) j=$((j + 1)) ;;
|
|
932
933
|
esac
|
|
933
934
|
;;
|
|
935
|
+
# `-n` is NOEXEC: the shell reads and parses its operand, then exits
|
|
936
|
+
# without running a line of it. So a syntax check is the one shape
|
|
937
|
+
# that puts a path at a command position while provably executing
|
|
938
|
+
# nothing, and following it reads a file the command never runs.
|
|
939
|
+
#
|
|
940
|
+
# This guard hit that on ITSELF: its pattern list is destructive
|
|
941
|
+
# command literals living inside the guard, so `bash -n` on its own
|
|
942
|
+
# source was refused by its own patterns — and the same held for any
|
|
943
|
+
# file documenting destructive commands. See CodySwannGT/lisa#3803.
|
|
944
|
+
#
|
|
945
|
+
# `bash <file>` still executes and is still followed. Noexec is the
|
|
946
|
+
# distinction, not the program: this is not a read-only exemption.
|
|
947
|
+
--noexec) noexec=1; break ;;
|
|
934
948
|
--*) j=$((j + 1)) ;;
|
|
935
949
|
-*c*) inline=1; j=$((j + 1)) ;;
|
|
950
|
+
-*n*) noexec=1; break ;;
|
|
936
951
|
-s | -[a-zA-Z]*s[a-zA-Z]*) stdin_mode=1; j=$((j + 1)) ;;
|
|
937
952
|
-*) j=$((j + 1)) ;;
|
|
938
953
|
*) break ;;
|
|
939
954
|
esac
|
|
940
955
|
done
|
|
956
|
+
if [ "$noexec" -eq 1 ]; then
|
|
957
|
+
# Nothing runs, so there is no script to follow and nothing to fail
|
|
958
|
+
# closed about. Checked before the heredoc and dispatcher arms: those
|
|
959
|
+
# decide WHICH text to read, and here there is no execution at all.
|
|
960
|
+
cmd_pos=0
|
|
961
|
+
i=$((j + 1))
|
|
962
|
+
continue
|
|
963
|
+
fi
|
|
941
964
|
if [ "$heredoc" -eq 1 ] && [ "$inline" -eq 0 ]; then
|
|
942
965
|
cmd_pos=0
|
|
943
966
|
i=$((j + 1))
|
|
@@ -901,6 +901,7 @@ follow_scan() {
|
|
|
901
901
|
redirected=""
|
|
902
902
|
heredoc=0
|
|
903
903
|
stdin_mode=0
|
|
904
|
+
noexec=0
|
|
904
905
|
j=$((i + 1))
|
|
905
906
|
while [ "$j" -lt "$n" ]; do
|
|
906
907
|
follow_unwrap "${toks[j]}"
|
|
@@ -931,13 +932,35 @@ follow_scan() {
|
|
|
931
932
|
*) j=$((j + 1)) ;;
|
|
932
933
|
esac
|
|
933
934
|
;;
|
|
935
|
+
# `-n` is NOEXEC: the shell reads and parses its operand, then exits
|
|
936
|
+
# without running a line of it. So a syntax check is the one shape
|
|
937
|
+
# that puts a path at a command position while provably executing
|
|
938
|
+
# nothing, and following it reads a file the command never runs.
|
|
939
|
+
#
|
|
940
|
+
# This guard hit that on ITSELF: its pattern list is destructive
|
|
941
|
+
# command literals living inside the guard, so `bash -n` on its own
|
|
942
|
+
# source was refused by its own patterns — and the same held for any
|
|
943
|
+
# file documenting destructive commands. See CodySwannGT/lisa#3803.
|
|
944
|
+
#
|
|
945
|
+
# `bash <file>` still executes and is still followed. Noexec is the
|
|
946
|
+
# distinction, not the program: this is not a read-only exemption.
|
|
947
|
+
--noexec) noexec=1; break ;;
|
|
934
948
|
--*) j=$((j + 1)) ;;
|
|
935
949
|
-*c*) inline=1; j=$((j + 1)) ;;
|
|
950
|
+
-*n*) noexec=1; break ;;
|
|
936
951
|
-s | -[a-zA-Z]*s[a-zA-Z]*) stdin_mode=1; j=$((j + 1)) ;;
|
|
937
952
|
-*) j=$((j + 1)) ;;
|
|
938
953
|
*) break ;;
|
|
939
954
|
esac
|
|
940
955
|
done
|
|
956
|
+
if [ "$noexec" -eq 1 ]; then
|
|
957
|
+
# Nothing runs, so there is no script to follow and nothing to fail
|
|
958
|
+
# closed about. Checked before the heredoc and dispatcher arms: those
|
|
959
|
+
# decide WHICH text to read, and here there is no execution at all.
|
|
960
|
+
cmd_pos=0
|
|
961
|
+
i=$((j + 1))
|
|
962
|
+
continue
|
|
963
|
+
fi
|
|
941
964
|
if [ "$heredoc" -eq 1 ] && [ "$inline" -eq 0 ]; then
|
|
942
965
|
cmd_pos=0
|
|
943
966
|
i=$((j + 1))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.39.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": "4.
|
|
3
|
+
"version": "4.39.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": "4.
|
|
3
|
+
"version": "4.39.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": "4.
|
|
3
|
+
"version": "4.39.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": "4.
|
|
3
|
+
"version": "4.39.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"
|