@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
@@ -4,7 +4,8 @@
4
4
  * OpenCode runs a plugin's factory function once when it loads the plugin at
5
5
  * session start, which is the natural home for Lisa's Codex SessionStart hooks:
6
6
  * - install-pkgs.sh → install dependencies when node_modules is missing
7
- * - setup-jira-cli.sh → write jira-cli config from environment variables
7
+ * - setup-jira-cli.sh → write jira-cli config from environment variables, only
8
+ * when the project's configured tracker is jira
8
9
  *
9
10
  * Both are fully fail-open (wrapped in try/catch) so a package-manager or
10
11
  * filesystem hiccup never bricks OpenCode startup, mirroring the Codex scripts.
@@ -61,6 +62,10 @@ export const LisaSessionBootstrap = async ({
61
62
  }
62
63
 
63
64
  // setup-jira-cli: write jira-cli config from environment variables and non-secret Lisa config.
65
+ // Gated on `tracker: "jira"` — a project on Linear or GitHub Issues has no use
66
+ // for a jira-cli config, and writing one made a false implicit claim about the
67
+ // project's tracker. Fails closed: an absent tracker writes nothing, because
68
+ // Lisa treats a missing `tracker` as unconfigured, not as a jira default.
64
69
  try {
65
70
  const readLisaConfig = (path: string[]) => {
66
71
  for (const file of [".lisa.config.local.json", ".lisa.config.json"]) {
@@ -82,6 +87,7 @@ export const LisaSessionBootstrap = async ({
82
87
  }
83
88
  return undefined;
84
89
  };
90
+ if (readLisaConfig(["tracker"]) !== "jira") return {};
85
91
  const atlassianSite = readLisaConfig(["atlassian", "site"]);
86
92
  const server =
87
93
  process.env.JIRA_SERVER ??
package/package.json CHANGED
@@ -132,7 +132,7 @@
132
132
  "ws": ">=8.21.0"
133
133
  },
134
134
  "name": "@codyswann/lisa",
135
- "version": "3.45.3",
135
+ "version": "3.45.5",
136
136
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
137
137
  "main": "dist/index.js",
138
138
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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
 
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "3.45.3",
3
+ "version": "3.45.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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-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, 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": "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-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"