@codyswann/lisa 3.64.2 → 3.64.3

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 (74) hide show
  1. package/dist/cli/sync-cmd.d.ts +2 -1
  2. package/dist/cli/sync-cmd.d.ts.map +1 -1
  3. package/dist/cli/sync-cmd.js +14 -1
  4. package/dist/cli/sync-cmd.js.map +1 -1
  5. package/dist/configs/vitest/scratch-setup.d.ts.map +1 -1
  6. package/dist/configs/vitest/scratch-setup.js +47 -2
  7. package/dist/configs/vitest/scratch-setup.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 -1
  10. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  11. package/dist/sync/artifact-sync.d.ts +50 -0
  12. package/dist/sync/artifact-sync.d.ts.map +1 -0
  13. package/dist/sync/artifact-sync.js +142 -0
  14. package/dist/sync/artifact-sync.js.map +1 -0
  15. package/dist/sync/config-sync.d.ts +2 -16
  16. package/dist/sync/config-sync.d.ts.map +1 -1
  17. package/dist/sync/config-sync.js +12 -59
  18. package/dist/sync/config-sync.js.map +1 -1
  19. package/dist/sync/stryker-thresholds-ownership.d.ts +111 -0
  20. package/dist/sync/stryker-thresholds-ownership.d.ts.map +1 -0
  21. package/dist/sync/stryker-thresholds-ownership.js +227 -0
  22. package/dist/sync/stryker-thresholds-ownership.js.map +1 -0
  23. package/package.json +1 -1
  24. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-agy/plugin.json +1 -1
  27. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  30. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  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/typescript/create-only/stryker.conf.json +1 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Ownership contract for the one mutation-score floor that lives in two files.
3
+ *
4
+ * `.lisa.config.json` (`quality.mutation.strykerThresholds`) owns the value;
5
+ * `stryker.conf.json` (`thresholds`) is where Stryker reads it. Every other
6
+ * sync artifact is written wholesale (`pointer: ""`), so a hand-edit to one of
7
+ * those is obviously wrong and gets overwritten. `stryker.conf.json` is the
8
+ * only partial binding in the registry: editing 17 of its 18 keys is correct
9
+ * and editing the 18th is silently wrong — which is exactly the file that
10
+ * drifted (CodySwannGT/lisa#2968).
11
+ *
12
+ * This module is deliberately named after that single instance rather than
13
+ * generalised. A framework for a one-instance problem is a bigger mistake than
14
+ * the instance; if a second partial binding is ever added, the registry test
15
+ * that pins "exactly one partial binding" fails and forces the decision then.
16
+ *
17
+ * Two controls live here:
18
+ *
19
+ * 1. {@link describeMutationFloorDivergence} — the message the config sync
20
+ * fails with when the two floors disagree with nothing recording why. Sync
21
+ * refuses in BOTH directions: writing the config value can raise the floor
22
+ * above the score the codebase actually measures (reddening the mutation
23
+ * gate on unchanged code), and absorbing the file value would silently
24
+ * lower a declared floor.
25
+ *
26
+ * A divergence someone deliberately chose is a different case, and blocking
27
+ * it would make the guard the thing that gets deleted. When
28
+ * `_thresholdsDivergence` records BOTH live numbers and a reason, sync
29
+ * proceeds, leaves the enforced floor alone, and reports that it is
30
+ * honouring a recorded divergence — visible, not blocking. A declaration
31
+ * that has gone stale against either live value is no longer a record of a
32
+ * decision, so it stops exempting anything.
33
+ * 2. {@link checkMutationFloorOwnership} — the executable form of the
34
+ * ownership statement carried in `stryker.conf.json` itself, so that a
35
+ * hand-edit of `thresholds` fails a test instead of relying on a comment
36
+ * being read.
37
+ * @module sync/stryker-thresholds-ownership
38
+ */
39
+ import { getAtPath, isJsonObject, jsonEquals, } from "./json-path.js";
40
+ /** Config key that owns the mutation-score floor. */
41
+ export const MUTATION_FLOOR_CONFIG_KEY = "quality.mutation.strykerThresholds";
42
+ /** Config file that owns the mutation-score floor. */
43
+ export const MUTATION_FLOOR_CONFIG_FILE = ".lisa.config.json";
44
+ /** Artifact file that mirrors the mutation-score floor. */
45
+ export const MUTATION_FLOOR_ARTIFACT_FILE = "stryker.conf.json";
46
+ /** Dot path of the mirrored floor inside the artifact file. */
47
+ export const MUTATION_FLOOR_ARTIFACT_POINTER = "thresholds";
48
+ /** Artifact key stating, in the file itself, who owns `thresholds`. */
49
+ export const MUTATION_FLOOR_OWNER_FIELD = "_thresholdsOwner";
50
+ /** Artifact key declaring a deliberate, temporary, fully-recorded divergence. */
51
+ export const MUTATION_FLOOR_DIVERGENCE_FIELD = "_thresholdsDivergence";
52
+ /**
53
+ * Whether a registry binding is the single config-owned mutation floor.
54
+ * @param key - Registry entry key being synced
55
+ * @param file - Artifact file the binding writes
56
+ * @param pointer - Dot path inside that file
57
+ * @returns True for the one guarded binding
58
+ */
59
+ export function isMutationFloorBinding(key, file, pointer) {
60
+ return (key === MUTATION_FLOOR_CONFIG_KEY &&
61
+ file === MUTATION_FLOOR_ARTIFACT_FILE &&
62
+ pointer === MUTATION_FLOOR_ARTIFACT_POINTER);
63
+ }
64
+ /**
65
+ * Render a value for an operator-readable diagnosis.
66
+ * @param value - Any JSON value
67
+ * @returns Compact JSON text
68
+ */
69
+ function show(value) {
70
+ return JSON.stringify(value ?? null);
71
+ }
72
+ /**
73
+ * Build the operator-readable divergence diagnosis, naming both values and the
74
+ * file each came from.
75
+ * @param configValue - Floor declared in the config
76
+ * @param artifactValue - Floor enforced by the artifact
77
+ * @returns Multi-line failure message
78
+ */
79
+ export function describeMutationFloorDivergence(configValue, artifactValue) {
80
+ return [
81
+ "Mutation-score floor divergence — refusing to sync.",
82
+ "",
83
+ ` ${MUTATION_FLOOR_CONFIG_FILE} ${MUTATION_FLOOR_CONFIG_KEY} = ${show(configValue)}`,
84
+ ` ${MUTATION_FLOOR_ARTIFACT_FILE} ${MUTATION_FLOOR_ARTIFACT_POINTER} = ${show(artifactValue)}`,
85
+ "",
86
+ `\`${MUTATION_FLOOR_ARTIFACT_POINTER}\` in ${MUTATION_FLOOR_ARTIFACT_FILE} is owned by ${MUTATION_FLOOR_CONFIG_FILE},`,
87
+ "and the two disagree. Sync will not resolve that in either direction: writing the",
88
+ "declared floor can raise it above the score the codebase actually measures, which",
89
+ "reddens the mutation gate on code that did not change, and absorbing the enforced",
90
+ "floor would silently lower a declared standard.",
91
+ "",
92
+ "Measure the real aggregate mutation score, then set BOTH files to one value and re-run.",
93
+ ].join("\n");
94
+ }
95
+ /** Config sync refused to write because the two mutation floors disagree. */
96
+ export class MutationFloorDivergenceError extends Error {
97
+ /** Floor declared in the config. */
98
+ configValue;
99
+ /** Floor enforced by the artifact on disk. */
100
+ artifactValue;
101
+ /**
102
+ * Build the refusal carrying both floors.
103
+ * @param configValue - Floor declared in the config
104
+ * @param artifactValue - Floor enforced by the artifact
105
+ */
106
+ constructor(configValue, artifactValue) {
107
+ super(describeMutationFloorDivergence(configValue, artifactValue));
108
+ this.name = "MutationFloorDivergenceError";
109
+ this.configValue = configValue;
110
+ this.artifactValue = artifactValue;
111
+ }
112
+ }
113
+ /**
114
+ * Read `_thresholdsDivergence` when it still records the live numbers.
115
+ * @param strykerConf - Parsed `stryker.conf.json`
116
+ * @param onDisk - Floor this file currently enforces
117
+ * @param configValue - Floor the owning config key currently declares
118
+ * @returns The declaration, or undefined when absent, incomplete, or stale
119
+ */
120
+ export function readMutationFloorDeclaration(strykerConf, onDisk, configValue) {
121
+ const file = isJsonObject(strykerConf) ? strykerConf : {};
122
+ const declaration = file[MUTATION_FLOOR_DIVERGENCE_FIELD];
123
+ if (!isJsonObject(declaration)) {
124
+ return undefined;
125
+ }
126
+ if (declarationFieldProblems(declaration, onDisk, configValue).length > 0) {
127
+ return undefined;
128
+ }
129
+ return {
130
+ reason: String(declaration["reason"]),
131
+ enforced: declaration["enforced"],
132
+ declared: declaration["declared"],
133
+ };
134
+ }
135
+ /**
136
+ * Build the line sync prints when it honours a recorded divergence.
137
+ * @param declaration - The current, matching divergence declaration
138
+ * @returns Operator-readable single-line detail
139
+ */
140
+ export function describeHonouredMutationFloorDivergence(declaration) {
141
+ return [
142
+ `${MUTATION_FLOOR_ARTIFACT_FILE} \`${MUTATION_FLOOR_ARTIFACT_POINTER}\` left at ${show(declaration.enforced)}`,
143
+ `while ${MUTATION_FLOOR_CONFIG_FILE} ${MUTATION_FLOOR_CONFIG_KEY} declares ${show(declaration.declared)}`,
144
+ `— honouring the divergence recorded in \`${MUTATION_FLOOR_DIVERGENCE_FIELD}\`: ${declaration.reason}`,
145
+ ].join(" ");
146
+ }
147
+ /**
148
+ * Check the ownership statement carried by `stryker.conf.json` itself.
149
+ * @param strykerConf - Parsed `stryker.conf.json`
150
+ * @param configValue - Floor declared in the owning config key
151
+ * @returns One problem string per violation; empty when the file is in step
152
+ */
153
+ export function checkMutationFloorOwnership(strykerConf, configValue) {
154
+ const file = isJsonObject(strykerConf) ? strykerConf : {};
155
+ const thresholds = getAtPath(file, MUTATION_FLOOR_ARTIFACT_POINTER);
156
+ return [
157
+ ...ownerStatementProblems(file[MUTATION_FLOOR_OWNER_FIELD]),
158
+ ...divergenceProblems(file[MUTATION_FLOOR_DIVERGENCE_FIELD], thresholds, configValue),
159
+ ];
160
+ }
161
+ /**
162
+ * Validate the in-file statement that `thresholds` is config-owned.
163
+ * @param statement - Value of the ownership field
164
+ * @returns Problems found with the statement
165
+ */
166
+ function ownerStatementProblems(statement) {
167
+ const prefix = `${MUTATION_FLOOR_ARTIFACT_FILE} \`${MUTATION_FLOOR_ARTIFACT_POINTER}\``;
168
+ if (typeof statement !== "string" || statement.trim() === "") {
169
+ return [
170
+ `${prefix} is config-owned but \`${MUTATION_FLOOR_OWNER_FIELD}\` is missing. State the owner in the file, next to the key someone would edit.`,
171
+ ];
172
+ }
173
+ if (!statement.includes(MUTATION_FLOOR_CONFIG_FILE) ||
174
+ !statement.includes(MUTATION_FLOOR_CONFIG_KEY)) {
175
+ return [
176
+ `\`${MUTATION_FLOOR_OWNER_FIELD}\` must name the owner: ${MUTATION_FLOOR_CONFIG_FILE} ${MUTATION_FLOOR_CONFIG_KEY}.`,
177
+ ];
178
+ }
179
+ return [];
180
+ }
181
+ /**
182
+ * Validate `thresholds` against the owning config value and any declared,
183
+ * deliberate divergence recorded beside it.
184
+ * @param declaration - Value of the divergence field
185
+ * @param thresholds - Floor enforced by this file
186
+ * @param configValue - Floor declared in the owning config key
187
+ * @returns Problems found with the floor or its declaration
188
+ */
189
+ function divergenceProblems(declaration, thresholds, configValue) {
190
+ const prefix = `${MUTATION_FLOOR_ARTIFACT_FILE} \`${MUTATION_FLOOR_ARTIFACT_POINTER}\``;
191
+ if (jsonEquals(thresholds, configValue)) {
192
+ return declaration === undefined
193
+ ? []
194
+ : [
195
+ `${prefix} now matches ${MUTATION_FLOOR_CONFIG_KEY}, so \`${MUTATION_FLOOR_DIVERGENCE_FIELD}\` is stale — delete it.`,
196
+ ];
197
+ }
198
+ if (!isJsonObject(declaration)) {
199
+ return [
200
+ `${prefix} is ${show(thresholds)} but ${MUTATION_FLOOR_CONFIG_FILE} ${MUTATION_FLOOR_CONFIG_KEY} is ${show(configValue)}. Set both to one value, or record the deliberate divergence in \`${MUTATION_FLOOR_DIVERGENCE_FIELD}\` (reason, enforced, declared).`,
201
+ ];
202
+ }
203
+ return declarationFieldProblems(declaration, thresholds, configValue);
204
+ }
205
+ /**
206
+ * Check that a divergence declaration still records the live numbers.
207
+ * @param declaration - Divergence declaration object
208
+ * @param thresholds - Floor enforced by this file
209
+ * @param configValue - Floor declared in the owning config key
210
+ * @returns Problems found with the declaration's fields
211
+ */
212
+ function declarationFieldProblems(declaration, thresholds, configValue) {
213
+ const reason = declaration["reason"];
214
+ const stale = [
215
+ !jsonEquals(declaration["enforced"], thresholds)
216
+ ? `\`${MUTATION_FLOOR_DIVERGENCE_FIELD}.enforced\` records ${show(declaration["enforced"])} but ${MUTATION_FLOOR_ARTIFACT_FILE} \`${MUTATION_FLOOR_ARTIFACT_POINTER}\` is ${show(thresholds)} — the floor was hand-edited out of step.`
217
+ : undefined,
218
+ !jsonEquals(declaration["declared"], configValue)
219
+ ? `\`${MUTATION_FLOOR_DIVERGENCE_FIELD}.declared\` records ${show(declaration["declared"])} but ${MUTATION_FLOOR_CONFIG_KEY} is ${show(configValue)}.`
220
+ : undefined,
221
+ typeof reason !== "string" || reason.trim() === ""
222
+ ? `\`${MUTATION_FLOOR_DIVERGENCE_FIELD}.reason\` must say why the two floors are allowed to differ and what resolves it.`
223
+ : undefined,
224
+ ];
225
+ return stale.filter((problem) => problem !== undefined);
226
+ }
227
+ //# sourceMappingURL=stryker-thresholds-ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stryker-thresholds-ownership.js","sourceRoot":"","sources":["../../src/sync/stryker-thresholds-ownership.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -142,7 +142,7 @@
142
142
  "zod-validation-error": "^4.0.0"
143
143
  },
144
144
  "name": "@codyswann/lisa",
145
- "version": "3.64.2",
145
+ "version": "3.64.3",
146
146
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
147
147
  "main": "dist/index.js",
148
148
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
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.64.2",
3
+ "version": "3.64.3",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"