@agentex/agent 0.0.20 → 0.0.22
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/README.md +57 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/providers/_shared/http-agent.d.ts.map +1 -1
- package/dist/providers/_shared/http-agent.js +1 -0
- package/dist/providers/_shared/http-agent.js.map +1 -1
- package/dist/providers/acp/index.d.ts.map +1 -1
- package/dist/providers/acp/index.js +1 -0
- package/dist/providers/acp/index.js.map +1 -1
- package/dist/providers/acp/session.d.ts.map +1 -1
- package/dist/providers/acp/session.js +4 -0
- package/dist/providers/acp/session.js.map +1 -1
- package/dist/providers/claude/index.d.ts.map +1 -1
- package/dist/providers/claude/index.js +1 -0
- package/dist/providers/claude/index.js.map +1 -1
- package/dist/providers/claude/parse.d.ts +61 -0
- package/dist/providers/claude/parse.d.ts.map +1 -1
- package/dist/providers/claude/parse.js +80 -0
- package/dist/providers/claude/parse.js.map +1 -1
- package/dist/providers/claude/session.d.ts +2 -1
- package/dist/providers/claude/session.d.ts.map +1 -1
- package/dist/providers/claude/session.js +29 -0
- package/dist/providers/claude/session.js.map +1 -1
- package/dist/providers/codex/index.d.ts.map +1 -1
- package/dist/providers/codex/index.js +1 -0
- package/dist/providers/codex/index.js.map +1 -1
- package/dist/providers/codex/session.d.ts +2 -1
- package/dist/providers/codex/session.d.ts.map +1 -1
- package/dist/providers/codex/session.js +4 -0
- package/dist/providers/codex/session.js.map +1 -1
- package/dist/providers/cursor/index.d.ts.map +1 -1
- package/dist/providers/cursor/index.js +1 -0
- package/dist/providers/cursor/index.js.map +1 -1
- package/dist/providers/openclaw/index.d.ts.map +1 -1
- package/dist/providers/openclaw/index.js +1 -0
- package/dist/providers/openclaw/index.js.map +1 -1
- package/dist/providers/opencode/http-session.d.ts.map +1 -1
- package/dist/providers/opencode/http-session.js +4 -0
- package/dist/providers/opencode/http-session.js.map +1 -1
- package/dist/providers/opencode/index.d.ts.map +1 -1
- package/dist/providers/opencode/index.js +1 -0
- package/dist/providers/opencode/index.js.map +1 -1
- package/dist/providers/pi/index.d.ts.map +1 -1
- package/dist/providers/pi/index.js +1 -0
- package/dist/providers/pi/index.js.map +1 -1
- package/dist/providers/pi/session.d.ts +2 -1
- package/dist/providers/pi/session.d.ts.map +1 -1
- package/dist/providers/pi/session.js +4 -0
- package/dist/providers/pi/session.js.map +1 -1
- package/dist/providers/process/index.d.ts.map +1 -1
- package/dist/providers/process/index.js +1 -0
- package/dist/providers/process/index.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/instructions.d.ts +140 -0
- package/dist/utils/instructions.d.ts.map +1 -1
- package/dist/utils/instructions.js +248 -0
- package/dist/utils/instructions.js.map +1 -1
- package/dist/utils/runtime-homes.d.ts +4 -1
- package/dist/utils/runtime-homes.d.ts.map +1 -1
- package/dist/utils/runtime-homes.js +14 -10
- package/dist/utils/runtime-homes.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { getDefaultRuntimeHome } from "./runtime-homes.js";
|
|
2
5
|
/**
|
|
3
6
|
* Read an instructions file and return its content.
|
|
4
7
|
* Returns null if no path is provided.
|
|
@@ -18,4 +21,249 @@ export async function resolveInstructions(filePath) {
|
|
|
18
21
|
throw err;
|
|
19
22
|
}
|
|
20
23
|
}
|
|
24
|
+
const RUNTIME_INSTRUCTIONS = {
|
|
25
|
+
claude: { projectFile: "CLAUDE.md", nativeFile: "CLAUDE.md", hasGlobalFile: true },
|
|
26
|
+
codex: { projectFile: "AGENTS.md", nativeFile: "AGENTS.md", hasGlobalFile: true },
|
|
27
|
+
opencode: { projectFile: "AGENTS.md", nativeFile: "AGENTS.md", hasGlobalFile: true },
|
|
28
|
+
gemini: { projectFile: "AGENTS.md", nativeFile: "GEMINI.md", hasGlobalFile: true },
|
|
29
|
+
cursor: { projectFile: "AGENTS.md", nativeFile: "AGENTS.md", hasGlobalFile: false },
|
|
30
|
+
pi: { projectFile: "AGENTS.md", nativeFile: "AGENTS.md", hasGlobalFile: true },
|
|
31
|
+
};
|
|
32
|
+
const ALL_RUNTIMES = ["claude", "codex", "gemini", "cursor", "opencode", "pi"];
|
|
33
|
+
const DEFAULT_MANAGED_TAG = "agentex";
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Path resolution
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Resolve which instruction files would be written for the given options,
|
|
39
|
+
* without touching disk.
|
|
40
|
+
*
|
|
41
|
+
* - "workspace": files dedupe by name under {cwd}/ (the default writes
|
|
42
|
+
* CLAUDE.md + AGENTS.md once each). `includeNativeFiles` adds GEMINI.md.
|
|
43
|
+
* - "global": one file per runtime in each runtime's home dir. Runtimes without
|
|
44
|
+
* a file-based global config (Cursor) are omitted.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveInstructionTargets(options) {
|
|
47
|
+
const location = options?.location ?? "workspace";
|
|
48
|
+
const runtimes = dedupeRuntimes(options?.runtimes ?? ALL_RUNTIMES);
|
|
49
|
+
if (location === "workspace") {
|
|
50
|
+
const cwd = options?.cwd;
|
|
51
|
+
if (!cwd)
|
|
52
|
+
throw new Error("cwd is required when location is 'workspace'");
|
|
53
|
+
const byFile = new Map();
|
|
54
|
+
const add = (filename, runtime) => {
|
|
55
|
+
const list = byFile.get(filename) ?? [];
|
|
56
|
+
list.push(runtime);
|
|
57
|
+
byFile.set(filename, list);
|
|
58
|
+
};
|
|
59
|
+
for (const runtime of runtimes) {
|
|
60
|
+
const spec = RUNTIME_INSTRUCTIONS[runtime];
|
|
61
|
+
add(spec.projectFile, runtime);
|
|
62
|
+
if (options?.includeNativeFiles && spec.nativeFile !== spec.projectFile) {
|
|
63
|
+
add(spec.nativeFile, runtime);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return [...byFile.entries()].map(([filename, rts]) => ({
|
|
67
|
+
filename,
|
|
68
|
+
targetPath: path.join(cwd, filename),
|
|
69
|
+
runtimes: dedupeRuntimes(rts),
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
// global: each runtime reads its own native file in its own home dir.
|
|
73
|
+
const targets = [];
|
|
74
|
+
for (const runtime of runtimes) {
|
|
75
|
+
const spec = RUNTIME_INSTRUCTIONS[runtime];
|
|
76
|
+
if (!spec.hasGlobalFile)
|
|
77
|
+
continue; // e.g. cursor global = app User Rules, not a file
|
|
78
|
+
const home = getDefaultRuntimeHome(runtime, options?.homeDir);
|
|
79
|
+
targets.push({
|
|
80
|
+
filename: spec.nativeFile,
|
|
81
|
+
targetPath: path.join(home, spec.nativeFile),
|
|
82
|
+
runtimes: [runtime],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return targets;
|
|
86
|
+
}
|
|
87
|
+
function dedupeRuntimes(runtimes) {
|
|
88
|
+
return [...new Set(runtimes)];
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Public API
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
/**
|
|
94
|
+
* Install an instruction brief into the right per-runtime files.
|
|
95
|
+
*
|
|
96
|
+
* By default merges `content` into a managed region of `{cwd}/CLAUDE.md` and
|
|
97
|
+
* `{cwd}/AGENTS.md`, preserving any user-authored content outside the markers.
|
|
98
|
+
* Idempotent: a re-install with unchanged content reports every entry as
|
|
99
|
+
* "skipped".
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* // Workspace (repo-root) install — the common case.
|
|
104
|
+
* await installInstructions(brief, { location: "workspace", cwd: projectDir });
|
|
105
|
+
* // → {cwd}/CLAUDE.md + {cwd}/AGENTS.md
|
|
106
|
+
*
|
|
107
|
+
* // Also drop Gemini's native GEMINI.md (it doesn't read AGENTS.md by default).
|
|
108
|
+
* await installInstructions(brief, { location: "workspace", cwd, includeNativeFiles: true });
|
|
109
|
+
*
|
|
110
|
+
* // Global install — per-runtime home files.
|
|
111
|
+
* await installInstructions(brief, { location: "global" });
|
|
112
|
+
* // → ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md, ~/.gemini/GEMINI.md, ...
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export async function installInstructions(content, options) {
|
|
116
|
+
const managed = options?.managed ?? true;
|
|
117
|
+
const tag = options?.managedTag ?? DEFAULT_MANAGED_TAG;
|
|
118
|
+
const targets = resolveInstructionTargets(options);
|
|
119
|
+
const entries = [];
|
|
120
|
+
for (const target of targets) {
|
|
121
|
+
try {
|
|
122
|
+
const existing = await readFileOrNull(target.targetPath);
|
|
123
|
+
const next = managed
|
|
124
|
+
? upsertManagedBlock(existing, content, { tag })
|
|
125
|
+
: ensureTrailingNewline(content);
|
|
126
|
+
let status;
|
|
127
|
+
if (existing === null) {
|
|
128
|
+
status = "created";
|
|
129
|
+
}
|
|
130
|
+
else if (existing === next) {
|
|
131
|
+
status = "skipped";
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
status = "updated";
|
|
135
|
+
}
|
|
136
|
+
if (status !== "skipped") {
|
|
137
|
+
await fs.mkdir(path.dirname(target.targetPath), { recursive: true });
|
|
138
|
+
await fs.writeFile(target.targetPath, next, { mode: 0o644 });
|
|
139
|
+
}
|
|
140
|
+
entries.push({ ...target, status });
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
entries.push({
|
|
144
|
+
...target,
|
|
145
|
+
status: "error",
|
|
146
|
+
error: err instanceof Error ? err.message : String(err),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
entries,
|
|
152
|
+
installed: entries.filter((e) => e.status === "created").length,
|
|
153
|
+
updated: entries.filter((e) => e.status === "updated").length,
|
|
154
|
+
skipped: entries.filter((e) => e.status === "skipped").length,
|
|
155
|
+
errors: entries.filter((e) => e.status === "error").length,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Remove the managed region installed by {@link installInstructions}, preserving
|
|
160
|
+
* any user-authored content outside the markers. If the file contains nothing
|
|
161
|
+
* but the managed block, it is deleted. User-owned files (no managed region) are
|
|
162
|
+
* left untouched and reported as "skipped".
|
|
163
|
+
*/
|
|
164
|
+
export async function removeInstructions(options) {
|
|
165
|
+
const tag = options?.managedTag ?? DEFAULT_MANAGED_TAG;
|
|
166
|
+
const targets = resolveInstructionTargets({
|
|
167
|
+
runtimes: options?.runtimes,
|
|
168
|
+
location: options?.location,
|
|
169
|
+
cwd: options?.cwd,
|
|
170
|
+
homeDir: options?.homeDir,
|
|
171
|
+
});
|
|
172
|
+
const entries = [];
|
|
173
|
+
for (const target of targets) {
|
|
174
|
+
try {
|
|
175
|
+
const existing = await readFileOrNull(target.targetPath);
|
|
176
|
+
if (existing === null) {
|
|
177
|
+
entries.push({ ...target, status: "not_found" });
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const stripped = stripManagedBlock(existing, { tag });
|
|
181
|
+
if (stripped === existing) {
|
|
182
|
+
// No managed region present — never touch user-owned files.
|
|
183
|
+
entries.push({ ...target, status: "skipped" });
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (stripped === null) {
|
|
187
|
+
await fs.rm(target.targetPath, { force: true });
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
await fs.writeFile(target.targetPath, stripped, { mode: 0o644 });
|
|
191
|
+
}
|
|
192
|
+
entries.push({ ...target, status: "removed" });
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
entries.push({
|
|
196
|
+
...target,
|
|
197
|
+
status: "error",
|
|
198
|
+
error: err instanceof Error ? err.message : String(err),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return { entries, removed: entries.filter((e) => e.status === "removed").length };
|
|
203
|
+
}
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// Managed-region merge (exported for low-level use / hosts with custom layouts)
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
/**
|
|
208
|
+
* Merge `content` into `existing` as a managed region, preserving everything the
|
|
209
|
+
* user wrote outside the markers.
|
|
210
|
+
*
|
|
211
|
+
* - `existing` has a managed region → replace only the bytes between the markers.
|
|
212
|
+
* - `existing` has no markers → prepend the managed block, keep prior content below.
|
|
213
|
+
* - `existing` is null/empty → return just the managed block.
|
|
214
|
+
*
|
|
215
|
+
* The start marker embeds a short content hash, so re-running with identical
|
|
216
|
+
* content produces a byte-identical result (enabling cheap skip detection).
|
|
217
|
+
*/
|
|
218
|
+
export function upsertManagedBlock(existing, content, options) {
|
|
219
|
+
const tag = options?.tag ?? DEFAULT_MANAGED_TAG;
|
|
220
|
+
const block = buildManagedBlock(content, tag);
|
|
221
|
+
if (existing === null || existing.length === 0) {
|
|
222
|
+
return `${block}\n`;
|
|
223
|
+
}
|
|
224
|
+
const re = managedBlockRegex(tag);
|
|
225
|
+
if (re.test(existing)) {
|
|
226
|
+
return existing.replace(re, block);
|
|
227
|
+
}
|
|
228
|
+
// No managed region yet — prepend it, keep the user's file below.
|
|
229
|
+
return `${block}\n\n${existing.replace(/^\n+/, "")}`;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Remove the managed region (if any) from `existing`, preserving user content.
|
|
233
|
+
* Returns the cleaned string, the original string if there was no managed
|
|
234
|
+
* region, or null if nothing but the managed block remained.
|
|
235
|
+
*/
|
|
236
|
+
export function stripManagedBlock(existing, options) {
|
|
237
|
+
const tag = options?.tag ?? DEFAULT_MANAGED_TAG;
|
|
238
|
+
const re = managedBlockRegex(tag);
|
|
239
|
+
if (!re.test(existing))
|
|
240
|
+
return existing;
|
|
241
|
+
const stripped = existing.replace(re, "").replace(/^\n+/, "");
|
|
242
|
+
return stripped.trim().length === 0 ? null : stripped;
|
|
243
|
+
}
|
|
244
|
+
function buildManagedBlock(content, tag) {
|
|
245
|
+
const body = content.replace(/\s+$/, "");
|
|
246
|
+
const hash = createHash("sha256").update(body).digest("hex").slice(0, 12);
|
|
247
|
+
return `<!-- ${tag}:managed:start hash=${hash} -->\n${body}\n<!-- ${tag}:managed:end -->`;
|
|
248
|
+
}
|
|
249
|
+
function managedBlockRegex(tag) {
|
|
250
|
+
const t = escapeRegExp(tag);
|
|
251
|
+
return new RegExp(`<!--\\s*${t}:managed:start[^>]*-->[\\s\\S]*?<!--\\s*${t}:managed:end\\s*-->`);
|
|
252
|
+
}
|
|
253
|
+
function escapeRegExp(s) {
|
|
254
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
255
|
+
}
|
|
256
|
+
function ensureTrailingNewline(s) {
|
|
257
|
+
return s.endsWith("\n") ? s : `${s}\n`;
|
|
258
|
+
}
|
|
259
|
+
async function readFileOrNull(filePath) {
|
|
260
|
+
try {
|
|
261
|
+
return await fs.readFile(filePath, "utf-8");
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
if (err.code === "ENOENT")
|
|
265
|
+
return null;
|
|
266
|
+
throw err;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
21
269
|
//# sourceMappingURL=instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/utils/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/utils/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAiB;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAoCD,MAAM,oBAAoB,GAAiD;IACzE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE;IAClF,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE;IACjF,QAAQ,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE;IACpF,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE;IAClF,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE;IACnF,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE;CAC/E,CAAC;AAEF,MAAM,YAAY,GAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAE/F,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAuFtC,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAMzC;IACC,MAAM,QAAQ,GAAkB,OAAO,EAAE,QAAQ,IAAI,WAAW,CAAC;IACjE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC;IAEnE,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;QACjD,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAE,OAAqB,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC3C,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/B,IAAI,OAAO,EAAE,kBAAkB,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;YACpC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,sEAAsE;IACtE,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,SAAS,CAAC,kDAAkD;QACrF,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,IAAI,CAAC,UAAU;YACzB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;YAC5C,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB;IAC9C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,OAAoC;IAEpC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC;IACvD,MAAM,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,GAA8B,EAAE,CAAC;IAE9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,OAAO;gBAClB,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC;gBAChD,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAEnC,IAAI,MAAyB,CAAC;YAC9B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;iBAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrE,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,MAAM;gBACT,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAC/D,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAC7D,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;QAC7D,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM;KAC3D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAmC;IAEnC,MAAM,GAAG,GAAG,OAAO,EAAE,UAAU,IAAI,mBAAmB,CAAC;IACvD,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,GAAG,EAAE,OAAO,EAAE,GAAG;QACjB,OAAO,EAAE,OAAO,EAAE,OAAO;KAC1B,CAAC,CAAC;IACH,MAAM,OAAO,GAA6B,EAAE,CAAC;IAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,4DAA4D;gBAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/C,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,MAAM;gBACT,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;AACpF,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,OAAe,EACf,OAA6B;IAE7B,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,mBAAmB,CAAC;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE9C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,KAAK,IAAI,CAAC;IACtB,CAAC;IAED,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,kEAAkE;IAClE,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,OAA6B;IAC/E,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,mBAAmB,CAAC;IAChD,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAExC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,GAAW;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,OAAO,QAAQ,GAAG,uBAAuB,IAAI,SAAS,IAAI,UAAU,GAAG,kBAAkB,CAAC;AAC5F,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,2CAA2C,CAAC,qBAAqB,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAS;IACtC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -8,6 +8,9 @@ import type { SkillRuntime } from "./skills.js";
|
|
|
8
8
|
export declare function getRuntimeHomeEnvVar(runtime: SkillRuntime): string | null;
|
|
9
9
|
/**
|
|
10
10
|
* Returns the default global home directory path for the given runtime.
|
|
11
|
+
*
|
|
12
|
+
* Pass `homeDir` to resolve against a base other than the user's real home
|
|
13
|
+
* directory (useful for sandboxed installs and tests). Defaults to os.homedir().
|
|
11
14
|
*/
|
|
12
|
-
export declare function getDefaultRuntimeHome(runtime: SkillRuntime): string;
|
|
15
|
+
export declare function getDefaultRuntimeHome(runtime: SkillRuntime, homeDir?: string): string;
|
|
13
16
|
//# sourceMappingURL=runtime-homes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-homes.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-homes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA2BhD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAEzE;AAED
|
|
1
|
+
{"version":3,"file":"runtime-homes.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-homes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA2BhD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,MAAqB,GAAG,MAAM,CAGnG"}
|
|
@@ -13,15 +13,15 @@ const ENV_VAR_MAP = {
|
|
|
13
13
|
pi: "PI_HOME",
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Home directory subpath (relative to the home base) for each runtime.
|
|
17
17
|
*/
|
|
18
|
-
const
|
|
19
|
-
claude:
|
|
20
|
-
codex:
|
|
21
|
-
gemini:
|
|
22
|
-
cursor:
|
|
23
|
-
opencode:
|
|
24
|
-
pi:
|
|
18
|
+
const HOME_SUBPATH_MAP = {
|
|
19
|
+
claude: [".claude"],
|
|
20
|
+
codex: [".codex"],
|
|
21
|
+
gemini: [".gemini"],
|
|
22
|
+
cursor: [".cursor"],
|
|
23
|
+
opencode: [".config", "opencode"],
|
|
24
|
+
pi: [".pi"],
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
27
|
* Returns the environment variable name that overrides the global home
|
|
@@ -34,8 +34,12 @@ export function getRuntimeHomeEnvVar(runtime) {
|
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
36
|
* Returns the default global home directory path for the given runtime.
|
|
37
|
+
*
|
|
38
|
+
* Pass `homeDir` to resolve against a base other than the user's real home
|
|
39
|
+
* directory (useful for sandboxed installs and tests). Defaults to os.homedir().
|
|
37
40
|
*/
|
|
38
|
-
export function getDefaultRuntimeHome(runtime) {
|
|
39
|
-
|
|
41
|
+
export function getDefaultRuntimeHome(runtime, homeDir = os.homedir()) {
|
|
42
|
+
const subpath = HOME_SUBPATH_MAP[runtime] ?? [`.${runtime}`];
|
|
43
|
+
return path.join(homeDir, ...subpath);
|
|
40
44
|
}
|
|
41
45
|
//# sourceMappingURL=runtime-homes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-homes.js","sourceRoot":"","sources":["../../src/utils/runtime-homes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B;;;GAGG;AACH,MAAM,WAAW,GAAwC;IACvD,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,iBAAiB,EAAG,8BAA8B;IAC5D,EAAE,EAAE,SAAS;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"runtime-homes.js","sourceRoot":"","sources":["../../src/utils/runtime-homes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B;;;GAGG;AACH,MAAM,WAAW,GAAwC;IACvD,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,iBAAiB,EAAG,8BAA8B;IAC5D,EAAE,EAAE,SAAS;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAmC;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC;IACnB,KAAK,EAAE,CAAC,QAAQ,CAAC;IACjB,MAAM,EAAE,CAAC,SAAS,CAAC;IACnB,MAAM,EAAE,CAAC,SAAS,CAAC;IACnB,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IACjC,EAAE,EAAE,CAAC,KAAK,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAqB,EAAE,UAAkB,EAAE,CAAC,OAAO,EAAE;IACzF,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;AACxC,CAAC"}
|