@codyswann/lisa 2.124.9 → 2.124.11
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.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -12
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +8 -2
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -12
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -12
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/scripts/generate-copilot-plugin-artifacts.mjs +41 -0
- package/scripts/lib/per-agent-hook-filter.mjs +38 -1
package/package.json
CHANGED
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"lodash": ">=4.18.1"
|
|
84
84
|
},
|
|
85
85
|
"name": "@codyswann/lisa",
|
|
86
|
-
"version": "2.124.
|
|
86
|
+
"version": "2.124.11",
|
|
87
87
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
88
88
|
"main": "dist/index.js",
|
|
89
89
|
"exports": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa",
|
|
3
|
-
"version": "2.124.
|
|
3
|
+
"version": "2.124.11",
|
|
4
4
|
"description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -45,17 +45,6 @@
|
|
|
45
45
|
}
|
|
46
46
|
]
|
|
47
47
|
}
|
|
48
|
-
],
|
|
49
|
-
"subagentStart": [
|
|
50
|
-
{
|
|
51
|
-
"matcher": "",
|
|
52
|
-
"hooks": [
|
|
53
|
-
{
|
|
54
|
-
"type": "command",
|
|
55
|
-
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/inject-rules.sh"
|
|
56
|
-
}
|
|
57
|
-
]
|
|
58
|
-
}
|
|
59
48
|
]
|
|
60
49
|
}
|
|
61
50
|
}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-expo",
|
|
3
|
-
"version": "2.124.
|
|
3
|
+
"version": "2.124.11",
|
|
4
4
|
"description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": [
|
|
9
9
|
"lisa-typescript"
|
|
10
|
-
]
|
|
10
|
+
],
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"expo": {
|
|
13
|
+
"type": "http",
|
|
14
|
+
"url": "https://mcp.expo.dev/mcp"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
11
17
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-harper-fabric",
|
|
3
|
-
"version": "2.124.
|
|
3
|
+
"version": "2.124.11",
|
|
4
4
|
"description": "Harper/Fabric-specific rules for TypeScript component apps",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -19,17 +19,6 @@
|
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
}
|
|
22
|
-
],
|
|
23
|
-
"subagentStart": [
|
|
24
|
-
{
|
|
25
|
-
"matcher": "",
|
|
26
|
-
"hooks": [
|
|
27
|
-
{
|
|
28
|
-
"type": "command",
|
|
29
|
-
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/inject-rules.sh"
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
22
|
]
|
|
34
23
|
}
|
|
35
24
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.124.
|
|
3
|
+
"version": "2.124.11",
|
|
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.124.
|
|
3
|
+
"version": "2.124.11",
|
|
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.124.
|
|
3
|
+
"version": "2.124.11",
|
|
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.124.
|
|
3
|
+
"version": "2.124.11",
|
|
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.124.
|
|
3
|
+
"version": "2.124.11",
|
|
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-rails",
|
|
3
|
-
"version": "2.124.
|
|
3
|
+
"version": "2.124.11",
|
|
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"
|
|
@@ -20,17 +20,6 @@
|
|
|
20
20
|
]
|
|
21
21
|
}
|
|
22
22
|
],
|
|
23
|
-
"subagentStart": [
|
|
24
|
-
{
|
|
25
|
-
"matcher": "",
|
|
26
|
-
"hooks": [
|
|
27
|
-
{
|
|
28
|
-
"type": "command",
|
|
29
|
-
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/inject-rules.sh"
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
],
|
|
34
23
|
"postToolUse": [
|
|
35
24
|
{
|
|
36
25
|
"matcher": "Write|Edit",
|
|
@@ -199,6 +199,47 @@ export function generateCopilotVariant(srcDir, outDir, version) {
|
|
|
199
199
|
} else {
|
|
200
200
|
delete manifest.hooks;
|
|
201
201
|
}
|
|
202
|
+
|
|
203
|
+
// 3b. Surface a bundled `.mcp.json`'s servers as an INLINE `mcpServers` object
|
|
204
|
+
// in the manifest. Copilot does NOT auto-discover a plugin's bundled
|
|
205
|
+
// `.mcp.json` (it reads `.mcp.json` only at the WORKSPACE root), and a
|
|
206
|
+
// `".mcp.json"` path-string pointer is ignored; only an inline `mcpServers`
|
|
207
|
+
// OBJECT in the manifest is honored. Verified by run (GitHub Copilot CLI
|
|
208
|
+
// 1.0.55, issue #1056): after `copilot plugin install`, the inline object made
|
|
209
|
+
// Copilot load the bundled server (the expo server initiated its OAuth
|
|
210
|
+
// connect), whereas bare `.mcp.json` and the path-string form both left
|
|
211
|
+
// Copilot reporting "No MCP servers configured". The `.mcp.json` file is kept
|
|
212
|
+
// (it is the source of truth and harmless to Copilot) and mirrored inline.
|
|
213
|
+
const mcpJsonPath = path.join(outDir, ".mcp.json");
|
|
214
|
+
if (fs.existsSync(mcpJsonPath)) {
|
|
215
|
+
try {
|
|
216
|
+
const mcpDoc = JSON.parse(fs.readFileSync(mcpJsonPath, "utf8"));
|
|
217
|
+
const servers = mcpDoc?.mcpServers;
|
|
218
|
+
if (
|
|
219
|
+
servers &&
|
|
220
|
+
typeof servers === "object" &&
|
|
221
|
+
!Array.isArray(servers) &&
|
|
222
|
+
Object.keys(servers).length > 0
|
|
223
|
+
) {
|
|
224
|
+
manifest.mcpServers = servers;
|
|
225
|
+
} else if (mcpDoc && "mcpServers" in mcpDoc) {
|
|
226
|
+
// Present but not a non-empty plain object (e.g. `[]`, a string) — a
|
|
227
|
+
// parseable-but-invalid file. Skip the pointer rather than emit a broken
|
|
228
|
+
// one, and surface why.
|
|
229
|
+
console.warn(
|
|
230
|
+
`[copilot] skipping mcpServers pointer: invalid mcpServers shape in ${mcpJsonPath}`
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
} catch (err) {
|
|
234
|
+
// Malformed `.mcp.json` — leave the manifest without an mcpServers pointer
|
|
235
|
+
// rather than emitting a broken one, but surface it so a broken MCP file
|
|
236
|
+
// doesn't ship silently without its servers.
|
|
237
|
+
console.warn(
|
|
238
|
+
`[copilot] skipping mcpServers pointer: could not parse ${mcpJsonPath}: ${err.message}`
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
202
243
|
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
|
|
203
244
|
|
|
204
245
|
// 4. Filter the hooks/ directory.
|
|
@@ -148,7 +148,9 @@ const COPILOT_EVENTS = {
|
|
|
148
148
|
SessionEnd: "sessionEnd",
|
|
149
149
|
UserPromptSubmit: "userPromptSubmitted",
|
|
150
150
|
Stop: "agentStop",
|
|
151
|
-
SubagentStart
|
|
151
|
+
// No `SubagentStart`: Copilot has no such event. It is dropped wholesale by
|
|
152
|
+
// AGENT_UNSUPPORTED_EVENTS before translation ever runs (see
|
|
153
|
+
// filterHooksForAgent), so it never needs a mapping here.
|
|
152
154
|
SubagentStop: "subagentStop",
|
|
153
155
|
};
|
|
154
156
|
|
|
@@ -169,6 +171,40 @@ const CURSOR_EVENTS = {
|
|
|
169
171
|
PreCompact: "preCompact",
|
|
170
172
|
};
|
|
171
173
|
|
|
174
|
+
/**
|
|
175
|
+
* Events a target agent's hook runner does NOT recognize. A hook block under one
|
|
176
|
+
* of these events is dropped wholesale for that agent — even when an individual
|
|
177
|
+
* handler script would otherwise ship — because emitting the event yields a
|
|
178
|
+
* manifest the agent rejects.
|
|
179
|
+
*
|
|
180
|
+
* Copilot has no `SubagentStart` event. Worse, the emitted `subagentStart` entry
|
|
181
|
+
* carries an empty `matcher`, and GitHub Copilot CLI (verified against 1.0.55)
|
|
182
|
+
* rejects the ENTIRE inline hooks config on it — `Invalid inline hooks config
|
|
183
|
+
* ...: hooks.subagentStart[0].matcher: matcher cannot be empty` — so NONE of the
|
|
184
|
+
* plugin's hooks fire, not just the subagent one. Dropping the event restores
|
|
185
|
+
* Copilot hook firing; `inject-rules.sh` still ships under `SessionStart`, so no
|
|
186
|
+
* rule delivery is lost. (Issue #1056, verified by run: with `subagentStart`
|
|
187
|
+
* present zero hooks fired; with it removed the `SessionStart` hooks fired and
|
|
188
|
+
* `${CLAUDE_PLUGIN_ROOT}` resolved.)
|
|
189
|
+
*
|
|
190
|
+
* @type {Record<string, Set<string>>}
|
|
191
|
+
*/
|
|
192
|
+
const AGENT_UNSUPPORTED_EVENTS = {
|
|
193
|
+
copilot: new Set(["SubagentStart"]),
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Whether a Claude event name is unsupported by the target agent and must be
|
|
198
|
+
* dropped wholesale (not translated, not partially filtered).
|
|
199
|
+
*
|
|
200
|
+
* @param {string} claudeEventName Claude event name (e.g. "SubagentStart")
|
|
201
|
+
* @param {"cursor"|"agy"|"copilot"|"codex"} agent Target agent slug
|
|
202
|
+
* @returns {boolean}
|
|
203
|
+
*/
|
|
204
|
+
export function isUnsupportedEvent(claudeEventName, agent) {
|
|
205
|
+
return Boolean(AGENT_UNSUPPORTED_EVENTS[agent]?.has(claudeEventName));
|
|
206
|
+
}
|
|
207
|
+
|
|
172
208
|
/**
|
|
173
209
|
* Translate Claude PascalCase event names to a target agent's native casing.
|
|
174
210
|
*
|
|
@@ -278,6 +314,7 @@ export function filterHooksForAgent(hookBlock, agent, opts = {}) {
|
|
|
278
314
|
const out = {};
|
|
279
315
|
|
|
280
316
|
for (const [claudeEventName, entries] of Object.entries(hookBlock)) {
|
|
317
|
+
if (isUnsupportedEvent(claudeEventName, agent)) continue;
|
|
281
318
|
if (!Array.isArray(entries)) continue;
|
|
282
319
|
const filteredEntries = [];
|
|
283
320
|
for (const entry of entries) {
|