@codyswann/lisa 3.45.3 → 3.45.5

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 (77) 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/dist/codex/scripts/setup-jira-cli.sh +7 -0
  5. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  6. package/dist/core/lisa-owned-hash-ledger.js +5 -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 +9 -7
  10. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  11. package/dist/opencode/plugin-templates/lisa-session-bootstrap.ts +7 -1
  12. package/package.json +1 -1
  13. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  15. package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/SKILL.md +5 -3
  16. package/plugins/lisa/hooks/block-managed-file-edits.sh +12 -2
  17. package/plugins/lisa/hooks/setup-jira-cli.sh +12 -0
  18. package/plugins/lisa/skills/lisa-analyze-claude-remote/SKILL.md +5 -3
  19. package/plugins/lisa-agy/plugin.json +1 -1
  20. package/plugins/lisa-agy/skills/lisa-analyze-claude-remote/SKILL.md +5 -3
  21. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  24. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +12 -2
  28. package/plugins/lisa-copilot/hooks/setup-jira-cli.sh +12 -0
  29. package/plugins/lisa-copilot/skills/lisa-analyze-claude-remote/SKILL.md +5 -3
  30. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +12 -2
  32. package/plugins/lisa-cursor/hooks/setup-jira-cli.sh +12 -0
  33. package/plugins/lisa-cursor/skills/lisa-analyze-claude-remote/SKILL.md +5 -3
  34. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo-agy/plugin.json +1 -1
  37. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  47. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  52. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  57. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails-agy/plugin.json +1 -1
  62. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  67. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  72. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/src/base/hooks/block-managed-file-edits.sh +12 -2
  75. package/plugins/src/base/hooks/setup-jira-cli.sh +12 -0
  76. package/plugins/src/base/skills/lisa-analyze-claude-remote/SKILL.md +5 -3
  77. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +25 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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.3",
3
+ "version": "3.45.5",
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
@@ -3,6 +3,13 @@
3
3
  # Writes the JIRA CLI config file from environment variables.
4
4
  # Runs on SessionStart so the config is available for every session.
5
5
  #
6
+ # Gated on the project's configured tracker: this only writes anything when
7
+ # `.lisa.config*.json` declares `tracker: "jira"`. A project on Linear or GitHub
8
+ # Issues has no use for a jira-cli config, and writing one made a false implicit
9
+ # claim about which tracker the project runs on. The gate fails closed — an
10
+ # unreadable or absent tracker writes nothing — because Lisa treats a missing
11
+ # `tracker` as unconfigured rather than as a jira default (see lisa-tracker-read).
12
+ #
6
13
  # Required env vars (must be created in your Claude Code Web environment):
7
14
  # JIRA_INSTALLATION - cloud or local
8
15
  # JIRA_SERVER - Atlassian instance URL (falls back to .lisa.config*.json atlassian.site)
@@ -42,6 +49,11 @@ read_lisa_config() {
42
49
  printf '%s' "${value}"
43
50
  }
44
51
 
52
+ # Tracker gate: do nothing unless this project actually runs on JIRA.
53
+ if [[ "$(read_lisa_config '.tracker')" != "jira" ]]; then
54
+ exit 0
55
+ fi
56
+
45
57
  if [[ -z "${JIRA_SERVER:-}" ]]; then
46
58
  ATLASSIAN_SITE="$(read_lisa_config '.atlassian.site')"
47
59
  if [[ -n "${ATLASSIAN_SITE}" ]]; then
@@ -28,7 +28,7 @@ This skill ships in the base Lisa plugin and is distributed to every host projec
28
28
  discover requirements **dynamically from the repo** rather than assuming Lisa-repo specifics. It
29
29
  audits two layers together:
30
30
 
31
- - **Lisa's needs** — startup hooks (`install-pkgs.sh`, `setup-jira-cli.sh`, rule injection),
31
+ - **Lisa's needs** — startup hooks (`install-pkgs.sh`, `setup-jira-cli.sh` — tracker-gated, rule injection),
32
32
  the configured `tracker`/`source`, and the CLIs/MCP/env those imply.
33
33
  - **The host project's needs** — its own package manager, build/test tooling, app runtime
34
34
  dependencies, CI-assumed binaries, and project-scoped MCP servers.
@@ -71,7 +71,9 @@ Group the findings as:
71
71
  runs, whether it is headless-safe, whether it needs network or write access to system paths,
72
72
  and whether it fits the cloud setup-script time budget (~5 minutes for environment caching;
73
73
  `SessionStart` hooks re-run every session and must be fast). Lisa's `install-pkgs.sh` and
74
- `setup-jira-cli.sh` are the usual headline items.
74
+ `setup-jira-cli.sh` are the usual headline items. Note that `setup-jira-cli.sh` is gated on
75
+ `tracker: "jira"` — on a project using another tracker it exits immediately and needs no
76
+ environment at all, so do not report its JIRA env vars as required there.
75
77
 
76
78
  3. **External CLIs / binaries** — scan hooks, `scripts/`, committed skills/commands, and
77
79
  `.github/workflows/` for invoked binaries that a base cloud image likely lacks. Assume node,
@@ -256,7 +258,7 @@ unsuffixed `…_TOKEN`/`…_KEY` is the simplest to set in a single-account rout
256
258
 
257
259
  ### JIRA — `tracker: jira`
258
260
  - Headless substrate: `jira-cli` + curl (Basic auth). The acli and Atlassian-MCP tiers need prior interactive/OAuth auth → not viable headless.
259
- - Env: `JIRA_API_TOKEN`, `JIRA_SERVER` (e.g. `https://acme.atlassian.net`), `JIRA_LOGIN` (account email), `JIRA_PROJECT` (default project key); optional `JIRA_INSTALLATION` (default `cloud`), `JIRA_BOARD`. (`setup-jira-cli.sh` writes the jira-cli config from these on SessionStart.)
261
+ - Env: `JIRA_API_TOKEN`, `JIRA_SERVER` (e.g. `https://acme.atlassian.net`), `JIRA_LOGIN` (account email), `JIRA_PROJECT` (default project key); optional `JIRA_INSTALLATION` (default `cloud`), `JIRA_BOARD`. (`setup-jira-cli.sh` writes the jira-cli config from these on SessionStart — but only when `.lisa.config*.json` sets `tracker: "jira"`; on any other tracker the hook is a no-op.)
260
262
  - Acquire: `https://id.atlassian.com/manage-profile/security/api-tokens`.
261
263
  - Access: the API token inherits the Atlassian user's permissions — the user must have Browse/Create/Edit/Transition on the target project. An unscoped token suffices for jira-cli; a scoped token must cover the JIRA project read/write operations.
262
264
 
@@ -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 ?? "")),