@lisa.ai/agent 2.11.1 → 2.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -161,6 +161,7 @@ lisa-agent chat -m claude
|
|
|
161
161
|
|
|
162
162
|
| Command | Description |
|
|
163
163
|
|---|---|
|
|
164
|
+
| `/read <file>` | Load a file into conversation context |
|
|
164
165
|
| `/test [cmd]` | Run tests and show results |
|
|
165
166
|
| `/explain <file>` | Analyze why a test is failing (no file changes) |
|
|
166
167
|
| `/heal <file>` | Auto-heal a specific failing test file |
|
|
@@ -171,8 +172,11 @@ lisa-agent chat -m claude
|
|
|
171
172
|
|
|
172
173
|
**Example session:**
|
|
173
174
|
```
|
|
174
|
-
lisa>
|
|
175
|
-
|
|
175
|
+
lisa> /read src/services/auth.service.ts
|
|
176
|
+
✓ Loaded auth.service.ts (142 lines) into context
|
|
177
|
+
|
|
178
|
+
lisa> write a unit test for this file
|
|
179
|
+
[streams a test based on the actual file content]
|
|
176
180
|
|
|
177
181
|
lisa> /test
|
|
178
182
|
Running: npx ng test --no-watch --browsers=ChromeHeadless...
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var Wt=Object.create;var tt=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var Xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var es=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Zt(t))!Qt.call(e,o)&&o!==s&&tt(e,o,{get:()=>t[o],enumerable:!(n=zt(t,o))||n.enumerable});return e};var b=(e,t,s)=>(s=e!=null?Wt(Jt(e)):{},es(t||!e||!e.__esModule?tt(s,"default",{value:e,enumerable:!0}):s,e));var Bt=Xt((Kn,Ls)=>{Ls.exports={name:"@lisa.ai/agent",version:"2.11.
|
|
2
|
+
"use strict";var Wt=Object.create;var tt=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var Xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var es=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Zt(t))!Qt.call(e,o)&&o!==s&&tt(e,o,{get:()=>t[o],enumerable:!(n=zt(t,o))||n.enumerable});return e};var b=(e,t,s)=>(s=e!=null?Wt(Jt(e)):{},es(t||!e||!e.__esModule?tt(s,"default",{value:e,enumerable:!0}):s,e));var Bt=Xt((Kn,Ls)=>{Ls.exports={name:"@lisa.ai/agent",version:"2.11.2",description:"Lisa.ai Autonomous CI/CD Worker Agent",main:"dist/index.js",bin:{"lisa-agent":"dist/index.js"},files:["dist/"],scripts:{build:"tsup",typecheck:"tsc --noEmit",start:"node dist/index.js",dev:"ts-node src/index.ts",prepublishOnly:"npm run typecheck && npm run build"},keywords:["lisa","ci","cd","agent"],author:"Lisa.ai",license:"ISC",dependencies:{"@ai-sdk/anthropic":"^3.0.46","@ai-sdk/google":"^3.0.30","@ai-sdk/openai":"^3.0.30","@octokit/rest":"^22.0.1",ai:"^6.0.94",commander:"^11.1.0",dotenv:"^17.3.1","simple-git":"^3.31.1"},devDependencies:{"@types/jest":"^30.0.0","@types/node":"^20.0.0","ts-node":"^10.9.1",tsup:"^8.5.1",typescript:"^5.0.0"}}});var qt=require("commander"),re=b(require("fs")),be=b(require("path")),Yt=b(require("readline"));var st=b(require("dotenv"));st.config({quiet:!0});async function je(e){let t=process.env.LISA_CONTROL_PLANE_URL||"http://localhost:3088";try{let s=`${t}/api/v1/lisa/config/${e}`;console.log(`[Lisa.ai Agent] Fetching dynamic configuration from ${s}...`);let n=await fetch(s);if(!n.ok){let i=n.status===404?"not_found":"unreachable";return console.warn(i==="not_found"?`[Lisa.ai Agent Warning] Control Plane returned 404. Project '${e}' not found.`:`[Lisa.ai Agent Warning] Control Plane returned ${n.status}. Falling back to local defaults.`),{ok:!1,reason:i}}return{ok:!0,config:await n.json()}}catch{return console.warn(`[Lisa.ai Agent Warning] Failed to reach Control Plane (${t}). Using local fallback configuration.`),{ok:!1,reason:"unreachable"}}}var $t=require("child_process"),B=b(require("fs")),te=b(require("path"));var j=b(require("path")),D=b(require("fs"));function Ee(e){return e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,"")}function G(e){let t=Ee(e),s=[...t.matchAll(/Executed\s+(\d+)\s+of\s+(\d+)(?:\s+\((\d+)\s+FAILED\))?/g)];if(s.length>0){let u=[...s].reverse().find(L=>L[3]!==void 0)??s[s.length-1],p=parseInt(u[2]),$=u[3]?parseInt(u[3]):0,g=parseInt(u[1])-$;return{total:p,passed:g,failed:$}}let n=t.match(/Tests:\s+(?:(\d+)\s+failed,?\s*)?(?:(\d+)\s+passed,?\s*)?(\d+)\s+total/);if(n){let u=parseInt(n[3]),p=n[1]?parseInt(n[1]):0,$=n[2]?parseInt(n[2]):0;return{total:u,passed:$,failed:p}}let o=t.match(/(\d+)\s+failed/),i=t.match(/(\d+)\s+passed/);if(i||o){let u=o?parseInt(o[1]):0,p=i?parseInt(i[1]):0,$=t.match(/(\d+)\s+skipped/),g=$?parseInt($[1]):0;return{total:p+u+g,passed:p,failed:u}}let a=t.match(/Tests\s+(?:(\d+)\s+failed\s*\|?\s*)?(\d+)\s+passed\s*\((\d+)\)/);if(a){let u=parseInt(a[3]),p=a[1]?parseInt(a[1]):0,$=parseInt(a[2]);return{total:u,passed:$,failed:p}}let r=t.match(/(\d+)\s+passing/),c=t.match(/(\d+)\s+failing/);if(r){let u=parseInt(r[1]),p=c?parseInt(c[1]):0;return{total:u+p,passed:u,failed:p}}return null}function Ge(e,t=process.cwd(),s=[]){let n=e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,""),o=s.map(d=>j.resolve(t,d)),i=new Map,a=new Set,r=/(?:Chrome|Firefox|Safari)(?:\s+Headless)?\s+[\d.]+(?:\s+[\d.]+)*\s+\([^)]+\)\s+(.+?)\s+FAILED/g,c;for(;(c=r.exec(n))!==null;){let l=c[1].trim().split(" ");for(let y=1;y<Math.min(l.length,6);y++){let h=l.slice(0,y).join(" ");if(a.has(h))continue;a.add(h);let C=Be(h,t,o);if(C){let v=j.resolve(C);i.has(v)||i.set(v,j.relative(t,C));break}}}let u=/^FAIL\s+([a-zA-Z0-9_./-\\]+\.(?:spec|test)\.(ts|tsx|js|jsx))/gm,p;for(;(p=u.exec(n))!==null;){let d=p[1],l=j.isAbsolute(d)?d:j.resolve(t,d);!o.includes(l)&&D.existsSync(l)&&!i.has(l)&&i.set(l,j.relative(t,l))}let $=/\[(?:chromium|firefox|webkit)\]\s+[>›]\s+([^\s:]+\.(?:spec|test)\.[tj]sx?):\d+:\d+\s+[>›]/g,g;for(;(g=$.exec(n))!==null;){let d=g[1],l=j.isAbsolute(d)?d:j.resolve(t,d);!o.includes(l)&&D.existsSync(l)&&!i.has(l)&&i.set(l,j.relative(t,l))}let L=/Running:\s+([^\s]+\.(?:cy|spec|test)\.[tj]sx?)/g,m;for(;(m=L.exec(n))!==null;){let d=m[1],l=j.isAbsolute(d)?d:j.resolve(t,d);if(!o.includes(l)&&D.existsSync(l)&&!i.has(l)){let y=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");new RegExp(y+"\\s+\\d+\\s+\\d+\\s+([1-9]\\d*)").test(n)&&i.set(l,j.relative(t,l))}}return[...i.values()]}function Ae(e,t=[],s=process.cwd()){let n=e.replace(/\x1B\[[0-9;]*[a-zA-Z]/g,""),o=t.map(d=>j.resolve(d));{let d=/(?:Chrome|Firefox|Safari)(?:\s+Headless)?\s+[\d.]+(?:\s+[\d.]+)*\s+\([^)]+\)\s+(.+?)\s+FAILED/g,l=new Set,y;for(;(y=d.exec(n))!==null;){let C=y[1].trim().split(" ");for(let v=1;v<Math.min(C.length,5);v++){let x=C.slice(0,v).join(" ");if(l.has(x))continue;l.add(x);let f=Be(x,s,o);if(f)return j.relative(s,f)}}}let i=/([a-zA-Z]:[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue)|[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))(?:\s*[:(])/g,a;for(;(a=i.exec(n))!==null;){let d=a[1];if(d){if(/(?:^|[/\\])(node_modules|dist|build)[/\\]/.test(d))continue;let l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}}let r=/FAIL\s+([a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))/gi,c;for(;(c=r.exec(n))!==null;){let d=c[1],l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}{let d=/\[(?:chromium|firefox|webkit)\]\s+[>›]\s+([^\s:]+\.(?:spec|test)\.[tj]sx?):\d+:\d+\s+[>›]/g,l;for(;(l=d.exec(n))!==null;){let y=l[1],h=j.isAbsolute(y)?y:j.resolve(s,y);if(!o.includes(h)&&D.existsSync(h))return y}}let u=/([a-zA-Z]:[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue)|[a-zA-Z0-9_.\-\/\\]+\.(?:ts|tsx|js|jsx|vue))/g,p;for(;(p=u.exec(n))!==null;){let d=p[1];if(d){if(/(?:^|[/\\])(node_modules|dist|build)[/\\]/.test(d))continue;let l=j.isAbsolute(d)?d:j.resolve(s,d);if(!o.includes(l)&&D.existsSync(l))return d}}let $=/\b([A-Z][a-zA-Z0-9]{3,})\b/g,g,L=new Set,m=["Error","TypeError","SyntaxError","ReferenceError","RangeError","Object","Boolean","String","Number","Array","NullInjectorError","NullInjector","R3Injector","ChainedInjector","Module","Component","Standalone","Application","App2","TestBed","UserContext","Chrome","ChromeHeadless","Karma","Launching","Starting","Headless","Connected","Executed","INFO","SUCCESS","FAILED","Building","Initial","Names","Lazy","Source","Find","NotFound","NG0201","Windows","Linux","Macintosh","Users","AppData","Local","Temp","Process","Unexpected","Expected","Validation","Directory","Configuration","Documentation"];for(;(g=$.exec(n))!==null;){let d=g[1];if(!d||m.includes(d)||L.has(d)||/^[A-Z][A-Z0-9]{5,11}$/.test(d)||/^[A-Za-z0-9]{16,}$/.test(d))continue;L.add(d);let l=nt(d,s,o);if(l)return j.relative(s,l)}return null}function Be(e,t,s){if(!D.existsSync(t))return null;let n=D.readdirSync(t);for(let o of n){let i=j.join(t,o);if(["node_modules","dist","build",".git",".angular"].includes(o))continue;let a;try{a=D.statSync(i)}catch{continue}if(a.isDirectory()){let r=Be(e,i,s);if(r)return r}else if(/\.(spec|test)\.(ts|tsx|js|jsx)$/.test(o)){if(s.includes(j.resolve(i)))continue;try{let r=D.readFileSync(i,"utf8");if(r.includes(`describe('${e}'`)||r.includes(`describe("${e}"`))return i}catch{continue}}}return null}function nt(e,t,s){if(!D.existsSync(t))return null;let n=D.readdirSync(t);for(let o of n){let i=j.join(t,o);if(o==="node_modules"||o==="dist"||o==="build"||o===".git"||o===".angular")continue;let a;try{a=D.statSync(i)}catch{continue}if(a.isDirectory()){let r=nt(e,i,s);if(r)return r}else if(o.match(/\.(ts|tsx|js|jsx|vue)$/)){let r=D.readFileSync(i,"utf8");if(r.includes(`class ${e}`)||r.includes(`function ${e}`)||r.includes(`const ${e}`)||r.includes(`let ${e}`)||r.includes(`exports.${e}`)||r.includes(`module.exports.${e}`)){let c=i,u=j.extname(i),p=i.slice(0,-u.length);if(!o.includes(".spec.")&&!o.includes(".test.")){let $=[`${p}.spec${u}`,`${p}.test${u}`,`${p}.spec.js`,`${p}.test.js`];for(let g of $)if(D.existsSync(g)){c=g;break}}if(!s.includes(j.resolve(c)))return c}}}return null}var ce=require("ai"),Te=require("@ai-sdk/openai"),ot=require("@ai-sdk/anthropic"),it=require("@ai-sdk/google"),at=b(require("dotenv"));at.config({quiet:!0});var qe=15e3;function Pe(e,t){return e.length<=qe?e:(console.warn(`[Lisa.ai LLM] ${t} is ${e.length} chars \u2014 truncating to ${qe} to stay within context window.`),e.slice(0,qe)+`
|
|
3
3
|
|
|
4
4
|
// ... (truncated)`)}function Ie(e,t){if(!/\b(describe|it\(|test\(|expect\(|beforeEach|afterEach|suite|assert\.|cy\.)\b/.test(e))throw new Error(`LLM returned a non-code response for ${t} (possible context overflow). Skipping to prevent file corruption.`)}function rt(e){if(!e||e.length===0)return"";let t={unit:"unit tests \u2014 test every function/method in complete isolation, mocking ALL external dependencies, services, and I/O",integration:"integration tests \u2014 test how modules work together using real service/repository layers; for HTTP routes use supertest or equivalent",e2e:"end-to-end tests \u2014 simulate complete user flows using the configured e2e framework (Playwright/Cypress); cover the full path from HTTP request to response or UI action to assertion"};return`5. Test scope \u2014 generate ALL of the following test types for this file:
|
|
5
5
|
${e.map(n=>` \u2022 ${t[n]??n}`).join(`
|