@codyswann/lisa 2.137.3 → 2.138.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.
- package/dist/claude/claude-md-installer.d.ts +6 -0
- package/dist/claude/claude-md-installer.d.ts.map +1 -1
- package/dist/claude/claude-md-installer.js +27 -29
- package/dist/claude/claude-md-installer.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +55 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/codex/agents-md-installer.d.ts +5 -5
- package/dist/codex/agents-md-installer.d.ts.map +1 -1
- package/dist/codex/agents-md-installer.js +42 -37
- package/dist/codex/agents-md-installer.js.map +1 -1
- package/dist/copilot/copilot-instructions-installer.d.ts.map +1 -1
- package/dist/copilot/copilot-instructions-installer.js +9 -12
- package/dist/copilot/copilot-instructions-installer.js.map +1 -1
- package/dist/core/instruction-files-migration.d.ts +30 -0
- package/dist/core/instruction-files-migration.d.ts.map +1 -0
- package/dist/core/instruction-files-migration.js +108 -0
- package/dist/core/instruction-files-migration.js.map +1 -0
- package/dist/core/lisa.d.ts +14 -22
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +31 -47
- package/dist/core/lisa.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-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/dist/agy/agents-md-installer.d.ts +0 -27
- package/dist/agy/agents-md-installer.d.ts.map +0 -1
- package/dist/agy/agents-md-installer.js +0 -131
- package/dist/agy/agents-md-installer.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.138.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.
|
|
3
|
+
"version": "2.138.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.
|
|
3
|
+
"version": "2.138.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.
|
|
3
|
+
"version": "2.138.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.
|
|
3
|
+
"version": "2.138.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,27 +0,0 @@
|
|
|
1
|
-
/** Filename of agy's project memory file (auto-loaded since v1.20.3). */
|
|
2
|
-
export declare const AGENTS_MD_FILENAME = "AGENTS.md";
|
|
3
|
-
/** Marker placed at the start of the Lisa-managed block in AGENTS.md. */
|
|
4
|
-
export declare const LISA_RULES_START_MARKER = "<!-- LISA_RULES_START -->";
|
|
5
|
-
/** Marker placed at the end of the Lisa-managed block in AGENTS.md. */
|
|
6
|
-
export declare const LISA_RULES_END_MARKER = "<!-- LISA_RULES_END -->";
|
|
7
|
-
/** Result of the agy AGENTS.md install pass. */
|
|
8
|
-
export interface AgyAgentsMdInstallResult {
|
|
9
|
-
/** Absolute path to the AGENTS.md file. */
|
|
10
|
-
readonly path: string;
|
|
11
|
-
/** True when this run created the file for the first time. */
|
|
12
|
-
readonly created: boolean;
|
|
13
|
-
/** Number of `.md` rule files baked into the marker block. */
|
|
14
|
-
readonly rulesBaked: number;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Install (or refresh) Lisa's AGENTS.md at the host project root for agy.
|
|
18
|
-
* @param destDir - Absolute path to the host project root.
|
|
19
|
-
* @param rulesEagerDirs - One or more absolute paths to `rules/eager/`
|
|
20
|
-
* directories whose `.md` bodies are baked in, in order. Pass the base
|
|
21
|
-
* plugin's dir plus each detected stack plugin's dir so agy gets the same
|
|
22
|
-
* eager rules Claude/Codex load via hooks. A bare string is accepted for
|
|
23
|
-
* backward compatibility.
|
|
24
|
-
* @returns Install result describing path, creation, and rules baked.
|
|
25
|
-
*/
|
|
26
|
-
export declare function installAgyAgentsMd(destDir: string, rulesEagerDirs: readonly string[] | string): Promise<AgyAgentsMdInstallResult>;
|
|
27
|
-
//# sourceMappingURL=agents-md-installer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md-installer.d.ts","sourceRoot":"","sources":["../../src/agy/agents-md-installer.ts"],"names":[],"mappings":"AA6BA,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAE/D,gDAAgD;AAChD,MAAM,WAAW,wBAAwB;IACvC,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA+ED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GACzC,OAAO,CAAC,wBAAwB,CAAC,CAoBnC"}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Write Lisa's AGENTS.md template for agy host projects, with rule content
|
|
3
|
-
* baked directly into the file body.
|
|
4
|
-
*
|
|
5
|
-
* Per the parity research artifact (Cluster 4-agy / Option α), Lisa cannot
|
|
6
|
-
* polyfill rules-injection on agy via a SessionStart hook because agy plugin
|
|
7
|
-
* hooks do not fire in `-p` headless mode. The alternative is to bake the
|
|
8
|
-
* eager rule content into the AGENTS.md template that agy auto-loads at
|
|
9
|
-
* session start (verified-by-doc since v1.20.3).
|
|
10
|
-
*
|
|
11
|
-
* Behavior diverges from `src/codex/agents-md-installer.ts`:
|
|
12
|
-
* - Codex installer is create-only and references hooks for rule injection.
|
|
13
|
-
* - agy installer is also create-only but appends the rule bodies directly
|
|
14
|
-
* to the template, with a Lisa-managed section marker so re-runs can
|
|
15
|
-
* refresh the rule content without overwriting host-authored sections.
|
|
16
|
-
*
|
|
17
|
-
* The marker block convention mirrors the tagged-merge pattern used in
|
|
18
|
-
* `src/codex/hooks-merger.ts`. On re-runs, the installer:
|
|
19
|
-
* 1. Reads the existing AGENTS.md.
|
|
20
|
-
* 2. Strips the `<!-- LISA_RULES_START -->...<!-- LISA_RULES_END -->` block
|
|
21
|
-
* if present.
|
|
22
|
-
* 3. Re-emits Lisa's current eager rules between fresh markers.
|
|
23
|
-
* 4. Preserves all content outside the marker block (host-authored guidance).
|
|
24
|
-
* @module agy/agents-md-installer
|
|
25
|
-
*/
|
|
26
|
-
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
27
|
-
import { existsSync } from "node:fs";
|
|
28
|
-
import * as path from "node:path";
|
|
29
|
-
/** Filename of agy's project memory file (auto-loaded since v1.20.3). */
|
|
30
|
-
export const AGENTS_MD_FILENAME = "AGENTS.md";
|
|
31
|
-
/** Marker placed at the start of the Lisa-managed block in AGENTS.md. */
|
|
32
|
-
export const LISA_RULES_START_MARKER = "<!-- LISA_RULES_START -->";
|
|
33
|
-
/** Marker placed at the end of the Lisa-managed block in AGENTS.md. */
|
|
34
|
-
export const LISA_RULES_END_MARKER = "<!-- LISA_RULES_END -->";
|
|
35
|
-
const HEADER = `# AGENTS.md
|
|
36
|
-
|
|
37
|
-
This file is auto-loaded by Antigravity (\`agy\`) at the start of every
|
|
38
|
-
session. Lisa polyfills rule injection by baking its eager rule content
|
|
39
|
-
directly into this file (agy plugin hooks do not fire in \`-p\` headless
|
|
40
|
-
mode, so the SessionStart-hook strategy Lisa uses on Claude and Codex is
|
|
41
|
-
not available on agy).
|
|
42
|
-
|
|
43
|
-
Anything between the markers below is Lisa-managed and is rewritten on
|
|
44
|
-
every \`lisa apply\` run. Add project-specific guidance OUTSIDE the marker
|
|
45
|
-
block — it will be preserved across re-applies.
|
|
46
|
-
`;
|
|
47
|
-
/**
|
|
48
|
-
* Read all eager rule files (the bodies Lisa wants in session context)
|
|
49
|
-
* sorted by filename for stable output.
|
|
50
|
-
* @param rulesEagerDir - Absolute path to the plugin's `rules/eager/` directory.
|
|
51
|
-
* @returns Array of `{ filename, body }` pairs.
|
|
52
|
-
*/
|
|
53
|
-
async function readEagerRules(rulesEagerDir) {
|
|
54
|
-
if (!existsSync(rulesEagerDir))
|
|
55
|
-
return [];
|
|
56
|
-
const entries = await readdir(rulesEagerDir, { withFileTypes: true });
|
|
57
|
-
const mdEntries = [
|
|
58
|
-
...entries.filter(entry => entry.isFile() && entry.name.endsWith(".md")),
|
|
59
|
-
].sort((a, b) => a.name.localeCompare(b.name));
|
|
60
|
-
return await Promise.all(mdEntries.map(async (entry) => {
|
|
61
|
-
const filePath = path.join(rulesEagerDir, entry.name);
|
|
62
|
-
const body = await readFile(filePath, "utf8");
|
|
63
|
-
return { filename: entry.name, body };
|
|
64
|
-
}));
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Build the Lisa-managed marker block from the eager rule bodies.
|
|
68
|
-
* @param rules - Eager rule contents read from `rules/eager/*.md`.
|
|
69
|
-
* @returns Markdown text including the start/end markers.
|
|
70
|
-
*/
|
|
71
|
-
function buildLisaBlock(rules) {
|
|
72
|
-
const sections = rules.map(rule => {
|
|
73
|
-
// Drop any existing leading H1 from rule bodies — they are already
|
|
74
|
-
// contextual subsections inside AGENTS.md, not standalone documents.
|
|
75
|
-
// Strip an optional leading H1 line — bounded to one line and one trailing
|
|
76
|
-
// newline pair to satisfy sonarjs/slow-regex (no unbounded `+` quantifiers).
|
|
77
|
-
const trimmed = rule.body.replace(/^# [^\n]{0,256}\n\n?/, "").trim();
|
|
78
|
-
const heading = `## ${rule.filename.replace(/\.md$/, "")}\n\n`;
|
|
79
|
-
return `${heading + trimmed}\n`;
|
|
80
|
-
});
|
|
81
|
-
return `${LISA_RULES_START_MARKER}\n\n${sections.join("\n")}\n${LISA_RULES_END_MARKER}\n`;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Strip an existing Lisa-managed block from the AGENTS.md body and return the
|
|
85
|
-
* surrounding host-authored content.
|
|
86
|
-
*
|
|
87
|
-
* Tolerates either ordering and whitespace variance around the markers.
|
|
88
|
-
* @param body - Existing AGENTS.md file contents.
|
|
89
|
-
* @returns The body with the Lisa block (if present) removed.
|
|
90
|
-
*/
|
|
91
|
-
function stripExistingLisaBlock(body) {
|
|
92
|
-
const startIdx = body.indexOf(LISA_RULES_START_MARKER);
|
|
93
|
-
const endIdx = body.indexOf(LISA_RULES_END_MARKER);
|
|
94
|
-
if (startIdx === -1 || endIdx === -1 || endIdx < startIdx) {
|
|
95
|
-
return body;
|
|
96
|
-
}
|
|
97
|
-
const before = body.slice(0, startIdx);
|
|
98
|
-
const after = body.slice(endIdx + LISA_RULES_END_MARKER.length);
|
|
99
|
-
// Use a bounded quantifier instead of `{3,}` (unbounded) to satisfy
|
|
100
|
-
// sonarjs/slow-regex — three or more consecutive newlines collapse to two.
|
|
101
|
-
return `${(before + after).replace(/\n\n\n+/g, "\n\n").trim()}\n`;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Install (or refresh) Lisa's AGENTS.md at the host project root for agy.
|
|
105
|
-
* @param destDir - Absolute path to the host project root.
|
|
106
|
-
* @param rulesEagerDirs - One or more absolute paths to `rules/eager/`
|
|
107
|
-
* directories whose `.md` bodies are baked in, in order. Pass the base
|
|
108
|
-
* plugin's dir plus each detected stack plugin's dir so agy gets the same
|
|
109
|
-
* eager rules Claude/Codex load via hooks. A bare string is accepted for
|
|
110
|
-
* backward compatibility.
|
|
111
|
-
* @returns Install result describing path, creation, and rules baked.
|
|
112
|
-
*/
|
|
113
|
-
export async function installAgyAgentsMd(destDir, rulesEagerDirs) {
|
|
114
|
-
await mkdir(destDir, { recursive: true });
|
|
115
|
-
const filePath = path.join(destDir, AGENTS_MD_FILENAME);
|
|
116
|
-
const dirs = typeof rulesEagerDirs === "string" ? [rulesEagerDirs] : rulesEagerDirs;
|
|
117
|
-
const ruleGroups = await Promise.all(dirs.map(dir => readEagerRules(dir)));
|
|
118
|
-
const rules = ruleGroups.flat();
|
|
119
|
-
const lisaBlock = buildLisaBlock(rules);
|
|
120
|
-
if (!existsSync(filePath)) {
|
|
121
|
-
const body = `${HEADER}\n${lisaBlock}`;
|
|
122
|
-
await writeFile(filePath, body, "utf8");
|
|
123
|
-
return { path: filePath, created: true, rulesBaked: rules.length };
|
|
124
|
-
}
|
|
125
|
-
const existing = await readFile(filePath, "utf8");
|
|
126
|
-
const hostContent = stripExistingLisaBlock(existing);
|
|
127
|
-
const updated = `${hostContent.trimEnd()}\n\n${lisaBlock}`;
|
|
128
|
-
await writeFile(filePath, updated, "utf8");
|
|
129
|
-
return { path: filePath, created: false, rulesBaked: rules.length };
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=agents-md-installer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md-installer.js","sourceRoot":"","sources":["../../src/agy/agents-md-installer.ts"],"names":[],"mappings":"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"}
|