@codyswann/lisa 2.137.2 → 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,5 +1,11 @@
|
|
|
1
1
|
/** Filename of the Claude project doc at the host project root. */
|
|
2
2
|
export declare const CLAUDE_MD_FILENAME = "CLAUDE.md";
|
|
3
|
+
/**
|
|
4
|
+
* The Claude Code `@`-import directive that pulls the canonical `AGENTS.md` into
|
|
5
|
+
* a Claude session. Exported so the doctor migration can detect whether an
|
|
6
|
+
* existing CLAUDE.md already points at AGENTS.md.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CLAUDE_MD_AGENTS_IMPORT = "@AGENTS.md";
|
|
3
9
|
/** Result of the CLAUDE.md install pass. */
|
|
4
10
|
export interface ClaudeMdInstallResult {
|
|
5
11
|
/** True when Lisa created the file (false when it already existed). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md-installer.d.ts","sourceRoot":"","sources":["../../src/claude/claude-md-installer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude-md-installer.d.ts","sourceRoot":"","sources":["../../src/claude/claude-md-installer.ts"],"names":[],"mappings":"AAuBA,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,eAAe,CAAC;AAEpD,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAiBD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC,CAOhC"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Write Lisa's CLAUDE.md template for Claude Code host projects.
|
|
3
3
|
*
|
|
4
|
-
* Claude Code auto-loads `CLAUDE.md` from the project tree at session start
|
|
5
|
-
*
|
|
4
|
+
* Claude Code auto-loads `CLAUDE.md` from the project tree at session start but,
|
|
5
|
+
* unlike Codex / Cursor / Copilot, does **not** read `AGENTS.md` natively. So
|
|
6
|
+
* Lisa keeps `CLAUDE.md` as a thin pointer: its only meaningful content is an
|
|
7
|
+
* `@AGENTS.md` import, which makes Claude Code load the canonical, cross-agent
|
|
8
|
+
* `AGENTS.md` (see `src/codex/agents-md-installer.ts`) at session start.
|
|
6
9
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
+
* This single-source-of-truth design avoids the double-load problem: agents that
|
|
11
|
+
* read both files (Copilot, Cursor) would otherwise ingest duplicated guidance.
|
|
12
|
+
* With CLAUDE.md reduced to a one-line import, the duplicate they see is
|
|
13
|
+
* negligible while Claude still gets the full canonical content.
|
|
10
14
|
*
|
|
11
|
-
* Create-only semantics: Lisa never overwrites a host-authored CLAUDE.md.
|
|
12
|
-
*
|
|
15
|
+
* Create-only semantics: Lisa never overwrites a host-authored CLAUDE.md. For
|
|
16
|
+
* existing projects that predate this pattern, `lisa doctor` non-destructively
|
|
17
|
+
* adds the `@AGENTS.md` import (see `src/core/instruction-files-migration.ts`).
|
|
13
18
|
* @module claude/claude-md-installer
|
|
14
19
|
*/
|
|
15
20
|
import { writeFile } from "node:fs/promises";
|
|
@@ -17,32 +22,25 @@ import { existsSync } from "node:fs";
|
|
|
17
22
|
import * as path from "node:path";
|
|
18
23
|
/** Filename of the Claude project doc at the host project root. */
|
|
19
24
|
export const CLAUDE_MD_FILENAME = "CLAUDE.md";
|
|
25
|
+
/**
|
|
26
|
+
* The Claude Code `@`-import directive that pulls the canonical `AGENTS.md` into
|
|
27
|
+
* a Claude session. Exported so the doctor migration can detect whether an
|
|
28
|
+
* existing CLAUDE.md already points at AGENTS.md.
|
|
29
|
+
*/
|
|
30
|
+
export const CLAUDE_MD_AGENTS_IMPORT = "@AGENTS.md";
|
|
20
31
|
const TEMPLATE = `# Claude Instructions
|
|
21
32
|
|
|
22
|
-
|
|
23
|
-
guidance. Anthropic's Claude Code reads CLAUDE.md from the project root, the
|
|
24
|
-
parent tree, and the user-level home directory; project-level takes precedence.
|
|
25
|
-
|
|
26
|
-
## Lisa Governance
|
|
27
|
-
|
|
28
|
-
This project uses [Lisa](https://github.com/CodySwannGT/lisa) for AI-assisted
|
|
29
|
-
software development governance. The Lisa Claude Code plugin ships skills,
|
|
30
|
-
agents, slash commands, hooks, rules, and MCP servers via the GitHub plugin
|
|
31
|
-
marketplace.
|
|
32
|
-
|
|
33
|
-
Lisa's eager rules are auto-injected into every Claude Code session via the
|
|
34
|
-
plugin's \`SessionStart\` and \`SubagentStart\` hooks (see
|
|
35
|
-
\`plugins/lisa/hooks/inject-rules.sh\` in the Lisa repository). The rules cover
|
|
36
|
-
coding philosophy, intent routing, leaf-only lifecycle, PRD lifecycle rollup,
|
|
37
|
-
repo-scope splits, security audit handling, documentation-source paths, and
|
|
38
|
-
empirical-inquiry discipline.
|
|
39
|
-
|
|
40
|
-
## Add Project-Specific Guidance Below
|
|
33
|
+
${CLAUDE_MD_AGENTS_IMPORT}
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
project
|
|
35
|
+
<!--
|
|
36
|
+
Lisa keeps CLAUDE.md as a thin pointer to AGENTS.md — the canonical, cross-agent
|
|
37
|
+
instruction file — so this project's guidance lives in exactly one place. The
|
|
38
|
+
\`${CLAUDE_MD_AGENTS_IMPORT}\` line above uses Claude Code's @-import syntax to load
|
|
39
|
+
AGENTS.md at session start (Claude Code does not read AGENTS.md natively).
|
|
45
40
|
|
|
41
|
+
Put project guidance in AGENTS.md. Add Claude-specific guidance below only if you
|
|
42
|
+
need behavior that should apply to Claude Code but not other agents.
|
|
43
|
+
-->
|
|
46
44
|
`;
|
|
47
45
|
/**
|
|
48
46
|
* Write a starter CLAUDE.md at the host project root, but only if the file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md-installer.js","sourceRoot":"","sources":["../../src/claude/claude-md-installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-md-installer.js","sourceRoot":"","sources":["../../src/claude/claude-md-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAUpD,MAAM,QAAQ,GAAG;;EAEf,uBAAuB;;;;;IAKrB,uBAAuB;;;;;;CAM1B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAC7D,CAAC"}
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,mDAAmD;AACnD,KAAK,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAO3C,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAyPD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,aAAa,EACtB,YAAY,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC7C,OAAO,CAAC,YAAY,CAAC,CA+BvB"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import * as path from "node:path";
|
|
4
|
+
import { AGENTS_MD_FILENAME } from "../codex/agents-md-installer.js";
|
|
5
|
+
import { CLAUDE_MD_FILENAME } from "../claude/claude-md-installer.js";
|
|
6
|
+
import { migrateInstructionFiles } from "../core/instruction-files-migration.js";
|
|
4
7
|
import { createDetectorRegistry } from "../detection/index.js";
|
|
5
8
|
import { STARTERS } from "./starters.js";
|
|
6
9
|
import { runUpdateCheck } from "./update-check.js";
|
|
7
10
|
const VERSION_CHECK_NAME = "Lisa version current?";
|
|
8
11
|
const STARTER_HEALTH_NAME = "Starter health";
|
|
9
12
|
const PROJECT_CONFIG_CHECK_NAME = "Project Lisa config present?";
|
|
13
|
+
const INSTRUCTION_FILES_CHECK_NAME = "Instruction files canonical?";
|
|
10
14
|
const DEFAULT_DEPENDENCIES = {
|
|
11
15
|
fetchImpl: fetch,
|
|
12
16
|
runUpdateCheck,
|
|
@@ -170,6 +174,56 @@ function checkWiki(targetPath) {
|
|
|
170
174
|
: `Missing ${missing.join(", ")}`,
|
|
171
175
|
};
|
|
172
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Determine whether a path looks like an agent-governed project, i.e. one that
|
|
179
|
+
* should carry the canonical `AGENTS.md` / `CLAUDE.md` pointer pattern. True
|
|
180
|
+
* when a Lisa config or either instruction file already exists — this keeps the
|
|
181
|
+
* mutating migration from touching unrelated, non-Lisa directories.
|
|
182
|
+
* @param targetPath - Project path to inspect
|
|
183
|
+
* @returns True when the path is an agent/Lisa project
|
|
184
|
+
*/
|
|
185
|
+
function looksLikeAgentProject(targetPath) {
|
|
186
|
+
return [
|
|
187
|
+
".lisa.config.json",
|
|
188
|
+
".lisa.config.local.json",
|
|
189
|
+
AGENTS_MD_FILENAME,
|
|
190
|
+
CLAUDE_MD_FILENAME,
|
|
191
|
+
].some(fileName => existsSync(path.join(targetPath, fileName)));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Ensure the project's agent instruction files follow Lisa's canonical pattern
|
|
195
|
+
* (canonical `AGENTS.md` + a thin `CLAUDE.md` that `@AGENTS.md`-imports it) and
|
|
196
|
+
* carry no legacy agy baked-rules block. This check is mutating: it repairs
|
|
197
|
+
* existing projects in place, non-destructively (host content is preserved).
|
|
198
|
+
* @param targetPath - Project path to inspect and repair
|
|
199
|
+
* @returns Doctor check result describing what, if anything, was changed
|
|
200
|
+
*/
|
|
201
|
+
async function checkInstructionFiles(targetPath) {
|
|
202
|
+
if (!looksLikeAgentProject(targetPath)) {
|
|
203
|
+
return {
|
|
204
|
+
name: INSTRUCTION_FILES_CHECK_NAME,
|
|
205
|
+
status: "ok",
|
|
206
|
+
detail: "Not a Lisa/agent project; skipped",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const result = await migrateInstructionFiles(targetPath);
|
|
211
|
+
return {
|
|
212
|
+
name: INSTRUCTION_FILES_CHECK_NAME,
|
|
213
|
+
status: "ok",
|
|
214
|
+
detail: result.changed
|
|
215
|
+
? `Repaired: ${result.actions.join("; ")}`
|
|
216
|
+
: "Already canonical (AGENTS.md source of truth, CLAUDE.md imports it)",
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return {
|
|
221
|
+
name: INSTRUCTION_FILES_CHECK_NAME,
|
|
222
|
+
status: "fail",
|
|
223
|
+
detail: `Could not reconcile instruction files: ${error instanceof Error ? error.message : String(error)}`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
173
227
|
/**
|
|
174
228
|
* Run Lisa doctor checks.
|
|
175
229
|
* @param targetPath - Optional project path
|
|
@@ -184,6 +238,7 @@ export async function runDoctor(targetPath, options, dependencies = {}) {
|
|
|
184
238
|
await checkVersion(deps, options.offline === true),
|
|
185
239
|
await checkProjectConfig(resolvedTarget),
|
|
186
240
|
await checkProjectType(resolvedTarget),
|
|
241
|
+
await checkInstructionFiles(resolvedTarget),
|
|
187
242
|
await checkStarterHealth(deps, options.offline === true),
|
|
188
243
|
checkWiki(resolvedTarget),
|
|
189
244
|
];
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAC7C,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,10 +15,10 @@ export interface AgentsMdInstallResult {
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function installAgentsMd(destDir: string): Promise<AgentsMdInstallResult>;
|
|
17
17
|
/**
|
|
18
|
-
* Starter template content. Intentionally short — the heavy
|
|
19
|
-
* rules, intent routing, orchestration)
|
|
20
|
-
*
|
|
21
|
-
* host-specific notes.
|
|
18
|
+
* Starter template content. Intentionally short and agent-neutral — the heavy
|
|
19
|
+
* lifting (Lisa rules, intent routing, orchestration) is injected per session
|
|
20
|
+
* via each agent's `inject-rules.sh` SessionStart hook, so `AGENTS.md` is
|
|
21
|
+
* reserved for host-specific notes and is never bloated with rule bodies.
|
|
22
22
|
*/
|
|
23
|
-
export declare const AGENTS_MD_TEMPLATE = "# Project Guidance
|
|
23
|
+
export declare const AGENTS_MD_TEMPLATE = "# Project Guidance\n\nThis is the **canonical, cross-agent instruction file** for this project. It\nfollows the [AGENTS.md](https://agents.md) open standard and is read natively at\nsession start by Codex, Cursor, GitHub Copilot, and Antigravity (`agy`). Claude\nCode reads it through the `@AGENTS.md` import in `CLAUDE.md`, so all of this\nproject's guidance lives in one place.\n\n## Lisa Governance\n\nThis project uses [Lisa](https://github.com/CodySwannGT/lisa) for AI-assisted\nsoftware development governance. Lisa ships skills, agents, slash commands,\nhooks, rules, and MCP servers via per-agent plugins. Lisa's eager rules are\ninjected into every session by the plugin's `SessionStart` / `SubagentStart`\nhooks (`inject-rules.sh`) \u2014 they are intentionally **not** duplicated into this\nfile.\n\n## Add Project-Specific Guidance Below\n\nThe lines above are a Lisa-managed starter; this file is owned by the host\nproject and is never overwritten on subsequent `lisa apply` runs. Add\nconvention notes, terminology, architectural shorthand, or anything agents\nshould know about *this particular* project that Lisa's universal rules do not\ncover.\n";
|
|
24
24
|
//# sourceMappingURL=agents-md-installer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md-installer.d.ts","sourceRoot":"","sources":["../../src/codex/agents-md-installer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agents-md-installer.d.ts","sourceRoot":"","sources":["../../src/codex/agents-md-installer.ts"],"names":[],"mappings":"AA4BA,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C,2CAA2C;AAC3C,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC,CAOhC;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,ipCAwB9B,CAAC"}
|
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Emit
|
|
2
|
+
* Emit the create-only, canonical `AGENTS.md` template into the host project
|
|
3
|
+
* root.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
* (
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* `AGENTS.md` is Lisa's single, cross-agent instruction file. It follows the
|
|
6
|
+
* [AGENTS.md](https://agents.md) open standard and is read natively at session
|
|
7
|
+
* start by Codex, Cursor, GitHub Copilot, and Antigravity (`agy`). Claude Code
|
|
8
|
+
* does not read `AGENTS.md` natively, so Lisa points `CLAUDE.md` at it with an
|
|
9
|
+
* `@AGENTS.md` import (see `src/claude/claude-md-installer.ts`) — that keeps the
|
|
10
|
+
* project's guidance in exactly one place and avoids the double-load that
|
|
11
|
+
* separate-but-duplicated `AGENTS.md`/`CLAUDE.md` files cause for agents (Copilot,
|
|
12
|
+
* Cursor) that read both.
|
|
10
13
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
+
* The template is deliberately agent-neutral and short: Lisa's actual rules are
|
|
15
|
+
* injected per session via each agent's `inject-rules.sh` SessionStart hook, so
|
|
16
|
+
* `AGENTS.md` is purely a host-facing knob, not a place to duplicate rule bodies.
|
|
17
|
+
*
|
|
18
|
+
* Create-only: never overwritten on subsequent `lisa` runs. The host owns the
|
|
19
|
+
* file once it exists.
|
|
20
|
+
*
|
|
21
|
+
* This module lives under `src/codex/` for historical reasons (Codex was the
|
|
22
|
+
* first non-Claude harness); the file it writes is canonical for all agents.
|
|
14
23
|
* @module codex/agents-md-installer
|
|
15
24
|
*/
|
|
16
25
|
import * as fse from "fs-extra";
|
|
@@ -33,38 +42,34 @@ export async function installAgentsMd(destDir) {
|
|
|
33
42
|
return { created: true, relativePath: AGENTS_MD_FILENAME };
|
|
34
43
|
}
|
|
35
44
|
/**
|
|
36
|
-
* Starter template content. Intentionally short — the heavy
|
|
37
|
-
* rules, intent routing, orchestration)
|
|
38
|
-
*
|
|
39
|
-
* host-specific notes.
|
|
45
|
+
* Starter template content. Intentionally short and agent-neutral — the heavy
|
|
46
|
+
* lifting (Lisa rules, intent routing, orchestration) is injected per session
|
|
47
|
+
* via each agent's `inject-rules.sh` SessionStart hook, so `AGENTS.md` is
|
|
48
|
+
* reserved for host-specific notes and is never bloated with rule bodies.
|
|
40
49
|
*/
|
|
41
|
-
export const AGENTS_MD_TEMPLATE = `# Project Guidance
|
|
42
|
-
|
|
43
|
-
This project uses Lisa governance. Codex sessions automatically receive
|
|
44
|
-
Lisa's rules, agents, and skills via the SessionStart hook in
|
|
45
|
-
\`.codex/hooks/lisa/inject-rules.sh\`.
|
|
46
|
-
|
|
47
|
-
This file is for **project-specific guidance** — add anything Codex should
|
|
48
|
-
know about *this particular* project that isn't covered by Lisa's rules.
|
|
49
|
-
|
|
50
|
-
## What lives where
|
|
50
|
+
export const AGENTS_MD_TEMPLATE = `# Project Guidance
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
This is the **canonical, cross-agent instruction file** for this project. It
|
|
53
|
+
follows the [AGENTS.md](https://agents.md) open standard and is read natively at
|
|
54
|
+
session start by Codex, Cursor, GitHub Copilot, and Antigravity (\`agy\`). Claude
|
|
55
|
+
Code reads it through the \`@AGENTS.md\` import in \`CLAUDE.md\`, so all of this
|
|
56
|
+
project's guidance lives in one place.
|
|
57
57
|
|
|
58
|
-
## Lisa
|
|
58
|
+
## Lisa Governance
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
This project uses [Lisa](https://github.com/CodySwannGT/lisa) for AI-assisted
|
|
61
|
+
software development governance. Lisa ships skills, agents, slash commands,
|
|
62
|
+
hooks, rules, and MCP servers via per-agent plugins. Lisa's eager rules are
|
|
63
|
+
injected into every session by the plugin's \`SessionStart\` / \`SubagentStart\`
|
|
64
|
+
hooks (\`inject-rules.sh\`) — they are intentionally **not** duplicated into this
|
|
65
|
+
file.
|
|
64
66
|
|
|
65
|
-
##
|
|
67
|
+
## Add Project-Specific Guidance Below
|
|
66
68
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
The lines above are a Lisa-managed starter; this file is owned by the host
|
|
70
|
+
project and is never overwritten on subsequent \`lisa apply\` runs. Add
|
|
71
|
+
convention notes, terminology, architectural shorthand, or anything agents
|
|
72
|
+
should know about *this particular* project that Lisa's universal rules do not
|
|
73
|
+
cover.
|
|
69
74
|
`;
|
|
70
75
|
//# sourceMappingURL=agents-md-installer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-md-installer.js","sourceRoot":"","sources":["../../src/codex/agents-md-installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agents-md-installer.js","sourceRoot":"","sources":["../../src/codex/agents-md-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAU9C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,SAAS,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-instructions-installer.d.ts","sourceRoot":"","sources":["../../src/copilot/copilot-instructions-installer.ts"],"names":[],"mappings":"AAmBA,yEAAyE;AACzE,eAAO,MAAM,kCAAkC,QAG9C,CAAC;AAEF,uDAAuD;AACvD,MAAM,WAAW,gCAAgC;IAC/C,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"copilot-instructions-installer.d.ts","sourceRoot":"","sources":["../../src/copilot/copilot-instructions-installer.ts"],"names":[],"mappings":"AAmBA,yEAAyE;AACzE,eAAO,MAAM,kCAAkC,QAG9C,CAAC;AAEF,uDAAuD;AACvD,MAAM,WAAW,gCAAgC;IAC/C,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAwBD;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gCAAgC,CAAC,CAQ3C"}
|
|
@@ -20,8 +20,12 @@ import * as path from "node:path";
|
|
|
20
20
|
export const COPILOT_INSTRUCTIONS_RELATIVE_PATH = path.join(".github", "copilot-instructions.md");
|
|
21
21
|
const TEMPLATE = `# Copilot Instructions
|
|
22
22
|
|
|
23
|
-
GitHub Copilot
|
|
24
|
-
guidance.
|
|
23
|
+
GitHub Copilot auto-loads this file at session start as repository-specific
|
|
24
|
+
guidance. Copilot also reads \`AGENTS.md\` at the project root natively — that is
|
|
25
|
+
Lisa's **canonical, cross-agent instruction file** and the single source of
|
|
26
|
+
truth for this project's guidance. Prefer editing \`AGENTS.md\`; keep this file
|
|
27
|
+
for Copilot-specific notes only, to avoid duplicated guidance across the two
|
|
28
|
+
files Copilot loads.
|
|
25
29
|
|
|
26
30
|
Lisa governance is active in this project. Lisa's eager rules ship via the
|
|
27
31
|
\`lisa-copilot\` plugin (see
|
|
@@ -30,17 +34,10 @@ through the plugin's bundled \`rules/\` directory plus the \`SessionStart\` hook
|
|
|
30
34
|
\`inject-rules.sh\` (the same polyfill Lisa uses on Claude and Codex when the
|
|
31
35
|
agent does not auto-load rules from a plugin).
|
|
32
36
|
|
|
33
|
-
This file is
|
|
34
|
-
|
|
35
|
-
\`lisa apply\` will never overwrite host-authored guidance here.
|
|
37
|
+
This file is create-only from Lisa's perspective — re-running \`lisa apply\` will
|
|
38
|
+
never overwrite host-authored guidance here.
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- \`.github/copilot-instructions.md\` (this file)
|
|
40
|
-
- \`AGENTS.md\` at project root, when present
|
|
41
|
-
- \`CLAUDE.md\` at project root, when present (Copilot cross-reads)
|
|
42
|
-
|
|
43
|
-
Add custom guidance below this line:
|
|
40
|
+
Add Copilot-specific guidance below this line:
|
|
44
41
|
`;
|
|
45
42
|
/**
|
|
46
43
|
* Write a starter `.github/copilot-instructions.md` at the host project root,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot-instructions-installer.js","sourceRoot":"","sources":["../../src/copilot/copilot-instructions-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,yEAAyE;AACzE,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC,IAAI,CACzD,SAAS,EACT,yBAAyB,CAC1B,CAAC;AAUF,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"copilot-instructions-installer.js","sourceRoot":"","sources":["../../src/copilot/copilot-instructions-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,yEAAyE;AACzE,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC,IAAI,CACzD,SAAS,EACT,yBAAyB,CAC1B,CAAC;AAUF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;CAoBhB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kCAAkC,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kCAAkC,EAAE,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marker that opened the legacy agy "baked rules" block in `AGENTS.md`. Retained
|
|
3
|
+
* here (after the agy AGENTS.md installer was removed) so the migration can
|
|
4
|
+
* recognize and strip blocks written by older Lisa versions.
|
|
5
|
+
*/
|
|
6
|
+
export declare const LISA_RULES_START_MARKER = "<!-- LISA_RULES_START -->";
|
|
7
|
+
/** Marker that closed the legacy agy "baked rules" block in `AGENTS.md`. */
|
|
8
|
+
export declare const LISA_RULES_END_MARKER = "<!-- LISA_RULES_END -->";
|
|
9
|
+
/** Outcome of an instruction-files migration pass. */
|
|
10
|
+
export interface InstructionFilesMigrationResult {
|
|
11
|
+
/** True when any file was created or modified. */
|
|
12
|
+
readonly changed: boolean;
|
|
13
|
+
/** Human-readable description of each action taken (empty when no-op). */
|
|
14
|
+
readonly actions: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Remove a legacy agy `LISA_RULES_START..END` block from an AGENTS.md body,
|
|
18
|
+
* collapsing the whitespace left behind. Returns the original string unchanged
|
|
19
|
+
* when no well-formed block is present.
|
|
20
|
+
* @param body - Existing `AGENTS.md` contents.
|
|
21
|
+
* @returns The body with the Lisa-managed agy block removed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function stripBakedAgyRulesBlock(body: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Run the instruction-files migration against a host project root.
|
|
26
|
+
* @param destDir - Absolute path to the host project root.
|
|
27
|
+
* @returns Whether anything changed plus a description of each action.
|
|
28
|
+
*/
|
|
29
|
+
export declare function migrateInstructionFiles(destDir: string): Promise<InstructionFilesMigrationResult>;
|
|
30
|
+
//# sourceMappingURL=instruction-files-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-files-migration.d.ts","sourceRoot":"","sources":["../../src/core/instruction-files-migration.ts"],"names":[],"mappings":"AAoCA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAE/D,sDAAsD;AACtD,MAAM,WAAW,+BAA+B;IAC9C,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU5D;AA8CD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,+BAA+B,CAAC,CAK1C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrate a host project's agent instruction files to Lisa's canonical pattern:
|
|
3
|
+
*
|
|
4
|
+
* - `AGENTS.md` is the single, cross-agent instruction file (read natively by
|
|
5
|
+
* Codex, Cursor, Copilot, and agy).
|
|
6
|
+
* - `CLAUDE.md` is a thin pointer that `@AGENTS.md`-imports it (Claude Code
|
|
7
|
+
* does not read AGENTS.md natively).
|
|
8
|
+
*
|
|
9
|
+
* This is the non-destructive, idempotent cleanup `lisa doctor` runs on existing
|
|
10
|
+
* projects that predate the pattern. It:
|
|
11
|
+
*
|
|
12
|
+
* 1. Creates a canonical `AGENTS.md` when one is missing.
|
|
13
|
+
* 2. Strips the legacy agy "baked rules" block
|
|
14
|
+
* (`<!-- LISA_RULES_START -->...<!-- LISA_RULES_END -->`) from an existing
|
|
15
|
+
* `AGENTS.md` — Lisa no longer bakes rule bodies into the file.
|
|
16
|
+
* 3. Ensures `CLAUDE.md` imports `AGENTS.md`: creates the pointer when no
|
|
17
|
+
* `CLAUDE.md` exists, or prepends the `@AGENTS.md` import to an existing
|
|
18
|
+
* host-authored `CLAUDE.md` (preserving all existing content).
|
|
19
|
+
*
|
|
20
|
+
* Host content is never deleted: the only thing removed is the clearly
|
|
21
|
+
* Lisa-managed agy marker block. Everything else is additive.
|
|
22
|
+
* @module core/instruction-files-migration
|
|
23
|
+
*/
|
|
24
|
+
import { existsSync } from "node:fs";
|
|
25
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
26
|
+
import * as path from "node:path";
|
|
27
|
+
import { AGENTS_MD_FILENAME, installAgentsMd, } from "../codex/agents-md-installer.js";
|
|
28
|
+
import { CLAUDE_MD_AGENTS_IMPORT, CLAUDE_MD_FILENAME, installClaudeMd, } from "../claude/claude-md-installer.js";
|
|
29
|
+
/**
|
|
30
|
+
* Marker that opened the legacy agy "baked rules" block in `AGENTS.md`. Retained
|
|
31
|
+
* here (after the agy AGENTS.md installer was removed) so the migration can
|
|
32
|
+
* recognize and strip blocks written by older Lisa versions.
|
|
33
|
+
*/
|
|
34
|
+
export const LISA_RULES_START_MARKER = "<!-- LISA_RULES_START -->";
|
|
35
|
+
/** Marker that closed the legacy agy "baked rules" block in `AGENTS.md`. */
|
|
36
|
+
export const LISA_RULES_END_MARKER = "<!-- LISA_RULES_END -->";
|
|
37
|
+
/**
|
|
38
|
+
* Remove a legacy agy `LISA_RULES_START..END` block from an AGENTS.md body,
|
|
39
|
+
* collapsing the whitespace left behind. Returns the original string unchanged
|
|
40
|
+
* when no well-formed block is present.
|
|
41
|
+
* @param body - Existing `AGENTS.md` contents.
|
|
42
|
+
* @returns The body with the Lisa-managed agy block removed.
|
|
43
|
+
*/
|
|
44
|
+
export function stripBakedAgyRulesBlock(body) {
|
|
45
|
+
const startIdx = body.indexOf(LISA_RULES_START_MARKER);
|
|
46
|
+
const endIdx = body.indexOf(LISA_RULES_END_MARKER);
|
|
47
|
+
if (startIdx === -1 || endIdx === -1 || endIdx < startIdx) {
|
|
48
|
+
return body;
|
|
49
|
+
}
|
|
50
|
+
const before = body.slice(0, startIdx);
|
|
51
|
+
const after = body.slice(endIdx + LISA_RULES_END_MARKER.length);
|
|
52
|
+
// Collapse 3+ consecutive newlines to two (bounded quantifier for slow-regex).
|
|
53
|
+
return `${(before + after).replace(/\n\n\n+/g, "\n\n").trim()}\n`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Ensure a canonical `AGENTS.md` exists and carries no legacy agy baked-rules
|
|
57
|
+
* block.
|
|
58
|
+
* @param destDir - Absolute path to the host project root.
|
|
59
|
+
* @returns Action strings describing what changed (empty when nothing did).
|
|
60
|
+
*/
|
|
61
|
+
async function reconcileAgentsMd(destDir) {
|
|
62
|
+
const filePath = path.join(destDir, AGENTS_MD_FILENAME);
|
|
63
|
+
if (!existsSync(filePath)) {
|
|
64
|
+
const result = await installAgentsMd(destDir);
|
|
65
|
+
return result.created ? [`created ${AGENTS_MD_FILENAME}`] : [];
|
|
66
|
+
}
|
|
67
|
+
const existing = await readFile(filePath, "utf8");
|
|
68
|
+
const stripped = stripBakedAgyRulesBlock(existing);
|
|
69
|
+
if (stripped === existing) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
await writeFile(filePath, stripped, "utf8");
|
|
73
|
+
return [`removed legacy baked-rules block from ${AGENTS_MD_FILENAME}`];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Ensure `CLAUDE.md` imports the canonical `AGENTS.md`.
|
|
77
|
+
*
|
|
78
|
+
* Creates the pointer file when no `CLAUDE.md` exists, or prepends the
|
|
79
|
+
* `@AGENTS.md` import to an existing host-authored file (preserving its content).
|
|
80
|
+
* @param destDir - Absolute path to the host project root.
|
|
81
|
+
* @returns Action strings describing what changed (empty when nothing did).
|
|
82
|
+
*/
|
|
83
|
+
async function reconcileClaudeMd(destDir) {
|
|
84
|
+
const filePath = path.join(destDir, CLAUDE_MD_FILENAME);
|
|
85
|
+
if (!existsSync(filePath)) {
|
|
86
|
+
const result = await installClaudeMd(destDir);
|
|
87
|
+
return result.created ? [`created ${CLAUDE_MD_FILENAME} pointer`] : [];
|
|
88
|
+
}
|
|
89
|
+
const existing = await readFile(filePath, "utf8");
|
|
90
|
+
if (existing.includes(CLAUDE_MD_AGENTS_IMPORT)) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const prefix = `${CLAUDE_MD_AGENTS_IMPORT}\n\n<!-- Lisa: import the canonical AGENTS.md so Claude Code loads the same guidance every other agent reads. -->\n\n`;
|
|
94
|
+
await writeFile(filePath, prefix + existing, "utf8");
|
|
95
|
+
return [`added ${CLAUDE_MD_AGENTS_IMPORT} import to ${CLAUDE_MD_FILENAME}`];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Run the instruction-files migration against a host project root.
|
|
99
|
+
* @param destDir - Absolute path to the host project root.
|
|
100
|
+
* @returns Whether anything changed plus a description of each action.
|
|
101
|
+
*/
|
|
102
|
+
export async function migrateInstructionFiles(destDir) {
|
|
103
|
+
const agentsActions = await reconcileAgentsMd(destDir);
|
|
104
|
+
const claudeActions = await reconcileClaudeMd(destDir);
|
|
105
|
+
const actions = [...agentsActions, ...claudeActions];
|
|
106
|
+
return { changed: actions.length > 0, actions };
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=instruction-files-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-files-migration.js","sourceRoot":"","sources":["../../src/core/instruction-files-migration.ts"],"names":[],"mappings":"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"}
|