@agentex/agent 0.0.1 → 0.0.3
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 +358 -78
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/execute.d.ts +1 -1
- package/dist/providers/claude/execute.d.ts.map +1 -1
- package/dist/providers/claude/execute.js +53 -20
- package/dist/providers/claude/execute.js.map +1 -1
- package/dist/providers/claude/index.d.ts +1 -1
- package/dist/providers/claude/index.d.ts.map +1 -1
- package/dist/providers/claude/index.js +40 -9
- package/dist/providers/claude/index.js.map +1 -1
- package/dist/providers/claude/parse.d.ts.map +1 -1
- package/dist/providers/claude/parse.js +2 -1
- package/dist/providers/claude/parse.js.map +1 -1
- package/dist/providers/claude/session.d.ts +10 -0
- package/dist/providers/claude/session.d.ts.map +1 -0
- package/dist/providers/claude/session.js +549 -0
- package/dist/providers/claude/session.js.map +1 -0
- package/dist/providers/claude/test.d.ts.map +1 -1
- package/dist/providers/claude/test.js +38 -11
- package/dist/providers/claude/test.js.map +1 -1
- package/dist/providers/codex/execute.d.ts +1 -1
- package/dist/providers/codex/execute.d.ts.map +1 -1
- package/dist/providers/codex/execute.js +114 -75
- package/dist/providers/codex/execute.js.map +1 -1
- package/dist/providers/codex/index.d.ts +1 -1
- package/dist/providers/codex/index.d.ts.map +1 -1
- package/dist/providers/codex/index.js +59 -3
- package/dist/providers/codex/index.js.map +1 -1
- package/dist/providers/codex/parse.d.ts.map +1 -1
- package/dist/providers/codex/parse.js +25 -3
- package/dist/providers/codex/parse.js.map +1 -1
- package/dist/providers/codex/session.d.ts +3 -0
- package/dist/providers/codex/session.d.ts.map +1 -0
- package/dist/providers/codex/session.js +553 -0
- package/dist/providers/codex/session.js.map +1 -0
- package/dist/providers/codex/test.d.ts.map +1 -1
- package/dist/providers/codex/test.js +28 -12
- package/dist/providers/codex/test.js.map +1 -1
- package/dist/providers/codex/usage-scanner.d.ts +18 -0
- package/dist/providers/codex/usage-scanner.d.ts.map +1 -0
- package/dist/providers/codex/usage-scanner.js +148 -0
- package/dist/providers/codex/usage-scanner.js.map +1 -0
- package/dist/providers/cursor/codec.d.ts +3 -0
- package/dist/providers/cursor/codec.d.ts.map +1 -0
- package/dist/providers/cursor/codec.js +43 -0
- package/dist/providers/cursor/codec.js.map +1 -0
- package/dist/providers/cursor/execute.d.ts +3 -0
- package/dist/providers/cursor/execute.d.ts.map +1 -0
- package/dist/providers/cursor/execute.js +248 -0
- package/dist/providers/cursor/execute.js.map +1 -0
- package/dist/providers/cursor/index.d.ts +3 -0
- package/dist/providers/cursor/index.d.ts.map +1 -0
- package/dist/providers/cursor/index.js +30 -0
- package/dist/providers/cursor/index.js.map +1 -0
- package/dist/providers/cursor/parse.d.ts +26 -0
- package/dist/providers/cursor/parse.d.ts.map +1 -0
- package/dist/providers/cursor/parse.js +224 -0
- package/dist/providers/cursor/parse.js.map +1 -0
- package/dist/providers/cursor/test.d.ts +3 -0
- package/dist/providers/cursor/test.d.ts.map +1 -0
- package/dist/providers/cursor/test.js +58 -0
- package/dist/providers/cursor/test.js.map +1 -0
- package/dist/providers/gemini/codec.d.ts +3 -0
- package/dist/providers/gemini/codec.d.ts.map +1 -0
- package/dist/providers/gemini/codec.js +47 -0
- package/dist/providers/gemini/codec.js.map +1 -0
- package/dist/providers/gemini/execute.d.ts +3 -0
- package/dist/providers/gemini/execute.d.ts.map +1 -0
- package/dist/providers/gemini/execute.js +236 -0
- package/dist/providers/gemini/execute.js.map +1 -0
- package/dist/providers/gemini/index.d.ts +3 -0
- package/dist/providers/gemini/index.d.ts.map +1 -0
- package/dist/providers/gemini/index.js +64 -0
- package/dist/providers/gemini/index.js.map +1 -0
- package/dist/providers/gemini/parse.d.ts +20 -0
- package/dist/providers/gemini/parse.d.ts.map +1 -0
- package/dist/providers/gemini/parse.js +207 -0
- package/dist/providers/gemini/parse.js.map +1 -0
- package/dist/providers/gemini/test.d.ts +3 -0
- package/dist/providers/gemini/test.d.ts.map +1 -0
- package/dist/providers/gemini/test.js +67 -0
- package/dist/providers/gemini/test.js.map +1 -0
- package/dist/providers/openclaw/execute.d.ts +1 -1
- package/dist/providers/openclaw/execute.d.ts.map +1 -1
- package/dist/providers/openclaw/execute.js +11 -6
- package/dist/providers/openclaw/execute.js.map +1 -1
- package/dist/providers/openclaw/index.d.ts +1 -1
- package/dist/providers/openclaw/index.d.ts.map +1 -1
- package/dist/providers/openclaw/index.js +13 -3
- package/dist/providers/openclaw/index.js.map +1 -1
- package/dist/providers/openclaw/test.d.ts.map +1 -1
- package/dist/providers/openclaw/test.js +4 -0
- package/dist/providers/openclaw/test.js.map +1 -1
- package/dist/providers/opencode/codec.d.ts +3 -0
- package/dist/providers/opencode/codec.d.ts.map +1 -0
- package/dist/providers/opencode/codec.js +47 -0
- package/dist/providers/opencode/codec.js.map +1 -0
- package/dist/providers/opencode/execute.d.ts +3 -0
- package/dist/providers/opencode/execute.d.ts.map +1 -0
- package/dist/providers/opencode/execute.js +225 -0
- package/dist/providers/opencode/execute.js.map +1 -0
- package/dist/providers/opencode/index.d.ts +3 -0
- package/dist/providers/opencode/index.d.ts.map +1 -0
- package/dist/providers/opencode/index.js +64 -0
- package/dist/providers/opencode/index.js.map +1 -0
- package/dist/providers/opencode/parse.d.ts +19 -0
- package/dist/providers/opencode/parse.d.ts.map +1 -0
- package/dist/providers/opencode/parse.js +145 -0
- package/dist/providers/opencode/parse.js.map +1 -0
- package/dist/providers/opencode/test.d.ts +3 -0
- package/dist/providers/opencode/test.d.ts.map +1 -0
- package/dist/providers/opencode/test.js +60 -0
- package/dist/providers/opencode/test.js.map +1 -0
- package/dist/providers/pi/codec.d.ts +7 -0
- package/dist/providers/pi/codec.d.ts.map +1 -0
- package/dist/providers/pi/codec.js +45 -0
- package/dist/providers/pi/codec.js.map +1 -0
- package/dist/providers/pi/execute.d.ts +3 -0
- package/dist/providers/pi/execute.d.ts.map +1 -0
- package/dist/providers/pi/execute.js +300 -0
- package/dist/providers/pi/execute.js.map +1 -0
- package/dist/providers/pi/index.d.ts +3 -0
- package/dist/providers/pi/index.d.ts.map +1 -0
- package/dist/providers/pi/index.js +66 -0
- package/dist/providers/pi/index.js.map +1 -0
- package/dist/providers/pi/parse.d.ts +18 -0
- package/dist/providers/pi/parse.d.ts.map +1 -0
- package/dist/providers/pi/parse.js +182 -0
- package/dist/providers/pi/parse.js.map +1 -0
- package/dist/providers/pi/test.d.ts +3 -0
- package/dist/providers/pi/test.d.ts.map +1 -0
- package/dist/providers/pi/test.js +60 -0
- package/dist/providers/pi/test.js.map +1 -0
- package/dist/providers/process/execute.d.ts +1 -1
- package/dist/providers/process/execute.d.ts.map +1 -1
- package/dist/providers/process/execute.js +46 -8
- package/dist/providers/process/execute.js.map +1 -1
- package/dist/providers/process/index.d.ts +1 -1
- package/dist/providers/process/index.d.ts.map +1 -1
- package/dist/providers/process/index.js +18 -4
- package/dist/providers/process/index.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +16 -8
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +325 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/ask-user-question.d.ts +50 -0
- package/dist/utils/ask-user-question.d.ts.map +1 -0
- package/dist/utils/ask-user-question.js +32 -0
- package/dist/utils/ask-user-question.js.map +1 -0
- package/dist/utils/auth.d.ts +29 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +243 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/binary.d.ts.map +1 -1
- package/dist/utils/binary.js +29 -6
- package/dist/utils/binary.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +18 -0
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/execute-all.d.ts +20 -0
- package/dist/utils/execute-all.d.ts.map +1 -0
- package/dist/utils/execute-all.js +46 -0
- package/dist/utils/execute-all.js.map +1 -0
- package/dist/utils/instructions.d.ts +7 -0
- package/dist/utils/instructions.d.ts.map +1 -0
- package/dist/utils/instructions.js +21 -0
- package/dist/utils/instructions.js.map +1 -0
- package/dist/utils/model-cache.d.ts +11 -0
- package/dist/utils/model-cache.d.ts.map +1 -0
- package/dist/utils/model-cache.js +17 -0
- package/dist/utils/model-cache.js.map +1 -0
- package/dist/utils/process.d.ts +4 -0
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +46 -5
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/runtime-config.d.ts +34 -0
- package/dist/utils/runtime-config.d.ts.map +1 -0
- package/dist/utils/runtime-config.js +71 -0
- package/dist/utils/runtime-config.js.map +1 -0
- package/dist/utils/runtime-homes.d.ts +13 -0
- package/dist/utils/runtime-homes.d.ts.map +1 -0
- package/dist/utils/runtime-homes.js +41 -0
- package/dist/utils/runtime-homes.js.map +1 -0
- package/dist/utils/skills.d.ts +152 -1
- package/dist/utils/skills.d.ts.map +1 -1
- package/dist/utils/skills.js +352 -0
- package/dist/utils/skills.js.map +1 -1
- package/dist/utils/workspace.d.ts +55 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +89 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +5 -2
package/dist/utils/skills.js
CHANGED
|
@@ -1,6 +1,358 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import * as os from "node:os";
|
|
4
|
+
/**
|
|
5
|
+
* Native per-runtime directories. Only used when includeNativeDirs is enabled.
|
|
6
|
+
* These are in addition to the two standard channels.
|
|
7
|
+
* Claude and Codex are excluded since they ARE the standard channels.
|
|
8
|
+
*/
|
|
9
|
+
const NATIVE_DIRS = {
|
|
10
|
+
gemini: {
|
|
11
|
+
global: path.join(os.homedir(), ".gemini", "skills"),
|
|
12
|
+
workspace: (cwd) => path.join(cwd, ".gemini", "skills"),
|
|
13
|
+
},
|
|
14
|
+
cursor: {
|
|
15
|
+
global: path.join(os.homedir(), ".cursor", "skills"),
|
|
16
|
+
workspace: (cwd) => path.join(cwd, ".cursor", "skills"),
|
|
17
|
+
},
|
|
18
|
+
opencode: {
|
|
19
|
+
global: path.join(os.homedir(), ".config", "opencode", "skills"),
|
|
20
|
+
workspace: (cwd) => path.join(cwd, ".opencode", "skills"),
|
|
21
|
+
},
|
|
22
|
+
pi: {
|
|
23
|
+
global: path.join(os.homedir(), ".pi", "agent", "skills"),
|
|
24
|
+
workspace: (cwd) => path.join(cwd, ".pi", "skills"),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Path resolution
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/** Resolve the standard skill discovery paths (both channels). */
|
|
31
|
+
function resolveStandardPaths(location, cwd) {
|
|
32
|
+
if (location === "workspace") {
|
|
33
|
+
if (!cwd)
|
|
34
|
+
throw new Error("cwd is required when location is 'workspace'");
|
|
35
|
+
return [
|
|
36
|
+
{ target: "agents", skillsHome: path.join(cwd, ".agents", "skills") },
|
|
37
|
+
{ target: "claude", skillsHome: path.join(cwd, ".claude", "skills") },
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
return [
|
|
41
|
+
{ target: "agents", skillsHome: path.join(os.homedir(), ".agents", "skills") },
|
|
42
|
+
{ target: "claude", skillsHome: path.join(os.homedir(), ".claude", "skills") },
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
/** Resolve native per-runtime paths (for includeNativeDirs). */
|
|
46
|
+
function resolveNativePaths(location, cwd) {
|
|
47
|
+
const results = [];
|
|
48
|
+
for (const [runtime, dirs] of Object.entries(NATIVE_DIRS)) {
|
|
49
|
+
if (location === "workspace") {
|
|
50
|
+
if (!cwd)
|
|
51
|
+
continue;
|
|
52
|
+
results.push({ target: runtime, skillsHome: dirs.workspace(cwd) });
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
results.push({ target: runtime, skillsHome: dirs.global });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
/** Build the full list of install/remove targets. */
|
|
61
|
+
function resolveTargets(location, cwd, includeNativeDirs) {
|
|
62
|
+
const targets = resolveStandardPaths(location, cwd);
|
|
63
|
+
if (includeNativeDirs) {
|
|
64
|
+
targets.push(...resolveNativePaths(location, cwd));
|
|
65
|
+
}
|
|
66
|
+
return targets;
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Public API
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
/**
|
|
72
|
+
* Install skill directories into agent discovery paths via idempotent symlinks.
|
|
73
|
+
*
|
|
74
|
+
* By default, installs into the two standard channels:
|
|
75
|
+
* - `.agents/skills/` — discovered by Codex, Gemini, Cursor, OpenCode, Pi
|
|
76
|
+
* - `.claude/skills/` — discovered by Claude Code
|
|
77
|
+
*
|
|
78
|
+
* Set `includeNativeDirs: true` to also install into each runtime's
|
|
79
|
+
* native directory (e.g. `.gemini/skills/`, `.cursor/skills/`).
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* // Global install (home directory)
|
|
84
|
+
* await installSkills(["~/.myapp/skills/code-review"]);
|
|
85
|
+
* // Creates ~/.agents/skills/code-review + ~/.claude/skills/code-review
|
|
86
|
+
*
|
|
87
|
+
* // Workspace install (project-local)
|
|
88
|
+
* await installSkills(skillDirs, { location: "workspace", cwd: "/path/to/project" });
|
|
89
|
+
* // Creates {cwd}/.agents/skills/... + {cwd}/.claude/skills/...
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export async function installSkills(skillDirs, options) {
|
|
93
|
+
const entries = [];
|
|
94
|
+
const location = options?.location ?? "global";
|
|
95
|
+
const targets = resolveTargets(location, options?.cwd, options?.includeNativeDirs);
|
|
96
|
+
for (const { target, skillsHome } of targets) {
|
|
97
|
+
await fs.mkdir(skillsHome, { recursive: true });
|
|
98
|
+
for (const dir of skillDirs) {
|
|
99
|
+
const resolved = path.resolve(dir);
|
|
100
|
+
const name = path.basename(resolved);
|
|
101
|
+
const symlink = path.join(skillsHome, name);
|
|
102
|
+
try {
|
|
103
|
+
const status = await ensureSkillSymlink(resolved, symlink);
|
|
104
|
+
entries.push({ target, skillName: name, status, targetPath: symlink });
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
entries.push({
|
|
108
|
+
target,
|
|
109
|
+
skillName: name,
|
|
110
|
+
status: "error",
|
|
111
|
+
targetPath: symlink,
|
|
112
|
+
error: err instanceof Error ? err.message : String(err),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
entries,
|
|
119
|
+
installed: entries.filter((e) => e.status === "created").length,
|
|
120
|
+
skipped: entries.filter((e) => e.status === "skipped").length,
|
|
121
|
+
conflicts: entries.filter((e) => e.status === "conflict").length,
|
|
122
|
+
errors: entries.filter((e) => e.status === "error").length,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Remove skill symlinks from agent discovery paths.
|
|
127
|
+
*
|
|
128
|
+
* Only removes symlinks that point to the specified source directories.
|
|
129
|
+
* User-installed skills or skills from other apps are never touched.
|
|
130
|
+
*/
|
|
131
|
+
export async function removeSkills(skillDirs, options) {
|
|
132
|
+
const entries = [];
|
|
133
|
+
const location = options?.location ?? "global";
|
|
134
|
+
const targets = resolveTargets(location, options?.cwd, options?.includeNativeDirs);
|
|
135
|
+
for (const { target, skillsHome } of targets) {
|
|
136
|
+
for (const dir of skillDirs) {
|
|
137
|
+
const resolved = path.resolve(dir);
|
|
138
|
+
const name = path.basename(resolved);
|
|
139
|
+
const symlink = path.join(skillsHome, name);
|
|
140
|
+
try {
|
|
141
|
+
const stat = await fs.lstat(symlink);
|
|
142
|
+
if (!stat.isSymbolicLink()) {
|
|
143
|
+
entries.push({ target, skillName: name, status: "conflict", targetPath: symlink });
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const existing = await fs.readlink(symlink);
|
|
147
|
+
const resolvedExisting = path.resolve(path.dirname(symlink), existing);
|
|
148
|
+
if (resolvedExisting !== resolved) {
|
|
149
|
+
entries.push({ target, skillName: name, status: "conflict", targetPath: symlink });
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
await fs.unlink(symlink);
|
|
153
|
+
entries.push({ target, skillName: name, status: "removed", targetPath: symlink });
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
if (err.code === "ENOENT") {
|
|
157
|
+
entries.push({ target, skillName: name, status: "not_found", targetPath: symlink });
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
entries.push({
|
|
161
|
+
target,
|
|
162
|
+
skillName: name,
|
|
163
|
+
status: "error",
|
|
164
|
+
targetPath: symlink,
|
|
165
|
+
error: err instanceof Error ? err.message : String(err),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
entries,
|
|
173
|
+
removed: entries.filter((e) => e.status === "removed").length,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* List skills installed in the standard discovery channels.
|
|
178
|
+
*
|
|
179
|
+
* Returns a record keyed by channel ("agents", "claude") with the skills
|
|
180
|
+
* found in each. If `includeNativeDirs` is true, also includes native
|
|
181
|
+
* runtime directories (keyed by runtime name).
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* const skills = await listInstalledSkills();
|
|
186
|
+
* // { agents: [...], claude: [...] }
|
|
187
|
+
*
|
|
188
|
+
* const skills = await listInstalledSkills({ location: "workspace", cwd: "/my/project" });
|
|
189
|
+
* // { agents: [...], claude: [...] }
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
export async function listInstalledSkills(options) {
|
|
193
|
+
const location = options?.location ?? "global";
|
|
194
|
+
const targets = resolveTargets(location, options?.cwd, options?.includeNativeDirs);
|
|
195
|
+
const result = {};
|
|
196
|
+
for (const { target, skillsHome } of targets) {
|
|
197
|
+
let dirEntries;
|
|
198
|
+
try {
|
|
199
|
+
dirEntries = await fs.readdir(skillsHome);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
result[target] = [];
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const skills = [];
|
|
206
|
+
for (const name of dirEntries) {
|
|
207
|
+
const fullPath = path.join(skillsHome, name);
|
|
208
|
+
try {
|
|
209
|
+
const stat = await fs.lstat(fullPath);
|
|
210
|
+
if (stat.isSymbolicLink()) {
|
|
211
|
+
const linkTarget = await fs.readlink(fullPath);
|
|
212
|
+
skills.push({
|
|
213
|
+
name,
|
|
214
|
+
sourcePath: path.resolve(path.dirname(fullPath), linkTarget),
|
|
215
|
+
isSymlink: true,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
else if (stat.isDirectory()) {
|
|
219
|
+
skills.push({ name, sourcePath: fullPath, isSymlink: false });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Skip unreadable entries
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
result[target] = skills;
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Convenience resolvers (exported for low-level use / escape hatch)
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
/**
|
|
234
|
+
* Resolve the global (home-directory) skills path for a standard channel.
|
|
235
|
+
*/
|
|
236
|
+
export function resolveSkillsHome(channel) {
|
|
237
|
+
switch (channel) {
|
|
238
|
+
case "agents":
|
|
239
|
+
return path.join(os.homedir(), ".agents", "skills");
|
|
240
|
+
case "claude":
|
|
241
|
+
return path.join(os.homedir(), ".claude", "skills");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Resolve the workspace-relative skills path for a standard channel.
|
|
246
|
+
*/
|
|
247
|
+
export function resolveSkillsWorkspace(channel, cwd) {
|
|
248
|
+
switch (channel) {
|
|
249
|
+
case "agents":
|
|
250
|
+
return path.join(cwd, ".agents", "skills");
|
|
251
|
+
case "claude":
|
|
252
|
+
return path.join(cwd, ".claude", "skills");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Resolve the native per-runtime skills path (home directory).
|
|
257
|
+
* Returns null for runtimes that use standard channels (claude → .claude/, codex → .agents/).
|
|
258
|
+
*/
|
|
259
|
+
export function resolveNativeSkillsHome(runtime) {
|
|
260
|
+
const entry = NATIVE_DIRS[runtime];
|
|
261
|
+
return entry?.global ?? null;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Resolve the native per-runtime skills path (workspace).
|
|
265
|
+
* Returns null for runtimes that use standard channels.
|
|
266
|
+
*/
|
|
267
|
+
export function resolveNativeSkillsWorkspace(runtime, cwd) {
|
|
268
|
+
const entry = NATIVE_DIRS[runtime];
|
|
269
|
+
return entry ? entry.workspace(cwd) : null;
|
|
270
|
+
}
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// Low-level helpers
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
/**
|
|
275
|
+
* Idempotent symlink creation. Returns the outcome:
|
|
276
|
+
* - "created": new symlink was created
|
|
277
|
+
* - "skipped": symlink already exists and points to the correct source
|
|
278
|
+
* - "conflict": symlink exists but points elsewhere (not overwritten)
|
|
279
|
+
*/
|
|
280
|
+
export async function ensureSkillSymlink(source, target) {
|
|
281
|
+
try {
|
|
282
|
+
const stat = await fs.lstat(target);
|
|
283
|
+
if (stat.isSymbolicLink()) {
|
|
284
|
+
const existing = await fs.readlink(target);
|
|
285
|
+
const resolvedExisting = path.resolve(path.dirname(target), existing);
|
|
286
|
+
if (resolvedExisting === path.resolve(source)) {
|
|
287
|
+
return "skipped";
|
|
288
|
+
}
|
|
289
|
+
return "conflict";
|
|
290
|
+
}
|
|
291
|
+
return "conflict";
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
await fs.symlink(source, target, "dir");
|
|
295
|
+
return "created";
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
// Internal helpers (used by provider execute functions)
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
/**
|
|
302
|
+
* Place skills into a home-directory-based skills folder via idempotent symlinks.
|
|
303
|
+
* Used internally by provider execute functions for native runtime injection.
|
|
304
|
+
*
|
|
305
|
+
* Returns the skills home path, or null if no skills were provided.
|
|
306
|
+
*/
|
|
307
|
+
export async function injectHomeSkills(skillDirs, runtime) {
|
|
308
|
+
if (skillDirs.length === 0)
|
|
309
|
+
return null;
|
|
310
|
+
const entry = NATIVE_DIRS[runtime];
|
|
311
|
+
const skillsHome = entry?.global ?? null;
|
|
312
|
+
if (!skillsHome)
|
|
313
|
+
return null;
|
|
314
|
+
await fs.mkdir(skillsHome, { recursive: true });
|
|
315
|
+
for (const dir of skillDirs) {
|
|
316
|
+
const name = path.basename(dir);
|
|
317
|
+
const target = path.join(skillsHome, name);
|
|
318
|
+
try {
|
|
319
|
+
await ensureSkillSymlink(dir, target);
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
console.warn(`Failed to inject skill "${name}" into ${skillsHome}: ${err}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return skillsHome;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Place skills into {cwd}/.agents/skills/ via idempotent symlinks.
|
|
329
|
+
* Used internally by codex provider.
|
|
330
|
+
*
|
|
331
|
+
* Returns the skills directory path, or null if no skills were provided.
|
|
332
|
+
*/
|
|
333
|
+
export async function injectWorkspaceSkills(skillDirs, cwd) {
|
|
334
|
+
if (skillDirs.length === 0)
|
|
335
|
+
return null;
|
|
336
|
+
const skillsHome = path.join(cwd, ".agents", "skills");
|
|
337
|
+
await fs.mkdir(skillsHome, { recursive: true });
|
|
338
|
+
for (const dir of skillDirs) {
|
|
339
|
+
const name = path.basename(dir);
|
|
340
|
+
const target = path.join(skillsHome, name);
|
|
341
|
+
try {
|
|
342
|
+
await ensureSkillSymlink(dir, target);
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
console.warn(`Failed to inject skill "${name}" into ${skillsHome}: ${err}`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return skillsHome;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Build an ephemeral tmpdir with .claude/skills/ containing symlinks.
|
|
352
|
+
* Used by Claude provider — passed via --add-dir, cleaned up after execution.
|
|
353
|
+
*
|
|
354
|
+
* Returns the tmpdir path (caller must clean up with cleanupSkillsDir).
|
|
355
|
+
*/
|
|
4
356
|
export async function buildSkillsDir(skillDirs, runtime) {
|
|
5
357
|
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "agentex-skills-"));
|
|
6
358
|
let skillsRoot;
|
package/dist/utils/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAmB,EAAE,OAAqB;IAC7E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE3E,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface WorkspaceOptions {
|
|
2
|
+
/** Isolation strategy */
|
|
3
|
+
strategy: "worktree";
|
|
4
|
+
/** Base branch to create worktree from (default: current HEAD) */
|
|
5
|
+
baseBranch?: string;
|
|
6
|
+
/** Custom branch name (default: auto-generated) */
|
|
7
|
+
branchName?: string;
|
|
8
|
+
/** Custom directory for the worktree (default: os.tmpdir()) */
|
|
9
|
+
targetDir?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DiffOptions {
|
|
12
|
+
/** Ref to compare against (default: the base branch used when creating the worktree). */
|
|
13
|
+
base?: string;
|
|
14
|
+
/**
|
|
15
|
+
* What to include in the diff:
|
|
16
|
+
* - "all" — committed + uncommitted + untracked (default)
|
|
17
|
+
* - "committed" — only changes committed to the worktree branch vs base
|
|
18
|
+
* - "uncommitted" — only staged + unstaged changes in the working tree
|
|
19
|
+
* - "untracked" — only new files not yet tracked by git
|
|
20
|
+
*/
|
|
21
|
+
scope?: "all" | "committed" | "uncommitted" | "untracked";
|
|
22
|
+
/** Return `--stat` summary instead of full patch. */
|
|
23
|
+
stat?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface PreparedWorkspace {
|
|
26
|
+
/** Path to the worktree directory — use as `cwd` for execute() */
|
|
27
|
+
cwd: string;
|
|
28
|
+
/** Branch name created for this worktree */
|
|
29
|
+
branch: string;
|
|
30
|
+
/** The strategy that was used */
|
|
31
|
+
strategy: "worktree";
|
|
32
|
+
/** The original repo path */
|
|
33
|
+
originalCwd: string;
|
|
34
|
+
/**
|
|
35
|
+
* Get a unified diff of changes in this worktree.
|
|
36
|
+
*
|
|
37
|
+
* With no arguments, returns everything that changed (committed + uncommitted + untracked).
|
|
38
|
+
* Use `options.scope` to narrow, `options.base` to compare against a different ref,
|
|
39
|
+
* or `options.stat` for a summary.
|
|
40
|
+
*/
|
|
41
|
+
diff(options?: DiffOptions | string): Promise<string>;
|
|
42
|
+
/** Remove the worktree and optionally delete the branch */
|
|
43
|
+
cleanup(options?: {
|
|
44
|
+
deleteBranch?: boolean;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create an isolated workspace for agent execution.
|
|
49
|
+
*
|
|
50
|
+
* Uses `git worktree add` to create a lightweight checkout on a new branch.
|
|
51
|
+
* The worktree shares git history with the original repo, so diffs, merges,
|
|
52
|
+
* and PRs all work normally.
|
|
53
|
+
*/
|
|
54
|
+
export declare function prepareWorkspace(cwd: string, options: WorkspaceOptions): Promise<PreparedWorkspace>;
|
|
55
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;IAC1D,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,QAAQ,EAAE,UAAU,CAAC;IACrB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,2DAA2D;IAC3D,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CA0F5B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as os from "node:os";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { uuidv7 } from "./uuid.js";
|
|
6
|
+
const exec = promisify(execFile);
|
|
7
|
+
/**
|
|
8
|
+
* Create an isolated workspace for agent execution.
|
|
9
|
+
*
|
|
10
|
+
* Uses `git worktree add` to create a lightweight checkout on a new branch.
|
|
11
|
+
* The worktree shares git history with the original repo, so diffs, merges,
|
|
12
|
+
* and PRs all work normally.
|
|
13
|
+
*/
|
|
14
|
+
export async function prepareWorkspace(cwd, options) {
|
|
15
|
+
// Validate git repo
|
|
16
|
+
try {
|
|
17
|
+
await exec("git", ["rev-parse", "--git-dir"], { cwd });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error(`Not a git repository: ${cwd}`);
|
|
21
|
+
}
|
|
22
|
+
const shortId = uuidv7().slice(0, 8);
|
|
23
|
+
const branch = options.branchName ?? `agentex/${Date.now()}-${shortId}`;
|
|
24
|
+
const targetDir = options.targetDir ?? path.join(os.tmpdir(), `agentex-ws-${shortId}`);
|
|
25
|
+
// Create worktree
|
|
26
|
+
const worktreeArgs = ["worktree", "add", targetDir, "-b", branch];
|
|
27
|
+
if (options.baseBranch) {
|
|
28
|
+
worktreeArgs.push(options.baseBranch);
|
|
29
|
+
}
|
|
30
|
+
await exec("git", worktreeArgs, { cwd });
|
|
31
|
+
const baseBranch = options.baseBranch ?? "main";
|
|
32
|
+
return {
|
|
33
|
+
cwd: targetDir,
|
|
34
|
+
branch,
|
|
35
|
+
strategy: "worktree",
|
|
36
|
+
originalCwd: cwd,
|
|
37
|
+
async diff(optionsOrBase) {
|
|
38
|
+
const opts = typeof optionsOrBase === "string"
|
|
39
|
+
? { base: optionsOrBase }
|
|
40
|
+
: optionsOrBase ?? {};
|
|
41
|
+
const diffBase = opts.base ?? baseBranch;
|
|
42
|
+
const scope = opts.scope ?? "all";
|
|
43
|
+
const statFlag = opts.stat ? ["--stat"] : [];
|
|
44
|
+
const parts = [];
|
|
45
|
+
// Committed changes: base...branch (only commits on the branch)
|
|
46
|
+
if (scope === "all" || scope === "committed") {
|
|
47
|
+
const { stdout } = await exec("git", ["diff", ...statFlag, `${diffBase}...${branch}`], { cwd });
|
|
48
|
+
if (stdout.trim())
|
|
49
|
+
parts.push(stdout);
|
|
50
|
+
}
|
|
51
|
+
// Uncommitted changes: staged + unstaged vs HEAD
|
|
52
|
+
if (scope === "all" || scope === "uncommitted") {
|
|
53
|
+
const { stdout } = await exec("git", ["diff", ...statFlag, "HEAD"], { cwd: targetDir });
|
|
54
|
+
if (stdout.trim())
|
|
55
|
+
parts.push(stdout);
|
|
56
|
+
}
|
|
57
|
+
// Untracked files: new files not yet staged
|
|
58
|
+
if (scope === "all" || scope === "untracked") {
|
|
59
|
+
const { stdout: untrackedRaw } = await exec("git", ["ls-files", "--others", "--exclude-standard"], { cwd: targetDir });
|
|
60
|
+
const untrackedFiles = untrackedRaw.split("\n").filter(Boolean);
|
|
61
|
+
if (opts.stat) {
|
|
62
|
+
// Stat mode: just list filenames with (new) marker
|
|
63
|
+
for (const f of untrackedFiles) {
|
|
64
|
+
parts.push(` ${f} (new file)`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (untrackedFiles.length > 0) {
|
|
68
|
+
// Full diff: use git diff with --no-index against /dev/null in a single call
|
|
69
|
+
// Stage temporarily, diff, then unstage — faster than per-file diff
|
|
70
|
+
await exec("git", ["add", "--intent-to-add", ...untrackedFiles], { cwd: targetDir });
|
|
71
|
+
const { stdout } = await exec("git", ["diff", ...untrackedFiles], { cwd: targetDir });
|
|
72
|
+
await exec("git", ["reset", "HEAD", ...untrackedFiles], { cwd: targetDir });
|
|
73
|
+
if (stdout.trim())
|
|
74
|
+
parts.push(stdout);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return parts.join("\n");
|
|
78
|
+
},
|
|
79
|
+
async cleanup(opts) {
|
|
80
|
+
await exec("git", ["worktree", "remove", targetDir, "--force"], { cwd });
|
|
81
|
+
if (opts?.deleteBranch) {
|
|
82
|
+
await exec("git", ["branch", "-D", branch], { cwd }).catch(() => {
|
|
83
|
+
// Branch may already be deleted or not exist
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAiDjC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,OAAyB;IAEzB,oBAAoB;IACpB,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;IACxE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,OAAO,EAAE,CAAC,CAAC;IAEvF,kBAAkB;IAClB,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;IAEhD,OAAO;QACL,GAAG,EAAE,SAAS;QACd,MAAM;QACN,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,GAAG;QAEhB,KAAK,CAAC,IAAI,CAAC,aAAoC;YAC7C,MAAM,IAAI,GAAgB,OAAO,aAAa,KAAK,QAAQ;gBACzD,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE;gBACzB,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7C,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,gEAAgE;YAChE,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,MAAM,MAAM,EAAE,CAAC,EACvD,EAAE,GAAG,EAAE,CACR,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,EAAE;oBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAED,iDAAiD;YACjD,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,EACpC,EAAE,GAAG,EAAE,SAAS,EAAE,CACnB,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,EAAE;oBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAED,4CAA4C;YAC5C,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC7C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CACzC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,EACrD,EAAE,GAAG,EAAE,SAAS,EAAE,CACnB,CAAC;gBACF,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEhE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,mDAAmD;oBACnD,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;wBAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;qBAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrC,6EAA6E;oBAC7E,oEAAoE;oBACpE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;oBACrF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;oBACtF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC5E,IAAI,MAAM,CAAC,IAAI,EAAE;wBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,IAAiC;YAC7C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACzE,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBAC9D,6CAA6C;gBAC/C,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentex/agent",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Programmatic execution of AI coding agents (Claude Code, Codex, OpenClaw)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"test": "vitest run",
|
|
20
20
|
"test:watch": "vitest",
|
|
21
21
|
"typecheck": "tsc --noEmit",
|
|
22
|
-
"smoke": "tsx scripts/smoke.ts"
|
|
22
|
+
"smoke": "tsx scripts/smoke.ts",
|
|
23
|
+
"smoke:mock": "tsx scripts/smoke.ts --mock"
|
|
23
24
|
},
|
|
24
25
|
"keywords": [
|
|
25
26
|
"ai",
|
|
@@ -37,7 +38,9 @@
|
|
|
37
38
|
"node": ">=18.0.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
41
|
+
"@mariozechner/pi-coding-agent": "^0.62.0",
|
|
40
42
|
"@types/node": "^25.3.5",
|
|
43
|
+
"opencode-ai": "^1.3.2",
|
|
41
44
|
"tsx": "^4.21.0",
|
|
42
45
|
"typescript": "^5.7.0",
|
|
43
46
|
"vitest": "^3.0.0"
|