@codyswann/lisa 2.228.0 → 2.229.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 (65) hide show
  1. package/dist/cli/ui-cmd.d.ts +9 -1
  2. package/dist/cli/ui-cmd.d.ts.map +1 -1
  3. package/dist/cli/ui-cmd.js +142 -11
  4. package/dist/cli/ui-cmd.js.map +1 -1
  5. package/dist/cli/ui-status-json.d.ts +29 -0
  6. package/dist/cli/ui-status-json.d.ts.map +1 -0
  7. package/dist/cli/ui-status-json.js +162 -0
  8. package/dist/cli/ui-status-json.js.map +1 -0
  9. package/dist/cli/ui-status.d.ts +42 -0
  10. package/dist/cli/ui-status.d.ts.map +1 -0
  11. package/dist/cli/ui-status.js +221 -0
  12. package/dist/cli/ui-status.js.map +1 -0
  13. package/package.json +2 -1
  14. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-agy/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo-agy/plugin.json +1 -1
  27. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  37. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  42. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  47. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails-agy/plugin.json +1 -1
  52. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  57. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  62. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  64. package/ui/README.md +15 -0
  65. package/ui/index.html +156 -0
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Live-status probe contract and bounded execution for `lisa ui`.
3
+ * @module cli/ui-status
4
+ */
5
+ import { execFile } from "node:child_process";
6
+ import { normalizeProbeResult } from "./ui-status-json.js";
7
+ /** Error used internally to distinguish a bounded probe timeout. */
8
+ class ProbeTimeoutError extends Error {
9
+ /**
10
+ * Create a probe timeout error.
11
+ * @param timeoutMs - Configured timeout in milliseconds
12
+ */
13
+ constructor(timeoutMs) {
14
+ super(`Probe timed out after ${timeoutMs}ms`);
15
+ this.name = "ProbeTimeoutError";
16
+ }
17
+ }
18
+ /**
19
+ * Convert arbitrary thrown data into a stable failure classification.
20
+ * @param error - Value thrown by a probe
21
+ * @returns Timeout classification and non-empty human-readable message
22
+ */
23
+ function classifyProbeError(error) {
24
+ try {
25
+ const timedOut = error instanceof ProbeTimeoutError;
26
+ const rawMessage = error instanceof Error ? error.message : String(error);
27
+ return {
28
+ timedOut,
29
+ message: rawMessage.trim().length > 0
30
+ ? rawMessage
31
+ : "Probe failed without an error message",
32
+ };
33
+ }
34
+ catch {
35
+ return {
36
+ timedOut: false,
37
+ message: "Probe failed with an unreadable error",
38
+ };
39
+ }
40
+ }
41
+ /**
42
+ * Run one probe without allowing it to block siblings or fabricate data.
43
+ * @param probe - Probe to execute
44
+ * @returns Explicit result, or unknown for invalid input, failure, or timeout
45
+ */
46
+ export async function runProbe(probe) {
47
+ if (!Number.isFinite(probe.timeoutMs) || probe.timeoutMs < 0) {
48
+ return {
49
+ state: "unknown",
50
+ reason: "invalid-timeout",
51
+ message: `Probe timeout must be a finite non-negative number; received ${String(probe.timeoutMs)}`,
52
+ };
53
+ }
54
+ const controller = new AbortController();
55
+ const timeout = new Promise((_resolve, reject) => {
56
+ controller.signal.addEventListener("abort", () => reject(controller.signal.reason), { once: true });
57
+ });
58
+ const timer = setTimeout(() => controller.abort(new ProbeTimeoutError(probe.timeoutMs)), probe.timeoutMs);
59
+ try {
60
+ const result = await Promise.race([probe.run(controller.signal), timeout]);
61
+ return normalizeProbeResult(result);
62
+ }
63
+ catch (error) {
64
+ const { timedOut, message } = classifyProbeError(error);
65
+ return {
66
+ state: "unknown",
67
+ reason: timedOut ? "timeout" : "probe-failed",
68
+ message,
69
+ };
70
+ }
71
+ finally {
72
+ clearTimeout(timer);
73
+ }
74
+ }
75
+ /**
76
+ * Execute `gh auth status` without invoking a shell.
77
+ * @param cwd - Project root used as the command working directory
78
+ * @param timeoutMs - Child-process timeout in milliseconds
79
+ * @param signal - Cancellation signal controlled by the probe runner
80
+ * @param hostname - Project origin hostname whose active account is checked
81
+ * @returns Authentication state when the command runs
82
+ */
83
+ const runGithubAuthStatus = async (cwd, timeoutMs, signal, hostname) => await new Promise((resolve, reject) => {
84
+ const ghExecutable = "gh";
85
+ execFile(
86
+ // eslint-disable-next-line sonarjs/no-os-command-from-path -- fixed user-installed gh executable
87
+ ghExecutable, ["auth", "status", "--active", "--hostname", hostname, "--json", "hosts"], { cwd, signal, timeout: timeoutMs, encoding: "utf8" }, (error, stdout) => {
88
+ if (error !== null) {
89
+ reject(error);
90
+ return;
91
+ }
92
+ try {
93
+ const parsed = JSON.parse(stdout);
94
+ if (typeof parsed !== "object" || parsed === null) {
95
+ throw new TypeError("GitHub auth status did not return an object");
96
+ }
97
+ const hosts = Reflect.get(parsed, "hosts");
98
+ if (typeof hosts !== "object" || hosts === null) {
99
+ throw new TypeError("GitHub auth status omitted its hosts map");
100
+ }
101
+ const accounts = Reflect.get(hosts, hostname);
102
+ const authenticated = Array.isArray(accounts) &&
103
+ accounts.some(account => typeof account === "object" &&
104
+ account !== null &&
105
+ Reflect.get(account, "active") === true &&
106
+ Reflect.get(account, "state") === "success");
107
+ resolve(authenticated ? "authenticated" : "not-authenticated");
108
+ }
109
+ catch (parseError) {
110
+ reject(parseError);
111
+ }
112
+ });
113
+ });
114
+ /**
115
+ * Read the effective origin URL through git without invoking a shell.
116
+ * @param cwd - Project root
117
+ * @param timeoutMs - Child-process timeout
118
+ * @param signal - Probe cancellation signal
119
+ * @returns Origin remote URL
120
+ */
121
+ async function readOriginRemote(cwd, timeoutMs, signal) {
122
+ return await new Promise((resolve, reject) => {
123
+ const gitExecutable = "git";
124
+ execFile(
125
+ // eslint-disable-next-line sonarjs/no-os-command-from-path -- fixed user-installed git executable
126
+ gitExecutable, ["-C", cwd, "remote", "get-url", "origin"], { cwd, signal, timeout: timeoutMs, encoding: "utf8" }, (error, stdout) => {
127
+ if (error !== null) {
128
+ reject(error);
129
+ return;
130
+ }
131
+ const remote = stdout.trim();
132
+ if (remote.length === 0) {
133
+ reject(new Error("Project origin remote is empty"));
134
+ return;
135
+ }
136
+ resolve(remote);
137
+ });
138
+ });
139
+ }
140
+ /**
141
+ * Extract a hostname from URL-form and scp-form git remotes.
142
+ * @param remote - Git remote URL
143
+ * @returns Hostname used by `gh auth status`
144
+ */
145
+ function remoteHostname(remote) {
146
+ const normalize = (hostname) => {
147
+ const normalized = hostname.toLowerCase();
148
+ return normalized.endsWith(".") ? normalized.slice(0, -1) : normalized;
149
+ };
150
+ if (!remote.includes("://")) {
151
+ const separator = remote.indexOf(":");
152
+ const authority = separator > 0 ? remote.slice(0, separator) : "";
153
+ const host = authority.slice(authority.lastIndexOf("@") + 1);
154
+ const looksLikeWindowsPath = authority.length === 1 && /[A-Za-z]/u.test(authority);
155
+ if (host.length > 0 &&
156
+ !looksLikeWindowsPath &&
157
+ !Array.from(host).some(character => /\s/u.test(character))) {
158
+ return normalize(host);
159
+ }
160
+ }
161
+ try {
162
+ const hostname = new URL(remote).hostname;
163
+ if (hostname.length > 0) {
164
+ return normalize(hostname);
165
+ }
166
+ }
167
+ catch {
168
+ // Fall through to the explicit error below.
169
+ }
170
+ throw new Error(`Unable to determine GitHub hostname from origin: ${remote}`);
171
+ }
172
+ /**
173
+ * Create the reference GitHub authentication probe.
174
+ * @param cwd - Project root used as the command working directory
175
+ * @param check - Injectable command check used by focused tests
176
+ * @param readRemote - Injectable effective-origin reader used by focused tests
177
+ * @returns Reference probe for the live-status transport
178
+ */
179
+ export function createGithubAuthProbe(cwd, check = runGithubAuthStatus, readRemote = readOriginRemote) {
180
+ const timeoutMs = 5_000;
181
+ return {
182
+ id: "github-auth",
183
+ timeoutMs,
184
+ run: async (signal) => {
185
+ const remote = await readRemote(cwd, timeoutMs + 250, signal);
186
+ const hostname = remoteHostname(remote);
187
+ const state = await check(cwd, timeoutMs + 250, signal, hostname);
188
+ return state === "authenticated"
189
+ ? { state: "value", value: true }
190
+ : {
191
+ state: "unknown",
192
+ reason: "not-authenticated",
193
+ message: "GitHub CLI is not authenticated",
194
+ };
195
+ },
196
+ };
197
+ }
198
+ /**
199
+ * Validate probe keys before binding a server so status snapshots cannot lose data.
200
+ * @param probes - Registered status probes
201
+ */
202
+ export function validateStatusProbes(probes) {
203
+ for (const [index, probe] of probes.entries()) {
204
+ if (probe.id.trim().length === 0) {
205
+ throw new Error("Probe id must contain a non-whitespace character");
206
+ }
207
+ if (probes.slice(0, index).some(candidate => candidate.id === probe.id)) {
208
+ throw new Error(`Duplicate probe id: ${probe.id}`);
209
+ }
210
+ }
211
+ }
212
+ /**
213
+ * Execute all probes concurrently, with failures isolated per probe.
214
+ * @param probes - Probes to execute
215
+ * @returns Results keyed by stable probe identifier
216
+ */
217
+ export async function readStatusSnapshot(probes) {
218
+ const entries = await Promise.all(probes.map(async (probe) => [probe.id, await runProbe(probe)]));
219
+ return Object.fromEntries(entries);
220
+ }
221
+ //# sourceMappingURL=ui-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-status.js","sourceRoot":"","sources":["../../src/cli/ui-status.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -102,7 +102,7 @@
102
102
  "form-data": ">=4.0.6"
103
103
  },
104
104
  "name": "@codyswann/lisa",
105
- "version": "2.228.0",
105
+ "version": "2.229.0",
106
106
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
107
107
  "main": "dist/index.js",
108
108
  "exports": {
@@ -227,6 +227,7 @@
227
227
  },
228
228
  "devDependencies": {
229
229
  "@codyswann/lisa": "^2.195.6",
230
+ "@playwright/test": "^1.61.1",
230
231
  "@types/js-yaml": "^4.0.9",
231
232
  "@types/semver": "^7.7.1",
232
233
  "eslint-plugin-oxlint": "^1.62.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.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": "2.228.0",
3
+ "version": "2.229.0",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"