@codyswann/lisa 3.35.1 → 3.38.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 (62) hide show
  1. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  2. package/dist/core/lisa-owned-hash-ledger.js +4 -0
  3. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  4. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.js +14 -4
  6. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  7. package/expo/create-only/.github/workflows/maestro-e2e.yml +27 -0
  8. package/expo/create-only/.github/workflows/nightly-e2e-health.yml +27 -0
  9. package/expo/create-only/.github/workflows/playwright-e2e.yml +151 -0
  10. package/package.json +1 -1
  11. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  13. package/plugins/lisa-agy/plugin.json +1 -1
  14. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  17. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  23. package/plugins/lisa-expo-agy/plugin.json +1 -1
  24. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  34. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  38. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  39. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  44. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-rails-agy/plugin.json +1 -1
  49. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  54. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  59. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  61. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +317 -18
  62. package/typescript/copy-overwrite/scripts/nightly-e2e-suites.schema.json +5 -0
@@ -137,6 +137,33 @@ jobs:
137
137
  # concurrency is free coverage in that case. The cost when on is the suite
138
138
  # taking iOS PLUS Android instead of the slower of the two.
139
139
  # serialize_platform_legs: true
140
+ #
141
+ # Uncomment when EAS build quota — not build freshness — is what limits
142
+ # this suite. On Expo's Free plan the monthly iOS quota is what stops the
143
+ # nightly running at all, and a rebuild of native inputs that did not
144
+ # change buys nothing. `eas fingerprint:generate` hashes those inputs; a
145
+ # match means the finished binary IS the app this commit would build, so
146
+ # it is downloaded instead of rebuilt. A miss falls back to the latest
147
+ # finished build for the profile, and only then does a fresh build start.
148
+ # Leave it off if your e2e profile embeds the JS bundle: JS-only changes
149
+ # do not move the fingerprint, so reuse would test stale JS.
150
+ # reuse_build_by_fingerprint: true
151
+ #
152
+ # Uncomment to have a failed build say WHY when Expo refuses it for
153
+ # quota. Without this the run reds with a generic build error and the
154
+ # cause is only in the raw log. The cost is that the build's stderr is
155
+ # buffered and replayed at the end rather than streaming live.
156
+ # diagnose_eas_quota_exhaustion: true
157
+ #
158
+ # Uncomment once every flow declares `appId: ${MAESTRO_APP_ID}` and any
159
+ # runFlow-included SUBFLOWS live OUTSIDE .maestro/flows. The app id
160
+ # arrives as `-e MAESTRO_APP_ID=…`, so a flow naming a different variable
161
+ # (or none) launches an EMPTY app id — which Maestro reports as a launch
162
+ # failure naming no cause, after you have already paid for an EAS build
163
+ # and an emulator boot. This turns that into a grep in preflight.
164
+ # `maestro test` recurses, so anything under the flows directory is a
165
+ # flow and is expected to declare an appId.
166
+ # lint_flow_app_id: true
140
167
  secrets:
141
168
  EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
142
169
  MAESTRO_SECRET_ENV: ${{ secrets.MAESTRO_SECRET_ENV }}
@@ -152,6 +152,33 @@ jobs:
152
152
  # "match": { "mode": "run" },
153
153
  # "first_seen": "2026-08-10T00:00:00Z"
154
154
  # }
155
+ #
156
+ # DECLARE `min_flows` ONCE YOUR SUITE IS REAL (rows 36-38). A run's
157
+ # conclusion answers "did it pass?" and says nothing about "how much of it
158
+ # ran?". A tag-filtered run of four flows reports `success` under the
159
+ # identical workflow name and is indistinguishable from a full green in
160
+ # `gh run list` — that is not hypothetical, it is what #2704 measured
161
+ # clearing a REQUIRED merge gate in two repositories.
162
+ #
163
+ # {
164
+ # "label": "Maestro native e2e",
165
+ # "workflow": "maestro-e2e.yml",
166
+ # "match": { "mode": "run" },
167
+ # "min_flows": 60
168
+ # }
169
+ #
170
+ # It is deliberately NOT set below. This template ships to a repo with no
171
+ # suite yet, and a floor guessed on its behalf would red-wall the first
172
+ # adopter — the same mistake as a default `workflow` that does not exist.
173
+ # Read the real number off a full night's `maestro-<platform>-flowcount-<N>`
174
+ # artifact, sum the platforms, and set it a little under that so ordinary
175
+ # churn does not redden the gate.
176
+ #
177
+ # Until you do, the gate still rejects a run that recorded ITSELF as
178
+ # tag-filtered (row 36), and every green line says so:
179
+ # `⚠️ scope unverified: this run published no executed-flow count`.
180
+ # Declaring `min_flows` is what turns that notice into a blocking question
181
+ # — and from then on an UNREADABLE count blocks too, which is the point.
155
182
  suites: |
156
183
  [
157
184
  {
@@ -0,0 +1,151 @@
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
3
+
4
+ name: 🎭 Playwright Web E2E
5
+
6
+ # Standalone Playwright suite — the web counterpart to maestro-e2e.yml.
7
+ #
8
+ # WHY THIS EXISTS. Playwright used to ride inside ci.yml as the
9
+ # `playwright_e2e` job of Lisa's reusable quality.yml. That coupled the
10
+ # heaviest and flakiest suite in the project to the lint/typecheck/unit gate:
11
+ # one workflow, one concurrency group, one cadence, and a red Playwright shard
12
+ # blocking a pull request that only changed a type. Splitting it out gives it
13
+ # its own cadence, its own concurrency, one target environment, and a
14
+ # dedicated red/green signal a nightly gate can read.
15
+ #
16
+ # ── BEFORE THIS FILE DOES ANYTHING, DECLARE THE GATE ───────────────────────
17
+ #
18
+ # This workflow resolves the `e2e-browser` gate at the `continuous:development`
19
+ # moment. Until `.lisa.config.json` declares it, quality.yml runs its BUILT-IN
20
+ # Playwright path here (sharded `npx playwright test`), which is a reasonable
21
+ # default but is not a decision anybody recorded. To make it one:
22
+ #
23
+ # {
24
+ # "gates": {
25
+ # "runner": "bun run",
26
+ # "e2e-browser": { "continuous:development": "required" }
27
+ # }
28
+ # }
29
+ #
30
+ # `runner` is optional and defaults to `<package_manager> run`. The gate's task
31
+ # is `test:e2e`, so the project needs that script in package.json — Lisa
32
+ # resolves the PROPERTY ("browser journeys pass end to end"), never the tool.
33
+ #
34
+ # TWO THINGS THAT ARE NOT INTERCHANGEABLE:
35
+ #
36
+ # * OMITTING the declaration and declaring it `off` are different. `off` is a
37
+ # recorded decision and drops the required context. Omitting it leaves
38
+ # Lisa's built-in path running. Neither is "no gate".
39
+ # * DECLARING IT WITH NO SUITE is refused, not greened. quality.yml fails the
40
+ # job when `e2e-browser` resolves and there is no playwright.config.ts,
41
+ # because a browser gate over an absent suite reports green having run
42
+ # nothing and is indistinguishable on the pull-request page from one that
43
+ # ran. If this project has no Playwright specs, DELETE THIS FILE rather
44
+ # than declaring the gate against it.
45
+ #
46
+ # ── SHARDING ───────────────────────────────────────────────────────────────
47
+ #
48
+ # `playwright_shards` splits Lisa's BUILT-IN invocation across N runners. It
49
+ # does not apply once `e2e-browser` resolves to a task: Lisa cannot append
50
+ # `--shard` to a command whose shape it does not know, and the `--` passthrough
51
+ # differs between npm, yarn and bun. A declared gate runs on one runner. Shard
52
+ # inside the project's own `test:e2e` script if the suite needs it.
53
+
54
+ on:
55
+ schedule:
56
+ # Nightly against the default branch. Offset from the Maestro nightly
57
+ # (maestro-e2e.yml, 09:00 UTC) so two heavy suites do not start together.
58
+ # The stagger is a COURTESY, not the mechanism — a run first waits for a
59
+ # hosted runner, and that wait has been measured in hours, far past any
60
+ # offset. `concurrency_group` below is what actually keeps them apart.
61
+ - cron: '0 7 * * *'
62
+ workflow_dispatch:
63
+
64
+ # Deliberately no `pull_request` trigger. This suite is too slow to gate a
65
+ # pull request, and adding one here would also collide with ci.yml: two
66
+ # workflows must not report the same check name, and the identity is the
67
+ # JOB name, not the workflow's. A reusable call reports as
68
+ # `<caller job name> / <callee job name>`, so the job below reports as
69
+ # `🎭 Playwright Web E2E / 🎭 Playwright E2E Tests`. Keep ci.yml's
70
+ # `skip_jobs` naming `playwright_e2e` so this workflow is the only place the
71
+ # suite runs.
72
+
73
+ permissions:
74
+ contents: read
75
+
76
+ # Keyed on the ENVIRONMENT, not the ref. Every run of this workflow hits the
77
+ # same backend no matter which branch dispatched it, so `${{ github.ref }}`
78
+ # would hand two branches two different groups over one database and one set of
79
+ # shared test users, and they would not exclude each other.
80
+ #
81
+ # CAVEAT — a displaced run reads as a flaky scheduler. GitHub keeps only ONE
82
+ # pending run per concurrency group: queue a third while one runs and one is
83
+ # pending and the PENDING one is cancelled rather than queued behind it. Not a
84
+ # safety problem (a dropped run tests nothing and stomps nothing), but a run
85
+ # that disappears without a red is worth recognising rather than re-diagnosing.
86
+ concurrency:
87
+ group: playwright-e2e-development
88
+ # Queue, never cancel. A suite that drives shared test accounts and mutates
89
+ # their server-side state leaves that state wrong when killed mid-run, and
90
+ # poisons the next run rather than just losing this one.
91
+ cancel-in-progress: false
92
+
93
+ jobs:
94
+ playwright:
95
+ name: 🎭 Playwright Web E2E
96
+ uses: CodySwannGT/lisa/.github/workflows/quality.yml@main
97
+ with:
98
+ node_version: '22.21.1'
99
+ package_manager: 'bun'
100
+ # The moment this workflow's cadence corresponds to. It is what makes
101
+ # the `.lisa.config.json` declaration above readable from here — a gate
102
+ # declared at `pull-request` is invisible at this moment, and vice
103
+ # versa, so a nightly suite and a per-change suite cannot be turned on
104
+ # by the same line of config by accident.
105
+ moment: 'continuous:development'
106
+ # Everything except `playwright_e2e`.
107
+ #
108
+ # THIS INVERSION IS A KNOWN-BAD SHAPE, carried because it is currently
109
+ # the only one that works. quality.yml gates most jobs on `skip_jobs`
110
+ # rather than on the moment, so a single-suite caller has to name the
111
+ # two dozen jobs it does NOT want. It is exact-token matched against
112
+ # `,{0},` — comma-delimited with NO SPACES, so `lint, lint_slow`
113
+ # silently skips nothing beyond `lint`.
114
+ #
115
+ # IT GOES STALE SILENTLY, and that is the cost. A job added to
116
+ # quality.yml is absent from this list and therefore RUNS here, on a
117
+ # nightly whose whole point is that it runs one suite. Measured while
118
+ # writing this file: the hand-maintained list in the first project to
119
+ # adopt this shape was already missing five keys that exist today
120
+ # (`bdd_coverage`, `state_classification`, `environment_reset`,
121
+ # `environment_reseed`, `skipped_required_checks`). Re-derive it from
122
+ # quality.yml when adding a suite, do not extend it from memory.
123
+ skip_jobs: 'bdd_coverage,build,dead_code,e2e_coverage,environment_reseed,environment_reset,floor_collisions,format,learnings_budget,license_compliance,lint,lint_slow,maestro_e2e,npm_security_scan,secret_scanning,sg_scan,skipped_required_checks,snyk,sonarcloud,state_classification,test:e2e,test:integration,test:mutation,test:unit,test_node_suites,threshold_ratchet,typecheck,work_item_traceability,zap_baseline'
124
+ # Cross-run mutex on whatever this suite shares with the OTHER suites
125
+ # that touch the same backend. Deliberately DISTINCT from this
126
+ # workflow's own top-level `concurrency` group above — a shared group
127
+ # between a parent run and the child run it is waiting on deadlocks.
128
+ # Join maestro-e2e.yml to the same group if the two suites share test
129
+ # accounts or fixtures.
130
+ concurrency_group: 'e2e-shared-development'
131
+ # Applies only while `e2e-browser` is undeclared — see the SHARDING note
132
+ # at the top of this file.
133
+ playwright_shards: 2
134
+ # Leave false unless the cache key has been checked against this
135
+ # project's layout. Lisa's key is a fingerprint of build inputs, and a
136
+ # key that misses the project's source directories freezes: `expo export`
137
+ # then serves stale transforms and every source change silently tests old
138
+ # code. A green suite over the previous commit is the worst failure this
139
+ # workflow has.
140
+ cache_build: false
141
+ # Runs before the web export, in the job that runs the suite. Bake the
142
+ # target environment in here — the export reads EXPO_PUBLIC_* from
143
+ # .env.local at BUILD time, so anything set after it is invisible to the
144
+ # running app.
145
+ #
146
+ # Use `printf '\n%s\n'` rather than `echo >>`: the committed .env.<mode>
147
+ # files do not end in a trailing newline, so a bare append concatenates
148
+ # onto the last variable's value — corrupting it AND silently dropping
149
+ # the line being added.
150
+ playwright_setup_command: |
151
+ cp .env.development .env.local
package/package.json CHANGED
@@ -133,7 +133,7 @@
133
133
  "ws": ">=8.21.0"
134
134
  },
135
135
  "name": "@codyswann/lisa",
136
- "version": "3.35.1",
136
+ "version": "3.38.0",
137
137
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
138
138
  "main": "dist/index.js",
139
139
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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-cdk",
3
- "version": "3.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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-expo",
3
- "version": "3.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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.35.1",
3
+ "version": "3.38.0",
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"