@codyswann/lisa 2.290.0 → 2.292.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.
Files changed (98) hide show
  1. package/all/merge/.claude/settings.json +1 -1
  2. package/cdk/merge/.claude/settings.json +1 -1
  3. package/dist/core/config-field-validation.d.ts +19 -0
  4. package/dist/core/config-field-validation.d.ts.map +1 -0
  5. package/dist/core/config-field-validation.js +69 -0
  6. package/dist/core/config-field-validation.js.map +1 -0
  7. package/dist/core/deploy-status-sync.d.ts +88 -0
  8. package/dist/core/deploy-status-sync.d.ts.map +1 -0
  9. package/dist/core/deploy-status-sync.js +301 -0
  10. package/dist/core/deploy-status-sync.js.map +1 -0
  11. package/dist/core/project-config.d.ts +3 -0
  12. package/dist/core/project-config.d.ts.map +1 -1
  13. package/dist/core/project-config.js +4 -40
  14. package/dist/core/project-config.js.map +1 -1
  15. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  16. package/dist/core/upstream-evidence-manifest.js +21 -13
  17. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  18. package/dist/opencode/plugin-templates/parity-safety-net.sh +299 -35
  19. package/dist/sync/registry.d.ts.map +1 -1
  20. package/dist/sync/registry.js +3 -6
  21. package/dist/sync/registry.js.map +1 -1
  22. package/expo/merge/.claude/settings.json +1 -1
  23. package/harper-fabric/merge/.claude/settings.json +1 -1
  24. package/nestjs/merge/.claude/settings.json +1 -1
  25. package/package.json +1 -1
  26. package/phaser/merge/.claude/settings.json +1 -1
  27. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/SKILL.md +41 -5
  30. package/plugins/lisa/hooks/parity-safety-net.sh +299 -35
  31. package/plugins/lisa/rules/eager/config-resolution.md +8 -0
  32. package/plugins/lisa/rules/reference/config-resolution.md +47 -0
  33. package/plugins/lisa/skills/lisa-parity-safety-net-rules/SKILL.md +41 -5
  34. package/plugins/lisa-agy/hooks/parity-safety-net.sh +299 -35
  35. package/plugins/lisa-agy/plugin.json +1 -1
  36. package/plugins/lisa-agy/skills/lisa-parity-safety-net-rules/SKILL.md +41 -5
  37. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  40. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +299 -35
  44. package/plugins/lisa-copilot/rules/eager/config-resolution.md +8 -0
  45. package/plugins/lisa-copilot/rules/reference/config-resolution.md +47 -0
  46. package/plugins/lisa-copilot/skills/lisa-parity-safety-net-rules/SKILL.md +41 -5
  47. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +299 -35
  49. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +47 -0
  50. package/plugins/lisa-cursor/rules/config-resolution.mdc +8 -0
  51. package/plugins/lisa-cursor/skills/lisa-parity-safety-net-rules/SKILL.md +41 -5
  52. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-expo-agy/plugin.json +1 -1
  55. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  65. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  70. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  75. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-rails-agy/plugin.json +1 -1
  80. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  84. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  85. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  89. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  90. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  92. package/plugins/src/base/hooks/parity-safety-net.sh +299 -35
  93. package/plugins/src/base/rules/eager/config-resolution.md +8 -0
  94. package/plugins/src/base/rules/reference/config-resolution.md +47 -0
  95. package/plugins/src/base/skills/lisa-parity-safety-net-rules/SKILL.md +41 -5
  96. package/rails/merge/.claude/settings.json +1 -1
  97. package/scripts/install-claude-plugins.sh +9 -6
  98. package/typescript/merge/.claude/settings.json +1 -1
@@ -86,4 +86,12 @@ A non-integration environment bug is fixed, merged, and verified on that
86
86
  environment branch first, then
87
87
  forward cherry-picked down to the integration branch via a linked follow-up.
88
88
 
89
+ ## Deploy status sync
90
+
91
+ `deployStatusSync` is an optional machine-written config block (`tier`, `provisioned` ids,
92
+ `linearBinding: labels|states`, `verifiedAt`). The deploy ladder is `deploy.order` (else canonical
93
+ `dev < staging < production`) over `deploy.branches` joined with the tracker's env-keyed done map;
94
+ a configured done status whose env has no branch is a config error, and the sole
95
+ `prod` ↔ `production` alias applies to the join.
96
+
89
97
  Full reference: [reference/config-resolution.md](../reference/config-resolution.md).
@@ -596,6 +596,53 @@ This is the same `deploy.branches` map already used by env-keyed `done` (reverse
596
596
  env from PR base branch) and the build flow (forward: base branch from env);
597
597
  `deploy.order` only adds the ranking those two directions never needed.
598
598
 
599
+ ### Deploy status sync (deployStatusSync)
600
+
601
+ `deployStatusSync` is an **optional, machine-written** section recorded by the
602
+ deploy-status-sync setup flow. Humans never need to author it; unknown fields
603
+ inside it are preserved on round-trip.
604
+
605
+ | Field | Type | Default | Meaning |
606
+ | --- | --- | --- | --- |
607
+ | `tier` | string | — | Provisioning tier chosen at setup time |
608
+ | `provisioned` | object (string → string) | — | Provisioned tracker artifact ids, keyed by artifact name |
609
+ | `linearBinding` | `"labels"` \| `"states"` | — | Whether Linear deploy statuses are represented as labels or workflow states |
610
+ | `verifiedAt` | string | — | Strict ISO-8601 UTC timestamp (`Z` suffix, e.g. `2026-01-01T00:00:00Z`) of the last successful verification |
611
+
612
+ **Ladder resolution.** The environment universe is the keys of
613
+ `deploy.branches`. Each env's done status comes from the tracker's env-keyed
614
+ done map — `github.labels.build.done`, `linear.labels.build.done`, or
615
+ `jira.workflow.done` — with configured entries winning over the built-in
616
+ defaults (`status:on-dev` / `status:on-stg` / `status:done` for label trackers;
617
+ `On Dev` / `On Stg` / `Done` for JIRA). Environments are ordered by
618
+ `deploy.order` when present (its env-name set must exactly match the keys of
619
+ `deploy.branches`); otherwise by the canonical `dev < staging < production`
620
+ rank, and an unrankable custom env name with more than one env configured is a
621
+ config error rather than a guess. A string-valued `done` binds only the
622
+ terminal (highest) rung; lower rungs fall back to the default table. An env
623
+ with a branch but no done status anywhere (possible only for custom names
624
+ outside the default tables) is **skipped**, not an error; an explicitly
625
+ configured done status whose env has no branch **is** a config error. A ladder
626
+ is flagged terminal-only when it resolves to exactly one rung **and** that
627
+ rung's env is the highest-ranked environment of the configured universe
628
+ (post-alias) — a sole surviving lower rung after skips is NOT terminal-only,
629
+ so downstream native closure never fires on an intermediate environment.
630
+ Absent or empty `deploy` yields an empty ladder, never an error.
631
+
632
+ **Alias.** Iff exactly one of `prod` / `production` appears across the
633
+ configured surfaces (`deploy.branches`, the configured done map,
634
+ `deploy.order`), the two spellings join as one environment — so
635
+ `branches.prod` meets the default `done.production` — and rungs report the
636
+ configured spelling. When both spellings appear they are distinct environments
637
+ and no aliasing occurs. No other alias exists.
638
+
639
+ **Error catalog** (verbatim):
640
+
641
+ - `Invalid deploy configuration in <source>: a done status ("<status>") is configured for environment "<env>", but deploy.branches has no "<env>" entry. Add deploy.branches.<env> (the git branch that deploys to <env>) or remove "<env>" from the done map.`
642
+ - `Invalid deploy.order in <source>: its environment names must exactly match the keys of deploy.branches. deploy.order has [<order-envs>]; deploy.branches has [<branch-envs>].` (also raised for duplicate `deploy.order` entries)
643
+ - `Invalid deploy.order in <source>: every entry must be an environment name string; found <entry>.`
644
+ - `Invalid deploy configuration in <source>: cannot order environment "<env>". Set deploy.order (environments listed lowest first, e.g. ["dev","staging","production"]) so Lisa knows the promotion order.`
645
+
599
646
  ### What's configurable, what's not
600
647
 
601
648
  - **Status / label NAMES** are configurable per project — that's the point of the vocabulary maps.
@@ -53,11 +53,47 @@ RULES_FILE="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-
53
53
 
54
54
  ### Built-in guards (always on)
55
55
 
56
- 1. `rm -rf` of a filesystem root, `$HOME`/`~`, or a top-level wildcard.
57
- 2. Force-pushing a protected branch (`main`/`master`/`production`/`release`).
58
- `--force-with-lease` is intentionally allowed.
59
- 3. `git reset --hard` while the working tree is **dirty** (would discard work).
60
- 4. Destructive SQL — `DROP DATABASE/SCHEMA/TABLE`, `TRUNCATE TABLE`.
56
+ 1. `rm -rf` of a filesystem root, `$HOME`/`~`, or a top-level wildcard — with
57
+ quote-aware boundaries, so wrapper/interpreter forms like
58
+ `bash -c "rm -rf /"` and `python -c "… os.system('rm -rf /')"` match too.
59
+ Path-prefixed spellings (`/bin/rm`, `./rm`) count as `rm` for every rm
60
+ guard.
61
+ 2. `rm -rf` target hardening: the cwd itself (`.`/`./`), `..`-traversal paths,
62
+ home-anchored `~/…` paths, absolute paths outside the project (`/tmp`,
63
+ `/var/tmp`, and `$TMPDIR` are allowed), `$VAR` targets other than `$TMPDIR`,
64
+ and **any** recursive forced delete while the working directory is `$HOME`.
65
+ 3. Force-pushing a protected branch
66
+ (`main`/`master`/`production`/`prod`/`release`). `--force-with-lease` is
67
+ intentionally allowed, and so is force-pushing a feature branch (sanctioned
68
+ rebase workflow). Acceptable parity divergence: a refspec force-push
69
+ (`git push origin +main`) is not blocked — upstream 1.0.6 allows it too.
70
+ 4. `git reset --hard` / `git reset --merge` while the working tree is **dirty**
71
+ (would discard work). Clean-tree resets are intentionally allowed.
72
+ 5. `git checkout` discards: the `--` pathspec form (with or without a ref),
73
+ `-f`/`--force`, `--pathspec-from-file`, and bare `git checkout .`.
74
+ Branch switching and `-b`/`-B` creation stay allowed.
75
+ 6. `git switch --discard-changes` / `-f`/`--force`.
76
+ 7. `git restore` touching the worktree — only `git restore --staged <path>`
77
+ without `--worktree` is allowed (unstaging is safe).
78
+ 8. `git stash drop` / `git stash clear` (push/pop/list/apply stay allowed).
79
+ 9. `git clean` with a force flag and no dry-run — `-n`/`--dry-run` anywhere
80
+ makes it a safe preview.
81
+ 10. `git branch -D` (or `-d` combined with `-f`, clustered or split);
82
+ safe `-d` and rename `-m` stay allowed.
83
+ 11. `git tag -d`, `git reflog delete`, `git worktree remove --force`.
84
+ 12. Deletion via `find … -delete`, `find … -exec rm -rf`, and `xargs … rm -rf`
85
+ (plain non-recursive `rm` on find/xargs output stays allowed).
86
+ 13. Disk destroyers: `dd of=/dev/…`, `mkfs … /dev/…`, `shred`.
87
+ 14. Destructive SQL — `DROP DATABASE/SCHEMA/TABLE`, `TRUNCATE TABLE`.
88
+
89
+ Every git guard sees through leading git **global options** (`-C <path>`,
90
+ `-c <k>=<v>`, `--git-dir[=…]`, `--no-pager`, …), so `git -C /path <destructive>`
91
+ is screened the same as `git <destructive>`.
92
+
93
+ Malformed hook input fails **closed** (exit 2 denies the command). A text-scan
94
+ hook cannot exempt display commands, so prose like
95
+ `echo "docs about rm -rf /"` can false-positive — quote-break the string or use
96
+ the gh-writer heredoc form (payload is stripped before the guards run).
61
97
 
62
98
  ## View the current rules
63
99
 
@@ -5,7 +5,7 @@
5
5
  },
6
6
  "enabledPlugins": {
7
7
  "ruby-lsp@claude-plugins-official": true,
8
- "safety-net@cc-marketplace": true,
8
+ "safety-net@cc-marketplace": false,
9
9
  "code-simplifier@claude-plugins-official": true,
10
10
  "code-review@claude-plugins-official": true,
11
11
  "coderabbit@claude-plugins-official": true,
@@ -526,19 +526,22 @@ for plugin in \
526
526
  "code-review@claude-plugins-official" \
527
527
  "coderabbit@claude-plugins-official" \
528
528
  "skill-creator@claude-plugins-official" \
529
- "atlassian@claude-plugins-official" \
530
- "safety-net@cc-marketplace"; do
529
+ "atlassian@claude-plugins-official"; do
531
530
  install_plugin_if_missing "$plugin"
532
531
  done
533
532
 
534
533
  # Retire third-party plugins Lisa no longer curates. The base lisa plugin
535
534
  # bundles the Sentry MCP server (plugins/src/base/.mcp.json) for every agent
536
535
  # runtime, so the upstream sentry plugin registered the same server twice in
537
- # each Claude session (issue #1955). The merge settings templates flip its
538
- # enabledPlugins entry to false; this removes the install itself. Version-gated
539
- # like the other one-time heals so same-version runs don't spawn the CLI.
536
+ # each Claude session (issue #1955). Likewise, the Lisa-native
537
+ # parity-safety-net.sh hook screens every Bash command, so the upstream
538
+ # safety-net plugin double-screened each command; its material guards were
539
+ # absorbed into the Lisa hook (issue #1960). The merge settings templates flip
540
+ # both enabledPlugins entries to false; this removes the installs themselves.
541
+ # Version-gated like the other one-time heals so same-version runs don't spawn
542
+ # the CLI.
540
543
  if [ "$FORCE_PLUGIN_SYNC" = "true" ]; then
541
- for retired_plugin in "sentry@claude-plugins-official"; do
544
+ for retired_plugin in "sentry@claude-plugins-official" "safety-net@cc-marketplace"; do
542
545
  claude plugin uninstall "$retired_plugin" --scope project </dev/null >/dev/null 2>&1 || true
543
546
  done
544
547
  fi
@@ -6,7 +6,7 @@
6
6
  "enabledPlugins": {
7
7
  "lisa-typescript@lisa": true,
8
8
  "typescript-lsp@claude-plugins-official": true,
9
- "safety-net@cc-marketplace": true,
9
+ "safety-net@cc-marketplace": false,
10
10
  "code-simplifier@claude-plugins-official": true,
11
11
  "code-review@claude-plugins-official": true,
12
12
  "coderabbit@claude-plugins-official": true,