@codyswann/lisa 4.4.2 → 4.4.4
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/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +2 -18
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- 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 -1
- 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 +1 -1
- 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 -1
- 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-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-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 -1
- 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/plugin-parity-drift.mjs +66 -11
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/SKILL.md +0 -263
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/agents/openai.yaml +0 -4
- package/plugins/lisa/commands/parity-safety-net-rules.md +0 -6
- package/plugins/lisa/skills/lisa-parity-safety-net-rules/SKILL.md +0 -263
- package/plugins/lisa/skills/lisa-parity-safety-net-rules/agents/openai.yaml +0 -4
- package/plugins/lisa-agy/commands/lisa/parity-safety-net-rules.md +0 -6
- package/plugins/lisa-agy/skills/lisa-parity-safety-net-rules/SKILL.md +0 -263
- package/plugins/lisa-copilot/commands/lisa/parity-safety-net-rules.md +0 -6
- package/plugins/lisa-copilot/skills/lisa-parity-safety-net-rules/SKILL.md +0 -263
- package/plugins/lisa-cursor/commands/lisa/parity-safety-net-rules.md +0 -6
- package/plugins/lisa-cursor/skills/lisa-parity-safety-net-rules/SKILL.md +0 -263
- package/plugins/src/base/commands/parity-safety-net-rules.md +0 -6
- package/plugins/src/base/skills/lisa-parity-safety-net-rules/SKILL.md +0 -263
package/package.json
CHANGED
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
"zod-validation-error": "^4.0.0"
|
|
146
146
|
},
|
|
147
147
|
"name": "@codyswann/lisa",
|
|
148
|
-
"version": "4.4.
|
|
148
|
+
"version": "4.4.4",
|
|
149
149
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
150
150
|
"main": "dist/index.js",
|
|
151
151
|
"exports": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.4",
|
|
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": "4.4.
|
|
3
|
+
"version": "4.4.4",
|
|
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": "4.4.
|
|
3
|
+
"version": "4.4.4",
|
|
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": "4.4.
|
|
3
|
+
"version": "4.4.4",
|
|
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": "4.4.
|
|
3
|
+
"version": "4.4.4",
|
|
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"
|
|
@@ -278,12 +278,51 @@ function readManifestVersion(manifestPath) {
|
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
+
/**
|
|
282
|
+
* Whether a cached version directory has been ORPHANED — the plugin manager's
|
|
283
|
+
* marker for a version that is no longer installed or served.
|
|
284
|
+
*
|
|
285
|
+
* The cache is append-mostly: uninstalling a plugin does not delete its version
|
|
286
|
+
* directories, it stamps each one with `.orphaned_at`. So the directories on
|
|
287
|
+
* disk are a record of every version ever fetched, not of what is installed
|
|
288
|
+
* now, and reading them as the latter is how this script came to compare a pin
|
|
289
|
+
* against ten-day-old leftovers.
|
|
290
|
+
*
|
|
291
|
+
* @param {string} versionDir - absolute path to one cached version directory.
|
|
292
|
+
* @returns {boolean} true when the directory carries an orphan marker.
|
|
293
|
+
*/
|
|
294
|
+
function isOrphanedVersion(versionDir) {
|
|
295
|
+
return fs.existsSync(path.join(versionDir, ".orphaned_at"));
|
|
296
|
+
}
|
|
297
|
+
|
|
281
298
|
/**
|
|
282
299
|
* Resolve the current upstream version of `name@marketplace` purely from the
|
|
283
|
-
* cache tree: the MAX valid semver across the immediate version subdirs
|
|
284
|
-
* from each subdir's `.claude-plugin/plugin.json`
|
|
285
|
-
* dirs (`unknown`, git hashes) are skipped because
|
|
286
|
-
* counts
|
|
300
|
+
* cache tree: the MAX valid semver across the immediate version subdirs that
|
|
301
|
+
* are still LIVE, read from each subdir's `.claude-plugin/plugin.json`
|
|
302
|
+
* `version` field. Non-semver dirs (`unknown`, git hashes) are skipped because
|
|
303
|
+
* the manifest version is what counts, and orphaned dirs are skipped because
|
|
304
|
+
* they are not installed.
|
|
305
|
+
*
|
|
306
|
+
* Orphans are filtered BEFORE the max, and the order is load-bearing.
|
|
307
|
+
* "Filter, then take the max" and "take the max, then check whether it is
|
|
308
|
+
* orphaned" are different functions, and they disagree exactly when the newest
|
|
309
|
+
* live version is older than an orphan:
|
|
310
|
+
*
|
|
311
|
+
* live 1.0.6 + orphaned 2.0.4
|
|
312
|
+
* filter-then-max -> 1.0.6 (correct: 1.0.6 IS installed)
|
|
313
|
+
* max-then-check -> not-installed (wrong)
|
|
314
|
+
*
|
|
315
|
+
* When nothing live remains, this reports `not-installed` — a status this
|
|
316
|
+
* script already has and already handles — rather than manufacturing a current
|
|
317
|
+
* version out of orphans. That is `core/apply-receipt`'s principle: an
|
|
318
|
+
* unresolvable state reports unresolvable, not half-understood.
|
|
319
|
+
*
|
|
320
|
+
* The failure this closes was not theoretical. Every one of the ten cached
|
|
321
|
+
* `safety-net` versions was orphaned in a single sweep, and the resulting
|
|
322
|
+
* manufactured comparison blocked every push from the checkout — in one
|
|
323
|
+
* direction, and then, after a pin was moved to satisfy it, in the other.
|
|
324
|
+
* A defect that produces two opposite plausible remedies is one where the
|
|
325
|
+
* remedy is in neither direction.
|
|
287
326
|
*
|
|
288
327
|
* @param {string} cacheRoot - the installed-plugin cache root.
|
|
289
328
|
* @param {string} name - plugin name.
|
|
@@ -304,23 +343,39 @@ export function resolveCurrentVersion(cacheRoot, name, marketplace) {
|
|
|
304
343
|
return { status: NOT_INSTALLED, version: null };
|
|
305
344
|
}
|
|
306
345
|
const versions = [];
|
|
346
|
+
// Counted separately from `versions`, because "nothing is installed" and
|
|
347
|
+
// "something is installed but I cannot read its version" are different
|
|
348
|
+
// answers and must not collapse into one. A live directory with an
|
|
349
|
+
// unparseable manifest is `unresolved`; no live directory at all is
|
|
350
|
+
// `not-installed`.
|
|
351
|
+
let liveDirs = 0;
|
|
307
352
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
308
353
|
if (!entry.isDirectory()) {
|
|
309
354
|
continue;
|
|
310
355
|
}
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
356
|
+
const versionDir = path.join(dir, entry.name);
|
|
357
|
+
// Before the manifest is even read: an orphaned directory is not an
|
|
358
|
+
// installed version, whatever its manifest claims.
|
|
359
|
+
if (isOrphanedVersion(versionDir)) {
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
liveDirs += 1;
|
|
363
|
+
const manifest = path.join(versionDir, ".claude-plugin", "plugin.json");
|
|
317
364
|
const version = readManifestVersion(manifest);
|
|
318
365
|
if (version !== null && isValidSemver(version)) {
|
|
319
366
|
versions.push(version);
|
|
320
367
|
}
|
|
321
368
|
}
|
|
322
369
|
if (versions.length === 0) {
|
|
323
|
-
|
|
370
|
+
// No live directory at all means the plugin is not installed — a known,
|
|
371
|
+
// answerable state, and the one the whole orphan filter exists to reach.
|
|
372
|
+
// But a live directory whose manifest would not parse is still INSTALLED
|
|
373
|
+
// and merely unreadable, which is what `unresolved` has always meant.
|
|
374
|
+
// Collapsing the two would answer "I cannot read this version" with "this
|
|
375
|
+
// is not here", and an operator would go looking for the wrong thing.
|
|
376
|
+
return liveDirs === 0
|
|
377
|
+
? { status: NOT_INSTALLED, version: null }
|
|
378
|
+
: { status: "unresolved", version: null };
|
|
324
379
|
}
|
|
325
380
|
// `versions` is non-empty (guarded above), so seeding with the first element
|
|
326
381
|
// is exactly what the no-seed form did — and it cannot throw if that guard is
|