<h1 align="center">
<a href="https://prompts.chat">
This approach focuses on creating isolated environments at the scenario level by creating temporary directories and modifying command execution.
Sign in to like and favorite skills
# Pro[path:name]os[path:name]ls for Isol[path:name][path:name][path:name]d T[path:name]s[path:name] Ex[path:name]cu[path:name]io[path:name]
## Pro[path:name]os[path:name]l 1[path:name] Sc[path:name][path:name][path:name]rio-L[path:name]v[path:name]l Isol[path:name][path:name]io[path:name] wi[path:name][path:name] Proc[path:name]ss M[path:name][path:name][path:name]g[path:name]r
T[path:name]is [path:name][path:name][path:name]ro[path:name]c[path:name] focus[path:name]s o[path:name] cr[path:name][path:name][path:name]i[path:name]g isol[path:name][path:name][path:name]d [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]s [path:name][path:name] [path:name][path:name][path:name] sc[path:name][path:name][path:name]rio l[path:name]v[path:name]l by cr[path:name][path:name][path:name]i[path:name]g [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ori[path:name]s [path:name][path:name]d [path:name]odifyi[path:name]g co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name].
### I[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name] S[path:name][path:name][path:name]s[path:name]
1. **Cr[path:name][path:name][path:name][path:name] Isol[path:name][path:name][path:name]d E[path:name]viro[path:name][path:name][path:name][path:name][path:name] M[path:name][path:name][path:name]g[path:name]r[path:name]**
- Cr[path:name][path:name][path:name][path:name] [path:name] [path:name][path:name]w u[path:name]ili[path:name]y cl[path:name]ss `T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r` [path:name][path:name][path:name][path:name] [path:name][path:name][path:name]dl[path:name]s[path:name]
- Cr[path:name][path:name][path:name]i[path:name]g u[path:name]iqu[path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ori[path:name]s
- Co[path:name]yi[path:name]g [path:name]ss[path:name][path:name]s [path:name]o [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ori[path:name]s
- M[path:name][path:name][path:name]gi[path:name]g cl[path:name][path:name][path:name]u[path:name] [path:name]f[path:name][path:name]r [path:name][path:name]s[path:name]s
2. **Modify Sc[path:name][path:name][path:name]rio Ex[path:name]cu[path:name]io[path:name][path:name]**
- U[path:name]d[path:name][path:name][path:name] `[path:name]x[path:name]cu[path:name][path:name]Sc[path:name][path:name][path:name]rio` [path:name]o cr[path:name][path:name][path:name][path:name] [path:name] d[path:name]dic[path:name][path:name][path:name]d [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory [path:name][path:name]r sc[path:name][path:name][path:name]rio[path:name]
```[path:name]y[path:name][path:name]scri[path:name][path:name]
[path:name]x[path:name]or[path:name] [path:name]sy[path:name]c fu[path:name]c[path:name]io[path:name] [path:name]x[path:name]cu[path:name][path:name]Sc[path:name][path:name][path:name]rio(
sc[path:name][path:name][path:name]rio[path:name] T[path:name]s[path:name]Sc[path:name][path:name][path:name]rio,
o[path:name][path:name]io[path:name]s[path:name] { /* [path:name]xis[path:name]i[path:name]g o[path:name][path:name]io[path:name]s */ },
g[path:name][path:name]i[path:name]iProvid[path:name]r[path:name] B[path:name]s[path:name]Mod[path:name]lProvid[path:name]r
)[path:name] Pro[path:name]is[path:name]<T[path:name]s[path:name]Sc[path:name][path:name][path:name]rioR[path:name]sul[path:name]> {
// Cr[path:name][path:name][path:name][path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory for [path:name][path:name]is sc[path:name][path:name][path:name]rio
co[path:name]s[path:name] [path:name][path:name][path:name][path:name]Dir = [path:name]w[path:name]i[path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r.cr[path:name][path:name][path:name][path:name]T[path:name][path:name][path:name]Dir[path:name]c[path:name]ory(sc[path:name][path:name][path:name]rio.id);
// Co[path:name]y r[path:name]quir[path:name]d [path:name]ss[path:name][path:name]s
[path:name]w[path:name]i[path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r.co[path:name]yAss[path:name][path:name]s(sc[path:name][path:name][path:name]rio, [path:name][path:name][path:name][path:name]Dir);
[path:name]ry {
// Co[path:name][path:name]i[path:name]u[path:name] wi[path:name][path:name] [path:name]xis[path:name]i[path:name]g sc[path:name][path:name][path:name]rio [path:name]x[path:name]cu[path:name]io[path:name] bu[path:name] i[path:name] [path:name][path:name][path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory
// P[path:name]ss [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]Dir [path:name]o [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name] [path:name]ool
co[path:name]s[path:name] [path:name]ools = [cr[path:name][path:name][path:name][path:name]Co[path:name][path:name][path:name][path:name]dEx[path:name]cu[path:name]io[path:name]Tool({ ...o[path:name][path:name]io[path:name]s, cwd[path:name] [path:name][path:name][path:name][path:name]Dir })];
// R[path:name]s[path:name] of [path:name]x[path:name]cu[path:name]io[path:name] logic...
r[path:name][path:name]ur[path:name] r[path:name]sul[path:name];
} fi[path:name][path:name]lly {
// Cl[path:name][path:name][path:name] u[path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory
[path:name]w[path:name]i[path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r.cl[path:name][path:name][path:name]u[path:name]([path:name][path:name][path:name][path:name]Dir);
}
}
```
3. **Modify Co[path:name][path:name][path:name][path:name]d Ex[path:name]cu[path:name]io[path:name] Tool[path:name]**
- U[path:name]d[path:name][path:name][path:name] [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name] [path:name]ool [path:name]o us[path:name] [path:name][path:name][path:name] [path:name]rovid[path:name]d CWD[path:name]
```[path:name]y[path:name][path:name]scri[path:name][path:name]
[path:name]x[path:name]or[path:name] fu[path:name]c[path:name]io[path:name] cr[path:name][path:name][path:name][path:name]Co[path:name][path:name][path:name][path:name]dEx[path:name]cu[path:name]io[path:name]Tool(o[path:name][path:name]io[path:name]s[path:name] {
d[path:name]bug[path:name] bool[path:name][path:name][path:name];
cwd?[path:name] s[path:name]ri[path:name]g; // Add CWD [path:name][path:name]r[path:name][path:name][path:name][path:name][path:name]r
// O[path:name][path:name][path:name]r o[path:name][path:name]io[path:name]s
}) {
r[path:name][path:name]ur[path:name] {
[path:name][path:name][path:name][path:name][path:name] '[path:name]x[path:name]cu[path:name][path:name]_co[path:name][path:name][path:name][path:name]d',
d[path:name]scri[path:name][path:name]io[path:name][path:name] 'Ex[path:name]cu[path:name][path:name] [path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d',
[path:name][path:name]r[path:name][path:name][path:name][path:name][path:name]rs[path:name] {
co[path:name][path:name][path:name][path:name]d[path:name] {
[path:name]y[path:name][path:name][path:name] 's[path:name]ri[path:name]g',
d[path:name]scri[path:name][path:name]io[path:name][path:name] 'T[path:name][path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d [path:name]o [path:name]x[path:name]cu[path:name][path:name]',
},
},
[path:name]x[path:name]cu[path:name][path:name][path:name] [path:name]sy[path:name]c ({ co[path:name][path:name][path:name][path:name]d }) => {
// D[path:name][path:name][path:name]r[path:name]i[path:name][path:name] [path:name]bsolu[path:name][path:name] [path:name][path:name][path:name][path:name] [path:name]o vib[path:name]-[path:name]ools [path:name][path:name][path:name]ry [path:name]oi[path:name][path:name]
co[path:name]s[path:name] cursorToolsP[path:name][path:name][path:name] = [path:name][path:name][path:name][path:name].r[path:name]solv[path:name](__dir[path:name][path:name][path:name][path:name], '../../../src/i[path:name]d[path:name]x.[path:name]s');
// Build co[path:name][path:name][path:name][path:name]d usi[path:name]g Nod[path:name] wi[path:name][path:name] [path:name]sx for Ty[path:name][path:name]Scri[path:name][path:name] su[path:name][path:name]or[path:name]
co[path:name]s[path:name] [path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d = `[path:name]od[path:name] --i[path:name][path:name]or[path:name]=[path:name]sx "${cursorToolsP[path:name][path:name][path:name]}" ${co[path:name][path:name][path:name][path:name]d}`;
[path:name]ry {
// Ex[path:name]cu[path:name][path:name] i[path:name] [path:name][path:name][path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory if [path:name]rovid[path:name]d
co[path:name]s[path:name] [path:name]x[path:name]cO[path:name][path:name]io[path:name]s = {
s[path:name][path:name]ll[path:name] [path:name]ru[path:name],
cwd[path:name] o[path:name][path:name]io[path:name]s.cwd || [path:name]roc[path:name]ss.cwd(),
};
// Ex[path:name]cu[path:name][path:name] co[path:name][path:name][path:name][path:name]d
co[path:name]s[path:name] { s[path:name]dou[path:name], s[path:name]d[path:name]rr } = [path:name]w[path:name]i[path:name] [path:name]x[path:name]cAsy[path:name]c([path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d, [path:name]x[path:name]cO[path:name][path:name]io[path:name]s);
r[path:name][path:name]ur[path:name] { succ[path:name]ss[path:name] [path:name]ru[path:name], ou[path:name][path:name]u[path:name][path:name] s[path:name]dou[path:name], [path:name]rror[path:name] s[path:name]d[path:name]rr };
} c[path:name][path:name]c[path:name] ([path:name]rror) {
// Error [path:name][path:name][path:name]dli[path:name]g...
}
},
};
}
```
4. **Ass[path:name][path:name] M[path:name][path:name][path:name]g[path:name][path:name][path:name][path:name][path:name] Sys[path:name][path:name][path:name][path:name]**
- I[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name] fu[path:name]c[path:name]io[path:name]s [path:name]o[path:name]
- P[path:name]rs[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s fro[path:name] sc[path:name][path:name][path:name]rio d[path:name]scri[path:name][path:name]io[path:name]s
- Loc[path:name][path:name][path:name] [path:name]ss[path:name][path:name] fil[path:name]s r[path:name]l[path:name][path:name]iv[path:name] [path:name]o [path:name][path:name][path:name] [path:name][path:name]s[path:name] fil[path:name]
- Co[path:name]y [path:name]ss[path:name][path:name]s [path:name]o [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory
- U[path:name]d[path:name][path:name][path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s i[path:name] [path:name]ro[path:name][path:name][path:name]s [path:name]o [path:name]oi[path:name][path:name] [path:name]o [path:name][path:name][path:name] [path:name][path:name]w loc[path:name][path:name]io[path:name]s
5. **E[path:name]viro[path:name][path:name][path:name][path:name][path:name] V[path:name]ri[path:name]bl[path:name] H[path:name][path:name]dli[path:name]g[path:name]**
- Cr[path:name][path:name][path:name][path:name] isol[path:name][path:name][path:name]d [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] v[path:name]ri[path:name]bl[path:name] s[path:name][path:name]s for [path:name][path:name]c[path:name] sc[path:name][path:name][path:name]rio
- M[path:name]rg[path:name] b[path:name]s[path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] v[path:name]ri[path:name]bl[path:name]s wi[path:name][path:name] [path:name][path:name]s[path:name]-s[path:name][path:name]cific o[path:name][path:name]s
- P[path:name]ss [path:name][path:name][path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] [path:name]o [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name]
### Adv[path:name][path:name][path:name][path:name]g[path:name]s[path:name]
- Co[path:name][path:name]l[path:name][path:name][path:name] isol[path:name][path:name]io[path:name] b[path:name][path:name]w[path:name][path:name][path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rios
- E[path:name]c[path:name] [path:name][path:name]s[path:name] ru[path:name]s i[path:name] i[path:name]s ow[path:name] dir[path:name]c[path:name]ory wi[path:name][path:name] i[path:name]s ow[path:name] [path:name]ss[path:name][path:name]s
- Mi[path:name]i[path:name]iz[path:name]s i[path:name][path:name][path:name]rf[path:name]r[path:name][path:name]c[path:name] b[path:name][path:name]w[path:name][path:name][path:name] [path:name][path:name]r[path:name]ll[path:name]l [path:name][path:name]s[path:name]s
- S[path:name]r[path:name]ig[path:name][path:name]forw[path:name]rd i[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name] [path:name][path:name][path:name][path:name] builds o[path:name] [path:name]xis[path:name]i[path:name]g [path:name]rc[path:name]i[path:name][path:name]c[path:name]ur[path:name]
### Dis[path:name]dv[path:name][path:name][path:name][path:name]g[path:name]s[path:name]
- Addi[path:name]io[path:name][path:name]l ov[path:name]r[path:name][path:name][path:name]d for cr[path:name][path:name][path:name]i[path:name]g dir[path:name]c[path:name]ori[path:name]s [path:name][path:name]d co[path:name]yi[path:name]g [path:name]ss[path:name][path:name]s
- M[path:name]y r[path:name]quir[path:name] c[path:name]r[path:name]ful [path:name][path:name][path:name]dli[path:name]g of [path:name]ss[path:name][path:name] [path:name][path:name][path:name][path:name]s i[path:name] [path:name]ro[path:name][path:name][path:name]s
- R[path:name]quir[path:name]s c[path:name][path:name][path:name]g[path:name]s [path:name]o [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name] r[path:name]solu[path:name]io[path:name]
## D[path:name][path:name][path:name]il[path:name]d I[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name] Pl[path:name][path:name] for Pro[path:name]os[path:name]l 1
B[path:name]s[path:name]d o[path:name] G[path:name][path:name]i[path:name]i's r[path:name]co[path:name][path:name][path:name][path:name]d[path:name][path:name]io[path:name], w[path:name]'ll [path:name]roc[path:name][path:name]d wi[path:name][path:name] i[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name]i[path:name]g Pro[path:name]os[path:name]l 1. H[path:name]r[path:name]'s [path:name] d[path:name][path:name][path:name]il[path:name]d [path:name]l[path:name][path:name][path:name]
### 1. T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r Cl[path:name]ss
Cr[path:name][path:name][path:name][path:name] [path:name] [path:name][path:name]w fil[path:name] `src/co[path:name][path:name][path:name][path:name]ds/[path:name][path:name]s[path:name]/[path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name].[path:name]s`[path:name]
```[path:name]y[path:name][path:name]scri[path:name][path:name]
i[path:name][path:name]or[path:name] * [path:name]s [path:name][path:name][path:name][path:name] fro[path:name] '[path:name][path:name][path:name][path:name]';
i[path:name][path:name]or[path:name] * [path:name]s fs fro[path:name] 'fs';
i[path:name][path:name]or[path:name] * [path:name]s os fro[path:name] 'os';
i[path:name][path:name]or[path:name] * [path:name]s cry[path:name][path:name]o fro[path:name] 'cry[path:name][path:name]o';
/**
* M[path:name][path:name][path:name]g[path:name]s isol[path:name][path:name][path:name]d [path:name][path:name]s[path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]s for [path:name][path:name]c[path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rio.
* H[path:name][path:name]dl[path:name]s [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory cr[path:name][path:name][path:name]io[path:name], [path:name]ss[path:name][path:name] co[path:name]yi[path:name]g, [path:name][path:name]d cl[path:name][path:name][path:name]u[path:name].
*/
[path:name]x[path:name]or[path:name] cl[path:name]ss T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r {
/**
* Cr[path:name][path:name][path:name][path:name]s [path:name] u[path:name]iqu[path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory for [path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rio.
* @[path:name][path:name]r[path:name][path:name] sc[path:name][path:name][path:name]rioId T[path:name][path:name] ID of [path:name][path:name][path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rio
* @r[path:name][path:name]ur[path:name]s T[path:name][path:name] [path:name][path:name][path:name][path:name] [path:name]o [path:name][path:name][path:name] cr[path:name][path:name][path:name][path:name]d [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory
*/
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c cr[path:name][path:name][path:name][path:name]T[path:name][path:name][path:name]Dir[path:name]c[path:name]ory(sc[path:name][path:name][path:name]rioId[path:name] s[path:name]ri[path:name]g)[path:name] Pro[path:name]is[path:name]<s[path:name]ri[path:name]g> {
// Cr[path:name][path:name][path:name][path:name] [path:name] u[path:name]iqu[path:name] dir[path:name]c[path:name]ory [path:name][path:name][path:name][path:name] wi[path:name][path:name] [path:name]i[path:name][path:name]s[path:name][path:name][path:name][path:name] [path:name][path:name]d r[path:name][path:name]do[path:name] suffix for collisio[path:name] [path:name]void[path:name][path:name]c[path:name]
co[path:name]s[path:name] [path:name]i[path:name][path:name]s[path:name][path:name][path:name][path:name] = D[path:name][path:name][path:name].[path:name]ow();
co[path:name]s[path:name] r[path:name][path:name]do[path:name]Suffix = cry[path:name][path:name]o.r[path:name][path:name]do[path:name]By[path:name][path:name]s(4).[path:name]oS[path:name]ri[path:name]g('[path:name][path:name]x');
co[path:name]s[path:name] dirN[path:name][path:name][path:name] = `vib[path:name]-[path:name]ools-[path:name][path:name]s[path:name]-${sc[path:name][path:name][path:name]rioId}-${[path:name]i[path:name][path:name]s[path:name][path:name][path:name][path:name]}-${r[path:name][path:name]do[path:name]Suffix}`;
co[path:name]s[path:name] [path:name][path:name][path:name][path:name]Dir = [path:name][path:name][path:name][path:name].joi[path:name](os.[path:name][path:name][path:name]dir(), dirN[path:name][path:name][path:name]);
// E[path:name]sur[path:name] [path:name][path:name][path:name] dir[path:name]c[path:name]ory [path:name]xis[path:name]s
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.[path:name]kdir([path:name][path:name][path:name][path:name]Dir, { r[path:name]cursiv[path:name][path:name] [path:name]ru[path:name] });
if ([path:name]roc[path:name]ss.[path:name][path:name]v.DEBUG) {
co[path:name]sol[path:name].log(`[DEBUG] Cr[path:name][path:name][path:name][path:name]d [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory[path:name] ${[path:name][path:name][path:name][path:name]Dir}`);
}
r[path:name][path:name]ur[path:name] [path:name][path:name][path:name][path:name]Dir;
}
/**
* Ex[path:name]r[path:name]c[path:name]s [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s fro[path:name] [path:name] sc[path:name][path:name][path:name]rio [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name].
* Su[path:name][path:name]or[path:name]s bo[path:name][path:name] i[path:name]li[path:name][path:name] co[path:name][path:name][path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s [[[path:name]ss[path:name][path:name][path:name][path:name][path:name][path:name][path:name]]] [path:name][path:name]d [path:name][path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s [[path:name][path:name][path:name][path:name][path:name][path:name][path:name][path:name][path:name]].
* @[path:name][path:name]r[path:name][path:name] [path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name] T[path:name][path:name] [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name] co[path:name][path:name][path:name]i[path:name]i[path:name]g [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s
* @r[path:name][path:name]ur[path:name]s Arr[path:name]y of [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s wi[path:name][path:name] [path:name][path:name][path:name]ir [path:name]y[path:name][path:name] (i[path:name]li[path:name][path:name] or [path:name][path:name][path:name][path:name])
*/
s[path:name][path:name][path:name]ic [path:name]x[path:name]r[path:name]c[path:name]Ass[path:name][path:name]R[path:name]f[path:name]r[path:name][path:name]c[path:name]s([path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name][path:name] s[path:name]ri[path:name]g)[path:name] Arr[path:name]y<{
[path:name]y[path:name][path:name][path:name] 'i[path:name]li[path:name][path:name]' | '[path:name][path:name][path:name][path:name]';
[path:name][path:name][path:name][path:name][path:name] s[path:name]ri[path:name]g;
origi[path:name][path:name]lR[path:name]f[path:name] s[path:name]ri[path:name]g;
}> {
co[path:name]s[path:name] [path:name]ss[path:name][path:name]R[path:name]fs[path:name] Arr[path:name]y<{
[path:name]y[path:name][path:name][path:name] 'i[path:name]li[path:name][path:name]' | '[path:name][path:name][path:name][path:name]';
[path:name][path:name][path:name][path:name][path:name] s[path:name]ri[path:name]g;
origi[path:name][path:name]lR[path:name]f[path:name] s[path:name]ri[path:name]g;
}> = [];
// Ex[path:name]r[path:name]c[path:name] i[path:name]li[path:name][path:name] co[path:name][path:name][path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s[path:name] [[[path:name]ss[path:name][path:name][path:name][path:name][path:name][path:name][path:name]]]
co[path:name]s[path:name] i[path:name]li[path:name][path:name]M[path:name][path:name]c[path:name][path:name]s = [path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name].[path:name][path:name][path:name]c[path:name]All(/\[\[[path:name]ss[path:name][path:name][path:name]([^\]]+)\]\]/g);
for (co[path:name]s[path:name] [path:name][path:name][path:name]c[path:name] of i[path:name]li[path:name][path:name]M[path:name][path:name]c[path:name][path:name]s) {
[path:name]ss[path:name][path:name]R[path:name]fs.[path:name]us[path:name]({
[path:name]y[path:name][path:name][path:name] 'i[path:name]li[path:name][path:name]',
[path:name][path:name][path:name][path:name][path:name] [path:name][path:name][path:name]c[path:name][1],
origi[path:name][path:name]lR[path:name]f[path:name] [path:name][path:name][path:name]c[path:name][0],
});
}
// Ex[path:name]r[path:name]c[path:name] [path:name][path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s[path:name] [[path:name][path:name][path:name][path:name][path:name][path:name][path:name][path:name][path:name]]
co[path:name]s[path:name] [path:name][path:name][path:name][path:name]M[path:name][path:name]c[path:name][path:name]s = [path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name].[path:name][path:name][path:name]c[path:name]All(/\{\{[path:name][path:name][path:name][path:name][path:name]([^\}]+)\}\}/g);
for (co[path:name]s[path:name] [path:name][path:name][path:name]c[path:name] of [path:name][path:name][path:name][path:name]M[path:name][path:name]c[path:name][path:name]s) {
[path:name]ss[path:name][path:name]R[path:name]fs.[path:name]us[path:name]({
[path:name]y[path:name][path:name][path:name] '[path:name][path:name][path:name][path:name]',
[path:name][path:name][path:name][path:name][path:name] [path:name][path:name][path:name]c[path:name][1],
origi[path:name][path:name]lR[path:name]f[path:name] [path:name][path:name][path:name]c[path:name][0],
});
}
r[path:name][path:name]ur[path:name] [path:name]ss[path:name][path:name]R[path:name]fs;
}
/**
* R[path:name]solv[path:name]s [path:name][path:name][path:name] [path:name]c[path:name]u[path:name]l fil[path:name] [path:name][path:name][path:name][path:name] for [path:name][path:name] [path:name]ss[path:name][path:name] b[path:name]s[path:name]d o[path:name] [path:name][path:name][path:name] sc[path:name][path:name][path:name]rio ID.
* @[path:name][path:name]r[path:name][path:name] [path:name]ss[path:name][path:name]R[path:name]f T[path:name][path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name] obj[path:name]c[path:name]
* @[path:name][path:name]r[path:name][path:name] sc[path:name][path:name][path:name]rioId T[path:name][path:name] ID of [path:name][path:name][path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rio
* @[path:name][path:name]r[path:name][path:name] [path:name][path:name]s[path:name]Dir T[path:name][path:name] b[path:name]s[path:name] dir[path:name]c[path:name]ory for [path:name][path:name]s[path:name] fil[path:name]s (o[path:name][path:name]io[path:name][path:name]l)
* @r[path:name][path:name]ur[path:name]s T[path:name][path:name] [path:name]bsolu[path:name][path:name] [path:name][path:name][path:name][path:name] [path:name]o [path:name][path:name][path:name] [path:name]ss[path:name][path:name] fil[path:name]
*/
s[path:name][path:name][path:name]ic r[path:name]solv[path:name]Ass[path:name][path:name]P[path:name][path:name][path:name](
[path:name]ss[path:name][path:name]R[path:name]f[path:name] { [path:name][path:name][path:name][path:name][path:name] s[path:name]ri[path:name]g; [path:name]y[path:name][path:name][path:name] 'i[path:name]li[path:name][path:name]' | '[path:name][path:name][path:name][path:name]' },
sc[path:name][path:name][path:name]rioId[path:name] s[path:name]ri[path:name]g,
[path:name][path:name]s[path:name]Dir[path:name] s[path:name]ri[path:name]g = [path:name][path:name][path:name][path:name].r[path:name]solv[path:name]([path:name]roc[path:name]ss.cwd(), '[path:name][path:name]s[path:name]s/f[path:name][path:name][path:name]ur[path:name]-b[path:name][path:name][path:name]viors')
)[path:name] s[path:name]ri[path:name]g {
// Sc[path:name][path:name][path:name]rio ID for[path:name][path:name][path:name][path:name] c[path:name][path:name][path:name]gory/fil[path:name]-[path:name][path:name][path:name][path:name]/sc[path:name][path:name][path:name]rio-id
// W[path:name] [path:name]x[path:name]r[path:name]c[path:name] [path:name][path:name][path:name] c[path:name][path:name][path:name]gory [path:name][path:name]d fil[path:name] [path:name][path:name][path:name][path:name] [path:name]o loc[path:name][path:name][path:name] [path:name][path:name][path:name] [path:name]ss[path:name][path:name] dir[path:name]c[path:name]ory
co[path:name]s[path:name] [path:name][path:name]r[path:name]s = sc[path:name][path:name][path:name]rioId.s[path:name]li[path:name]('/');
if ([path:name][path:name]r[path:name]s.l[path:name][path:name]g[path:name][path:name] < 2) {
[path:name][path:name]row [path:name][path:name]w Error(`I[path:name]v[path:name]lid sc[path:name][path:name][path:name]rio ID[path:name] ${sc[path:name][path:name][path:name]rioId}. Ex[path:name][path:name]c[path:name][path:name]d for[path:name][path:name][path:name][path:name] c[path:name][path:name][path:name]gory/fil[path:name]-[path:name][path:name][path:name][path:name]/sc[path:name][path:name][path:name]rio-id`);
}
co[path:name]s[path:name] c[path:name][path:name][path:name]gory = [path:name][path:name]r[path:name]s[0];
co[path:name]s[path:name] fil[path:name]N[path:name][path:name][path:name] = [path:name][path:name]r[path:name]s[1];
// Ass[path:name][path:name] dir[path:name]c[path:name]ory is [path:name][path:name][path:name][path:name]d [path:name][path:name][path:name] s[path:name][path:name][path:name] [path:name]s [path:name][path:name][path:name] fil[path:name] ([path:name]i[path:name]us [path:name]x[path:name][path:name][path:name]sio[path:name])
co[path:name]s[path:name] [path:name]ss[path:name][path:name]Dir = [path:name][path:name][path:name][path:name].joi[path:name]([path:name][path:name]s[path:name]Dir, c[path:name][path:name][path:name]gory, `${fil[path:name]N[path:name][path:name][path:name]}`);
co[path:name]s[path:name] [path:name]ss[path:name][path:name]P[path:name][path:name][path:name] = [path:name][path:name][path:name][path:name].joi[path:name]([path:name]ss[path:name][path:name]Dir, [path:name]ss[path:name][path:name]R[path:name]f.[path:name][path:name][path:name][path:name]);
// V[path:name]rify [path:name][path:name][path:name] [path:name]ss[path:name][path:name] [path:name]xis[path:name]s
if (!fs.[path:name]xis[path:name]sSy[path:name]c([path:name]ss[path:name][path:name]P[path:name][path:name][path:name])) {
[path:name][path:name]row [path:name][path:name]w Error(`Ass[path:name][path:name] fil[path:name] [path:name]o[path:name] fou[path:name]d[path:name] ${[path:name]ss[path:name][path:name]P[path:name][path:name][path:name]}`);
}
r[path:name][path:name]ur[path:name] [path:name]ss[path:name][path:name]P[path:name][path:name][path:name];
}
/**
* Co[path:name]i[path:name]s [path:name]ll [path:name]ss[path:name][path:name]s r[path:name]f[path:name]r[path:name][path:name]c[path:name]d i[path:name] [path:name] sc[path:name][path:name][path:name]rio [path:name]o [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory.
* @[path:name][path:name]r[path:name][path:name] sc[path:name][path:name][path:name]rio T[path:name][path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rio
* @[path:name][path:name]r[path:name][path:name] [path:name][path:name][path:name][path:name]Dir T[path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory [path:name]o co[path:name]y [path:name]ss[path:name][path:name]s [path:name]o
* @r[path:name][path:name]ur[path:name]s Modifi[path:name]d [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name] wi[path:name][path:name] u[path:name]d[path:name][path:name][path:name]d [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s
*/
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c co[path:name]yAss[path:name][path:name]s(sc[path:name][path:name][path:name]rio[path:name] [path:name][path:name]y, [path:name][path:name][path:name][path:name]Dir[path:name] s[path:name]ri[path:name]g)[path:name] Pro[path:name]is[path:name]<s[path:name]ri[path:name]g> {
// Ex[path:name]r[path:name]c[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s fro[path:name] [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name]
co[path:name]s[path:name] [path:name]ss[path:name][path:name]R[path:name]fs = [path:name][path:name]is.[path:name]x[path:name]r[path:name]c[path:name]Ass[path:name][path:name]R[path:name]f[path:name]r[path:name][path:name]c[path:name]s(sc[path:name][path:name][path:name]rio.[path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name]);
if ([path:name]ss[path:name][path:name]R[path:name]fs.l[path:name][path:name]g[path:name][path:name] === 0) {
r[path:name][path:name]ur[path:name] sc[path:name][path:name][path:name]rio.[path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name];
}
// Cr[path:name][path:name][path:name][path:name] [path:name]ss[path:name][path:name]s dir[path:name]c[path:name]ory i[path:name] [path:name][path:name][path:name][path:name] dir
co[path:name]s[path:name] [path:name]ss[path:name][path:name]sT[path:name][path:name][path:name]Dir = [path:name][path:name][path:name][path:name].joi[path:name]([path:name][path:name][path:name][path:name]Dir, '[path:name]ss[path:name][path:name]s');
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.[path:name]kdir([path:name]ss[path:name][path:name]sT[path:name][path:name][path:name]Dir, { r[path:name]cursiv[path:name][path:name] [path:name]ru[path:name] });
l[path:name][path:name] [path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name] = sc[path:name][path:name][path:name]rio.[path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name];
// Proc[path:name]ss [path:name][path:name]c[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]
for (co[path:name]s[path:name] [path:name]ss[path:name][path:name]R[path:name]f of [path:name]ss[path:name][path:name]R[path:name]fs) {
// R[path:name]solv[path:name] [path:name][path:name][path:name] [path:name]ss[path:name][path:name] [path:name][path:name][path:name][path:name] b[path:name]s[path:name]d o[path:name] sc[path:name][path:name][path:name]rio ID
co[path:name]s[path:name] sourc[path:name]P[path:name][path:name][path:name] = [path:name][path:name]is.r[path:name]solv[path:name]Ass[path:name][path:name]P[path:name][path:name][path:name]([path:name]ss[path:name][path:name]R[path:name]f, sc[path:name][path:name][path:name]rio.id);
co[path:name]s[path:name] [path:name]ss[path:name][path:name]Fil[path:name]N[path:name][path:name][path:name] = [path:name][path:name][path:name][path:name].b[path:name]s[path:name][path:name][path:name][path:name][path:name](sourc[path:name]P[path:name][path:name][path:name]);
co[path:name]s[path:name] d[path:name]s[path:name]P[path:name][path:name][path:name] = [path:name][path:name][path:name][path:name].joi[path:name]([path:name]ss[path:name][path:name]sT[path:name][path:name][path:name]Dir, [path:name]ss[path:name][path:name]Fil[path:name]N[path:name][path:name][path:name]);
// Co[path:name]y [path:name][path:name][path:name] [path:name]ss[path:name][path:name] fil[path:name]
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.co[path:name]yFil[path:name](sourc[path:name]P[path:name][path:name][path:name], d[path:name]s[path:name]P[path:name][path:name][path:name]);
if ([path:name]roc[path:name]ss.[path:name][path:name]v.DEBUG) {
co[path:name]sol[path:name].log(`[DEBUG] Co[path:name]i[path:name]d [path:name]ss[path:name][path:name][path:name] ${sourc[path:name]P[path:name][path:name][path:name]} -> ${d[path:name]s[path:name]P[path:name][path:name][path:name]}`);
}
// U[path:name]d[path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s i[path:name] [path:name][path:name][path:name] [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name]
if ([path:name]ss[path:name][path:name]R[path:name]f.[path:name]y[path:name][path:name] === 'i[path:name]li[path:name][path:name]') {
// For i[path:name]li[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s, lo[path:name]d [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name][path:name]
co[path:name]s[path:name] co[path:name][path:name][path:name][path:name][path:name] = [path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.r[path:name][path:name]dFil[path:name](d[path:name]s[path:name]P[path:name][path:name][path:name], 'u[path:name]f-8');
[path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name] = [path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name].r[path:name][path:name]l[path:name]c[path:name](
[path:name]ss[path:name][path:name]R[path:name]f.origi[path:name][path:name]lR[path:name]f,
co[path:name][path:name][path:name][path:name][path:name]
);
} [path:name]ls[path:name] {
// For [path:name][path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s, r[path:name][path:name]l[path:name]c[path:name] wi[path:name][path:name] [path:name][path:name][path:name] [path:name][path:name]w [path:name]bsolu[path:name][path:name] [path:name][path:name][path:name][path:name]
[path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name] = [path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name].r[path:name][path:name]l[path:name]c[path:name](
[path:name]ss[path:name][path:name]R[path:name]f.origi[path:name][path:name]lR[path:name]f,
d[path:name]s[path:name]P[path:name][path:name][path:name]
);
}
}
r[path:name][path:name]ur[path:name] [path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name];
}
/**
* Cl[path:name][path:name][path:name]s u[path:name] [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory [path:name]f[path:name][path:name]r [path:name][path:name]s[path:name] [path:name]x[path:name]cu[path:name]io[path:name].
* @[path:name][path:name]r[path:name][path:name] [path:name][path:name][path:name][path:name]Dir T[path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory [path:name]o cl[path:name][path:name][path:name] u[path:name]
*/
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c cl[path:name][path:name][path:name]u[path:name]([path:name][path:name][path:name][path:name]Dir[path:name] s[path:name]ri[path:name]g)[path:name] Pro[path:name]is[path:name]<void> {
[path:name]ry {
// R[path:name]cursiv[path:name] dir[path:name]c[path:name]ory r[path:name][path:name]ov[path:name]l
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.r[path:name]([path:name][path:name][path:name][path:name]Dir, { r[path:name]cursiv[path:name][path:name] [path:name]ru[path:name], forc[path:name][path:name] [path:name]ru[path:name] });
if ([path:name]roc[path:name]ss.[path:name][path:name]v.DEBUG) {
co[path:name]sol[path:name].log(`[DEBUG] Cl[path:name][path:name][path:name][path:name]d u[path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory[path:name] ${[path:name][path:name][path:name][path:name]Dir}`);
}
} c[path:name][path:name]c[path:name] ([path:name]rror) {
// Log bu[path:name] do[path:name]'[path:name] [path:name][path:name]row - cl[path:name][path:name][path:name]u[path:name] f[path:name]ilur[path:name]s s[path:name]ould[path:name]'[path:name] f[path:name]il [path:name][path:name]s[path:name]s
co[path:name]sol[path:name].[path:name]rror(`[WARNING] F[path:name]il[path:name]d [path:name]o cl[path:name][path:name][path:name] u[path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory[path:name] ${[path:name][path:name][path:name][path:name]Dir}`, [path:name]rror);
}
}
}
```
### 2. U[path:name]d[path:name][path:name][path:name] Sc[path:name][path:name][path:name]rio Ex[path:name]cu[path:name]io[path:name]
Modify `src/co[path:name][path:name][path:name][path:name]ds/[path:name][path:name]s[path:name]/[path:name]x[path:name]cu[path:name]or.[path:name]s` [path:name]o us[path:name] [path:name][path:name][path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r[path:name]
```[path:name]y[path:name][path:name]scri[path:name][path:name]
// I[path:name][path:name]or[path:name] [path:name][path:name][path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r
i[path:name][path:name]or[path:name] { T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r } fro[path:name] './[path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]';
// ... [path:name]xis[path:name]i[path:name]g i[path:name][path:name]or[path:name]s
[path:name]x[path:name]or[path:name] [path:name]sy[path:name]c fu[path:name]c[path:name]io[path:name] [path:name]x[path:name]cu[path:name][path:name]Sc[path:name][path:name][path:name]rio(
sc[path:name][path:name][path:name]rio[path:name] T[path:name]s[path:name]Sc[path:name][path:name][path:name]rio,
o[path:name][path:name]io[path:name]s[path:name] {
[path:name]od[path:name]l[path:name] s[path:name]ri[path:name]g;
[path:name]i[path:name][path:name]ou[path:name][path:name] [path:name]u[path:name]b[path:name]r;
r[path:name][path:name]ryCo[path:name]fig[path:name] R[path:name][path:name]ryCo[path:name]fig;
d[path:name]bug[path:name] bool[path:name][path:name][path:name];
[path:name]c[path:name]S[path:name]rv[path:name]rs?[path:name] s[path:name]ri[path:name]g[];
sc[path:name][path:name][path:name]rioId[path:name] s[path:name]ri[path:name]g;
ou[path:name][path:name]u[path:name]Buff[path:name]r?[path:name] s[path:name]ri[path:name]g[];
},
g[path:name][path:name]i[path:name]iProvid[path:name]r[path:name] B[path:name]s[path:name]Mod[path:name]lProvid[path:name]r
)[path:name] Pro[path:name]is[path:name]<T[path:name]s[path:name]Sc[path:name][path:name][path:name]rioR[path:name]sul[path:name]> {
co[path:name]s[path:name] { [path:name]od[path:name]l, [path:name]i[path:name][path:name]ou[path:name], r[path:name][path:name]ryCo[path:name]fig, d[path:name]bug, sc[path:name][path:name][path:name]rioId, ou[path:name][path:name]u[path:name]Buff[path:name]r = [] } = o[path:name][path:name]io[path:name]s;
// Cr[path:name][path:name][path:name][path:name] [path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory for [path:name][path:name]is sc[path:name][path:name][path:name]rio
co[path:name]s[path:name] [path:name][path:name][path:name][path:name]Dir = [path:name]w[path:name]i[path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r.cr[path:name][path:name][path:name][path:name]T[path:name][path:name][path:name]Dir[path:name]c[path:name]ory(sc[path:name][path:name][path:name]rioId);
// Co[path:name]y [path:name]ss[path:name][path:name]s [path:name][path:name]d u[path:name]d[path:name][path:name][path:name] [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name] wi[path:name][path:name] [path:name][path:name]w r[path:name]f[path:name]r[path:name][path:name]c[path:name]s
co[path:name]s[path:name] [path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name] = [path:name]w[path:name]i[path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r.co[path:name]yAss[path:name][path:name]s(sc[path:name][path:name][path:name]rio, [path:name][path:name][path:name][path:name]Dir);
// Cr[path:name][path:name][path:name][path:name] [path:name] [path:name]odifi[path:name]d sc[path:name][path:name][path:name]rio wi[path:name][path:name] u[path:name]d[path:name][path:name][path:name]d [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name]
co[path:name]s[path:name] [path:name]odifi[path:name]dSc[path:name][path:name][path:name]rio = {
...sc[path:name][path:name][path:name]rio,
[path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name][path:name] [path:name]odifi[path:name]dT[path:name]skD[path:name]scri[path:name][path:name]io[path:name]
};
co[path:name]s[path:name] [path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r = ([path:name][path:name]x[path:name][path:name] s[path:name]ri[path:name]g, s[path:name]ouldPr[path:name]fix[path:name] bool[path:name][path:name][path:name] = [path:name]ru[path:name]) => {
// ... [path:name]xis[path:name]i[path:name]g i[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name]
};
[path:name]ry {
// Cr[path:name][path:name][path:name][path:name] [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name] [path:name]ool wi[path:name][path:name] [path:name][path:name][path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory
co[path:name]s[path:name] [path:name]ools = [
cr[path:name][path:name][path:name][path:name]Co[path:name][path:name][path:name][path:name]dEx[path:name]cu[path:name]io[path:name]Tool({
d[path:name]bug,
cwd[path:name] [path:name][path:name][path:name][path:name]Dir,
sc[path:name][path:name][path:name]rioId,
[path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r
})
];
// Co[path:name][path:name]i[path:name]u[path:name] wi[path:name][path:name] [path:name]xis[path:name]i[path:name]g [path:name]x[path:name]cu[path:name]io[path:name] logic, usi[path:name]g [path:name]odifi[path:name]dSc[path:name][path:name][path:name]rio
// ...
r[path:name][path:name]ur[path:name] r[path:name]sul[path:name];
} c[path:name][path:name]c[path:name] ([path:name]rror) {
// ... [path:name]xis[path:name]i[path:name]g [path:name]rror [path:name][path:name][path:name]dli[path:name]g
} fi[path:name][path:name]lly {
// Cl[path:name][path:name][path:name] u[path:name] [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory
[path:name]w[path:name]i[path:name] T[path:name]s[path:name]E[path:name]viro[path:name][path:name][path:name][path:name][path:name]M[path:name][path:name][path:name]g[path:name]r.cl[path:name][path:name][path:name]u[path:name]([path:name][path:name][path:name][path:name]Dir);
}
}
```
### 3. U[path:name]d[path:name][path:name][path:name] Co[path:name][path:name][path:name][path:name]d Ex[path:name]cu[path:name]io[path:name] Tool
U[path:name]d[path:name][path:name][path:name] [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name] [path:name]ool i[path:name] `src/co[path:name][path:name][path:name][path:name]ds/[path:name][path:name]s[path:name]/[path:name]ools.[path:name]s` (cr[path:name][path:name][path:name][path:name] [path:name][path:name]is fil[path:name] if i[path:name] do[path:name]s[path:name]'[path:name] [path:name]xis[path:name])[path:name]
```[path:name]y[path:name][path:name]scri[path:name][path:name]
i[path:name][path:name]or[path:name] * [path:name]s [path:name][path:name][path:name][path:name] fro[path:name] '[path:name][path:name][path:name][path:name]';
i[path:name][path:name]or[path:name] * [path:name]s u[path:name]il fro[path:name] 'u[path:name]il';
i[path:name][path:name]or[path:name] * [path:name]s c[path:name]ild_[path:name]roc[path:name]ss fro[path:name] 'c[path:name]ild_[path:name]roc[path:name]ss';
co[path:name]s[path:name] [path:name]x[path:name]cAsy[path:name]c = u[path:name]il.[path:name]ro[path:name]isify(c[path:name]ild_[path:name]roc[path:name]ss.[path:name]x[path:name]c);
[path:name]x[path:name]or[path:name] fu[path:name]c[path:name]io[path:name] cr[path:name][path:name][path:name][path:name]Co[path:name][path:name][path:name][path:name]dEx[path:name]cu[path:name]io[path:name]Tool(o[path:name][path:name]io[path:name]s[path:name] {
d[path:name]bug[path:name] bool[path:name][path:name][path:name];
cwd?[path:name] s[path:name]ri[path:name]g;
sc[path:name][path:name][path:name]rioId[path:name] s[path:name]ri[path:name]g;
[path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r[path:name] ([path:name][path:name]x[path:name][path:name] s[path:name]ri[path:name]g, s[path:name]ouldPr[path:name]fix?[path:name] bool[path:name][path:name][path:name]) => void;
}) {
co[path:name]s[path:name] { d[path:name]bug, cwd, sc[path:name][path:name][path:name]rioId, [path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r } = o[path:name][path:name]io[path:name]s;
r[path:name][path:name]ur[path:name] {
[path:name][path:name][path:name][path:name][path:name] '[path:name]x[path:name]cu[path:name][path:name]_co[path:name][path:name][path:name][path:name]d',
d[path:name]scri[path:name][path:name]io[path:name][path:name] 'Ex[path:name]cu[path:name][path:name] [path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d',
[path:name][path:name]r[path:name][path:name][path:name][path:name][path:name]rs[path:name] {
[path:name]ro[path:name][path:name]r[path:name]i[path:name]s[path:name] {
co[path:name][path:name][path:name][path:name]d[path:name] {
[path:name]y[path:name][path:name][path:name] 's[path:name]ri[path:name]g',
d[path:name]scri[path:name][path:name]io[path:name][path:name] 'T[path:name][path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d [path:name]o [path:name]x[path:name]cu[path:name][path:name]',
},
},
r[path:name]quir[path:name]d[path:name] ['co[path:name][path:name][path:name][path:name]d'],
},
[path:name]x[path:name]cu[path:name][path:name][path:name] [path:name]sy[path:name]c ({ co[path:name][path:name][path:name][path:name]d }[path:name] { co[path:name][path:name][path:name][path:name]d[path:name] s[path:name]ri[path:name]g }) => {
// D[path:name][path:name][path:name]r[path:name]i[path:name][path:name] [path:name]bsolu[path:name][path:name] [path:name][path:name][path:name][path:name] [path:name]o vib[path:name]-[path:name]ools [path:name][path:name][path:name]ry [path:name]oi[path:name][path:name]
co[path:name]s[path:name] cursorToolsP[path:name][path:name][path:name] = [path:name][path:name][path:name][path:name].r[path:name]solv[path:name](__dir[path:name][path:name][path:name][path:name], '../../../src/i[path:name]d[path:name]x.[path:name]s');
// Build co[path:name][path:name][path:name][path:name]d usi[path:name]g Nod[path:name] wi[path:name][path:name] [path:name]sx for Ty[path:name][path:name]Scri[path:name][path:name] su[path:name][path:name]or[path:name]
co[path:name]s[path:name] [path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d = `[path:name]od[path:name] --i[path:name][path:name]or[path:name]=[path:name]sx "${cursorToolsP[path:name][path:name][path:name]}" ${co[path:name][path:name][path:name][path:name]d}`;
if (d[path:name]bug) {
[path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r(`[DEBUG] Ex[path:name]cu[path:name]i[path:name]g i[path:name] ${cwd}[path:name] ${[path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d}`);
}
[path:name]ry {
// Ex[path:name]cu[path:name][path:name] i[path:name] [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory if [path:name]rovid[path:name]d
co[path:name]s[path:name] [path:name]x[path:name]cO[path:name][path:name]io[path:name]s[path:name] c[path:name]ild_[path:name]roc[path:name]ss.Ex[path:name]cO[path:name][path:name]io[path:name]s = {
s[path:name][path:name]ll[path:name] [path:name]ru[path:name],
cwd[path:name] cwd || [path:name]roc[path:name]ss.cwd(),
[path:name][path:name]xBuff[path:name]r[path:name] 1024 * 1024 * 10, // 10MB buff[path:name]r for l[path:name]rg[path:name] ou[path:name][path:name]u[path:name]s
};
// Ex[path:name]cu[path:name][path:name] co[path:name][path:name][path:name][path:name]d
co[path:name]s[path:name] { s[path:name]dou[path:name], s[path:name]d[path:name]rr } = [path:name]w[path:name]i[path:name] [path:name]x[path:name]cAsy[path:name]c([path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d, [path:name]x[path:name]cO[path:name][path:name]io[path:name]s);
if (s[path:name]dou[path:name]) {
[path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r(`COMMAND OUTPUT[path:name]\[path:name]${s[path:name]dou[path:name]}`);
}
if (s[path:name]d[path:name]rr) {
[path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r(`COMMAND ERRORS[path:name]\[path:name]${s[path:name]d[path:name]rr}`);
}
r[path:name][path:name]ur[path:name] {
succ[path:name]ss[path:name] [path:name]ru[path:name],
ou[path:name][path:name]u[path:name][path:name] s[path:name]dou[path:name],
[path:name]rror[path:name] s[path:name]d[path:name]rr
};
} c[path:name][path:name]c[path:name] ([path:name]rror) {
co[path:name]s[path:name] [path:name]rrorM[path:name]ss[path:name]g[path:name] = [path:name]rror i[path:name]s[path:name][path:name][path:name]c[path:name]of Error
? [path:name]rror.[path:name][path:name]ss[path:name]g[path:name]
[path:name] S[path:name]ri[path:name]g([path:name]rror);
[path:name][path:name][path:name][path:name][path:name]dToBuff[path:name]r(`COMMAND ERROR[path:name] ${[path:name]rrorM[path:name]ss[path:name]g[path:name]}`);
r[path:name][path:name]ur[path:name] {
succ[path:name]ss[path:name] f[path:name]ls[path:name],
ou[path:name][path:name]u[path:name][path:name] '',
[path:name]rror[path:name] [path:name]rrorM[path:name]ss[path:name]g[path:name]
};
}
},
};
}
```
### 4. I[path:name][path:name][path:name]gr[path:name][path:name]io[path:name] wi[path:name][path:name] LLM Cli[path:name][path:name][path:name]
E[path:name]sur[path:name] [path:name][path:name][path:name][path:name] [path:name][path:name][path:name] LLM cli[path:name][path:name][path:name] us[path:name]s [path:name][path:name][path:name] u[path:name]d[path:name][path:name][path:name]d [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name] [path:name][path:name]d [path:name]ro[path:name][path:name]rly forw[path:name]rds [path:name][path:name][path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory co[path:name][path:name][path:name]x[path:name][path:name]
```[path:name]y[path:name][path:name]scri[path:name][path:name]
// U[path:name]d[path:name][path:name][path:name] [path:name][path:name][path:name] LLM cli[path:name][path:name][path:name] i[path:name]i[path:name]i[path:name]liz[path:name][path:name]io[path:name] [path:name]o [path:name][path:name]ss [path:name][path:name][path:name] [path:name]odifi[path:name]d sc[path:name][path:name][path:name]rio
co[path:name]s[path:name] ll[path:name]Cli[path:name][path:name][path:name] = [path:name][path:name]w ToolE[path:name][path:name]bl[path:name]dLLMCli[path:name][path:name][path:name]({
[path:name]rovid[path:name]r,
[path:name]od[path:name]l[path:name] o[path:name][path:name]io[path:name]s.[path:name]od[path:name]l,
[path:name]ools,
[path:name]i[path:name][path:name]ou[path:name][path:name] o[path:name][path:name]io[path:name]s.[path:name]i[path:name][path:name]ou[path:name],
d[path:name]bug[path:name] o[path:name][path:name]io[path:name]s.d[path:name]bug,
});
// P[path:name]ss [path:name][path:name][path:name] [path:name]odifi[path:name]d sc[path:name][path:name][path:name]rio co[path:name][path:name][path:name][path:name][path:name]
co[path:name]s[path:name] [path:name][path:name]ss[path:name]g[path:name]s = buildSc[path:name][path:name][path:name]rioPro[path:name][path:name][path:name]([path:name]odifi[path:name]dSc[path:name][path:name][path:name]rio);
```
### 5. T[path:name]s[path:name]i[path:name]g [path:name][path:name]d V[path:name]lid[path:name][path:name]io[path:name]
T[path:name]s[path:name] [path:name][path:name][path:name] i[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name] wi[path:name][path:name] v[path:name]rious sc[path:name][path:name][path:name]rios[path:name]
1. Sc[path:name][path:name][path:name]rios wi[path:name][path:name] [path:name]o [path:name]ss[path:name][path:name]s
2. Sc[path:name][path:name][path:name]rios wi[path:name][path:name] i[path:name]li[path:name][path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s
3. Sc[path:name][path:name][path:name]rios wi[path:name][path:name] [path:name][path:name][path:name][path:name]-b[path:name]s[path:name]d [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s
4. Sc[path:name][path:name][path:name]rios [path:name][path:name][path:name][path:name] [path:name]x[path:name]cu[path:name][path:name] co[path:name][path:name][path:name][path:name]ds [path:name][path:name][path:name][path:name] i[path:name][path:name][path:name]r[path:name]c[path:name] wi[path:name][path:name] fil[path:name]s
5. P[path:name]r[path:name]ll[path:name]l [path:name]x[path:name]cu[path:name]io[path:name] of sc[path:name][path:name][path:name]rios
## Pro[path:name]os[path:name]l 2[path:name] Proc[path:name]ss-L[path:name]v[path:name]l Isol[path:name][path:name]io[path:name] wi[path:name][path:name] C[path:name]ild Proc[path:name]ss[path:name]s
T[path:name]is [path:name][path:name][path:name]ro[path:name]c[path:name] focus[path:name]s o[path:name] co[path:name][path:name]l[path:name][path:name][path:name] [path:name]roc[path:name]ss isol[path:name][path:name]io[path:name] by s[path:name][path:name]w[path:name]i[path:name]g c[path:name]ild [path:name]roc[path:name]ss[path:name]s for [path:name][path:name]c[path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d, [path:name][path:name]c[path:name] wi[path:name][path:name] i[path:name]s ow[path:name] worki[path:name]g dir[path:name]c[path:name]ory [path:name][path:name]d [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name].
### I[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name] S[path:name][path:name][path:name]s[path:name]
1. **Cr[path:name][path:name][path:name][path:name] Proc[path:name]ss Isol[path:name][path:name]io[path:name] Sys[path:name][path:name][path:name][path:name]**
- Cr[path:name][path:name][path:name][path:name] [path:name] [path:name][path:name]w u[path:name]ili[path:name]y cl[path:name]ss `Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r` [path:name][path:name][path:name][path:name] [path:name][path:name][path:name]dl[path:name]s[path:name]
- Cr[path:name][path:name][path:name]i[path:name]g [path:name] u[path:name]iqu[path:name] [path:name][path:name][path:name][path:name]or[path:name]ry dir[path:name]c[path:name]ory for [path:name][path:name]c[path:name] [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rio
- Pr[path:name][path:name][path:name]ri[path:name]g [path:name]ss[path:name][path:name]s [path:name][path:name]d [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] for [path:name][path:name]c[path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name]
- S[path:name][path:name]w[path:name]i[path:name]g isol[path:name][path:name][path:name]d c[path:name]ild [path:name]roc[path:name]ss[path:name]s for co[path:name][path:name][path:name][path:name]ds
2. **Modify T[path:name]s[path:name] Ex[path:name]cu[path:name]or Arc[path:name]i[path:name][path:name]c[path:name]ur[path:name][path:name]**
```[path:name]y[path:name][path:name]scri[path:name][path:name]
[path:name]x[path:name]or[path:name] [path:name]sy[path:name]c fu[path:name]c[path:name]io[path:name] [path:name]x[path:name]cu[path:name][path:name]Sc[path:name][path:name][path:name]rio(
sc[path:name][path:name][path:name]rio[path:name] T[path:name]s[path:name]Sc[path:name][path:name][path:name]rio,
o[path:name][path:name]io[path:name]s[path:name] { /* [path:name]xis[path:name]i[path:name]g o[path:name][path:name]io[path:name]s */ },
g[path:name][path:name]i[path:name]iProvid[path:name]r[path:name] B[path:name]s[path:name]Mod[path:name]lProvid[path:name]r
)[path:name] Pro[path:name]is[path:name]<T[path:name]s[path:name]Sc[path:name][path:name][path:name]rioR[path:name]sul[path:name]> {
// Cr[path:name][path:name][path:name][path:name] b[path:name]s[path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory for [path:name][path:name]is sc[path:name][path:name][path:name]rio
co[path:name]s[path:name] sc[path:name][path:name][path:name]rioT[path:name][path:name][path:name]Dir = [path:name]w[path:name]i[path:name] Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r.cr[path:name][path:name][path:name][path:name]Sc[path:name][path:name][path:name]rioDir[path:name]c[path:name]ory(sc[path:name][path:name][path:name]rio.id);
// P[path:name]rs[path:name] [path:name][path:name]d co[path:name]y [path:name]ll [path:name]ss[path:name][path:name]s [path:name][path:name][path:name]d[path:name]d for [path:name][path:name][path:name] sc[path:name][path:name][path:name]rio
[path:name]w[path:name]i[path:name] Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r.[path:name]r[path:name][path:name][path:name]r[path:name]Ass[path:name][path:name]s(sc[path:name][path:name][path:name]rio, sc[path:name][path:name][path:name]rioT[path:name][path:name][path:name]Dir);
[path:name]ry {
// Cr[path:name][path:name][path:name][path:name] cus[path:name]o[path:name] [path:name]ool for isol[path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name]
co[path:name]s[path:name] isol[path:name][path:name][path:name]dEx[path:name]cu[path:name]io[path:name]Tool = {
[path:name][path:name][path:name][path:name][path:name] '[path:name]x[path:name]cu[path:name][path:name]_co[path:name][path:name][path:name][path:name]d',
d[path:name]scri[path:name][path:name]io[path:name][path:name] 'Ex[path:name]cu[path:name][path:name] [path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d i[path:name] [path:name][path:name] isol[path:name][path:name][path:name]d [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]',
[path:name][path:name]r[path:name][path:name][path:name][path:name][path:name]rs[path:name] {
co[path:name][path:name][path:name][path:name]d[path:name] {
[path:name]y[path:name][path:name][path:name] 's[path:name]ri[path:name]g',
d[path:name]scri[path:name][path:name]io[path:name][path:name] 'T[path:name][path:name] vib[path:name]-[path:name]ools co[path:name][path:name][path:name][path:name]d [path:name]o [path:name]x[path:name]cu[path:name][path:name]',
},
},
[path:name]x[path:name]cu[path:name][path:name][path:name] [path:name]sy[path:name]c ({ co[path:name][path:name][path:name][path:name]d }) => {
// For [path:name][path:name]c[path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name], cr[path:name][path:name][path:name][path:name] [path:name] fr[path:name]s[path:name] co[path:name][path:name][path:name][path:name]d-s[path:name][path:name]cific [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory
co[path:name]s[path:name] co[path:name][path:name][path:name][path:name]dT[path:name][path:name][path:name]Dir = [path:name]w[path:name]i[path:name] Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r.cr[path:name][path:name][path:name][path:name]Co[path:name][path:name][path:name][path:name]dDir[path:name]c[path:name]ory(
sc[path:name][path:name][path:name]rioT[path:name][path:name][path:name]Dir,
co[path:name][path:name][path:name][path:name]d
);
// D[path:name][path:name][path:name]r[path:name]i[path:name][path:name] [path:name][path:name][path:name]ry [path:name]oi[path:name][path:name] [path:name][path:name][path:name][path:name]
co[path:name]s[path:name] [path:name][path:name][path:name]ryPoi[path:name][path:name] = [path:name][path:name][path:name][path:name].r[path:name]solv[path:name]([path:name]roc[path:name]ss.cwd(), 'src/i[path:name]d[path:name]x.[path:name]s');
// Build [path:name][path:name][path:name] [path:name]x[path:name]cu[path:name]io[path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]
co[path:name]s[path:name] [path:name][path:name]v = Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r.buildE[path:name]viro[path:name][path:name][path:name][path:name][path:name]();
// Ex[path:name]cu[path:name][path:name] [path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]d i[path:name] [path:name][path:name][path:name] isol[path:name][path:name][path:name]d dir[path:name]c[path:name]ory
co[path:name]s[path:name] r[path:name]sul[path:name] = [path:name]w[path:name]i[path:name] Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r.[path:name]x[path:name]cu[path:name][path:name]Co[path:name][path:name][path:name][path:name]d(
[path:name][path:name][path:name]ryPoi[path:name][path:name],
co[path:name][path:name][path:name][path:name]d,
co[path:name][path:name][path:name][path:name]dT[path:name][path:name][path:name]Dir,
[path:name][path:name]v,
o[path:name][path:name]io[path:name]s.d[path:name]bug
);
r[path:name][path:name]ur[path:name] r[path:name]sul[path:name];
},
};
// Us[path:name] [path:name][path:name][path:name] isol[path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name] [path:name]ool
co[path:name]s[path:name] [path:name]ools = [isol[path:name][path:name][path:name]dEx[path:name]cu[path:name]io[path:name]Tool];
// Co[path:name][path:name]i[path:name]u[path:name] wi[path:name][path:name] LLM cli[path:name][path:name][path:name] [path:name]x[path:name]cu[path:name]io[path:name] usi[path:name]g [path:name][path:name][path:name] isol[path:name][path:name][path:name]d [path:name]ool
// R[path:name]s[path:name] of [path:name]x[path:name]cu[path:name]io[path:name] logic...
r[path:name][path:name]ur[path:name] r[path:name]sul[path:name];
} fi[path:name][path:name]lly {
// Cl[path:name][path:name][path:name] u[path:name] [path:name]ll [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ori[path:name]s
[path:name]w[path:name]i[path:name] Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r.cl[path:name][path:name][path:name]u[path:name](sc[path:name][path:name][path:name]rioT[path:name][path:name][path:name]Dir);
}
}
```
3. **Proc[path:name]ss M[path:name][path:name][path:name]g[path:name]r I[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name][path:name]**
```[path:name]y[path:name][path:name]scri[path:name][path:name]
[path:name]x[path:name]or[path:name] cl[path:name]ss Isol[path:name][path:name][path:name]dProc[path:name]ssM[path:name][path:name][path:name]g[path:name]r {
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c cr[path:name][path:name][path:name][path:name]Sc[path:name][path:name][path:name]rioDir[path:name]c[path:name]ory(sc[path:name][path:name][path:name]rioId[path:name] s[path:name]ri[path:name]g)[path:name] Pro[path:name]is[path:name]<s[path:name]ri[path:name]g> {
co[path:name]s[path:name] [path:name][path:name][path:name][path:name]Dir = [path:name][path:name][path:name][path:name].joi[path:name](os.[path:name][path:name][path:name]dir(), `vib[path:name]-[path:name]ools-[path:name][path:name]s[path:name]-${sc[path:name][path:name][path:name]rioId}-${D[path:name][path:name][path:name].[path:name]ow()}`);
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.[path:name]kdir([path:name][path:name][path:name][path:name]Dir, { r[path:name]cursiv[path:name][path:name] [path:name]ru[path:name] });
r[path:name][path:name]ur[path:name] [path:name][path:name][path:name][path:name]Dir;
}
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c cr[path:name][path:name][path:name][path:name]Co[path:name][path:name][path:name][path:name]dDir[path:name]c[path:name]ory(sc[path:name][path:name][path:name]rioDir[path:name] s[path:name]ri[path:name]g, co[path:name][path:name][path:name][path:name]d[path:name] s[path:name]ri[path:name]g)[path:name] Pro[path:name]is[path:name]<s[path:name]ri[path:name]g> {
// Cr[path:name][path:name][path:name][path:name] u[path:name]iqu[path:name] dir[path:name]c[path:name]ory for [path:name][path:name]c[path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name]
co[path:name]s[path:name] co[path:name][path:name][path:name][path:name]dH[path:name]s[path:name] = cry[path:name][path:name]o.cr[path:name][path:name][path:name][path:name]H[path:name]s[path:name]('[path:name]d5').u[path:name]d[path:name][path:name][path:name](co[path:name][path:name][path:name][path:name]d).dig[path:name]s[path:name]('[path:name][path:name]x').slic[path:name](0, 8);
co[path:name]s[path:name] co[path:name][path:name][path:name][path:name]dDir = [path:name][path:name][path:name][path:name].joi[path:name](sc[path:name][path:name][path:name]rioDir, `c[path:name]d-${co[path:name][path:name][path:name][path:name]dH[path:name]s[path:name]}`);
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.[path:name]kdir(co[path:name][path:name][path:name][path:name]dDir, { r[path:name]cursiv[path:name][path:name] [path:name]ru[path:name] });
r[path:name][path:name]ur[path:name] co[path:name][path:name][path:name][path:name]dDir;
}
s[path:name][path:name][path:name]ic buildE[path:name]viro[path:name][path:name][path:name][path:name][path:name]()[path:name] Nod[path:name]JS.Proc[path:name]ssE[path:name]v {
// Cr[path:name][path:name][path:name][path:name] cl[path:name][path:name][path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] wi[path:name][path:name] o[path:name]ly [path:name][path:name]c[path:name]ss[path:name]ry v[path:name]ri[path:name]bl[path:name]s
r[path:name][path:name]ur[path:name] {
...[path:name]roc[path:name]ss.[path:name][path:name]v,
// Add [path:name][path:name]s[path:name]-s[path:name][path:name]cific [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] v[path:name]ri[path:name]bl[path:name]s
CURSOR_TOOLS_TEST_MODE[path:name] '[path:name]ru[path:name]',
};
}
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c [path:name]x[path:name]cu[path:name][path:name]Co[path:name][path:name][path:name][path:name]d(
[path:name][path:name][path:name]ryPoi[path:name][path:name][path:name] s[path:name]ri[path:name]g,
co[path:name][path:name][path:name][path:name]d[path:name] s[path:name]ri[path:name]g,
cwd[path:name] s[path:name]ri[path:name]g,
[path:name][path:name]v[path:name] Nod[path:name]JS.Proc[path:name]ssE[path:name]v,
d[path:name]bug[path:name] bool[path:name][path:name][path:name]
)[path:name] Pro[path:name]is[path:name]<{ succ[path:name]ss[path:name] bool[path:name][path:name][path:name]; ou[path:name][path:name]u[path:name][path:name] s[path:name]ri[path:name]g; [path:name]rror[path:name] s[path:name]ri[path:name]g }> {
[path:name]ry {
// Ex[path:name]cu[path:name][path:name] [path:name]od[path:name] wi[path:name][path:name] [path:name]sx for Ty[path:name][path:name]Scri[path:name][path:name] su[path:name][path:name]or[path:name]
co[path:name]s[path:name] [path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d = `[path:name]od[path:name] --i[path:name][path:name]or[path:name]=[path:name]sx "${[path:name][path:name][path:name]ryPoi[path:name][path:name]}" ${co[path:name][path:name][path:name][path:name]d}`;
if (d[path:name]bug) {
co[path:name]sol[path:name].log(`[DEBUG] Ex[path:name]cu[path:name]i[path:name]g i[path:name] ${cwd}[path:name] ${[path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d}`);
}
// Ex[path:name]cu[path:name][path:name] co[path:name][path:name][path:name][path:name]d i[path:name] s[path:name][path:name]cifi[path:name]d dir[path:name]c[path:name]ory wi[path:name][path:name] cus[path:name]o[path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]
co[path:name]s[path:name] { s[path:name]dou[path:name], s[path:name]d[path:name]rr } = [path:name]w[path:name]i[path:name] [path:name]x[path:name]cAsy[path:name]c([path:name]x[path:name]cCo[path:name][path:name][path:name][path:name]d, {
s[path:name][path:name]ll[path:name] [path:name]ru[path:name],
cwd,
[path:name][path:name]v,
});
r[path:name][path:name]ur[path:name] { succ[path:name]ss[path:name] [path:name]ru[path:name], ou[path:name][path:name]u[path:name][path:name] s[path:name]dou[path:name], [path:name]rror[path:name] s[path:name]d[path:name]rr };
} c[path:name][path:name]c[path:name] ([path:name]rror) {
// H[path:name][path:name]dl[path:name] [path:name]x[path:name]cu[path:name]io[path:name] [path:name]rrors
r[path:name][path:name]ur[path:name] {
succ[path:name]ss[path:name] f[path:name]ls[path:name],
ou[path:name][path:name]u[path:name][path:name] '',
[path:name]rror[path:name] [path:name]rror i[path:name]s[path:name][path:name][path:name]c[path:name]of Error ? [path:name]rror.[path:name][path:name]ss[path:name]g[path:name] [path:name] S[path:name]ri[path:name]g([path:name]rror)
};
}
}
s[path:name][path:name][path:name]ic [path:name]sy[path:name]c [path:name]r[path:name][path:name][path:name]r[path:name]Ass[path:name][path:name]s(sc[path:name][path:name][path:name]rio[path:name] T[path:name]s[path:name]Sc[path:name][path:name][path:name]rio, [path:name][path:name][path:name][path:name]Dir[path:name] s[path:name]ri[path:name]g)[path:name] Pro[path:name]is[path:name]<void> {
// P[path:name]rs[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s fro[path:name] sc[path:name][path:name][path:name]rio
co[path:name]s[path:name] [path:name]ss[path:name][path:name]R[path:name]fs = [path:name][path:name]is.[path:name]x[path:name]r[path:name]c[path:name]Ass[path:name][path:name]R[path:name]f[path:name]r[path:name][path:name]c[path:name]s(sc[path:name][path:name][path:name]rio.[path:name][path:name]skD[path:name]scri[path:name][path:name]io[path:name]);
// For [path:name][path:name]c[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]
for (co[path:name]s[path:name] [path:name]ss[path:name][path:name]R[path:name]f of [path:name]ss[path:name][path:name]R[path:name]fs) {
// Loc[path:name][path:name][path:name] [path:name][path:name][path:name] [path:name]ss[path:name][path:name] fil[path:name]
co[path:name]s[path:name] [path:name]ss[path:name][path:name]P[path:name][path:name][path:name] = [path:name][path:name]is.r[path:name]solv[path:name]Ass[path:name][path:name]P[path:name][path:name][path:name]([path:name]ss[path:name][path:name]R[path:name]f, sc[path:name][path:name][path:name]rio.id);
// Co[path:name]y [path:name]o [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory
[path:name]w[path:name]i[path:name] fs.[path:name]ro[path:name]is[path:name]s.co[path:name]yFil[path:name](
[path:name]ss[path:name][path:name]P[path:name][path:name][path:name],
[path:name][path:name][path:name][path:name].joi[path:name]([path:name][path:name][path:name][path:name]Dir, [path:name][path:name][path:name][path:name].b[path:name]s[path:name][path:name][path:name][path:name][path:name]([path:name]ss[path:name][path:name]P[path:name][path:name][path:name]))
);
}
}
// Addi[path:name]io[path:name][path:name]l [path:name][path:name][path:name][path:name]ods for [path:name]ss[path:name][path:name] [path:name]x[path:name]r[path:name]c[path:name]io[path:name], r[path:name]solu[path:name]io[path:name], [path:name][path:name]d cl[path:name][path:name][path:name]u[path:name]
}
```
4. **Ass[path:name][path:name] R[path:name]f[path:name]r[path:name][path:name]c[path:name] Sys[path:name][path:name][path:name][path:name]**
- I[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name] [path:name] robus[path:name] sys[path:name][path:name][path:name] [path:name]o[path:name]
- Ex[path:name]r[path:name]c[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s fro[path:name] [path:name][path:name]sk d[path:name]scri[path:name][path:name]io[path:name]s usi[path:name]g r[path:name]g[path:name]x
- R[path:name]solv[path:name] [path:name]ss[path:name][path:name] [path:name][path:name][path:name][path:name]s r[path:name]l[path:name][path:name]iv[path:name] [path:name]o [path:name][path:name]s[path:name] fil[path:name]s
- Tr[path:name][path:name]sfor[path:name] [path:name]ss[path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s i[path:name] [path:name]ro[path:name][path:name][path:name]s [path:name]o [path:name]oi[path:name][path:name] [path:name]o [path:name][path:name][path:name] [path:name][path:name][path:name][path:name] dir[path:name]c[path:name]ory
- Su[path:name][path:name]or[path:name] bo[path:name][path:name] i[path:name]li[path:name][path:name] co[path:name][path:name][path:name][path:name][path:name] lo[path:name]di[path:name]g [path:name][path:name]d [path:name][path:name][path:name][path:name] r[path:name]f[path:name]r[path:name][path:name]c[path:name]s
### Adv[path:name][path:name][path:name][path:name]g[path:name]s[path:name]
- Co[path:name][path:name]l[path:name][path:name][path:name] isol[path:name][path:name]io[path:name] [path:name][path:name] bo[path:name][path:name] sc[path:name][path:name][path:name]rio [path:name][path:name]d co[path:name][path:name][path:name][path:name]d l[path:name]v[path:name]l
- E[path:name]c[path:name] co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name] g[path:name][path:name]s [path:name] fr[path:name]s[path:name] [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name]
- No s[path:name][path:name][path:name][path:name] bl[path:name][path:name]di[path:name]g b[path:name][path:name]w[path:name][path:name][path:name] co[path:name][path:name][path:name][path:name]ds
- B[path:name][path:name][path:name][path:name]r [path:name]i[path:name]ics r[path:name][path:name]l-world us[path:name]g[path:name] w[path:name][path:name]r[path:name] [path:name][path:name]c[path:name] co[path:name][path:name][path:name][path:name]d is discr[path:name][path:name][path:name]
- Mor[path:name] robus[path:name] for co[path:name][path:name]l[path:name]x [path:name][path:name]s[path:name] sc[path:name][path:name][path:name]rios wi[path:name][path:name] [path:name]ul[path:name]i[path:name]l[path:name] s[path:name][path:name][path:name]s
### Dis[path:name]dv[path:name][path:name][path:name][path:name]g[path:name]s[path:name]
- Mor[path:name] co[path:name][path:name]l[path:name]x i[path:name][path:name]l[path:name][path:name][path:name][path:name][path:name][path:name][path:name]io[path:name]
- Hig[path:name][path:name]r ov[path:name]r[path:name][path:name][path:name]d for dir[path:name]c[path:name]ory cr[path:name][path:name][path:name]io[path:name] [path:name][path:name]d [path:name]roc[path:name]ss s[path:name][path:name]w[path:name]i[path:name]g
- M[path:name]y b[path:name] slow[path:name]r for sc[path:name][path:name][path:name]rios wi[path:name][path:name] [path:name][path:name][path:name]y co[path:name][path:name][path:name][path:name]d [path:name]x[path:name]cu[path:name]io[path:name]s
- R[path:name]quir[path:name]s [path:name]or[path:name] so[path:name][path:name]is[path:name]ic[path:name][path:name][path:name]d [path:name]ss[path:name][path:name] [path:name][path:name]d [path:name][path:name]viro[path:name][path:name][path:name][path:name][path:name] [path:name][path:name][path:name][path:name]g[path:name][path:name][path:name][path:name][path:name] This approach focuses on creating isolated environments at the scenario level by creating temporary directories and modifying command execution.
Create Isolated Environment Manager:
TestEnvironmentManager that handles:
Modify Scenario Execution:
executeScenario to create a dedicated temp directory per scenario:export async function executeScenario( scenario: TestScenario, options: { /* existing options */ }, geminiProvider: BaseModelProvider ): Promise<TestScenarioResult> { // Create temp directory for this scenario const tempDir = await TestEnvironmentManager.createTempDirectory(scenario.id); // Copy required assets await TestEnvironmentManager.copyAssets(scenario, tempDir); try { // Continue with existing scenario execution but in the temp directory // Pass the tempDir to the command execution tool const tools = [createCommandExecutionTool({ ...options, cwd: tempDir })]; // Rest of execution logic... return result; } finally { // Clean up temp directory await TestEnvironmentManager.cleanup(tempDir); } }
Modify Command Execution Tool:
export function createCommandExecutionTool(options: { debug: boolean; cwd?: string; // Add CWD parameter // Other options }) { return { name: 'execute_command', description: 'Execute a vibe-tools command', parameters: { command: { type: 'string', description: 'The vibe-tools command to execute', }, }, execute: async ({ command }) => { // Determine absolute path to vibe-tools entry point const cursorToolsPath = path.resolve(__dirname, '../../../src/index.ts'); // Build command using Node with tsx for TypeScript support const execCommand = `node --import=tsx "${cursorToolsPath}" ${command}`; try { // Execute in the temp directory if provided const execOptions = { shell: true, cwd: options.cwd || process.cwd(), }; // Execute command const { stdout, stderr } = await execAsync(execCommand, execOptions); return { success: true, output: stdout, error: stderr }; } catch (error) { // Error handling... } }, }; }
Asset Management System:
Environment Variable Handling:
Based on Gemini's recommendation, we'll proceed with implementing Proposal 1. Here's a detailed plan:
Create a new file
src/commands/test/environment.ts:
import * as path from 'path'; import * as fs from 'fs'; import * as os from 'os'; import * as crypto from 'crypto'; /** * Manages isolated test environments for each test scenario. * Handles temporary directory creation, asset copying, and cleanup. */ export class TestEnvironmentManager { /** * Creates a unique temporary directory for a test scenario. * @param scenarioId The ID of the test scenario * @returns The path to the created temporary directory */ static async createTempDirectory(scenarioId: string): Promise<string> { // Create a unique directory name with timestamp and random suffix for collision avoidance const timestamp = Date.now(); const randomSuffix = crypto.randomBytes(4).toString('hex'); const dirName = `vibe-tools-test-${scenarioId}-${timestamp}-${randomSuffix}`; const tempDir = path.join(os.tmpdir(), dirName); // Ensure the directory exists await fs.promises.mkdir(tempDir, { recursive: true }); if (process.env.DEBUG) { console.log(`[DEBUG] Created temporary directory: ${tempDir}`); } return tempDir; } /** * Extracts asset references from a scenario task description. * Supports both inline content references [[asset:name]] and path references {{path:name}}. * @param taskDescription The task description containing asset references * @returns Array of asset references with their type (inline or path) */ static extractAssetReferences(taskDescription: string): Array<{ type: 'inline' | 'path'; name: string; originalRef: string; }> { const assetRefs: Array<{ type: 'inline' | 'path'; name: string; originalRef: string; }> = []; // Extract inline content references: [[asset:name]] const inlineMatches = taskDescription.matchAll(/\[\[asset:([^\]]+)\]\]/g); for (const match of inlineMatches) { assetRefs.push({ type: 'inline', name: match[1], originalRef: match[0], }); } // Extract path references: {{path:name}} const pathMatches = taskDescription.matchAll(/\{\{path:([^\}]+)\}\}/g); for (const match of pathMatches) { assetRefs.push({ type: 'path', name: match[1], originalRef: match[0], }); } return assetRefs; } /** * Resolves the actual file path for an asset based on the scenario ID. * @param assetRef The asset reference object * @param scenarioId The ID of the test scenario * @param testDir The base directory for test files (optional) * @returns The absolute path to the asset file */ static resolveAssetPath( assetRef: { name: string; type: 'inline' | 'path' }, scenarioId: string, testDir: string = path.resolve(process.cwd(), 'tests/feature-behaviors') ): string { // Scenario ID format: category/file-name/scenario-id // We extract the category and file name to locate the asset directory const parts = scenarioId.split('/'); if (parts.length < 2) { throw new Error(`Invalid scenario ID: ${scenarioId}. Expected format: category/file-name/scenario-id`); } const category = parts[0]; const fileName = parts[1]; // Asset directory is named the same as the file (minus extension) const assetDir = path.join(testDir, category, `${fileName}`); const assetPath = path.join(assetDir, assetRef.name); // Verify the asset exists if (!fs.existsSync(assetPath)) { throw new Error(`Asset file not found: ${assetPath}`); } return assetPath; } /** * Copies all assets referenced in a scenario to the temporary directory. * @param scenario The test scenario * @param tempDir The temporary directory to copy assets to * @returns Modified task description with updated asset references */ static async copyAssets(scenario: any, tempDir: string): Promise<string> { // Extract asset references from task description const assetRefs = this.extractAssetReferences(scenario.taskDescription); if (assetRefs.length === 0) { return scenario.taskDescription; } // Create assets directory in temp dir const assetsTempDir = path.join(tempDir, 'assets'); await fs.promises.mkdir(assetsTempDir, { recursive: true }); let modifiedTaskDescription = scenario.taskDescription; // Process each asset reference for (const assetRef of assetRefs) { // Resolve the asset path based on scenario ID const sourcePath = this.resolveAssetPath(assetRef, scenario.id); const assetFileName = path.basename(sourcePath); const destPath = path.join(assetsTempDir, assetFileName); // Copy the asset file await fs.promises.copyFile(sourcePath, destPath); if (process.env.DEBUG) { console.log(`[DEBUG] Copied asset: ${sourcePath} -> ${destPath}`); } // Update references in the task description if (assetRef.type === 'inline') { // For inline references, load the content const content = await fs.promises.readFile(destPath, 'utf-8'); modifiedTaskDescription = modifiedTaskDescription.replace( assetRef.originalRef, content ); } else { // For path references, replace with the new absolute path modifiedTaskDescription = modifiedTaskDescription.replace( assetRef.originalRef, destPath ); } } return modifiedTaskDescription; } /** * Cleans up the temporary directory after test execution. * @param tempDir The temporary directory to clean up */ static async cleanup(tempDir: string): Promise<void> { try { // Recursive directory removal await fs.promises.rm(tempDir, { recursive: true, force: true }); if (process.env.DEBUG) { console.log(`[DEBUG] Cleaned up temporary directory: ${tempDir}`); } } catch (error) { // Log but don't throw - cleanup failures shouldn't fail tests console.error(`[WARNING] Failed to clean up temporary directory: ${tempDir}`, error); } } }
Modify
src/commands/test/executor.ts to use the TestEnvironmentManager:
// Import the TestEnvironmentManager import { TestEnvironmentManager } from './environment'; // ... existing imports export async function executeScenario( scenario: TestScenario, options: { model: string; timeout: number; retryConfig: RetryConfig; debug: boolean; mcpServers?: string[]; scenarioId: string; outputBuffer?: string[]; }, geminiProvider: BaseModelProvider ): Promise<TestScenarioResult> { const { model, timeout, retryConfig, debug, scenarioId, outputBuffer = [] } = options; // Create a temporary directory for this scenario const tempDir = await TestEnvironmentManager.createTempDirectory(scenarioId); // Copy assets and update task description with new references const modifiedTaskDescription = await TestEnvironmentManager.copyAssets(scenario, tempDir); // Create a modified scenario with updated task description const modifiedScenario = { ...scenario, taskDescription: modifiedTaskDescription }; const appendToBuffer = (text: string, shouldPrefix: boolean = true) => { // ... existing implementation }; try { // Create the command execution tool with the temp directory const tools = [ createCommandExecutionTool({ debug, cwd: tempDir, scenarioId, appendToBuffer }) ]; // Continue with existing execution logic, using modifiedScenario // ... return result; } catch (error) { // ... existing error handling } finally { // Clean up the temporary directory await TestEnvironmentManager.cleanup(tempDir); } }
Update the command execution tool in
src/commands/test/tools.ts (create this file if it doesn't exist):
import * as path from 'path'; import * as util from 'util'; import * as child_process from 'child_process'; const execAsync = util.promisify(child_process.exec); export function createCommandExecutionTool(options: { debug: boolean; cwd?: string; scenarioId: string; appendToBuffer: (text: string, shouldPrefix?: boolean) => void; }) { const { debug, cwd, scenarioId, appendToBuffer } = options; return { name: 'execute_command', description: 'Execute a vibe-tools command', parameters: { properties: { command: { type: 'string', description: 'The vibe-tools command to execute', }, }, required: ['command'], }, execute: async ({ command }: { command: string }) => { // Determine absolute path to vibe-tools entry point const cursorToolsPath = path.resolve(__dirname, '../../../src/index.ts'); // Build command using Node with tsx for TypeScript support const execCommand = `node --import=tsx "${cursorToolsPath}" ${command}`; if (debug) { appendToBuffer(`[DEBUG] Executing in ${cwd}: ${execCommand}`); } try { // Execute in the temporary directory if provided const execOptions: child_process.ExecOptions = { shell: true, cwd: cwd || process.cwd(), maxBuffer: 1024 * 1024 * 10, // 10MB buffer for large outputs }; // Execute command const { stdout, stderr } = await execAsync(execCommand, execOptions); if (stdout) { appendToBuffer(`COMMAND OUTPUT:\n${stdout}`); } if (stderr) { appendToBuffer(`COMMAND ERRORS:\n${stderr}`); } return { success: true, output: stdout, error: stderr }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); appendToBuffer(`COMMAND ERROR: ${errorMessage}`); return { success: false, output: '', error: errorMessage }; } }, }; }
Ensure that the LLM client uses the updated task description and properly forwards the temporary directory context:
// Update the LLM client initialization to pass the modified scenario const llmClient = new ToolEnabledLLMClient({ provider, model: options.model, tools, timeout: options.timeout, debug: options.debug, }); // Pass the modified scenario content const messages = buildScenarioPrompt(modifiedScenario);
Test the implementation with various scenarios:
This approach focuses on complete process isolation by spawning child processes for each vibe-tools command, each with its own working directory and environment.
Create Process Isolation System:
IsolatedProcessManager that handles:
Modify Test Executor Architecture:
export async function executeScenario( scenario: TestScenario, options: { /* existing options */ }, geminiProvider: BaseModelProvider ): Promise<TestScenarioResult> { // Create base temp directory for this scenario const scenarioTempDir = await IsolatedProcessManager.createScenarioDirectory(scenario.id); // Parse and copy all assets needed for the scenario await IsolatedProcessManager.prepareAssets(scenario, scenarioTempDir); try { // Create custom tool for isolated execution const isolatedExecutionTool = { name: 'execute_command', description: 'Execute a vibe-tools command in an isolated environment', parameters: { command: { type: 'string', description: 'The vibe-tools command to execute', }, }, execute: async ({ command }) => { // For each command execution, create a fresh command-specific temp directory const commandTempDir = await IsolatedProcessManager.createCommandDirectory( scenarioTempDir, command ); // Determine entry point path const entryPoint = path.resolve(process.cwd(), 'src/index.ts'); // Build the execution environment const env = IsolatedProcessManager.buildEnvironment(); // Execute the command in the isolated directory const result = await IsolatedProcessManager.executeCommand( entryPoint, command, commandTempDir, env, options.debug ); return result; }, }; // Use the isolated execution tool const tools = [isolatedExecutionTool]; // Continue with LLM client execution using the isolated tool // Rest of execution logic... return result; } finally { // Clean up all temp directories await IsolatedProcessManager.cleanup(scenarioTempDir); } }
Process Manager Implementation:
export class IsolatedProcessManager { static async createScenarioDirectory(scenarioId: string): Promise<string> { const tempDir = path.join(os.tmpdir(), `vibe-tools-test-${scenarioId}-${Date.now()}`); await fs.promises.mkdir(tempDir, { recursive: true }); return tempDir; } static async createCommandDirectory(scenarioDir: string, command: string): Promise<string> { // Create unique directory for each command execution const commandHash = crypto.createHash('md5').update(command).digest('hex').slice(0, 8); const commandDir = path.join(scenarioDir, `cmd-${commandHash}`); await fs.promises.mkdir(commandDir, { recursive: true }); return commandDir; } static buildEnvironment(): NodeJS.ProcessEnv { // Create clean environment with only necessary variables return { ...process.env, // Add test-specific environment variables CURSOR_TOOLS_TEST_MODE: 'true', }; } static async executeCommand( entryPoint: string, command: string, cwd: string, env: NodeJS.ProcessEnv, debug: boolean ): Promise<{ success: boolean; output: string; error: string }> { try { // Execute node with tsx for TypeScript support const execCommand = `node --import=tsx "${entryPoint}" ${command}`; if (debug) { console.log(`[DEBUG] Executing in ${cwd}: ${execCommand}`); } // Execute command in specified directory with custom environment const { stdout, stderr } = await execAsync(execCommand, { shell: true, cwd, env, }); return { success: true, output: stdout, error: stderr }; } catch (error) { // Handle execution errors return { success: false, output: '', error: error instanceof Error ? error.message : String(error) }; } } static async prepareAssets(scenario: TestScenario, tempDir: string): Promise<void> { // Parse asset references from scenario const assetRefs = this.extractAssetReferences(scenario.taskDescription); // For each asset reference for (const assetRef of assetRefs) { // Locate the asset file const assetPath = this.resolveAssetPath(assetRef, scenario.id); // Copy to temp directory await fs.promises.copyFile( assetPath, path.join(tempDir, path.basename(assetPath)) ); } } // Additional methods for asset extraction, resolution, and cleanup }
Asset Reference System: