@codyswann/lisa 2.342.0 → 2.342.1

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 (69) hide show
  1. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +38 -6
  2. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +44 -13
  3. package/all/create-only/scripts/remote-agent-aws-setup.sh +8 -1
  4. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.js +8 -7
  6. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  7. package/dist/opencode/plugin-templates/parity-safety-net.sh +44 -13
  8. package/package.json +1 -1
  9. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa/hooks/parity-safety-net.sh +44 -13
  12. package/plugins/lisa/hooks/threshold-ratchet.mjs +39 -5
  13. package/plugins/lisa-agy/hooks/parity-safety-net.sh +44 -13
  14. package/plugins/lisa-agy/plugin.json +1 -1
  15. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  18. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +44 -13
  22. package/plugins/lisa-copilot/hooks/threshold-ratchet.mjs +39 -5
  23. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +44 -13
  25. package/plugins/lisa-cursor/hooks/threshold-ratchet.mjs +39 -5
  26. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-agy/plugin.json +1 -1
  29. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  49. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails-agy/plugin.json +1 -1
  54. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  59. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  64. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/src/base/hooks/parity-safety-net.sh +44 -13
  67. package/plugins/src/base/hooks/threshold-ratchet.mjs +39 -5
  68. package/rails/copy-overwrite/scripts/check-threshold-ratchet.mjs +39 -5
  69. package/typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs +39 -5
@@ -47,19 +47,51 @@ const DEPENDENCY_SECTIONS = [
47
47
  "peerDependencies",
48
48
  ];
49
49
 
50
+ /**
51
+ * Lowest version a single disjunction branch permits.
52
+ *
53
+ * An upper-bound-only branch (`<2.0.0`, `<=2.0.0`) has no floor: it permits
54
+ * everything beneath the bound, so its lower bound is zero. Every other form
55
+ * used in practice (`>=1.2.3`, `^1.2.3`, `~1.2.3`, `1.2.3`, `>=1.2.3 <2`)
56
+ * leads with its lower bound.
57
+ * @param {string} branch One branch of a `||` range.
58
+ * @returns {number[]|null} [major, minor, patch], or null when there is none.
59
+ */
60
+ function branchLowerBound(branch) {
61
+ const trimmed = branch.trim();
62
+ if (trimmed === "") return null;
63
+ if (/^<=?\s*\d/.test(trimmed)) return [0, 0, 0];
64
+ const match = /(\d+)\.(\d+)\.(\d+)/.exec(trimmed);
65
+ return match ? match.slice(1, 4).map(Number) : null;
66
+ }
67
+
50
68
  /**
51
69
  * Lowest version a range permits, as a comparable tuple.
52
70
  *
53
- * Deliberately crude: it reads the first version in the spec, which is the
54
- * lower bound for every form used in practice (`>=1.2.3`, `^1.2.3`, `~1.2.3`,
55
- * `1.2.3`, `>=1.2.3 <2`). A spec carrying no version `*`, `workspace:*`,
56
- * `latest` has no floor to compare and returns null.
71
+ * Reading only the first version in the spec was wrong in a direction that
72
+ * matters: for `^2.0.0 || ^1.9.0` it reported 2.0.0, a floor HIGHER than the
73
+ * range actually permits, and the caller's `compare(target, floor) >= 0` then
74
+ * skipped a genuine collision. A floor read too high is a false negative in a
75
+ * security check, so every branch is measured and the lowest wins.
76
+ *
77
+ * An alias spec (`npm:other-pkg@^1.2.3`) versions a different package
78
+ * entirely; its number cannot be compared against a floor for this name, so it
79
+ * returns null rather than a misleading answer. A spec carrying no version —
80
+ * `*`, `workspace:*`, `latest` — has no floor either.
57
81
  * @param {string} spec A version range.
58
82
  * @returns {number[]|null} [major, minor, patch], or null when there is none.
59
83
  */
60
84
  export function lowestPermitted(spec) {
61
- const match = /(\d+)\.(\d+)\.(\d+)/.exec(spec ?? "");
62
- return match ? match.slice(1, 4).map(Number) : null;
85
+ const raw = spec ?? "";
86
+ if (/^\s*npm:/i.test(raw)) return null;
87
+ const bounds = raw
88
+ .split("||")
89
+ .map(branchLowerBound)
90
+ .filter(bound => bound !== null);
91
+ if (bounds.length === 0) return null;
92
+ return bounds.reduce((lowest, bound) =>
93
+ compare(bound, lowest) < 0 ? bound : lowest
94
+ );
63
95
  }
64
96
 
65
97
  /**
@@ -172,16 +172,6 @@ case "$command_str" in
172
172
  ;;
173
173
  esac
174
174
 
175
- # matches / matches_cs run an ERE against the guarded command text. matches is
176
- # case-insensitive (the default for these guards); matches_cs is case-SENSITIVE
177
- # for guards where flag case is meaningful (`git branch -d` vs `-D`).
178
- matches() {
179
- printf '%s' "$command_for_guards" | grep -Eiq -- "$1"
180
- }
181
- matches_cs() {
182
- printf '%s' "$command_for_guards" | grep -Eq -- "$1"
183
- }
184
-
185
175
  # Normalize bash line-continuations (a trailing backslash + newline → space)
186
176
  # before segmenting the command. Without this, "git push --force origin
187
177
  # \<newline>main" splits into a segment matching --force but not `main`, letting a
@@ -190,6 +180,28 @@ matches_cs() {
190
180
  normalized_command_str="$(printf '%s' "$command_for_guards" \
191
181
  | awk '{ if (sub(/\\$/, "")) printf "%s ", $0; else print }')"
192
182
 
183
+ # matches / matches_cs run an ERE against the guarded command text. matches is
184
+ # case-insensitive (the default for these guards); matches_cs is case-SENSITIVE
185
+ # for guards where flag case is meaningful (`git branch -d` vs `-D`).
186
+ #
187
+ # Both read the NORMALIZED text. They used to read $command_for_guards, so only
188
+ # the two segment-walking guards (rm, git push) were protected against line
189
+ # continuations and every guard expressed through these helpers could be evaded
190
+ # by breaking the command across lines:
191
+ #
192
+ # git reset --hard \
193
+ # origin/main
194
+ #
195
+ # The patterns match on intermediate whitespace, and an embedded "\<newline>" is
196
+ # not whitespace to grep -E, so the anchor failed to span the break. Defined
197
+ # after the normalization above so the value exists when these are first called.
198
+ matches() {
199
+ printf '%s' "$normalized_command_str" | grep -Eiq -- "$1"
200
+ }
201
+ matches_cs() {
202
+ printf '%s' "$normalized_command_str" | grep -Eq -- "$1"
203
+ }
204
+
193
205
  # Shared ERE fragments. GIT_TOKENS walks over intermediate argv tokens without
194
206
  # crossing a statement separator, so a flag in a LATER statement can never be
195
207
  # attributed to an earlier git subcommand.
@@ -553,9 +565,28 @@ if [ -f "$rules_file" ]; then
553
565
  case "$rule" in
554
566
  '' | '#'*) continue ;;
555
567
  esac
556
- if printf '%s' "$command_for_guards" | grep -Eiq -- "$rule"; then
557
- block "matched a project custom safety rule (${rules_file##*/}): $rule"
558
- fi
568
+ # Normalized text, for the same reason every built-in guard uses it: a
569
+ # project rule must not be evadable by breaking the command across lines.
570
+ #
571
+ # `|| rule_status=$?` rather than a bare pipeline: this script runs under
572
+ # `set -e`, and a no-match grep exits 1, which would end the hook right
573
+ # here — before the remaining rules ran, and with an exit status that is
574
+ # not a refusal. The `||` puts the pipeline in a condition context, where
575
+ # a non-zero status is expected rather than fatal.
576
+ rule_status=0
577
+ printf '%s' "$normalized_command_str" | grep -Eiq -- "$rule" || rule_status=$?
578
+ case "$rule_status" in
579
+ 0) block "matched a project custom safety rule (${rules_file##*/}): $rule" ;;
580
+ 1) ;; # no match
581
+ # grep exits 2 on a malformed ERE. Treated as no-match before, so a typo
582
+ # in a project's rules file silently disabled that rule — a guard the
583
+ # project believed it had. Say so instead; still non-fatal, because one
584
+ # bad line must not take the other rules down with it.
585
+ *)
586
+ printf 'parity-safety-net: invalid regex in %s, rule NOT enforced: %s\n' \
587
+ "$rules_file" "$rule" >&2
588
+ ;;
589
+ esac
559
590
  done <"$rules_file"
560
591
  fi
561
592
 
@@ -6,7 +6,14 @@ set -euo pipefail
6
6
 
7
7
  if NPM_ROOT="$(npm root 2>/dev/null)" && [ -n "$NPM_ROOT" ]; then
8
8
  LOCAL_LISA_SCRIPT="$NPM_ROOT/@codyswann/lisa/plugins/lisa/scripts/remote-agent-aws-setup.sh"
9
- [ -x "$LOCAL_LISA_SCRIPT" ] && exec "$LOCAL_LISA_SCRIPT" "$@"
9
+ # Spelled as a full `if` rather than `[ -x ] && exec …`. That form is the
10
+ # last command in this block, so when the file is absent its non-zero status
11
+ # is the block's status, and `set -e` exits (1) right here — before the
12
+ # diagnostic below can print. The operator saw a silent failure instead of
13
+ # being told to install the package.
14
+ if [ -x "$LOCAL_LISA_SCRIPT" ]; then
15
+ exec "$LOCAL_LISA_SCRIPT" "$@"
16
+ fi
10
17
  fi
11
18
 
12
19
  echo "remote-agent-aws-setup: install @codyswann/lisa before running this setup script" >&2
@@ -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,CAwqEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAovNjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,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,CAwqEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAqvNjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -4,16 +4,16 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
4
4
  "all/copy-contents/.gitattributes": "9d3831007e681186a3673e1037ef3fc82980cab2fc04e27c0868e562912c9e9f",
5
5
  "all/copy-contents/gitignore": "2dbf7fd2f2020fc7824c432342002d9ca3ebb57b2872e761b14e942b23479a11",
6
6
  "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "1bec5f3c284b3febdc471487ee6a23ffb72bd4e7b293f9e26b0188f32318c722",
7
- "all/copy-overwrite/scripts/lisa-floor-collisions.mjs": "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
7
+ "all/copy-overwrite/scripts/lisa-floor-collisions.mjs": "3c7a0234b4f5609fce49e44711d2ec86af8cf7fb82b0831e4450e3347ecefe45",
8
8
  "all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh": "850cfc23852eb752114ae1e938a1c7bcf34bc50c85d3aaca0c02311cc8c0ef70",
9
9
  "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "33e2bd341eb992036059b0c4606db35a218adcfeca7e44d174fedf8ebdff29d2",
10
10
  "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": "1934a15e154fda3c2a40979a5cd6225661b14fe7bc77328a69ce499bea85dba7",
11
- "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "062c69eea85157f1e941ec3626d8912aa9f182af6ccdbe19687588a6074db5ce",
11
+ "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "d9ea58150aa27e7f0aa9a4ef155ed446d30bdfc932d01c64e2b8ca211aa0de7b",
12
12
  "all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh": "bf4132e49ba18e2f7e941520c299c15aeeacfd220e489f3d2eb8397f2048157b",
13
13
  "all/copy-overwrite/scripts/lisa-work-item.mjs": "2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
14
14
  "all/create-only/.claude/rules/PROJECT_RULES.md": "6e1c7923ad2a15356babc60c97e7f97be728d790af285b6a7cd7d1b4d39cd97f",
15
15
  "all/create-only/.lisaignore": "3c9827e7e98daa46510b5357cd6dd9406da1821e64cc46d2eea9f311cd6d06b9",
16
- "all/create-only/scripts/remote-agent-aws-setup.sh": "7677908a345891810d2104ba8b2fd1a8318bb29c408fb5ce0110d57beef9b556",
16
+ "all/create-only/scripts/remote-agent-aws-setup.sh": "12d2204d34195ad4f81082e90a25dbbf7d2493debcc50c1cd37b32dc4648fc17",
17
17
  "all/create-only/specs/.keep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
18
18
  "all/deletions.json": "31af98085a56dd96d34d4b3cb42956e068fb492df7b1dd781987408c1b4b2ea3",
19
19
  "all/github-rulesets/base.json": "58b9606f185cdca8b17218829aac333b7d8c08f0f2b4f86d7e360f7be1de4787",
@@ -310,13 +310,13 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
310
310
  "plugins/src/base/hooks/install-pkgs.sh": "e9a13faba849a277410dde911ab102ee6f88ef915b33571bb1d4eef904172db5",
311
311
  "plugins/src/base/hooks/parity-safety-net-heredoc.py": "f21b1232ac82bd0e42d2ba43c68f4cc4546334fc885ba31747881f427097ef78",
312
312
  "plugins/src/base/hooks/parity-safety-net.agy.sh": "ce9bd2b4566ad9147e4ace56434cffbbe87edb4ccbb57549ab3fd9f4c671ced4",
313
- "plugins/src/base/hooks/parity-safety-net.sh": "062c69eea85157f1e941ec3626d8912aa9f182af6ccdbe19687588a6074db5ce",
313
+ "plugins/src/base/hooks/parity-safety-net.sh": "d9ea58150aa27e7f0aa9a4ef155ed446d30bdfc932d01c64e2b8ca211aa0de7b",
314
314
  "plugins/src/base/hooks/setup-jira-cli.sh": "a675f6b17ce7f0d6b9fb7daeba6d2bc59bcb48ef79b034076ea73b2b1e72ee09",
315
315
  "plugins/src/base/hooks/shell-write-nudge.sh": "69839af423f8792b1e52c71097316c3264425553031627c0a2f9409a9d5becd0",
316
316
  "plugins/src/base/hooks/sonar-secrets.sh": "bf4132e49ba18e2f7e941520c299c15aeeacfd220e489f3d2eb8397f2048157b",
317
317
  "plugins/src/base/hooks/threshold-ratchet-compare.mjs": "4535a145c5c5cbee13bdf970bc91d390a264043604e607288cdd6bf28de56192",
318
318
  "plugins/src/base/hooks/threshold-ratchet-families.mjs": "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
319
- "plugins/src/base/hooks/threshold-ratchet.mjs": "04f660131bf50864239eb09cbf4d9555e53921254f6ab45ff2b85c173e160901",
319
+ "plugins/src/base/hooks/threshold-ratchet.mjs": "49dee610439f4f21aecb0420a0cc72f5d3595a36f2489970053096190b9909c4",
320
320
  "plugins/src/base/hooks/threshold-ratchet.sh": "b86f4d0b554e44fd119ad8a8920cd0ba6c9dbe779f7ee219d381cf0629453990",
321
321
  "plugins/src/base/hooks/ticket-sync-reminder.sh": "212f80bcdfd9e3ec2254987c5a7186d1d2d38065b330ddcdc631f76df7c4a6c0",
322
322
  "plugins/src/base/hooks/track-plan-sessions.sh": "8bc47dcad3aed628df0c9efbe7b6f3df87635b94b0c54c71e0bd52eceace563a",
@@ -947,7 +947,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
947
947
  "rails/copy-overwrite/ast-grep/utils/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
948
948
  "rails/copy-overwrite/config/initializers/version.rb": "fa664a84f407877b5ddbd3709a2352b30e4dc6fbce538a8503bad6c52448dc86",
949
949
  "rails/copy-overwrite/lefthook.yml": "28bb382b9171a04fb92ebafc1f1522b8639f5edc4fcffcc6940e7fba3460fb4e",
950
- "rails/copy-overwrite/scripts/check-threshold-ratchet.mjs": "04f660131bf50864239eb09cbf4d9555e53921254f6ab45ff2b85c173e160901",
950
+ "rails/copy-overwrite/scripts/check-threshold-ratchet.mjs": "49dee610439f4f21aecb0420a0cc72f5d3595a36f2489970053096190b9909c4",
951
951
  "rails/copy-overwrite/scripts/lisa-clean-git-env.sh": "e7121a0ee9e1bf7c01cd2ab55f563dd6d9ab75990739bb6ddf571a513efa10e9",
952
952
  "rails/copy-overwrite/scripts/threshold-ratchet-compare.mjs": "4535a145c5c5cbee13bdf970bc91d390a264043604e607288cdd6bf28de56192",
953
953
  "rails/copy-overwrite/scripts/threshold-ratchet-families.mjs": "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
@@ -1070,7 +1070,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1070
1070
  "typescript/copy-overwrite/eslint.ignore.config.json": "04dcd754829cf93bf0ba0d76e4031d28cb7149afa658575d02bb13bf73f7880e",
1071
1071
  "typescript/copy-overwrite/eslint.slow.config.ts": "f66d04381940936544931d7f20ffd4e43c38b8a907d56ffa101e2236371d8c94",
1072
1072
  "typescript/copy-overwrite/knip.json": "6eb93d705a2d645332fbae1dd42cf2d48f85978ebc265451a53790912f277d12",
1073
- "typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs": "04f660131bf50864239eb09cbf4d9555e53921254f6ab45ff2b85c173e160901",
1073
+ "typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs": "49dee610439f4f21aecb0420a0cc72f5d3595a36f2489970053096190b9909c4",
1074
1074
  "typescript/copy-overwrite/scripts/check-verification-coverage.mjs": "3c1d27d0668fc66a18cb014f2b607878f0a88c178a773fbe964b8e46b19e86d6",
1075
1075
  "typescript/copy-overwrite/scripts/lisa-mutation.mjs": "7d8d24dea151ef2178807046e97aea7ebfadd9c88eb50347feb7bb4bb190227d",
1076
1076
  "typescript/copy-overwrite/scripts/threshold-ratchet-compare.mjs": "4535a145c5c5cbee13bdf970bc91d390a264043604e607288cdd6bf28de56192",
@@ -7352,6 +7352,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7352
7352
  "tests/unit/hooks/parity-safety-net-heredoc-continuation.test.ts": true,
7353
7353
  "tests/unit/hooks/parity-safety-net-heredoc-literal.test.ts": true,
7354
7354
  "tests/unit/hooks/parity-safety-net-heredoc.test.ts": true,
7355
+ "tests/unit/hooks/parity-safety-net-line-continuation.test.ts": true,
7355
7356
  "tests/unit/hooks/parity-safety-net.test.ts": true,
7356
7357
  "tests/unit/hooks/post-checkout.test.ts": true,
7357
7358
  "tests/unit/hooks/pre-push-git-environment.test.ts": true,