@codyswann/lisa 2.334.0 → 2.335.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/lisa-enforcement-fallback.sh +32 -9
- package/all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh +139 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +12 -4
- package/dist/core/upstream-evidence-manifest.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-setup-sonar/SKILL.md +45 -0
- package/plugins/lisa/hooks/sonar-secrets.sh +139 -0
- package/plugins/lisa/skills/lisa-setup-sonar/SKILL.md +45 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-sonar/SKILL.md +45 -0
- 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/sonar-secrets.sh +139 -0
- package/plugins/lisa-copilot/skills/lisa-setup-sonar/SKILL.md +45 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/sonar-secrets.sh +139 -0
- package/plugins/lisa-cursor/skills/lisa-setup-sonar/SKILL.md +45 -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/sonar-secrets.sh +139 -0
- package/plugins/src/base/skills/lisa-setup-sonar/SKILL.md +45 -0
- package/scripts/build-plugins.sh +14 -0
- package/scripts/lisa-enforcement-fallback.sh +32 -9
|
@@ -24,16 +24,39 @@ payload="$(cat)"
|
|
|
24
24
|
repo_root="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null)}"
|
|
25
25
|
[ -n "$repo_root" ] || exit 0
|
|
26
26
|
|
|
27
|
-
#
|
|
28
|
-
# guard twice and print every refusal twice. Absence is the interesting case and
|
|
29
|
-
# the only one this exists for.
|
|
27
|
+
# There is deliberately no skip here, and that is the whole point.
|
|
30
28
|
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
# This used to stand down when `installed_plugins.json` mentioned `lisa@lisa`,
|
|
30
|
+
# to avoid running every guard twice on a developer machine. The question that
|
|
31
|
+
# has to be answered is "are the plugin's guards running in this session?" and
|
|
32
|
+
# the file being consulted answers "has this plugin ever been installed, for any
|
|
33
|
+
# project, on this machine?". Those come apart three ways, and in each one both
|
|
34
|
+
# layers were off:
|
|
35
|
+
#
|
|
36
|
+
# - Project-blind. The registry is keyed by plugin with an array of per-project
|
|
37
|
+
# entries, so the grep matched the key. One project installing Lisa disabled
|
|
38
|
+
# the fallback for every other project on the machine.
|
|
39
|
+
# - Enablement-blind. `enabledPlugins` can set a plugin to false without
|
|
40
|
+
# removing its registry entry, so the plugin guards were off while this file
|
|
41
|
+
# believed they were on.
|
|
42
|
+
# - Session-blind. Hooks load at session start; the registry is written on any
|
|
43
|
+
# install or update. A plugin updated four minutes into a session leaves the
|
|
44
|
+
# registry saying "installed" for the rest of it, with no plugin hooks
|
|
45
|
+
# loaded. That is the one that was caught in the wild: a write to AGENTS.md
|
|
46
|
+
# went through in a session where both guard copies exit 2 for that exact
|
|
47
|
+
# payload.
|
|
48
|
+
#
|
|
49
|
+
# The first two are fixable with a better lookup. The third is not: plugin-hook
|
|
50
|
+
# liveness is not observable from a repository hook. CLAUDE_PLUGIN_ROOT is set
|
|
51
|
+
# only for plugin hooks, and nothing on disk distinguishes "registered" from
|
|
52
|
+
# "loaded into this session". Any check against a file answers a different
|
|
53
|
+
# question and will drift from the real one again.
|
|
54
|
+
#
|
|
55
|
+
# So the guards run unconditionally. On a machine where the plugin hooks are also
|
|
56
|
+
# live that costs a duplicated sweep (~170ms) and a refusal printed twice, and
|
|
57
|
+
# that is the correct trade against enforcement silently switching itself off.
|
|
58
|
+
# Recovering it belongs in the guards — a marker keyed on session and payload, so
|
|
59
|
+
# whichever layer fires first does the work — not in a liveness guess here.
|
|
37
60
|
|
|
38
61
|
# Where the guards live depends on which repository this is.
|
|
39
62
|
#
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Shared wrapper around `sonar hook <event>` for every agent surface.
|
|
4
|
+
#
|
|
5
|
+
# `sonar integrate <agent>` generates a five-line shim per surface: if `sonar` is
|
|
6
|
+
# on PATH, pipe the hook payload to it and let whatever comes back stand. That is
|
|
7
|
+
# correct for the thing the scanner exists to do — refusing a prompt or a file
|
|
8
|
+
# read that genuinely contains a credential — and wrong for the thing it also
|
|
9
|
+
# does, which is refusing *everything* when the CLI has no token yet:
|
|
10
|
+
#
|
|
11
|
+
# {"decision":"block","reason":"SonarQube secret scanning is inactive:
|
|
12
|
+
# not authenticated. Run 'sonar auth login'."}
|
|
13
|
+
#
|
|
14
|
+
# At the shim level that reply is indistinguishable from a real finding, so a
|
|
15
|
+
# workstation that had simply never run the browser login could not submit a
|
|
16
|
+
# prompt at all. Two things are wrong with that, and this wrapper fixes both.
|
|
17
|
+
#
|
|
18
|
+
# 1. The credential is usually already provisioned. A project that declares
|
|
19
|
+
# SONARQUBE_CLI_TOKEN under `secrets.require` has it in its configured
|
|
20
|
+
# provider — and the CLI reads only the environment and the OS keychain, so on
|
|
21
|
+
# a local surface (which deliberately materializes nothing to disk) the value
|
|
22
|
+
# is present and unreachable at the same time. We resolve it through
|
|
23
|
+
# lisa-secrets-access, the one sanctioned reader, and only when the CLI says
|
|
24
|
+
# it needs it.
|
|
25
|
+
#
|
|
26
|
+
# 2. An unauthenticated scanner is a degraded gate, not a breach. This hook is
|
|
27
|
+
# one of several overlapping layers: secret scanning at commit time and in CI
|
|
28
|
+
# does not depend on it. Blocking every prompt to protect a redundant layer
|
|
29
|
+
# trades a certain outage for a hypothetical leak — and the outage lands on
|
|
30
|
+
# exactly the person least able to diagnose it, since the block fires before
|
|
31
|
+
# their first prompt is ever seen.
|
|
32
|
+
#
|
|
33
|
+
# A real finding still blocks. Only the "inactive" reply is downgraded, and the
|
|
34
|
+
# distinction is drawn on the reason text the vendor emits, so a detection that
|
|
35
|
+
# arrives while unauthenticated is impossible by construction — in that state the
|
|
36
|
+
# scanner does not scan at all.
|
|
37
|
+
#
|
|
38
|
+
# Usage: sonar-secrets.sh <vendor-event-name> # hook payload on stdin
|
|
39
|
+
set -uo pipefail
|
|
40
|
+
|
|
41
|
+
event="${1:-}"
|
|
42
|
+
[ -n "$event" ] || exit 0
|
|
43
|
+
|
|
44
|
+
# Nothing installed, nothing to enforce. Matches the vendor shim's own guard.
|
|
45
|
+
command -v sonar >/dev/null 2>&1 || exit 0
|
|
46
|
+
|
|
47
|
+
# An explicit off switch, for bisecting a session that is misbehaving. There is
|
|
48
|
+
# deliberately no way to turn the *blocking* back on from the environment: the
|
|
49
|
+
# decision that a missing token must not stop work belongs in this file, where it
|
|
50
|
+
# is reviewable, not in whatever shell happened to launch the agent.
|
|
51
|
+
[ "${LISA_SONAR_HOOK:-on}" = "off" ] && exit 0
|
|
52
|
+
|
|
53
|
+
payload="$(cat)"
|
|
54
|
+
|
|
55
|
+
# The vendor signals its verdict as JSON on stdout and always exits 0, so the
|
|
56
|
+
# exit code carries no information and the reason text is the only channel.
|
|
57
|
+
inactive_marker='secret scanning is inactive'
|
|
58
|
+
|
|
59
|
+
run_scanner() {
|
|
60
|
+
printf '%s' "$payload" | sonar hook "$event" 2>/dev/null
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
is_inactive() {
|
|
64
|
+
case "$1" in
|
|
65
|
+
*"$inactive_marker"*) return 0 ;;
|
|
66
|
+
*) return 1 ;;
|
|
67
|
+
esac
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Run the resolver with a ceiling, because the provider call crosses the network
|
|
71
|
+
# and this sits in front of every prompt and every file read. `timeout` is not
|
|
72
|
+
# present on a stock macOS, so this is the portable equivalent: start it, poll,
|
|
73
|
+
# give up. Giving up is safe — the caller treats an empty value as "the provider
|
|
74
|
+
# had nothing", which lands on the warn path rather than a block.
|
|
75
|
+
resolve_secret() {
|
|
76
|
+
local resolver="$1" name="$2" out pid waited=0
|
|
77
|
+
out="$(mktemp)" || return 0
|
|
78
|
+
node "$resolver" get "$name" >"$out" 2>/dev/null &
|
|
79
|
+
pid=$!
|
|
80
|
+
while kill -0 "$pid" 2>/dev/null; do
|
|
81
|
+
[ "$waited" -ge 10 ] && { kill -9 "$pid" 2>/dev/null; break; }
|
|
82
|
+
sleep 1
|
|
83
|
+
waited=$((waited + 1))
|
|
84
|
+
done
|
|
85
|
+
wait "$pid" 2>/dev/null
|
|
86
|
+
cat "$out"
|
|
87
|
+
rm -f "$out"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
out="$(run_scanner)"
|
|
91
|
+
|
|
92
|
+
if is_inactive "$out"; then
|
|
93
|
+
# Where lisa-secrets-access lives depends on how the project receives Lisa.
|
|
94
|
+
# Claude and Codex get it as an installed plugin, which is not part of a clone;
|
|
95
|
+
# the agent skill directories and node_modules are what a fresh checkout
|
|
96
|
+
# actually has. Same search order as the remote-env setup script, including the
|
|
97
|
+
# `plugins/` rung that exists only in the Lisa monorepo itself.
|
|
98
|
+
repo_root="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
|
|
99
|
+
resolver=""
|
|
100
|
+
for candidate in \
|
|
101
|
+
"$repo_root/.claude/skills/lisa-secrets-access/scripts/resolve-secret.mjs" \
|
|
102
|
+
"$repo_root/.agents/skills/lisa-secrets-access/scripts/resolve-secret.mjs" \
|
|
103
|
+
"$repo_root/.codex/skills/lisa-secrets-access/scripts/resolve-secret.mjs" \
|
|
104
|
+
"$repo_root/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-secret.mjs" \
|
|
105
|
+
"$repo_root/node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-secret.mjs"; do
|
|
106
|
+
if [ -f "$candidate" ]; then
|
|
107
|
+
resolver="$candidate"
|
|
108
|
+
break
|
|
109
|
+
fi
|
|
110
|
+
done
|
|
111
|
+
|
|
112
|
+
if [ -n "$resolver" ] && command -v node >/dev/null 2>&1; then
|
|
113
|
+
token="$(resolve_secret "$resolver" SONARQUBE_CLI_TOKEN)"
|
|
114
|
+
if [ -n "$token" ]; then
|
|
115
|
+
# Exported into this process only. Writing it anywhere durable would create
|
|
116
|
+
# a second live copy of a credential whose single store is the provider —
|
|
117
|
+
# see the one-store rule in lisa-secrets-access.
|
|
118
|
+
export SONARQUBE_CLI_TOKEN="$token"
|
|
119
|
+
org="$(resolve_secret "$resolver" SONARQUBE_CLI_ORG)"
|
|
120
|
+
[ -n "$org" ] && export SONARQUBE_CLI_ORG="$org"
|
|
121
|
+
out="$(run_scanner)"
|
|
122
|
+
fi
|
|
123
|
+
unset token org
|
|
124
|
+
fi
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
if is_inactive "$out"; then
|
|
128
|
+
# stderr on a zero exit is advisory in every agent's hook protocol: the user
|
|
129
|
+
# sees it, the operation proceeds.
|
|
130
|
+
echo "sonar: local secret scanning is inactive (no token in the environment," >&2
|
|
131
|
+
echo " the OS keychain, or the configured secrets provider). Continuing —" >&2
|
|
132
|
+
echo " commit-time and CI secret scanning still gate this repository." >&2
|
|
133
|
+
echo " To restore it: 'sonar auth login', or store SONARQUBE_CLI_TOKEN in" >&2
|
|
134
|
+
echo " the project's secrets provider." >&2
|
|
135
|
+
exit 0
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
[ -n "$out" ] && printf '%s' "$out"
|
|
139
|
+
exit 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgqEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAmsNjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
4
4
|
"all/copy-contents/.gitattributes": "9d3831007e681186a3673e1037ef3fc82980cab2fc04e27c0868e562912c9e9f",
|
|
5
5
|
"all/copy-contents/gitignore": "2dbf7fd2f2020fc7824c432342002d9ca3ebb57b2872e761b14e942b23479a11",
|
|
6
|
-
"all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "
|
|
6
|
+
"all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "d7d88e44763694bed5eae998cd3663922c957e49f9f9621d9201f0417a4128ad",
|
|
7
7
|
"all/copy-overwrite/scripts/lisa-floor-collisions.mjs": "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
|
|
8
8
|
"all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh": "8996e0bcbf1db085a5d99734e797c91f5025997bd967bc374efff8348dac14c2",
|
|
9
9
|
"all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "a6ed91576efebb6ba40cfa4e9d8a3e8566314909210ae8d5860be62a3feb4cff",
|
|
10
10
|
"all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": "3b5f074f3ab5708030af507eea962389f3b067c5dbdc76580bd9e44d3ac6c603",
|
|
11
11
|
"all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "062c69eea85157f1e941ec3626d8912aa9f182af6ccdbe19687588a6074db5ce",
|
|
12
|
+
"all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh": "7a408788975a6351d53e14aa32bb9a5d161f33df9dfea59ba32784ae33a62e67",
|
|
12
13
|
"all/copy-overwrite/scripts/lisa-work-item.mjs": "6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
|
|
13
14
|
"all/create-only/.claude/rules/PROJECT_RULES.md": "6e1c7923ad2a15356babc60c97e7f97be728d790af285b6a7cd7d1b4d39cd97f",
|
|
14
15
|
"all/create-only/.lisaignore": "3c9827e7e98daa46510b5357cd6dd9406da1821e64cc46d2eea9f311cd6d06b9",
|
|
@@ -312,6 +313,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
312
313
|
"plugins/src/base/hooks/parity-safety-net.sh": "062c69eea85157f1e941ec3626d8912aa9f182af6ccdbe19687588a6074db5ce",
|
|
313
314
|
"plugins/src/base/hooks/setup-jira-cli.sh": "a675f6b17ce7f0d6b9fb7daeba6d2bc59bcb48ef79b034076ea73b2b1e72ee09",
|
|
314
315
|
"plugins/src/base/hooks/shell-write-nudge.sh": "69839af423f8792b1e52c71097316c3264425553031627c0a2f9409a9d5becd0",
|
|
316
|
+
"plugins/src/base/hooks/sonar-secrets.sh": "7a408788975a6351d53e14aa32bb9a5d161f33df9dfea59ba32784ae33a62e67",
|
|
315
317
|
"plugins/src/base/hooks/threshold-ratchet-compare.mjs": "4535a145c5c5cbee13bdf970bc91d390a264043604e607288cdd6bf28de56192",
|
|
316
318
|
"plugins/src/base/hooks/threshold-ratchet-families.mjs": "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
|
|
317
319
|
"plugins/src/base/hooks/threshold-ratchet.mjs": "04f660131bf50864239eb09cbf4d9555e53921254f6ab45ff2b85c173e160901",
|
|
@@ -582,7 +584,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
582
584
|
"plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs": "aa703a3fcadd847594c694f458fc41edd39590dfabeddf4fed1546b73099f33f",
|
|
583
585
|
"plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs": "496de5aed034692fee421dc3a1fbad9f85ed9e1d0c83a1080f781a486d0274e6",
|
|
584
586
|
"plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": "82bc2a27a0a5afb2ff413a88365c619fd7f0eaada5de3ccabf2000938f0607a4",
|
|
585
|
-
"plugins/src/base/skills/lisa-setup-sonar/SKILL.md": "
|
|
587
|
+
"plugins/src/base/skills/lisa-setup-sonar/SKILL.md": "b18e07ae942f75aad5730c0535840ef5f7115072f1b6cc62afac83196b28d6a3",
|
|
586
588
|
"plugins/src/base/skills/lisa-setup-workstation/SKILL.md": "e57e64083c292f0402b704eeb647244be0f33ab17394a688bce57a1efd59f169",
|
|
587
589
|
"plugins/src/base/skills/lisa-setup-workstation/scripts/catalogue.mjs": "eb0b8ec8a5d4fd81402dcbf40e6ccb55eb5e0c960f11aa928e45b99de43fabbc",
|
|
588
590
|
"plugins/src/base/skills/lisa-setup-workstation/scripts/cli.mjs": "cb64e501a6e8bf0b12fd865aa0be3407f54c5a08537a36dc71d2ead4764f5da0",
|
|
@@ -970,7 +972,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
970
972
|
"rails/deletions.json": "eeadf9a2b1677913199a235091a8d6190477f3e2a5fd598d62cf658cb59a8099",
|
|
971
973
|
"rails/github-rulesets/quality-checks.json": "0ec1c366589edbaa6b8f45f940cef3ada5ed7b1a956d98d3fa6034b0f78fbc7c",
|
|
972
974
|
"rails/merge/.claude/settings.json": "9c49f8c7c453f8749c90def3e22d412c3345c533d24b30dc7745ffa052ad6fa1",
|
|
973
|
-
"scripts/build-plugins.sh": "
|
|
975
|
+
"scripts/build-plugins.sh": "c584fab4c77a77facf70c38c4699d4ed27d46ae667c1e1ef644efc2c4c5a14c7",
|
|
974
976
|
"scripts/check-duplicate-versions.mjs": "84d97e94eb834522848ddce951bb54ae9da1e4be252e2c51fed0c01c4f4d6b72",
|
|
975
977
|
"scripts/check-learnings-budget.ts": "007430c2d6938efcc79ccbfd5717ebe2c7cf66b4de9a21a3e67b8db7f3600349",
|
|
976
978
|
"scripts/check-plugins-sync.sh": "3a99cbff0e8ec5e7c944690eae003a6d51b51c85436d77bd37faea4d553728af",
|
|
@@ -1006,7 +1008,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1006
1008
|
"scripts/lib/reusable-workflow-contract.d.mts": "791f01b55dd7a6b5d9a5f4cb9c44167caa146c2fc3c31a2ae4c2d8a350adc2f1",
|
|
1007
1009
|
"scripts/lib/reusable-workflow-contract.mjs": "134ee2a327290f066f1eb318b5ed53c711557c3e10ed462c00ff5c97cfb20863",
|
|
1008
1010
|
"scripts/lisa-commit-and-pr-local.sh": "605409c3ce6ec38ad3275604291a1ceae98f7807a605654263bc14f811c03903",
|
|
1009
|
-
"scripts/lisa-enforcement-fallback.sh": "
|
|
1011
|
+
"scripts/lisa-enforcement-fallback.sh": "d7d88e44763694bed5eae998cd3663922c957e49f9f9621d9201f0417a4128ad",
|
|
1010
1012
|
"scripts/lisa-github-environments.sh": "0a76e92f108519abaf3e29991299ec3b0db20ea533e69e6d2a53d802dba9c370",
|
|
1011
1013
|
"scripts/lisa-github-repo-settings.sh": "4afbccdfb08c62ba13afee42ec8561a28facf87c61f6f4b80000115328364d54",
|
|
1012
1014
|
"scripts/lisa-github-repo-setup.sh": "dc2f1c9d718aa34ba57161120d9319b5f78fe6b0b496d8e3c77226a08795aa36",
|
|
@@ -1257,6 +1259,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
1257
1259
|
"all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": true,
|
|
1258
1260
|
"all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": true,
|
|
1259
1261
|
"all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": true,
|
|
1262
|
+
"all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh": true,
|
|
1260
1263
|
"all/copy-overwrite/scripts/lisa-work-item.mjs": true,
|
|
1261
1264
|
"all/create-only/.claude/rules/PROJECT_RULES.md": true,
|
|
1262
1265
|
"all/create-only/.lisaignore": true,
|
|
@@ -2388,6 +2391,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
2388
2391
|
"plugins/lisa-copilot/hooks/parity-safety-net.sh": true,
|
|
2389
2392
|
"plugins/lisa-copilot/hooks/setup-jira-cli.sh": true,
|
|
2390
2393
|
"plugins/lisa-copilot/hooks/shell-write-nudge.sh": true,
|
|
2394
|
+
"plugins/lisa-copilot/hooks/sonar-secrets.sh": true,
|
|
2391
2395
|
"plugins/lisa-copilot/hooks/threshold-ratchet-compare.mjs": true,
|
|
2392
2396
|
"plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs": true,
|
|
2393
2397
|
"plugins/lisa-copilot/hooks/threshold-ratchet.mjs": true,
|
|
@@ -2802,6 +2806,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
2802
2806
|
"plugins/lisa-cursor/hooks/parity-safety-net.sh": true,
|
|
2803
2807
|
"plugins/lisa-cursor/hooks/setup-jira-cli.sh": true,
|
|
2804
2808
|
"plugins/lisa-cursor/hooks/shell-write-nudge.sh": true,
|
|
2809
|
+
"plugins/lisa-cursor/hooks/sonar-secrets.sh": true,
|
|
2805
2810
|
"plugins/lisa-cursor/hooks/threshold-ratchet-compare.mjs": true,
|
|
2806
2811
|
"plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs": true,
|
|
2807
2812
|
"plugins/lisa-cursor/hooks/threshold-ratchet.mjs": true,
|
|
@@ -5301,6 +5306,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
5301
5306
|
"plugins/lisa/hooks/parity-safety-net.sh": true,
|
|
5302
5307
|
"plugins/lisa/hooks/setup-jira-cli.sh": true,
|
|
5303
5308
|
"plugins/lisa/hooks/shell-write-nudge.sh": true,
|
|
5309
|
+
"plugins/lisa/hooks/sonar-secrets.sh": true,
|
|
5304
5310
|
"plugins/lisa/hooks/threshold-ratchet-compare.mjs": true,
|
|
5305
5311
|
"plugins/lisa/hooks/threshold-ratchet-families.mjs": true,
|
|
5306
5312
|
"plugins/lisa/hooks/threshold-ratchet.mjs": true,
|
|
@@ -5896,6 +5902,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
5896
5902
|
"plugins/src/base/hooks/parity-safety-net.sh": true,
|
|
5897
5903
|
"plugins/src/base/hooks/setup-jira-cli.sh": true,
|
|
5898
5904
|
"plugins/src/base/hooks/shell-write-nudge.sh": true,
|
|
5905
|
+
"plugins/src/base/hooks/sonar-secrets.sh": true,
|
|
5899
5906
|
"plugins/src/base/hooks/threshold-ratchet-compare.mjs": true,
|
|
5900
5907
|
"plugins/src/base/hooks/threshold-ratchet-families.mjs": true,
|
|
5901
5908
|
"plugins/src/base/hooks/threshold-ratchet.mjs": true,
|
|
@@ -7313,6 +7320,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7313
7320
|
"tests/unit/hooks/parity-safety-net.test.ts": true,
|
|
7314
7321
|
"tests/unit/hooks/post-checkout.test.ts": true,
|
|
7315
7322
|
"tests/unit/hooks/pre-push-git-environment.test.ts": true,
|
|
7323
|
+
"tests/unit/hooks/sonar-secrets.test.ts": true,
|
|
7316
7324
|
"tests/unit/hooks/track-plan-sessions.test.ts": true,
|
|
7317
7325
|
"tests/unit/hooks/typecheck-hook-placement.test.ts": true,
|
|
7318
7326
|
"tests/unit/hooks/verification-failure-mode-fixtures.test.ts": true,
|