workspai 0.50.0 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -497
- package/contracts/artifact-remediation-plan.v1.json +87 -0
- package/contracts/cli-runtime-command-inventory.v1.snapshot.json +24 -0
- package/contracts/create-planner-capabilities.v1.json +10 -1
- package/contracts/doctor-project-evidence.v1.json +46 -0
- package/contracts/doctor-remediation-plan.v1.json +82 -0
- package/contracts/doctor-workspace-evidence.v1.json +46 -0
- package/contracts/extension-cli-compatibility.v1.json +6 -2
- package/contracts/published-contract-catalog.v1.json +22 -1
- package/contracts/runtime-command-surface.v1.json +104 -0
- package/contracts/workspace-intelligence/doctor-dependency-repair-transaction.v1.json +66 -0
- package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +5 -0
- package/contracts/workspace-intelligence/verified-goal-status.v1.json +27 -0
- package/contracts/workspace-intelligence/verified-goal.v1.json +163 -0
- package/contracts/workspace-intelligence-chain.v1.json +6 -0
- package/dist/analyze-J7VNZMDH.js +1 -0
- package/dist/artifact-remediation-plan-2UKY4TKO.js +3 -0
- package/dist/autopilot-release-UG23AWVH.js +1 -0
- package/dist/chunk-27UR373Z.js +1 -0
- package/dist/chunk-2PY65U6X.js +5 -0
- package/dist/{chunk-DQ3PI7EP.js → chunk-3D3PFPP5.js} +1 -1
- package/dist/chunk-4D7DIGAB.js +1 -0
- package/dist/{chunk-IND3TUVU.js → chunk-4UVGTFOX.js} +1 -1
- package/dist/chunk-5XJRCP3D.js +36 -0
- package/dist/chunk-62K2H72S.js +1 -0
- package/dist/chunk-6AXRIAP2.js +86 -0
- package/dist/chunk-6HJJHEL6.js +2 -0
- package/dist/{chunk-BHYTI3RH.js → chunk-6PBSAAS5.js} +1 -1
- package/dist/{chunk-MVLIONQD.js → chunk-7MQZQ4UU.js} +1 -1
- package/dist/chunk-7RLGOEWV.js +1 -0
- package/dist/{chunk-CV5HKU4P.js → chunk-7T4TSV5C.js} +1 -1
- package/dist/chunk-B4CPDK6J.js +2 -0
- package/dist/{chunk-SHXJ2GDR.js → chunk-DZ4VKAXB.js} +1 -1
- package/dist/{chunk-5EXZBCAZ.js → chunk-F4KBYFZ5.js} +1 -1
- package/dist/{chunk-LZQUZGXB.js → chunk-FRJYAJH6.js} +1 -1
- package/dist/chunk-FUPHQOJB.js +1 -0
- package/dist/{chunk-VKTUWUS6.js → chunk-GHB6QMQH.js} +1 -1
- package/dist/chunk-GR6442P7.js +1 -0
- package/dist/chunk-HPWLSLMC.js +8 -0
- package/dist/{chunk-KXG6E5VK.js → chunk-ICLYL3N5.js} +1 -1
- package/dist/chunk-IO54DFWR.js +691 -0
- package/dist/{chunk-RTVRZFIJ.js → chunk-KHEJO3JU.js} +1 -1
- package/dist/{chunk-IPJ5URDF.js → chunk-LOCPNNSK.js} +1 -1
- package/dist/chunk-LPCL4U4L.js +1 -0
- package/dist/{chunk-C35UXTDM.js → chunk-M5ICGR55.js} +1 -1
- package/dist/{chunk-SS2VV3D5.js → chunk-MBRU3VWJ.js} +2 -2
- package/dist/{chunk-DDQ3XK3H.js → chunk-MZFSINY7.js} +3 -3
- package/dist/chunk-OTDGTAZJ.js +1 -0
- package/dist/chunk-P4OSLAVD.js +3 -0
- package/dist/chunk-PS5F4DCT.js +1 -0
- package/dist/{chunk-C3FLCDRN.js → chunk-PTTZPDLX.js} +1 -1
- package/dist/chunk-Q6CUJ3WF.js +10 -0
- package/dist/{chunk-MV7KF75Q.js → chunk-QURMI7ID.js} +1 -1
- package/dist/{chunk-RVQLMTTI.js → chunk-ULR66OJR.js} +1 -1
- package/dist/chunk-WJVB6SSD.js +16 -0
- package/dist/chunk-WJY7ZXVJ.js +2 -0
- package/dist/{chunk-6UTM5AJI.js → chunk-XHRHNVCZ.js} +1 -1
- package/dist/chunk-ZTKIBREF.js +1 -0
- package/dist/{chunk-BQGBU2Y3.js → chunk-ZVOEPWQM.js} +1 -1
- package/dist/{create-I23DC7SN.js → create-ESK3CQPK.js} +1 -1
- package/dist/{doctor-DOOMYLIH.js → doctor-DLEBZSF7.js} +1 -1
- package/dist/index.d.ts +26 -11
- package/dist/index.js +129 -129
- package/dist/{pipeline-U77HSINC.js → pipeline-NT6AYYWM.js} +1 -1
- package/dist/{project-intelligence-lens-BKKVPCLC.js → project-intelligence-lens-Q4SZDI2N.js} +1 -1
- package/dist/project-test-coverage-A677ZLW3.js +1 -0
- package/dist/verified-goal-MJNZROS5.js +1 -0
- package/dist/{workspace-ZEYUVR26.js → workspace-LSOZM2CG.js} +1 -1
- package/dist/{workspace-agent-sync-DKYJLUDP.js → workspace-agent-sync-RZBQXCNJ.js} +1 -1
- package/dist/{workspace-archive-4JNT4S7N.js → workspace-archive-ZOWQXWJ6.js} +1 -1
- package/dist/workspace-context-IYJKO5BN.js +1 -0
- package/dist/{workspace-contract-PVLGPBBV.js → workspace-contract-AZFISDLS.js} +1 -1
- package/dist/workspace-explain-26UGV7L4.js +1 -0
- package/dist/workspace-explain-contract-GIWPCCEF.js +1 -0
- package/dist/{workspace-feedback-RATRXFUC.js → workspace-feedback-LIHEWTNV.js} +1 -1
- package/dist/{workspace-foundation-D33LJLGT.js → workspace-foundation-H5UTAUXQ.js} +1 -1
- package/dist/{workspace-graph-stream-THNG2T7R.js → workspace-graph-stream-KUDOZE73.js} +1 -1
- package/dist/workspace-graph-token-efficiency-5FNH4JZ5.js +1 -0
- package/dist/{workspace-history-EWFPT74O.js → workspace-history-HULG5EFN.js} +1 -1
- package/dist/{workspace-intelligence-MCNSWWDV.js → workspace-intelligence-A4UE4DZK.js} +1 -1
- package/dist/{workspace-intelligence-evaluation-7CABG5Y6.js → workspace-intelligence-evaluation-AOLGHYHC.js} +1 -1
- package/dist/workspace-intelligence-runner-42QI5RYA.js +1 -0
- package/dist/{workspace-intelligence-runtime-registry-ZZ3GRAL2.js → workspace-intelligence-runtime-registry-YOQ5GFFJ.js} +1 -1
- package/dist/{workspace-knowledge-graph-2EYR7N56.js → workspace-knowledge-graph-LEM6X5CM.js} +1 -1
- package/dist/{workspace-knowledge-graph-query-VOSPPH4W.js → workspace-knowledge-graph-query-EKHIE3E2.js} +1 -1
- package/dist/{workspace-mcp-serve-FLAVKWYW.js → workspace-mcp-serve-N2QPR7VJ.js} +1 -1
- package/dist/{workspace-model-FMFYLHE4.js → workspace-model-FJXX3NET.js} +1 -1
- package/dist/{workspace-onboarding-MYROZDI2.js → workspace-onboarding-IKFISWWY.js} +1 -1
- package/dist/workspace-readme-E2M35RJH.js +77 -0
- package/dist/{workspace-registry-summary-6VXIAQLX.js → workspace-registry-summary-HOQ3OBNT.js} +1 -1
- package/dist/workspace-run-GOZTUGJS.js +1 -0
- package/dist/{workspace-verify-FKYI65UQ.js → workspace-verify-32AWCJQG.js} +1 -1
- package/dist/workspace-watch-4WVNB26E.js +1 -0
- package/docs/README.md +1 -0
- package/docs/README_CONTENT_CONTRACT.md +98 -124
- package/docs/ci-workflows.md +53 -15
- package/docs/commands-reference.md +16 -2
- package/docs/doctor-command.md +16 -0
- package/docs/workspace-intelligence-runner.md +48 -0
- package/docs/workspace-knowledge-graph.md +39 -0
- package/docs/workspace-operations.md +9 -6
- package/package.json +9 -4
- package/scripts/enterprise-package-smoke.mjs +11 -0
- package/templates/kits/fastapi-ddd/README.md.j2 +1 -1
- package/templates/kits/fastapi-standard/README.md.j2 +1 -1
- package/templates/kits/nestjs-standard/Dockerfile.j2 +1 -1
- package/templates/kits/nestjs-standard/README.md.j2 +1 -1
- package/templates/kits/nestjs-standard/package.json.j2 +11 -2
- package/dist/analyze-ZFQWTCJQ.js +0 -1
- package/dist/artifact-remediation-plan-ICN3KOFG.js +0 -3
- package/dist/autopilot-release-VKXQ7BS7.js +0 -1
- package/dist/chunk-2AXEGYPL.js +0 -1
- package/dist/chunk-2D4UOYOJ.js +0 -1
- package/dist/chunk-AHLMIL2T.js +0 -1
- package/dist/chunk-AL2A7Q4X.js +0 -86
- package/dist/chunk-GNQRYISX.js +0 -5
- package/dist/chunk-I42F552T.js +0 -2
- package/dist/chunk-IDQKVJUF.js +0 -2
- package/dist/chunk-JFUD73OZ.js +0 -933
- package/dist/chunk-KKAOTTYO.js +0 -8
- package/dist/chunk-KMLPHFLD.js +0 -2
- package/dist/chunk-L2YK5RV2.js +0 -1
- package/dist/chunk-LAJM2SBP.js +0 -15
- package/dist/chunk-TDTCMZK7.js +0 -10
- package/dist/chunk-UETZ7USY.js +0 -36
- package/dist/chunk-WDKNMTJQ.js +0 -1
- package/dist/chunk-YPKNQCLK.js +0 -2
- package/dist/project-test-coverage-4TEHZJFC.js +0 -1
- package/dist/workspace-context-IHUFMZT3.js +0 -1
- package/dist/workspace-explain-64HNKAHO.js +0 -1
- package/dist/workspace-explain-contract-H7O26QJU.js +0 -1
- package/dist/workspace-graph-token-efficiency-CFGFCJ5V.js +0 -1
- package/dist/workspace-intelligence-runner-TG2VLHNZ.js +0 -1
- package/dist/workspace-run-2ZI5UMJ2.js +0 -1
- package/dist/workspace-watch-RP5KMVP2.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a as a$6}from'./chunk-HTYMXMQM.js';import {i,o}from'./chunk-WJVB6SSD.js';import {a as a$3}from'./chunk-27UR373Z.js';import {a as a$1}from'./chunk-Y5YAP4F3.js';import {d as d$1,c as c$1}from'./chunk-EWZZUQBR.js';import {a as a$2,p,d,g,f as f$3,e as e$1}from'./chunk-B4CPDK6J.js';import {c,b as b$2,i as i$1,w,f as f$2}from'./chunk-6HJJHEL6.js';import {j as j$1,i as i$2,h}from'./chunk-2PY65U6X.js';import {a as a$4}from'./chunk-GR6442P7.js';import {f as f$1,d as d$2,a as a$5,e}from'./chunk-MBRU3VWJ.js';import {b as b$1,a}from'./chunk-62K2H72S.js';import {t,s}from'./chunk-MOSXTVPU.js';import f from'path';import E from'fs-extra';import It from'crypto';import {createRequire}from'module';var Wt=new Set(["backend","desktop","extension","service","frontend","worker","library","infra","docs","test-suite","unknown"]);async function et(e){try{if(!await E.pathExists(e))return null;let t=await E.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function xt(e){for(let t of e){let r=await et(t);if(r)return r}return null}function Ze(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return Wt.has(t)?t==="service"?"backend":t:null}function tt(e){switch(e){case "backend":case "service":case "worker":return "backend";case "frontend":case "desktop":case "extension":case "library":return e;case "infra":return "infrastructure";case "docs":return "documentation";case "test-suite":return "quality";default:return "unknown"}}async function rt(e,t$1){let r=t$1??await xt(t(e,"project.json")),o=Ze(r?.kind)??Ze(r?.type);if(o)return o;let s=typeof r?.kit_name=="string"?r.kit_name:r?.kit,n=typeof r?.framework=="string"?r.framework:null,i=typeof r?.runtime=="string"?r.runtime:null,a=`${typeof s=="string"?s:""} ${n??""} ${i??""}`.trim().toLowerCase();if(/\b(tauri|electron|wails|desktop)\b/.test(a))return "desktop";if(/\b(vscode-extension|visual studio code extension|jetbrains-plugin|browser-extension)\b/.test(a))return "extension";if(/\b(frontend|nextjs|next\.js|react|vue|svelte|vite|angular|astro|remix|nuxt)\b/.test(a))return "frontend";if(/\b(fastapi|nestjs|springboot|spring boot|gofiber|gogin|dotnet|webapi|django|flask|express|fastify|python|node|java|go|rust|php|ruby|elixir)\b/.test(a))return "backend";let c=await et(f.join(e,"package.json"));if(c){let d={...c.dependencies??{},...c.devDependencies??{}},u=c.scripts??{},p=Object.values(u).filter(v=>typeof v=="string").join(" ").toLowerCase(),l=c.engines??{},m=Array.isArray(c.categories)?c.categories.filter(v=>typeof v=="string"):[];if(d["@tauri-apps/api"]||d["@tauri-apps/cli"]||await E.pathExists(f.join(e,"src-tauri","tauri.conf.json"))||await E.pathExists(f.join(e,"src-tauri","tauri.conf.json5"))||d.electron||d["@electron-forge/cli"]||p.includes("electron-forge")||p.includes("electron "))return "desktop";if(typeof l.vscode=="string"||m.some(v=>v.toLowerCase()==="extension packs")||c.publisher&&(c.activationEvents||c.contributes))return "extension";if(d.next||d.react||d.vue||d.svelte||d.vite||d["@angular/core"]||p.includes("next ")||p.includes("vite "))return "frontend";if(c.private===true&&!d.express&&!d["@nestjs/core"])return "library"}return await E.pathExists(f.join(e,"Dockerfile"))||await E.pathExists(f.join(e,"docker-compose.yml"))||await E.pathExists(f.join(e,"terraform.tf"))?"infra":"backend"}var Rt=new Set(c().map(e=>e.id)),At=[...i().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,status:"available",canExecuteCreate:true,versionPolicy:e.versionPolicy,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true,...e.minNodeVersion?{runtimeRequirements:{node:`>=${e.minNodeVersion}`}}:e.minNodeMajor?{runtimeRequirements:{node:`>=${e.minNodeMajor}`}}:{}})),...o().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,status:"available",canExecuteCreate:true,versionPolicy:e.versionPolicy,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true,...e.nodeSupport?{runtimeRequirements:{node:e.nodeSupport.requirement}}:{}})),{id:"wordpress-site",aliases:["wordpress","wordpress-site","wp","wp-site"],ecosystem:"wordpress",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["wp core download","wp config create","wp db create","wp core install"],adoptAfterCreate:true},{id:"wordpress-block",aliases:["wordpress-block","wp-block","gutenberg-block"],ecosystem:"wordpress",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["npx @wordpress/create-block@latest <slug>"],adoptAfterCreate:true},{id:"symfony",aliases:["symfony","php-symfony"],ecosystem:"php",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["composer create-project symfony/skeleton <name>"],adoptAfterCreate:true},{id:"rails",aliases:["rails","ruby-on-rails","ruby-rails"],ecosystem:"ruby",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["rails new <name>"],adoptAfterCreate:true}],L=new Map;for(let e of At){L.set(e.id,e);for(let t of e.aliases)L.set(t,e);}var Mt=new Set(["php","ruby","rust","elixir","clojure","scala","kotlin","unknown"]);function N(e){return e?.trim().toLowerCase()||void 0}function nt(e){let t=N(e.kitId)??N(e.framework)??N(e.runtime)??"unknown";if(e.projectExists)return {lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"Existing projects enter Workspace Intelligence through adopt/import."};let r=e.kitId?b$2(e.kitId):void 0;if(r&&Rt.has(r))return {lane:"native",status:"available",canExecuteCreate:true,requested:t,resolved:r,reason:"Workspai owns the create contract, project marker, registry, doctor, and workspace model path."};let o=L.get(t)??L.get(N(e.framework)??"")??L.get(N(e.runtime)??"");if(o)return {lane:"official",status:o.status,canExecuteCreate:o.canExecuteCreate,requested:t,resolved:o.id,officialCommands:o.officialCommands,fallbackLane:o.canExecuteCreate?void 0:"existing",reason:o.status==="available"?"Workspai runs the official ecosystem generator, then registers the project in Workspace Intelligence.":"Official generator support is planned but not enabled; use adopt/import until Workspai owns the post-create contract."};let s=N(e.runtime);return s&&Mt.has(s)?{lane:"existing",status:"available",canExecuteCreate:false,requested:t,resolved:s,reason:"Runtime can be governed through Workspace Intelligence, but native create is not supported."}:{lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"No native create contract is available; use adopt/import to enter Workspace Intelligence."}}function Dr(e){return !e.canExecuteCreate&&(e.lane==="official"||e.lane==="existing"&&e.resolved!==void 0)}var Tr="rapidkit-freshness-metadata-v1";function he(e){if(Array.isArray(e))return e.map(t=>he(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=he(e[r]);return t}return e}function Ft(e){return JSON.stringify(he(e))}function $(e){return It.createHash("sha256").update(Ft(e)).digest("hex")}var ot=".workspai/workspace-graph.overrides.json",Dt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Ot=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),at=600,it=5,Gt=256*1024,st={inferred:1,contract:2,manual:3};function _t(e){return e.split(f.sep).join("/")}function re(e,t){return _t(f.relative(e,t)||".")}function ct(e){let t=new Map;for(let r of e.projects)t.has(r.name)||t.set(r.name,{id:r.name,path:r.path,...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kind?{kind:r.kind}:{}});return [...t.values()].sort((r,o)=>r.id.localeCompare(o.id))}function dt(e,t){let r=new Map,o=new Map;for(let n of t.projects){if(r.has(n.name))continue;let i=n.absolutePath?f.resolve(n.absolutePath):f.resolve(e,n.path);r.set(n.name,i),o.has(i)||o.set(i,n.name);}let s=[...o.entries()].map(([n,i])=>({dir:n,id:i})).sort((n,i)=>i.dir.length-n.dir.length||n.dir.localeCompare(i.dir));return {idToDir:r,dirToId:o,sortedDirs:s}}function ne(e,t){let r=f.resolve(t);for(let{dir:o,id:s}of e.sortedDirs)if(r===o||r.startsWith(`${o}${f.sep}`))return s;return null}async function we(e){try{if(!await E.pathExists(e))return null;let t=await E.readJSON(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function be(e){try{return await E.pathExists(e)?await E.readFile(e,"utf8"):null}catch{return null}}async function pt(e,t){let r=[],o=new Map;for(let[s,n]of t.idToDir.entries()){let i=await we(f.join(n,"package.json")),a=typeof i?.name=="string"?i.name.trim():"";a&&!o.has(a)&&o.set(a,s);}for(let[s,n]of t.idToDir.entries()){let i=await we(f.join(n,"package.json"));if(i){let a=["dependencies","devDependencies","peerDependencies","optionalDependencies"],c=new Set;for(let d of a){let u=i[d];if(!(!u||typeof u!="object"||Array.isArray(u)))for(let p of Object.keys(u)){let l=o.get(p);!l||l===s||c.has(l)||(c.add(l),r.push({from:s,to:l,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:re(e,f.join(n,"package.json")),detail:`declares dependency ${p}`}]}));}}}r.push(...await Tt(e,t,s,n)),r.push(...await Nt(e,t,s,n));}return r}async function Tt(e,t,r,o){let s=await be(f.join(o,"pyproject.toml"));if(!s)return [];let n=[],i=new Set,a=/path\s*=\s*["']([^"']+)["']/g,c;for(;(c=a.exec(s))!==null;){let d=ne(t,f.resolve(o,c[1]));!d||d===r||i.has(d)||(i.add(d),n.push({from:r,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:re(e,f.join(o,"pyproject.toml")),detail:`path dependency ${c[1]}`}]}));}return n}async function Nt(e,t,r,o){let s=await be(f.join(o,"go.mod"));if(!s)return [];let n=[],i=new Set,a=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,c;for(;(c=a.exec(s))!==null;){let d=ne(t,f.resolve(o,c[1]));!d||d===r||i.has(d)||(i.add(d),n.push({from:r,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:re(e,f.join(o,"go.mod")),detail:`go.mod replace ${c[1]}`}]}));}return n}async function $t(e,t){let r=[],o=[e];for(;o.length>0&&r.length<t;){let s=o.shift();if(!s)continue;let n=[];try{n=await E.readdir(s,{withFileTypes:true});}catch{continue}let i=[],a=[];for(let c of n)if(c.isDirectory()){if(Ot.has(c.name)||a$4(c.name)||c.name.startsWith("."))continue;i.push(f.join(s,c.name));}else c.isFile()&&Dt.has(f.extname(c.name))&&a.push(f.join(s,c.name));a.sort((c,d)=>c.localeCompare(d)),i.sort((c,d)=>c.localeCompare(d));for(let c of a){if(r.length>=t)break;r.push(c);}o.push(...i);}return r}var Vt=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function Ht(e){let t=new Set;for(let r of Vt){r.lastIndex=0;let o;for(;(o=r.exec(e))!==null;){let s=o[1];s.startsWith(".")&&t.add(s);}}return [...t]}async function ve(e,t,r,o){let s=new Map;for(let[n,i]of t.idToDir.entries()){if(o&&!o.has(n))continue;let a=await $t(i,r);for(let c of a){let d=await E.stat(c).catch(()=>null);if(!d||d.size>Gt)continue;let u=await be(c);if(u)for(let p of Ht(u)){let l=f.resolve(f.dirname(c),p),m=ne(t,l);if(!m||m===n)continue;let v=`${n}\0${m}`,h=s.get(v);h||(h={from:n,to:m,evidence:[]},s.set(v,h)),h.evidence.length<it&&h.evidence.push({file:re(e,c),detail:`imports ${p}`});}}}return [...s.values()].map(n=>({from:n.from,to:n.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:n.evidence}))}function Kt(e,t,r){let o=new Map;for(let s of r.projects){let n=Bt(e,t,s);n&&o.set(s.slug,n);}return o}function Bt(e,t,r){let o=[r.relativePath,r.externalPath].filter(s=>typeof s=="string"&&s.length>0);for(let s of o){let n=f.resolve(e,s),i=t.dirToId.get(n)??ne(t,n);if(i)return i}return t.idToDir.has(r.slug)?r.slug:null}function lt(e,t,r){let o=[],s=Kt(e,t,r),n=g,i=new Map,a=new Map;for(let c of r.projects){let d=s.get(c.slug);if(!d)continue;let u=c.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let p of u.dependsOn??[]){let l=s.get(p);!l||l===d||o.push({from:d,to:l,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:n,detail:`dependsOn ${p}`}]});}for(let p of u.publishes??[])i.has(p)||i.set(p,new Set),i.get(p)?.add(d);for(let p of u.consumes??[])a.has(p)||a.set(p,new Set),a.get(p)?.add(d);}for(let[c,d]of i.entries()){let u=a.get(c);if(u)for(let p of u)for(let l of d)p!==l&&o.push({from:p,to:l,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:n,detail:`consumes event ${c}`}]});}return o.push(...Lt(r,s)),o}function ke(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function Lt(e,t){let r=[],o=e.projects.map(s=>({project:s,id:t.get(s.slug)})).filter(s=>!!s.id).filter(s=>ke(s.project.slug).length>=3);for(let s of e.projects){let n=t.get(s.slug);if(!n)continue;let i=s.contracts?.env??[];if(i.length===0)continue;let a=new Set;for(let c of i){let d=ke(c);for(let u of o)u.id===n||a.has(u.id)||!(d.includes(ke(u.project.slug))&&(u.project.ports?.length??0)>0)||(a.add(u.id),r.push({from:n,to:u.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:g,detail:`env ${c} references ${u.project.slug}`}]}));}}return r}async function ut(e,t){let r=await we(f.join(e,ot)),o=Array.isArray(r?.edges)?r?.edges:[],s=[],n=new Set(f$3);for(let i of o){if(!i||typeof i!="object"||Array.isArray(i))continue;let a=i,c=typeof a.from=="string"?a.from:"",d=typeof a.to=="string"?a.to:"",u=typeof a.kind=="string"?a.kind:"";if(!t.has(c)||!t.has(d)||c===d||!n.has(u))continue;let p=Array.isArray(a.evidence)?a.evidence.map(l=>l&&typeof l=="object"&&typeof l.file=="string"?{file:l.file,...typeof l.detail=="string"?{detail:l.detail}:{}}:null).filter(l=>!!l):[];s.push({from:c,to:d,kind:u,source:"manual",confidence:"high",evidence:p.length>0?p:[{file:ot,detail:"manual edge"}]});}return s}function zt(e){return `${e.from}\0${e.to}\0${e.kind}`}function qt(e){let t=new Set,r=[];for(let o of e){let s=`${o.file}\0${o.detail??""}`;t.has(s)||(t.add(s),r.push(o));}return r.sort((o,s)=>o.file.localeCompare(s.file)||(o.detail??"").localeCompare(s.detail??"")).slice(0,it)}function Ut(e){let t=new Map;for(let r of e){let o=zt(r),s=t.get(o);if(!s){t.set(o,{...r,evidence:[...r.evidence]});continue}let n=st[s.source],i=st[r.source];i>n?t.set(o,{...r,evidence:[...r.evidence,...s.evidence]}):i===n&&s.evidence.push(...r.evidence);}return [...t.values()].map(r=>({from:r.from,to:r.to,kind:r.kind,source:r.source,confidence:r.confidence,evidence:qt(r.evidence)})).sort((r,o)=>r.from.localeCompare(o.from)||r.to.localeCompare(o.to)||r.kind.localeCompare(o.kind)||r.source.localeCompare(o.source))}function ye(e){return Math.round(e*1e3)/1e3}function Jt(e){return Math.max(0,Math.min(100,Math.round(e)))}function Xt(e){return e>=75?"critical":e>=50?"high":e>=20?"medium":"low"}function Yt(e){return e==="critical"||e==="high"?"strict":e==="medium"?"elevated":"normal"}function Qt(e,t){let r=a$6({nodes:e,edges:t}),o=new Map;for(let s of e){let n=r.byId.get(s.id)??{fanIn:0,fanOut:0,reach:0,betweenness:0,isHotspot:false},i=t.filter(m=>m.from===s.id||m.to===s.id),a=i.filter(m=>m.source==="contract"||m.source==="manual").length,c=i.filter(m=>m.confidence==="low").length,d=[],u=n.reach*20+n.fanIn*14+n.fanOut*8+Math.min(20,n.betweenness*4)+a*8;n.isHotspot&&(u+=24,d.push("Critical-path hotspot in dependency graph")),n.reach>0&&d.push(`Change reaches ${n.reach} dependent project(s)`),n.fanIn>0&&d.push(`${n.fanIn} direct dependent project(s)`),n.fanOut>0&&d.push(`${n.fanOut} direct dependency project(s)`),a>0&&d.push(`${a} contract/manual edge(s)`),c>0&&d.push(`${c} low-confidence inferred edge(s) need review`),i.length===0&&d.push("No dependency evidence connected to this project yet");let p=Jt(u),l=Xt(p);o.set(s.id,{weight:l,score:p,verificationPriority:Yt(l),reasons:d.slice(0,5),centrality:{fanIn:n.fanIn,fanOut:n.fanOut,reach:n.reach,betweenness:n.betweenness,isHotspot:n.isHotspot}});}return o}function Zt(e,t){let r=Qt(e,t);return e.map(o=>({...o,operationalProfile:r.get(o.id)}))}function er(e,t){let r=new Set;for(let c of t)r.add(c.from),r.add(c.to);let o=e.length,s=t.length,n=e.filter(c=>r.has(c.id)).length,i=Math.max(0,o-n),a=a$6({nodes:e,edges:t});return {nodeCount:o,edgeCount:s,inferredEdges:t.filter(c=>c.source==="inferred").length,contractEdges:t.filter(c=>c.source==="contract").length,manualEdges:t.filter(c=>c.source==="manual").length,authoritativeEdges:t.filter(c=>c.source==="contract"||c.source==="manual").length,lowConfidenceEdges:t.filter(c=>c.confidence==="low").length,orphanCount:i,connectedNodeCount:n,density:ye(o>1?s/(o*(o-1)):0),edgeCoverageRatio:ye(o>0?n/o:1),evidenceCoverageRatio:ye(s>0?t.filter(c=>c.evidence.length>0).length/s:1),hotspotCount:a.hotspots.length,hasCycle:rr(e,t)}}function tr(e,t,r){let o=[],s=e.filter(n=>!t.some(i=>i.from===n.id||i.to===n.id)).map(n=>n.id).sort((n,i)=>n.localeCompare(i));return r.nodeCount===0&&o.push({code:"graph.empty",severity:"info",message:"Workspace model has no projects, so dependency reasoning is unavailable.",recommendation:"Import, scaffold, or register projects before relying on graph-aware impact."}),r.nodeCount>1&&r.edgeCount===0?o.push({code:"graph.edges.missing",severity:"warning",message:"Projects were detected, but no inter-project dependency edges were found.",recommendation:"Run graph explain, add workspace contract relationships, or define manual graph overrides for operational dependencies that code imports cannot reveal.",nodeIds:s}):r.orphanCount>0&&o.push({code:"graph.orphans.detected",severity:"warning",message:`${r.orphanCount} project(s) have no dependency evidence connected to the graph.`,recommendation:"Review isolated projects and add package, contract, or manual edges when they participate in release-critical flows.",nodeIds:s.slice(0,12)}),r.lowConfidenceEdges>0&&o.push({code:"graph.low_confidence_edges",severity:"info",message:`${r.lowConfidenceEdges} inferred edge(s) are low confidence.`,recommendation:"Promote important low-confidence relationships to workspace contract or manual overrides."}),r.edgeCount>0&&r.evidenceCoverageRatio<1&&o.push({code:"graph.evidence.partial",severity:"warning",message:"Some dependency edges do not include file-level evidence.",recommendation:"Attach evidence to manual overrides so agents can audit why a relationship exists."}),r.hasCycle&&o.push({code:"graph.cycle.detected",severity:"error",message:"The dependency graph contains at least one directed cycle.",recommendation:"Break the cycle or document the relationship explicitly before using graph-aware release gates."}),o.sort((n,i)=>{let a={error:0,warning:1,info:2};return a[n.severity]-a[i.severity]||n.code.localeCompare(i.code)})}function rr(e,t){let r=new Map;for(let c of e)r.set(c.id,[]);for(let c of t)r.has(c.from)||r.set(c.from,[]),r.get(c.from)?.push(c.to);let o=0,s=1,n=2,i=new Map;for(let c of r.keys())i.set(c,o);let a=c=>{let d=[{id:c,index:0}];for(i.set(c,s);d.length>0;){let u=d[d.length-1],p=r.get(u.id)??[];if(u.index>=p.length){i.set(u.id,n),d.pop();continue}let l=p[u.index];u.index+=1;let m=i.get(l)??o;if(m===s)return true;m===o&&(i.set(l,s),d.push({id:l,index:0}));}return false};for(let c of [...r.keys()].sort())if(i.get(c)===o&&a(c))return true;return false}function ft(e,t,r,o){let s=Ut(r.filter(c=>t.has(c.from)&&t.has(c.to))),n=Zt(e,s),i=er(e,s),a=tr(e,s,i);return {schemaVersion:e$1,generatedAt:(o??new Date).toISOString(),nodes:n,edges:s,stats:i,...a.length>0?{diagnostics:a}:{}}}async function mt(e){let t=f.resolve(e.workspacePath),r=e.maxImportFilesPerProject??at,o=ct(e.model),s=new Set(o.map(a=>a.id)),n=dt(t,e.model),i=[];return i.push(...await pt(t,n)),i.push(...await ve(t,n,r)),e.contract&&i.push(...lt(t,n,e.contract)),i.push(...await ut(t,s)),ft(o,s,i,e.now)}async function gt(e){let t=f.resolve(e.workspacePath),r=e.maxImportFilesPerProject??at,o=ct(e.model),s=new Set(o.map(a=>a.id)),n=dt(t,e.model),i=[];if(i.push(...await pt(t,n)),e.structuralChange)i.push(...await ve(t,n,r));else {i.push(...await ve(t,n,r,e.changedProjectIds));for(let a of e.previousGraph.edges)a.kind==="code-import"&&a.source==="inferred"&&!e.changedProjectIds.has(a.from)&&s.has(a.from)&&s.has(a.to)&&i.push({from:a.from,to:a.to,kind:"code-import",source:"inferred",confidence:a.confidence,evidence:a.evidence});}return e.contract&&i.push(...lt(t,n,e.contract)),i.push(...await ut(t,s)),ft(o,s,i,e.now)}var Pe="workspace-model-cache.v1",je=".workspai/cache/workspace-model.v1.json",ht=["package.json","pyproject.toml","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","workspai.project.json",".workspai/project.json",".workspai/context.json","rapidkit.project.json",".rapidkit/project.json",".rapidkit/context.json"],kt=[".workspai/workspace.contract.json",".workspai/workspace.json","workspai.workspace.json",".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"],sr=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),ar=new Set([".git",".workspai",".rapidkit","node_modules","dist","build","out","target","coverage",".next",".turbo",".cache",".venv"]),ir=1500,z=null;function Ce(){if(z)return z;try{z=createRequire(import.meta.url)("../package.json")?.version??"0.0.0";}catch{z="0.0.0";}return z}async function oe(e){try{let t=await E.readFile(e);return It.createHash("sha256").update(t).digest("hex")}catch{return null}}async function cr(e){let t={};for(let s of ht){let n=await oe(f.join(e,s));n&&(t[s]=n);}let r=[],o=[e];for(;o.length>0&&r.length<ir;){let s=o.shift();if(!s)continue;let n=[];try{n=await E.readdir(s,{withFileTypes:true});}catch{continue}let i=[];for(let a of n)if(a.isDirectory()){if(ar.has(a.name)||a$4(a.name)||a.name.startsWith("."))continue;i.push(f.join(s,a.name));}else if(a.isFile()&&sr.has(f.extname(a.name))){let c=f.join(s,a.name),d=await E.stat(c).catch(()=>null);if(d){let u=f.relative(e,c).split(f.sep).join("/");r.push(`${u}:${d.size}:${Math.round(d.mtimeMs)}`);}}i.sort((a,c)=>a.localeCompare(c)),o.push(...i);}return r.sort((s,n)=>s.localeCompare(n)),$({manifests:t,source:r})}async function se(e,t){let r=f.resolve(e),o={},s=[...new Set(t.map(n=>f.relative(r,f.resolve(n)).split(f.sep).join("/")))].sort((n,i)=>n.localeCompare(i));for(let n of s)o[n]=await cr(f.join(r,n));return o}async function ae(e){let t=f.resolve(e),r={};for(let o of kt){let s=await oe(f.join(t,o));s&&(r[o]=s);}return r}async function ie(e){let t=f.resolve(e.workspacePath),r=[...new Set(e.projectPaths.map(n=>f.relative(t,f.resolve(n)).split(f.sep).join("/")))].sort((n,i)=>n.localeCompare(i)),o=[];for(let n of r){let i={};for(let a of ht){let c=await oe(f.join(t,n,a));c&&(i[a]=c);}o.push({project:n,manifests:i});}let s={};for(let n of kt){let i=await oe(f.join(t,n));i&&(s[n]=i);}return $({cacheSchema:Pe,cliVersion:e.cliVersion,flags:e.flags,workspaceJson:e.workspaceJson??null,marker:e.marker??null,projects:o,workspaceFiles:s})}async function Se(e){let t=await d$2(e,je)??a$5(e,je);try{if(!await E.pathExists(t))return null;let r=await E.readJson(t);return !r||r.schemaVersion!==Pe||typeof r.inputsHash!="string"||typeof r.cliVersion!="string"||!r.model?null:r}catch{return null}}async function ce(e$1,t){let r={schemaVersion:Pe,...t};return e(e$1,je,r)}var yt="rapidkit-fact-freshness-v1",U={durable:720*60*60,derived:10080*60,evidenceBacked:1440*60,live:300,verifyBeforeUse:1440*60};function dr(e){switch(e){case "durable":return U.durable;case "derived":return U.derived;case "evidence-backed":return U.evidenceBacked;case "live":return U.live;case "verify-before-use":return U.verifyBeforeUse}}function pr(e){if(e.status)return e.status;if(e.ttlSeconds===null)return "unknown";let t=Date.parse(e.generatedAt);if(!Number.isFinite(t))return "unknown";let r=t+e.ttlSeconds*1e3;return e.now.getTime()>r?"stale":"fresh"}function lr(e){let t=e.now??new Date,r=e.generatedAt??t.toISOString(),o=Date.parse(r),s=Number.isFinite(o),n=s?r:t.toISOString(),i=e.ttlSeconds===void 0?dr(e.kind):e.ttlSeconds,a=pr({generatedAt:n,ttlSeconds:i,status:e.status??(s?void 0:"unknown"),now:t}),c=Date.parse(n),d=i===null||!Number.isFinite(c)?void 0:new Date(c+i*1e3),u=e.verifyBeforeUse??(e.kind==="live"||e.kind==="verify-before-use"||e.category!=="structure"||a!=="fresh");return {schemaVersion:yt,kind:e.kind,category:e.category,generatedAt:n,ttlSeconds:i,...d?{expiresAt:d.toISOString()}:{},status:a,verifyBeforeUse:u,...e.sourceArtifact?{sourceArtifact:e.sourceArtifact}:{},...e.sourcePath?{sourcePath:e.sourcePath}:{},inputsHash:e.inputsHash??$(e.value??null),reason:e.reason}}function b(e){return {id:e.id,label:e.label,scope:e.scope,value:e.value,...e.project?{project:e.project}:{},freshness:lr({...e.freshness,value:e.value})}}function wt(e){let t=e.generatedAt??(e.now??new Date).toISOString(),r={durable:0,derived:0,"evidence-backed":0,live:0,"verify-before-use":0},o={structure:0,verification:0,state:0},s=0,n=0,i=0,a=0;for(let c of e.facts)r[c.freshness.kind]+=1,o[c.freshness.category]+=1,c.freshness.status==="stale"&&(s+=1),c.freshness.status==="unknown"&&(n+=1),c.freshness.kind==="live"&&(i+=1),c.freshness.verifyBeforeUse&&(a+=1);return {schemaVersion:yt,generatedAt:t,status:s>0?"stale":n>0?"unknown":"fresh",totalFacts:e.facts.length,staleFacts:s,unknownFacts:n,liveFacts:i,verifyBeforeUseFacts:a,byKind:r,byCategory:o}}var ur=b$1.model,de=a.model;function Ee(e){return e.projectTopology??e.graph}function bt(e){return !!(e.projectTopology&&e.graph&&c$1(e.projectTopology)===c$1(e.graph))}function An(e){let t=e.engineStatus==="hit"||e.engineStatus==="unchanged"?"reused":e.engineStatus==="incremental"?"partially-reused":"rebuilt";return {schemaVersion:"workspace-model-build.v1",mode:e.mode,outcome:t,engineStatus:e.engineStatus}}var fr=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","deno.jsonc","bun.lock","bun.lockb","deps.edn","project.clj","build.sbt","docker-compose.yml","docker-compose.yaml","terraform.tf"],mr=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next",".turbo"]);function jt(e,t){return (f.relative(e,t)||".").split(f.sep).join("/")}async function Pt(e){try{if(!await E.pathExists(e))return null;let t=await E.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function gr(e,t){for(let r of t)if(await E.pathExists(f.join(e,r)))return true;return false}function We(e){let t=Number.parseInt(process.env.RAPIDKIT_WORKSPACE_MODEL_SCAN_DEPTH??"",10),r=typeof e=="number"&&Number.isFinite(e)?e:Number.isFinite(t)?t:4;return Math.min(12,Math.max(1,Math.trunc(r)))}async function xe(e,t){let r=f.resolve(e),o=[{dirPath:r,depth:0}],s=new Set,n=new Set;for(;o.length>0;){let i=o.shift();if(!i)continue;let a=f.resolve(i.dirPath);if(n.has(a))continue;if(n.add(a),a!==r&&await gr(a,fr)){s.add(a);continue}if(i.depth>=t)continue;let c=[];try{c=await E.readdir(a,{withFileTypes:true});}catch{continue}for(let d of c)!d.isDirectory()||mr.has(d.name)||a$4(d.name)||d.name.startsWith(".")&&d.name!==".config"||o.push({dirPath:f.join(a,d.name),depth:i.depth+1});}return Array.from(s).sort((i,a)=>i.localeCompare(a))}function Re(e){let t=new Set,r=[];for(let o of e){let s=f.resolve(o);t.has(s)||(t.add(s),r.push(s));}return r.sort((o,s)=>o.localeCompare(s))}function vt(e,t){let r=e?.[t];return typeof r=="string"&&r.trim()?r.trim():void 0}function hr(e,t){return e?.[t]===true}function kr(e,t,r){let o=e?.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=vt(o,"generator"),n=vt(o,"command_display"),i=typeof t=="string"&&t.startsWith("frontend.");if(!(!s&&!i))return {...s?{id:s}:{},...t?{kit:t}:{},displayName:r,source:hr(o,"official_generator")?"official-generator":"metadata",...n?{commandDisplay:n}:{}}}async function yr(e){let t=[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json","package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","Dockerfile","docker-compose.yml","README.md"],r=[];for(let o of t)await E.pathExists(f.join(e,o))&&r.push(o);return r}async function S(e,t,r,o=t){let s=await d$2(e,t),n=s!==null,i={path:o.split(f.sep).join("/"),exists:n};if(s&&r){let a=await Pt(s);typeof a?.generatedAt=="string"&&(i.generatedAt=a.generatedAt);let c=a?.status??a?.result??a?.verdict;typeof c=="string"&&(i.status=c);}return i}async function wr(e,t,r){let o=jt(e,t),s=".workspai/reports",n=c=>S(t,`${s}/${c}`,r,`${o}/${s}/${c}`),i=await n("doctor-project-last-run.json");return {doctor:i?.exists===true?i:await n("doctor-last-run.json"),remediationPlan:await n("doctor-remediation-plan-last-run.json"),fixResult:await n("doctor-fix-result-last-run.json"),analyze:await n("analyze-last-run.json"),readiness:await n("release-readiness-last-run.json")}}async function vr(e,t,r){let o=i$1(t),s=j$1(t,o),n=w(t),i=f$2(s.runtime),a=await rt(t,o),c=r.contractProject?.slug?r.contractProject.slug:typeof o?.name=="string"&&o.name.trim()?o.name.trim():f.basename(t),d=typeof o?.kit_name=="string"?o.kit_name:typeof o?.kit=="string"?o.kit:r.contractProject?.kit,u=typeof o?.engine=="string"?o.engine:n.engine!=="unknown"?n.engine:void 0,p=kr(o,d,s.displayName),l=nt({kitId:d,framework:s.key,runtime:s.runtime}),m=f.relative(e,t),h$1=m===".."||m.startsWith(`..${f.sep}`)?i$2(t):h(t),W=[s.runtime,...h$1.filter(x=>x!==s.runtime)];return {name:c,path:jt(e,t),...r.includeAbsolutePaths?{absolutePath:t}:{},kind:a,category:tt(a),runtime:s.runtime,runtimeCandidates:W,framework:s.key,frameworkDisplayName:s.displayName,confidence:s.confidence,detectionSource:s.source,supportTier:s.supportTier,runtimeSupportTier:i.tier,runtimeDoctorSupport:i.doctorSupport,moduleSupport:n.moduleSupport,...d?{kit:d}:{},...u?{engine:u}:{},...p?{generator:p}:{},createCapability:l,commands:{supported:n.supportedCommands,unsupported:n.unsupportedCommands,global:n.globalCommands,fleetStages:n.fleetStages,localOnly:n.localOnlyCommands,map:n.commandMap},importantFiles:await yr(t),evidence:await wr(e,t,r.includeEvidence),provenance:{path:r.contractProject?"workspace contract declaration reconciled with filesystem discovery":"filesystem discovery",runtime:s.source,framework:s.source,commands:"project command capability matrix",createCapability:"create planner capability contract",evidence:"project .workspai/reports"}}}async function Ae(e){for(let t of s(e,"workspace.json")){let r=await Pt(t);if(r)return r}return null}function br(e){if(e.length===0)return "empty-workspace";let t=new Set(e.map(r=>r.category));return t.size>1?"polyglot-product-workspace":t.has("frontend")&&e.length>1?"full-stack-workspace":t.has("frontend")?"frontend-workspace":t.has("desktop")?"desktop-application-workspace":t.has("extension")?"extension-workspace":t.has("library")?"library-workspace":e.length>1?"backend-platform":"backend-workspace"}function jr(e){let t=new Set;for(let r of e){let o=`${r.name} ${r.path}`.toLowerCase();for(let s of ["auth","billing","payment","notification","order","admin","report","search","analytics"])o.includes(s)&&t.add(s);}return Array.from(t).sort()}function P(e,t,r,o){return {severity:e,code:t,message:r,target:o}}function Ct(e){let t=[];e.workspace.name.trim()||t.push(P("error","workspace.name.missing","Workspace name could not be resolved.","workspace")),e.workspace.type==="observed-workspace"&&t.push(P("warning","workspace.marker.missing","Workspace marker is missing; model is based on filesystem observation.","workspace.marker")),e.summary.projectCount===0&&t.push(P("warning","workspace.projects.empty","No project roots were detected in this workspace.","projects")),e.contracts.exists||t.push(P("warning","workspace.contract.missing","Workspace contract is missing; dependency and API edges may be incomplete.",e.contracts.workspaceContractPath));let r=new Map;for(let n of e.projects){let i=n.name.toLowerCase(),a=r.get(i)??[];a.push(n),r.set(i,a),n.importantFiles.length||t.push(P("warning","project.markers.missing",`Project ${n.name} has no important manifest files recorded.`,n.path));let c=f.isAbsolute(n.path)?n.path:f.resolve(e.workspace.root,n.path);E.existsSync(c)||t.push(P("warning","project.path.missing",`Registered project ${n.name} is not available at its declared path.`,n.path)),n.runtime==="unknown"&&t.push(P("warning","project.runtime.unknown",`Project ${n.name} runtime could not be confidently detected.`,n.path));let d=["test","build"];for(let l of d)n.commands.supported.includes(l)&&n.commands.unsupported.includes(l)&&t.push(P("error","project.commands.conflict",`Project ${n.name} marks ${l} as both supported and unsupported.`,n.path));let u=new Set(n.commands.fleetStages),p=new Set(n.commands.localOnly);for(let l of n.commands.fleetStages){p.has(l)&&t.push(P("error","project.commands.scope-conflict",`Project ${n.name} marks ${l} as both fleet and local-only.`,n.path));let m=n.commands.map[l];(!m||m.status!=="supported"||m.fleetEligible!==true||m.executionScope!=="fleet")&&t.push(P("error","project.commands.fleet-stage-invalid",`Project ${n.name} advertises ${l} as a fleet stage without a supported fleet capability.`,n.path));}for(let l of n.commands.localOnly){let m=n.commands.map[l];(!m||m.status!=="supported"||m.executionScope!=="local-only"||m.fleetEligible===true)&&t.push(P("error","project.commands.local-only-invalid",`Project ${n.name} advertises ${l} as local-only without a matching local-only capability.`,n.path));}for(let l of Object.values(n.commands.map))l.status==="supported"&&(l.fleetEligible===true&&!u.has(l.command)&&t.push(P("error","project.commands.fleet-stage-missing",`Project ${n.name} capability ${l.command} is fleet-eligible but missing from fleetStages.`,n.path)),l.executionScope==="local-only"&&l.fleetEligible!==true&&!p.has(l.command)&&t.push(P("error","project.commands.local-only-missing",`Project ${n.name} capability ${l.command} is local-only but missing from localOnly commands.`,n.path)));}for(let[n,i]of r.entries())i.length>1&&t.push(P("error","project.name.duplicate",`Project name "${n}" is ambiguous across ${i.length} project roots.`,i.map(a=>a.path).join(", ")));e.projectTopology&&e.graph&&c$1({...e.projectTopology,generatedAt:"<ignored>"})!==c$1({...e.graph,generatedAt:"<ignored>"})&&t.push(P("error","workspace.project-topology.alias-mismatch","Deprecated model.graph must remain structurally identical to canonical model.projectTopology during the v1 migration window.","projectTopology"));let o=t.filter(n=>n.severity==="error").length,s=t.filter(n=>n.severity==="warning").length;return {status:o>0?"failed":s>0?"warning":"passed",errors:o,warnings:s,issues:t}}function Mn(e){return Ct(e)}function j(e){return e.join(".")}function Pr(e,t){let r=de,o=e.generatedAt,s=[b({id:"workspace.name",label:"Workspace name",scope:"workspace",value:e.workspace.name,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["workspace","name"]),reason:"Workspace identity is structural metadata and changes through workspace setup."}}),b({id:"workspace.type",label:"Workspace type",scope:"workspace",value:e.identity.workspaceType,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["identity","workspaceType"]),reason:"Workspace type is derived from the current project inventory."}}),b({id:"workspace.projectCount",label:"Project count",scope:"workspace",value:e.summary.projectCount,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["summary","projectCount"]),reason:"Project count is derived from workspace discovery and should be refreshed after structural changes."}}),b({id:"workspace.runtimeFamilies",label:"Runtime families",scope:"workspace",value:e.identity.runtimeFamilies,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["identity","runtimeFamilies"]),reason:"Runtime coverage is inferred from project surfaces."}}),b({id:"workspace.policyMode",label:"Workspace policy mode",scope:"policy",value:e.policies.mode,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["policies","mode"]),reason:"Policy mode is configuration, not runtime state."}}),b({id:"workspace.contract.exists",label:"Workspace contract presence",scope:"contract",value:e.contracts.exists,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["contracts","exists"]),reason:"Contract presence is derived from workspace files and should be refreshed before release gating."}})],n=Ee(e);n&&s.push(b({id:"graph.edgeCount",label:"Dependency graph edge count",scope:"graph",value:n.stats.edgeCount,freshness:{kind:"derived",category:"structure",generatedAt:n.generatedAt??o,now:t,sourceArtifact:r,sourcePath:j(["projectTopology","stats","edgeCount"]),reason:"Graph topology is derived from manifests, imports, and workspace contracts."}}),b({id:"graph.evidenceCoverageRatio",label:"Dependency graph evidence coverage",scope:"graph",value:n.stats.evidenceCoverageRatio,freshness:{kind:"derived",category:"structure",generatedAt:n.generatedAt??o,now:t,sourceArtifact:r,sourcePath:j(["projectTopology","stats","evidenceCoverageRatio"]),reason:"Graph evidence coverage changes when dependency evidence or contract edges change."}}));for(let[i,a]of e.projects.entries()){let c=`projects[${i}]`,d={kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,reason:"Project facts are derived from workspace discovery, project metadata, and framework probes."};s.push(b({id:`project.${a.name}.kind`,label:`${a.name} kind`,scope:"project",project:a.name,value:a.kind,freshness:{...d,sourcePath:j([c,"kind"])}}),b({id:`project.${a.name}.category`,label:`${a.name} category`,scope:"project",project:a.name,value:a.category,freshness:{...d,sourcePath:j([c,"category"])}}),b({id:`project.${a.name}.runtime`,label:`${a.name} runtime`,scope:"project",project:a.name,value:a.runtime,freshness:{...d,sourcePath:j([c,"runtime"])}}),b({id:`project.${a.name}.framework`,label:`${a.name} framework`,scope:"project",project:a.name,value:a.frameworkDisplayName,freshness:{...d,sourcePath:j([c,"frameworkDisplayName"])}}),b({id:`project.${a.name}.supportTier`,label:`${a.name} support tier`,scope:"project",project:a.name,value:a.supportTier,freshness:{...d,sourcePath:j([c,"supportTier"])}}),b({id:`project.${a.name}.safeFleetStages`,label:`${a.name} safe fleet stages`,scope:"command",project:a.name,value:a.commands.fleetStages,freshness:{...d,sourcePath:j([c,"commands","fleetStages"]),reason:"Safe command availability is derived from package and project command surfaces."}}));for(let[u,p]of Object.entries(a.evidence))s.push(b({id:`project.${a.name}.evidence.${u}`,label:`${a.name} ${u} evidence`,scope:"evidence",project:a.name,value:p?{path:p.path,exists:p.exists,status:p.status??null}:{exists:false},freshness:{kind:p?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:p?.generatedAt??o,now:t,status:p?.exists?void 0:"unknown",sourceArtifact:p?.path??r,sourcePath:j([c,"evidence",u]),verifyBeforeUse:true,reason:p?.exists?"Evidence reports can expire or become stale after source changes.":"Missing evidence must be generated before this fact is used for verification."}}));}for(let[i,a]of Object.entries(e.evidence))s.push(b({id:`workspace.evidence.${i}`,label:`Workspace ${i} evidence`,scope:"evidence",value:a?{path:a.path,exists:a.exists,status:a.status??null}:null,freshness:{kind:a?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:a?.generatedAt??o,now:t,status:a?.exists?void 0:"unknown",sourceArtifact:a?.path??r,sourcePath:j(["evidence",i]),verifyBeforeUse:true,reason:a?.exists?"Workspace evidence can expire or become stale after project, dependency, or policy changes.":"Missing workspace evidence must be generated before release or repair decisions."}}));return s}async function pe(e){let t=f.resolve(e.workspacePath),r=e.includeAbsolutePaths===true,o=e.includeEvidence===true,s$1=We(e.observableScanDepth),n=e.now??new Date,[i,a$4,c,d,u,p]=await Promise.all([a$1(t),Ae(t),Me(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),xe(t,s$1)]),l=new Map;for(let g of c?.projects??[]){let ue=g.externalPath?f.resolve(g.externalPath):f.resolve(t,g.relativePath);l.set(ue,g);}let m=Re([...u,...p,...l.keys(),...d.map(g=>f.isAbsolute(g.path)?g.path:f.join(t,g.path))]),v=e.reuseProjectModels,h=await Promise.all(m.map(g=>{if(v){let ue=f.relative(t,f.resolve(g)).split(f.sep).join("/"),Ie=v.get(ue);if(Ie)return Promise.resolve(Ie)}return vr(t,g,{includeAbsolutePaths:r,includeEvidence:o,contractProject:l.get(f.resolve(g))})})),W=typeof a$4?.workspace_name=="string"?a$4.workspace_name:typeof a$4?.name=="string"?a$4.name:i?.name||c?.workspace.name||f.basename(t),x=typeof a$4?.profile=="string"?a$4.profile:typeof a$4?.mode=="string"?a$4.mode:c?.workspace.profile,H=Array.from(new Set(h.map(g=>g.kind))).sort(),le=Array.from(new Set(h.map(g=>g.category))).sort(),K=Array.from(new Set(h.flatMap(g=>g.runtimeCandidates.length>0?g.runtimeCandidates:[g.runtime]))).sort(),J=Array.from(new Set(h.map(g=>g.framework))).sort(),I=[".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/policies.yml",".rapidkit/policies.yaml"].find(g=>E.existsSync(f.join(t,g))),X=s(t,"workspace.contract.json").map(g=>f.relative(t,g).split(f.sep).join("/")).find(g=>E.existsSync(f.join(t,g)))??".workspai/workspace.contract.json",R=await E.pathExists(f.join(t,X)),Y={schemaVersion:ur,generatedAt:n.toISOString(),workspace:{name:W,root:t,...x?{profile:x}:{},type:i?"rapidkit-workspace":"observed-workspace",...i?{marker:{createdBy:i.createdBy,version:i.version,createdAt:i.createdAt}}:{}},identity:{workspaceType:br(h),surfaces:H,categories:le,runtimeFamilies:K,businessCapabilities:jr(h)},discovery:{observableScanDepth:s$1},projects:h,policies:{mode:typeof a$4?.policy_mode=="string"?a$4.policy_mode:typeof a$4?.policyMode=="string"?a$4.policyMode:"warn",source:I??null,exists:!!I},contracts:{workspaceContractPath:X,exists:R,status:R?"known":"missing"},evidence:{doctor:await S(t,a.doctor,o),projectDoctor:await S(t,".workspai/reports/doctor-project-last-run.json",o),doctorRemediationPlan:await S(t,".workspai/reports/doctor-remediation-plan-last-run.json",o),artifactRemediationPlan:await S(t,".workspai/reports/artifact-remediation-plan-last-run.json",o),doctorFixResult:await S(t,".workspai/reports/doctor-fix-result-last-run.json",o),analyze:await S(t,a.analyze,o),readiness:await S(t,a.readiness,o),pipeline:await S(t,".workspai/reports/pipeline-last-run.json",o)},summary:{projectCount:h.length,runtimes:K,frameworks:J,firstClassProjects:h.filter(g=>g.supportTier==="first-class").length,observedProjects:h.filter(g=>g.supportTier==="observed").length}},w=await St(t,Y,{contractExists:R,now:n,incrementalGraph:e.incrementalGraph}),C={...Y,projectTopology:w,graph:w},A=Ct(C),F=Pr({...C},n),Et=wt({facts:F,generatedAt:n.toISOString(),now:n});return {...C,facts:F,factFreshness:Et,validation:A}}async function In(e){if(e.cache!==true)return {model:await pe(e),cache:"disabled"};let t=f.resolve(e.workspacePath),r=We(e.observableScanDepth),o=Ce(),[s,n,i,a,c]=await Promise.all([a$1(t),Ae(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),xe(t,r)]),d=Re([...a,...c,...i.map(h=>f.isAbsolute(h.path)?h.path:f.join(t,h.path))]),u=await ie({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:d,workspaceJson:n,marker:s}),p=await Se(t);if(p&&p.cliVersion===o&&p.inputsHash===u&&bt(p.model))return {model:p.model,cache:"hit"};let l=await pe({...e}),[m,v]=await Promise.all([se(t,d),ae(t)]);return await ce(t,{cliVersion:o,inputsHash:u,generatedAt:(e.now??new Date).toISOString(),model:l,projectSignatures:m,workspaceFileSignatures:v}),{model:l,cache:"miss"}}function Cr(e,t){let r=new Set,o=new Set,s=new Set;for(let[n,i]of Object.entries(t))n in e?e[n]!==i&&r.add(n):o.add(n);for(let n of Object.keys(e))n in t||s.add(n);return {changed:r,added:o,removed:s}}function Sr(e={},t={}){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r)if(e[o]!==t[o])return false;return true}async function Fn(e){let t=f.resolve(e.workspacePath),r=We(e.observableScanDepth),o=Ce(),s=e.now??new Date,[n,i,a,c,d]=await Promise.all([a$1(t),Ae(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),xe(t,r)]),u=Re([...c,...d,...a.map(w=>f.isAbsolute(w.path)?w.path:f.join(t,w.path))]),p=await Se(t),l=async()=>{let w=await pe({...e}),C=await ie({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:u,workspaceJson:i,marker:n}),[A,F]=await Promise.all([se(t,u),ae(t)]);return await ce(t,{cliVersion:o,inputsHash:C,generatedAt:s.toISOString(),model:w,projectSignatures:A,workspaceFileSignatures:F}),{model:w,mode:"full"}},m=p?Ee(p.model):void 0;if(!p||p.cliVersion!==o||!p.projectSignatures||!m||!bt(p.model))return l();let v=await ae(t);if(!Sr(p.workspaceFileSignatures,v))return l();let h=await se(t,u),{changed:W,added:x,removed:H}=Cr(p.projectSignatures,h);if(W.size===0&&x.size===0&&H.size===0)return {model:p.model,mode:"unchanged"};let le=new Set([...W,...x]),K=new Map;for(let w of p.model.projects){let C=w.path.split(f.sep).join("/");!le.has(C)&&!H.has(C)&&K.set(C,w);}let J=new Set,I=false;for(let w of p.model.projects){let C=w.path.split(f.sep).join("/");W.has(C)&&J.add(w.name);}let X=x.size>0||H.size>0,R=await pe({...e,reuseProjectModels:K,incrementalGraph:{previousGraph:m,changedProjectIds:J,structuralChange:X||I}});for(let w of p.model.projects){let C=w.path.split(f.sep).join("/");if(!W.has(C))continue;let A=R.projects.find(F=>F.path.split(f.sep).join("/")===C);if(A&&A.name!==w.name){I=true;break}}if(I)return l();let Y=await ie({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:u,workspaceJson:i,marker:n});return await ce(t,{cliVersion:o,inputsHash:Y,generatedAt:s.toISOString(),model:R,projectSignatures:h,workspaceFileSignatures:v}),{model:R,mode:"incremental"}}async function Me(e){try{let{contract:t}=await p({workspacePath:e});return t&&typeof t=="object"?t:null}catch{return null}}async function St(e,t,r){let o=r.contractExists?await Me(e):null;try{return r.incrementalGraph?await gt({workspacePath:e,model:t,contract:o,now:r.now,previousGraph:r.incrementalGraph.previousGraph,changedProjectIds:r.incrementalGraph.changedProjectIds,structuralChange:r.incrementalGraph.structuralChange}):await mt({workspacePath:e,model:t,contract:o,now:r.now})}catch{let s=t.projects.map(n=>({id:n.name,path:n.path}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:r.now.toISOString(),nodes:s,edges:[],stats:{nodeCount:s.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:s.length,connectedNodeCount:0,density:0,edgeCoverageRatio:s.length>0?0:1,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:s.length>1?[{code:"graph.inference.failed",severity:"warning",message:"Dependency graph inference failed; model contains projects but no dependency edges.",recommendation:"Run workspace model again after fixing graph inputs, or add workspace contract/manual graph overrides.",nodeIds:s.map(n=>n.id).sort((n,i)=>n.localeCompare(i))}]:void 0}}}async function Dn(e,t){let r=e.contracts.exists?await Me(t):null,{buildWorkspaceKnowledgeGraph:o}=await import('./workspace-knowledge-graph-LEM6X5CM.js'),s=d(e),n=await o({workspacePath:t,workspace:{name:e.workspace.name,...e.workspace.profile?{profile:e.workspace.profile}:{}},projects:e.projects.map(a=>({id:a.name,path:a.path,...a.absolutePath?{absolutePath:a.absolutePath}:{},runtime:a.runtime,runtimeCandidates:a.runtimeCandidates,framework:a.framework,kind:a.kind,category:a.category,...a.kit?{kit:a.kit}:{}})),projectTopology:Ee(e)??await St(t,e,{contractExists:e.contracts.exists,now:new Date(e.generatedAt)}),contract:r,now:new Date(e.generatedAt),source:{kind:"workspace-model",artifact:de,hashAlgorithm:"sha256",hash:d$1(s)}}),[,i]=await f$1(t,de,[{relativePath:a.knowledgeGraph,payload:n},{relativePath:de,payload:s}]);return i}export{tt as a,rt as b,nt as c,Dr as d,Tr as e,$ as f,yt as g,b as h,wt as i,ur as j,de as k,Ee as l,An as m,Mn as n,Pr as o,pe as p,In as q,Fn as r,Dn as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {c,e}from'./chunk-
|
|
1
|
+
import {c,e}from'./chunk-MBRU3VWJ.js';import {s}from'./chunk-MOSXTVPU.js';import u from'fs';import d from'path';var a="workspace-run-v1",p="workspace-run-last.json",o=`.workspai/reports/${p}`;var m=new Set(["init","test","build","start"]);function A(e){return m.has(e)}async function w(e){try{return await u.promises.access(e,u.constants.F_OK),true}catch{return false}}async function W(e){try{let r=await u.promises.readFile(e,"utf-8");return JSON.parse(r)}catch{return null}}function S(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function P(e){let r=e.stage;return typeof r!="string"||r.trim().length===0||!Array.isArray(e.projects)?false:A(r)||/^[a-z][a-z0-9_-]*$/i.test(r)}function _(e){let r=S(e);return !r||r.schemaVersion===a?false:P(r)}function h(e){let r=S(e);return r?r.schemaVersion===a&&r.stages!=null:false}function R(e){if(h(e))return e;if(_(e)){let r=e.stage;return {schemaVersion:a,generatedAt:e.generatedAt,workspacePath:e.workspacePath,latestStage:r,stages:{[r]:e},enterpriseControls:e.enterpriseControls??{jsonReady:true,evidencePath:o}}}return null}function x(e,r){let n=R(e);if(!n)return null;let t=r??n.latestStage;return n.stages[t]??null}async function L(e){let r=(await Promise.all(s(d.resolve(e),"reports",p).map(async t=>await w(t)?t:null))).find(t=>typeof t=="string");if(!r)return null;let n=await W(r);return R(n)}async function I(e$1,r){let n=d.resolve(e$1);return c(n,o,async()=>{let t=(await Promise.all(s(n,"reports",p).map(async s=>await w(s)?s:null))).find(s=>typeof s=="string"),l=t?await W(t):null,i=R(l);if(t&&!i)throw new Error(`Workspace run evidence is unreadable or invalid; refusing to overwrite: ${t}`);let g=i?{...i.stages}:{};g[r.stage]=r;let k={schemaVersion:a,generatedAt:r.generatedAt,workspacePath:r.workspacePath,latestStage:r.stage,stages:g,enterpriseControls:{jsonReady:true,evidencePath:o}};return await e(n,o,k),k})}export{p as a,o as b,x as c,L as d,I as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(n){let t=n.trim().toLowerCase();return /^(?:\.venv(?:[._-].+)?|venv)$/.test(t)}export{r as a};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import {f as f$1,e}from'./chunk-T3GJ7YVG.js';import {a as a$1,b as b$2}from'./chunk-2OIBHUVH.js';import {a as a$2}from'./chunk-27UR373Z.js';import {h,j as j$1}from'./chunk-2PY65U6X.js';import {e as e$1}from'./chunk-MBRU3VWJ.js';import {a,b as b$1}from'./chunk-62K2H72S.js';import {j,s,t}from'./chunk-MOSXTVPU.js';import b from'fs';import p from'path';import o from'chalk';var H=new Set([".git",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next"]);async function D(e){try{return await b.promises.access(e,b.constants.F_OK),true}catch{return false}}async function P(e){try{let n=JSON.parse(await b.promises.readFile(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async function L(e){try{return await b.promises.readFile(e,"utf-8")}catch{return ""}}function K(e){return a$1(e)}async function B(e,n){return await N([...t(e,"project.json"),...t(e,"context.json")])?true:b$2(e)?false:p.resolve(e)===p.resolve(n)?h(e).length>0:h(e).length>0}async function U(e){let n=await a$2(e,{skipDirs:H,includeHiddenDirs:false,descendIntoMatchedProjects:false,isProjectDir:B});return n.length>0?n:b$2(e)?[]:h(e).length>0?[e]:[]}function V(e,n){return p.relative(e,n).replace(/\\/g,"/")||"."}async function A(e,n){for(let t of n)if(await D(p.join(e,t)))return true;return false}async function N(e){for(let n of e)if(await D(n))return true;return false}async function M(e){for(let n of e){let t=await P(n);if(t)return t}return null}async function q(e){return A(e,["health","health.ts","health.js","health.py","health.go","health.kt","health.rb","health.php","healthcheck","health-check","src/health.ts","src/health.js","src/health.py","src/health.go","src/health.kt","src/health.rb","src/health.php","src/healthcheck.ts","src/healthcheck.js","src/liveness.ts","src/readiness.ts","src/ping.ts"])}async function Q(e){if(await A(e,["tests","test","__tests__","src/__tests__","pytest.ini","vitest.config.ts","jest.config.ts"]))return true;let t=await P(p.join(e,"package.json")),r=t?.scripts&&typeof t.scripts=="object"?t.scripts:{};return typeof r.test=="string"&&r.test.trim().length>0}async function X(e){let n=await P(p.join(e,"package.json")),t=n?.scripts&&typeof n.scripts=="object"?n.scripts:{};return Object.keys(t).sort()}function f(e,n,t,r,s,a){return {id:e,severity:n,target:t,title:r,detail:s,remediation:a}}function Y(e){let n=e.reduce((t,r)=>r.severity==="fail"?t+28:r.severity==="warn"?t+12:t+3,0);return Math.max(0,100-n)}async function Z(e,n){let t$1=await M(t(n,"project.json")),r=j$1(n,t$1),s=h(n),a=r.runtime==="unknown"?s[0]||"unknown":r.runtime,i=V(e,n),l=i,u=await X(n),g=await N([...t(n,"project.json"),...t(n,"context.json")]),d=await Q(n),h$1=await A(n,["Dockerfile","dockerfile"]),k=await A(n,[".env.example","env.example","config/env.example"]),z=await A(n,[".github/workflows/ci.yml",".github/workflows/ci.yaml",".github/workflows/main.yml",".github/workflows/build.yml",".github/workflows/test.yml",".github/workflows/deploy.yml",".gitlab-ci.yml",".circleci/config.yml","azure-pipelines.yml","bitbucket-pipelines.yml","cloudbuild.yaml"]),C=await q(n),m=[];return r.key==="unknown"&&m.push(f("project.stack.unknown","fail",l,"Project stack is unknown","Workspai cannot confidently classify this backend project.","Add .workspai/project.json metadata or import the project with `workspai import`.")),g||m.push(f("project.marker.missing","warn",l,"Workspai marker is missing","The project can be detected by files, but it is not registered with Workspai metadata.","Run `workspai import <path>` from a workspace or create the project through Workspai.")),d||m.push(f("project.tests.missing","warn",l,"Test entrypoint is missing","No common test folder, config, or package test script was found.","Add a test command so `workspai workspace run test --affected` can gate changes.")),k||m.push(f("project.env.example.missing","info",l,"Environment example is missing","No .env.example or env.example file was found.","Add an env example for onboarding and CI secret documentation.")),z||m.push(f("project.ci.missing","warn",l,"Continuous integration is missing","No recognized CI/CD configuration file was detected for this project.","Add CI configuration so tests and checks run automatically for every change.")),C||m.push(f("project.health.missing","info",l,"Health or readiness probe is missing","The project has no obvious health or readiness endpoint to support automated deployment and runtime checks.","Add a simple health endpoint and document it for readiness gates and observability.")),h$1||m.push(f("project.container.missing","info",l,"Container recipe is missing","No Dockerfile was found for this project.","Add a Dockerfile when the service is intended for containerized deployment.")),{name:p.basename(n),path:n,relativePath:i,runtime:a,framework:r.key,confidence:r.confidence,supportTier:r.supportTier,hasRapidKitMarker:g,hasTests:d,hasDockerfile:h$1,hasEnvExample:k,hasCiConfig:z,hasHealthEndpoint:C,scripts:u,findings:m,score:Y(m)}}function ee(e){return e.name.toLowerCase()}async function ne(e){let n=new Map(e.map(s=>[ee(s),s])),t=[];for(let s of e){let a=await P(p.join(s.path,"package.json")),i={...a?.dependencies??{},...a?.devDependencies??{},...a?.peerDependencies??{}};for(let u of Object.keys(i)){let g=u.replace(/^@[^/]+\//,"").toLowerCase(),d=n.get(g);d&&d.relativePath!==s.relativePath&&t.push({from:s.relativePath,to:d.relativePath,kind:"package"});}let l=await L(p.join(s.path,"pyproject.toml"));for(let u of e)u.relativePath!==s.relativePath&&l.includes(u.name)&&t.push({from:s.relativePath,to:u.relativePath,kind:"workspace-reference"});}let r=new Set;return t.filter(s=>{let a=`${s.from}\0${s.to}\0${s.kind}`;return r.has(a)?false:(r.add(a),true)})}function te(e,n){let t=new Map;for(let r of e)t.set(r.relativePath,{project:r.relativePath,directDependents:0,directDependencies:0});for(let r of n){let s=t.get(r.from),a=t.get(r.to);s&&(s.directDependencies+=1),a&&(a.directDependents+=1);}return Array.from(t.values()).sort((r,s)=>s.directDependents-r.directDependents||s.directDependencies-r.directDependencies)}async function re(e){let n=await M(s(e,"workspace.json"));return typeof n?.profile=="string"?n.profile:null}function se(e){return {fail:e.filter(n=>n.severity==="fail").length,warn:e.filter(n=>n.severity==="warn").length,info:e.filter(n=>n.severity==="info").length}}function oe(e){if(e.projectCount===0)return e.workspaceDetected?["Add your first project: npx workspai create project <name> --kit <kit>","Import an existing service: npx workspai import <path>"]:["Create a Workspai workspace: npx workspai create workspace my-workspace --profile polyglot","Import an existing service: npx workspai import ../service"];let n=[];return e.findings.some(t=>t.id==="workspace.marker.missing")&&n.push("Initialize workspace metadata with `workspai bootstrap --profile polyglot`."),e.findings.some(t=>t.id==="project.marker.missing")&&n.push("Register detected projects with `workspai import <path>` or recreate them via `workspai create project`."),e.findings.some(t=>t.id==="project.tests.missing")&&n.push("Add test entrypoints, then gate changes with `workspai workspace run test --affected --strict`."),e.findings.some(t=>t.id==="project.ci.missing")&&n.push("Add CI/CD configuration to catch regressions early and make workspace health checks actionable."),e.findings.some(t=>t.id==="project.health.missing")&&n.push("Add a health/readiness endpoint so runtime probes and deployment checks can verify service health."),e.hasGraph||n.push("Create `.workspai/workspace-dependency-graph.json` or use analyze output as the first graph seed."),n.push("Run `workspai autopilot release --mode audit --json` before release."),Array.from(new Set(n))}async function ke(e$2={}){let n=p.resolve(e$2.workspacePath||process.cwd());if(!await D(n))throw new Error(`Workspace path does not exist: ${n}`);let t=K(n)??n,r=j(t),s=await re(t),a$1=await U(t),i=await Promise.all(a$1.map(c=>Z(t,c))),l=await ne(i),u=te(i,l),g=[];r||g.push(f("workspace.marker.missing","warn",".","Workspace metadata is missing","The directory can be analyzed, but it is not a registered Workspai workspace.","Run `workspai create workspace` or `workspai bootstrap --profile polyglot` in a workspace root.")),i.length===0&&g.push(f("workspace.projects.missing","warn",".","No backend projects detected","Workspai did not find runtime markers or project metadata under this root.","Create a project with `workspai create project` or import one with `workspai import <path>`."));let d=[...g,...i.flatMap(c=>c.findings)],h=se(d),k={};for(let c of i)k[c.runtime]=(k[c.runtime]||0)+1;let z=i.length>0?Math.round(i.reduce((c,y)=>c+y.score,0)/i.length):0,C=g.reduce((c,y)=>c+(y.severity==="fail"?20:y.severity==="warn"?8:2),0),m=Math.max(0,z-C),O=i.length===0&&h.fail===0&&d.length>0&&d.every(c=>c.id==="workspace.projects.missing"&&c.severity==="warn"),J=h.fail>0||e$2.strict&&h.warn>0&&!O?"blocked":h.warn>0?"needs-attention":"ready",w={schemaVersion:b$1.analyze,generatedAt:new Date().toISOString(),workspacePath:t,workspaceDetected:r,profile:s,summary:{score:m,verdict:J,projectCount:i.length,runtimeCount:Object.keys(k).length,findings:h},runtimes:k,projects:i,dependencyGraph:{status:l.length>0?"generated":"empty",edges:l,topImpactedProjects:u.slice(0,5)},findings:d,nextActions:oe({findings:d,projectCount:i.length,hasGraph:l.length>0,workspaceDetected:r}),enterpriseControls:{jsonReady:true,ciGateCommand:"workspai analyze --json --strict",releaseGateCommand:"workspai autopilot release --mode enforce --json",evidencePath:a.analyze}};if(e$2.output&&(await b.promises.mkdir(p.dirname(p.resolve(e$2.output)),{recursive:true}),await b.promises.writeFile(p.resolve(e$2.output),`${JSON.stringify(w,null,2)}
|
|
2
|
+
`)),!e$2.output&&r){let c=f$1(w,{commandId:"workspaceAnalyze",exitCode:w.summary.verdict==="blocked"?2:w.summary.verdict==="needs-attention"?1:0,generatedAt:w.generatedAt,blockers:w.findings.filter(y=>y.severity==="fail").map(y=>y.title).slice(0,12),runId:e()});await e$1(t,a.analyze,c);}return w}function we(e){let n=e.summary.verdict==="ready"?o.green:e.summary.verdict==="needs-attention"?o.yellow:o.red;if(console.log(o.bold(`
|
|
3
|
+
Workspai Workspace Analysis
|
|
4
|
+
`)),console.log(o.cyan("Workspace:"),e.workspacePath),console.log(o.cyan("Profile:"),e.profile||"not configured"),console.log(o.cyan("Score:"),`${e.summary.score}/100`),console.log(o.cyan("Verdict:"),n(e.summary.verdict)),console.log(o.gray(`Projects: ${e.summary.projectCount}, runtimes: ${e.summary.runtimeCount}, findings: ${e.summary.findings.fail} fail / ${e.summary.findings.warn} warn / ${e.summary.findings.info} info`)),e.projects.length>0){console.log(o.bold(`
|
|
5
|
+
Projects`));for(let t of e.projects){let r=t.score>=85?o.green("pass"):t.score>=65?o.yellow("watch"):o.red("risk");console.log(` ${t.relativePath} ${o.gray(`${t.runtime}/${t.framework}`)} ${r} ${t.score}/100`);}}if(e.dependencyGraph.status==="generated"&&(console.log(o.bold(`
|
|
6
|
+
Dependency Graph`)),console.log(o.gray(` edges: ${e.dependencyGraph.edges.length}`)),e.dependencyGraph.topImpactedProjects.length>0)){console.log(o.gray(" Top impacted projects:"));for(let t of e.dependencyGraph.topImpactedProjects.slice(0,3))console.log(` ${t.project} (${t.directDependents} dependents, ${t.directDependencies} dependencies)`);}if(e.findings.length>0){console.log(o.bold(`
|
|
7
|
+
Top Findings`));for(let t of e.findings.slice(0,8)){let r=t.severity==="fail"?o.red:t.severity==="warn"?o.yellow:o.gray;console.log(` ${r(t.severity.toUpperCase())} ${t.target}: ${t.title}`),console.log(o.gray(` ${t.remediation}`));}}console.log(o.bold(`
|
|
8
|
+
Next Actions`));for(let t of e.nextActions.slice(0,5))console.log(o.gray(` - ${t}`));console.log();}export{ke as a,we as b};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {f,l}from'./chunk-
|
|
1
|
+
import {f,l}from'./chunk-FUPHQOJB.js';import {a,b}from'./chunk-S5KTATOU.js';function u(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,f(n));return s}function w(r){let s=u(r),n=l(r)??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??f({missing:t.id}),l=[...b(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,f)=>c.localeCompare(f)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:f({own:e,dependencies:l})});}return o}function y(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function M(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{u as a,w as b,y as c,M as d};
|