workspai 0.47.0 → 0.49.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.
Files changed (103) hide show
  1. package/README.md +247 -136
  2. package/contracts/agent-customization-pack.v1.json +5 -0
  3. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +4 -0
  4. package/contracts/extension-cli-compatibility.v1.json +8 -2
  5. package/contracts/published-contract-catalog.v1.json +33 -1
  6. package/contracts/runtime-command-surface.v1.json +163 -3
  7. package/contracts/workspace-intelligence/model-usage-event.v1.json +82 -0
  8. package/contracts/workspace-intelligence/workspace-graph-stream.v1.json +262 -0
  9. package/contracts/workspace-intelligence/workspace-intelligence-evaluation-comparison.v1.json +53 -0
  10. package/contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json +120 -0
  11. package/contracts/workspace-intelligence-architecture.v1.json +31 -2
  12. package/contracts/workspace-intelligence-chain.v1.json +44 -3
  13. package/dist/analyze-EEEU3MIF.js +1 -0
  14. package/dist/{artifact-remediation-plan-EPALZ2LC.js → artifact-remediation-plan-SPOUHMK5.js} +1 -1
  15. package/dist/autopilot-release-R4XRTWEM.js +1 -0
  16. package/dist/{chunk-2TEDAKP6.js → chunk-32OJDBIG.js} +1 -1
  17. package/dist/{chunk-ZDN7RHXJ.js → chunk-37CVKXBD.js} +1 -1
  18. package/dist/{chunk-YCL3I2JO.js → chunk-3NU32T4A.js} +1 -1
  19. package/dist/chunk-3VFA7D5T.js +1 -0
  20. package/dist/{chunk-CW7PGBIQ.js → chunk-4HDYADHT.js} +1 -1
  21. package/dist/{chunk-PBHP6JNY.js → chunk-54EP5CEV.js} +1 -1
  22. package/dist/{chunk-NOFM7MNA.js → chunk-AFL3ACCR.js} +1 -1
  23. package/dist/{chunk-MEMHNE7Y.js → chunk-BFLJ2R4D.js} +1 -1
  24. package/dist/{chunk-6SWRNA47.js → chunk-BGPXQQNY.js} +1 -1
  25. package/dist/chunk-BMWFQXGW.js +1 -0
  26. package/dist/{chunk-2GHUZDYA.js → chunk-CRHYBQI3.js} +1 -1
  27. package/dist/{chunk-KZZ36CK5.js → chunk-E2KJ5QWY.js} +1 -1
  28. package/dist/{chunk-BSRVO52Y.js → chunk-EKZLUMCS.js} +2 -2
  29. package/dist/{chunk-76YOPAOT.js → chunk-ESLPI3XZ.js} +1 -1
  30. package/dist/{chunk-DV6GJD4K.js → chunk-HDXNIN4N.js} +1 -1
  31. package/dist/{chunk-TNQI5VCW.js → chunk-HZDXO65G.js} +14 -14
  32. package/dist/{chunk-COARSXRC.js → chunk-J5ENLXDF.js} +1 -1
  33. package/dist/{chunk-QDWYIRHR.js → chunk-K4X3DM7R.js} +1 -1
  34. package/dist/chunk-LHOZXC2M.js +2 -0
  35. package/dist/{chunk-RWRLFSKW.js → chunk-NAJCUQ4X.js} +1 -1
  36. package/dist/{chunk-ZM5NQ5Z2.js → chunk-OW42TZFB.js} +1 -1
  37. package/dist/{chunk-SK6XRKGG.js → chunk-P3D5YQB2.js} +1 -1
  38. package/dist/{chunk-TWNFECMN.js → chunk-PHXQR6PX.js} +1 -1
  39. package/dist/{chunk-ITCAMC2E.js → chunk-PRTR2DQ2.js} +1 -1
  40. package/dist/{chunk-7VLCK5JW.js → chunk-RHQW3DTP.js} +1 -1
  41. package/dist/{chunk-22NJ2ZMG.js → chunk-T4YR4RAI.js} +1 -1
  42. package/dist/{chunk-VBSQ7MF6.js → chunk-TIE2XMGH.js} +20 -20
  43. package/dist/{chunk-HSGFUKCN.js → chunk-VU7NZHPM.js} +1 -1
  44. package/dist/{chunk-U5EZHZBX.js → chunk-YJZOMRAS.js} +1 -1
  45. package/dist/{create-7JKJDAQV.js → create-S64IWHAP.js} +1 -1
  46. package/dist/{doctor-PGPNIS76.js → doctor-4NNUDNGZ.js} +1 -1
  47. package/dist/{dotnet-webapi-clean-6TVFBTVI.js → dotnet-webapi-clean-A6MVDYXX.js} +4 -4
  48. package/dist/{gofiber-standard-2BL7GWZB.js → gofiber-standard-I5YPQG5V.js} +1 -1
  49. package/dist/{gogin-standard-XGP3KBXA.js → gogin-standard-VY2L4QT5.js} +1 -1
  50. package/dist/index.d.ts +35 -11
  51. package/dist/index.js +138 -136
  52. package/dist/{pipeline-IB6ILJSV.js → pipeline-LHTPE3DR.js} +1 -1
  53. package/dist/{springboot-standard-JJNUID6M.js → springboot-standard-55XKCBIZ.js} +4 -4
  54. package/dist/{workspace-H3QXBFGB.js → workspace-PJPRBUMQ.js} +1 -1
  55. package/dist/{workspace-agent-sync-C7SG2Z5W.js → workspace-agent-sync-662QHXGF.js} +1 -1
  56. package/dist/{workspace-context-BKQBKA4C.js → workspace-context-23YYCUCP.js} +1 -1
  57. package/dist/{workspace-contract-RPQQBQXR.js → workspace-contract-TU2I7GC2.js} +1 -1
  58. package/dist/{workspace-dependency-graph-23BI2HG7.js → workspace-dependency-graph-BP4EXYQ5.js} +1 -1
  59. package/dist/workspace-explain-MWUEN643.js +1 -0
  60. package/dist/workspace-explain-contract-ZPI3JXJU.js +1 -0
  61. package/dist/{workspace-feedback-WAID3IOE.js → workspace-feedback-SUVH2LUJ.js} +1 -1
  62. package/dist/{workspace-foundation-5OOJEO2D.js → workspace-foundation-WPLD7OEO.js} +1 -1
  63. package/dist/workspace-graph-stream-KAGGQPJT.js +1 -0
  64. package/dist/{workspace-history-C6OP3IAQ.js → workspace-history-BANOJRQ2.js} +1 -1
  65. package/dist/{workspace-intelligence-VKDL3H2J.js → workspace-intelligence-MFJE7W67.js} +1 -1
  66. package/dist/workspace-intelligence-evaluation-IPH7M3WV.js +1 -0
  67. package/dist/{workspace-intelligence-runner-LVALAZY7.js → workspace-intelligence-runner-OTYTHV6B.js} +1 -1
  68. package/dist/{workspace-knowledge-graph-FE2NTZKV.js → workspace-knowledge-graph-ARDC6HHG.js} +1 -1
  69. package/dist/workspace-knowledge-graph-export-UYAYFTWX.js +10 -0
  70. package/dist/workspace-mcp-serve-EZR6O76D.js +3 -0
  71. package/dist/{workspace-model-S33CIB2R.js → workspace-model-7OU2M3LE.js} +1 -1
  72. package/dist/{workspace-registry-summary-A3YDL63D.js → workspace-registry-summary-ORDK7A36.js} +1 -1
  73. package/dist/workspace-run-QND2SIYA.js +1 -0
  74. package/dist/{workspace-verify-ZGH3NXAH.js → workspace-verify-EBVL7FWT.js} +1 -1
  75. package/dist/workspace-watch-7HWGA5TF.js +1 -0
  76. package/docs/GLOSSARY.md +28 -24
  77. package/docs/OPEN_SOURCE_USER_SCENARIOS.md +11 -8
  78. package/docs/README.md +62 -23
  79. package/docs/README_CONTENT_CONTRACT.md +154 -0
  80. package/docs/ci-workflows.md +3 -3
  81. package/docs/commands-reference.md +16 -3
  82. package/docs/contracts/ARTIFACT_CATALOG.md +35 -20
  83. package/docs/contracts/README.md +3 -0
  84. package/docs/creating-workspaces-and-projects.md +16 -12
  85. package/docs/doctor-command.md +30 -28
  86. package/docs/examples/ci-agent-grounding.yml +1 -1
  87. package/docs/from-code-to-shared-understanding.md +2 -2
  88. package/docs/graph-benchmark-methodology.md +2 -2
  89. package/docs/workspace-intelligence-evaluation.md +149 -0
  90. package/docs/workspace-intelligence-runner.md +17 -6
  91. package/docs/workspace-knowledge-graph.md +31 -10
  92. package/docs/workspace-operations.md +13 -5
  93. package/package.json +9 -4
  94. package/templates/kits/fastapi-ddd/README.md.j2 +1 -1
  95. package/dist/analyze-UVXPRGYZ.js +0 -1
  96. package/dist/autopilot-release-5BQ6F5L2.js +0 -1
  97. package/dist/chunk-LNRAB7UY.js +0 -1
  98. package/dist/chunk-NRYS4CLR.js +0 -2
  99. package/dist/workspace-explain-WVN7JH3U.js +0 -1
  100. package/dist/workspace-explain-contract-SEFTVF6J.js +0 -1
  101. package/dist/workspace-mcp-serve-KT2I676Z.js +0 -3
  102. package/dist/workspace-run-M4LNJILC.js +0 -1
  103. package/dist/workspace-watch-EVBJTMV7.js +0 -1
@@ -1,2 +1,2 @@
1
- import {a as a$1}from'./chunk-FXQJX34Z.js';import {w}from'./chunk-TWNFECMN.js';import {a as a$2,d,c,e as e$1}from'./chunk-2TEDAKP6.js';import {b as b$1}from'./chunk-YCL3I2JO.js';import {a,b}from'./chunk-LNRAB7UY.js';import {e}from'./chunk-RO73VVHW.js';import {p,o}from'./chunk-5XATWNME.js';import {l}from'./chunk-OCGZNSOE.js';import m from'path';import g from'fs-extra';var ne="unknown-run";function M(e$1){let t=e();return !t||t===ne?e$1:{...e$1,runId:t}}var be="workspace-dependency-graph.v1",L=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],U=["inferred","contract","manual"];var C=".workspai/workspace.contract.json",ae=a.contractVerify,v=1,se=b.contractVerify,j=class extends Error{constructor(o){super(`Workspace contract verification failed: ${o.violations.join("; ")}`);this.verification=o;this.name="WorkspaceContractVerificationError";}verification};function Z(e){return e.replace(/\\/g,"/")}function O(e){let t=Z(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(o=>o===".."||o===".")}function z(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function ce(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ie(e){let o=(Array.isArray(e.ports)?e.ports:[]).map(c=>{if(!c||typeof c!="object"||Array.isArray(c))return null;let d=c,f=Number(d.port);if(!Number.isInteger(f)||f<1||f>65535)return null;let u=d.protocol==="https"||d.protocol==="grpc"||d.protocol==="tcp"||d.protocol==="udp"?d.protocol:"http";return {name:typeof d.name=="string"&&d.name.trim()?d.name:"http",port:f,protocol:u}}).filter(c=>c!==null);if(o.length>0)return o;let n=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=Number(e.port??n?.default_port);return Number.isInteger(s)&&s>=1&&s<=65535?[{name:"http",port:s,protocol:"http"}]:[]}async function A(e){for(let t of e)if(await g.pathExists(t))return t;return null}async function pe(e){for(let t of o(e,"workspace.json"))try{let o=await g.readJson(t);return {name:typeof o.workspace_name=="string"&&o.workspace_name.trim()||typeof o.name=="string"&&o.name.trim()||m.basename(e),profile:typeof o.profile=="string"?o.profile:void 0}}catch{}return {name:m.basename(e)}}async function de(e){let t=[],o=[e],n=new Set,s=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;o.length>0;){let c=o.shift();if(!c||n.has(c))continue;n.add(c);let d=await A(p(c,"project.json")),f=await A(p(c,"context.json"));if(d||f){t.push(d??f??"");continue}let u;try{u=await g.readdir(c,{withFileTypes:true});}catch{continue}for(let l of u)!l.isDirectory()||s.has(l.name)||o.push(m.join(c,l.name));}return t.sort()}function ue(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function le(e,t){let o=(e||"").toLowerCase(),n=(t||"").toLowerCase();return o.includes("fastapi")?8e3:o.includes("nestjs")?3e3:o.includes("springboot")?8080:o.includes("gofiber")?3e3:o.includes("gogin")?8080:n==="node"?3e3:n==="python"?8e3:n==="java"||n==="go"?8080:null}function Y(e,t){let o=e;for(;t.has(o)&&o<65535;)o+=1;return o}function _(e,t,o){let n=e!==void 0&&e.source===void 0,s=le(t.kit,t.runtime),c=e?.ports||[],d=t.ports||[],u=(c.length>0?c:d.length>0?d:s?[{name:"http",port:Y(s,o),protocol:"http"}]:[]).map(i=>({...i,port:Y(i.port,o)}));for(let i of u)o.add(i.port);let l={...t,...e,slug:e?.slug||t.slug,relativePath:n&&e?.relativePath&&O(e.relativePath)?e.relativePath:t.relativePath,source:n&&e?.source||t.source,relationship:n&&e?.relationship||t.relationship,externalPath:n&&e?.externalPath||t.externalPath,runtime:e?.runtime||t.runtime,framework:e?.framework||t.framework,kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:u,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},a=JSON.stringify(e||null)!==JSON.stringify(l);return {project:l,changed:a}}async function Q(e){let t=m.resolve(e.workspacePath),o=await pe(t),n=await de(t),s=await a$1(t),c=[];for(let l of s){let a=m.resolve(l.path),i=await A(p(a,"project.json"))??await A(p(a,"context.json"));!i||n.some(k=>m.resolve(k)===m.resolve(i))||c.push({projectJsonPath:i,registryEntry:l});}let d=[],f=[...n.map(l=>({projectJsonPath:l})),...c];for(let{projectJsonPath:l,registryEntry:a}of f){let i=m.dirname(m.dirname(l)),k=Z(m.relative(t,i)),h=a!==void 0&&!O(k),r=z(a?.name||m.basename(i),m.basename(i)),p=h?`external/${r}`:k||r,w=await g.readJson(l),y=typeof w.kit_name=="string"&&w.kit_name||typeof w.kit=="string"&&w.kit||void 0,R=typeof w.framework=="string"&&w.framework||ue(y);d.push({slug:a?.name||p||m.basename(i),relativePath:p,source:a?.source??"workspace",relationship:a?.relationship,externalPath:h?i:void 0,runtime:typeof w.runtime=="string"?w.runtime:void 0,framework:R,kit:y,modules:ce(w.modules),ports:ie(w),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let u=new Map;for(let l of d){let a=z(l.slug,l.relativePath),i=u.get(a);(!i||i.source!=="workspace"&&l.source==="workspace")&&u.set(a,l);}return {schemaVersion:v,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:o,projects:[...u.values()]}}async function Te(e){let t=m.resolve(e.outputPath||a$2(e.workspacePath,C));if(await g.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let o=await Q({workspacePath:e.workspacePath,now:e.now}),n=new Set,s={...o,projects:o.projects.map(d=>_(void 0,d,n).project)},c=await te({workspacePath:e.workspacePath,contractPath:t,contract:s});if(e.strict&&c.status==="failed")throw new j(c);return await X({workspacePath:e.workspacePath,contractPath:t,contract:s,now:e.now}),{contractPath:t,contract:s}}async function Ve(e){let t=m.resolve(e.workspacePath),o=a$2(t,C),n=await d(t,C)??o,s=await Q({workspacePath:t,now:e.now}),c=await g.pathExists(n)?await g.readJson(n):null,d$1=new Map((c?.projects||[]).map(h=>[h.slug,h])),f=new Set,u=[],l=[],a=[];for(let h of s.projects){let r=d$1.get(h.slug),p=_(r,h,f);r?p.changed&&l.push(h.slug):u.push(h.slug),a.push(p.project),d$1.delete(h.slug);}for(let h of d$1.values()){if(h.source)continue;let r=_(h,h,f);a.push(r.project);}let i={schemaVersion:v,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...s.workspace,...c?.workspace||{},name:c?.workspace?.name||s.workspace.name},projects:a.sort((h,r)=>h.slug.localeCompare(r.slug))},k=await te({workspacePath:t,contractPath:o,contract:i});if(e.strict&&k.status==="failed")throw new j(k);return await X({workspacePath:t,contractPath:o,contract:i,now:e.now}),{contractPath:o,contract:i,addedProjects:u,updatedProjects:l,verification:k}}async function q(e){return await g.pathExists(e)?{exists:true,contents:await g.readFile(e)}:{exists:false}}async function B(e,t){if(!t.exists){await g.remove(e);return}await g.outputFile(e,t.contents);}async function X(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:o}=await import('./workspace-registry-summary-A3YDL63D.js'),n=await t(e.workspacePath,{now:e.now,contract:e.contract}),s=a$2(e.workspacePath,o),c$1=d=>{if(!d||typeof d!="object"||Array.isArray(d))return JSON.stringify(d);let{generatedAt:f,...u}=d;return JSON.stringify(u)};if(await g.pathExists(e.contractPath)&&await g.pathExists(s)){let[d,f]=await Promise.all([g.readJson(e.contractPath),g.readJson(s)]);if(c$1(d)===c$1(e.contract)&&c$1(f)===c$1(n))return}b$1(C,e.contract),b$1(o,n),await c(e.workspacePath,C,async()=>{let[d,f]=await Promise.all([q(e.contractPath),q(s)]);try{if(e.contractPath===a$2(e.workspacePath,C)?await e$1(e.workspacePath,C,e.contract):(await g.ensureDir(m.dirname(e.contractPath)),await g.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await e$1(e.workspacePath,o,n);}catch(u){let a=(await Promise.allSettled([B(e.contractPath,d),B(s,f)])).filter(i=>i.status==="rejected");throw a.length>0?new AggregateError([u,...a.map(i=>i.reason)],"Workspace contract publication failed and rollback was incomplete."):u}});}async function ee(e){let t=e.contractPath??(await d(e.workspacePath,C)||a$2(e.workspacePath,C)),o=await g.readJson(t);return {contractPath:t,contract:o}}var me={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function ge(e,t){return t.externalPath?m.resolve(t.externalPath):m.resolve(e,t.relativePath)}async function fe(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[o,n]of Object.entries(me))for(let s of n)await g.pathExists(m.join(e,s))&&t[o].push(s);try{let o=await g.readdir(e,{withFileTypes:true});for(let n of o)n.isFile()&&(n.name.endsWith(".csproj")||n.name.endsWith(".sln"))&&t.manifests.push(n.name),n.isFile()&&n.name.endsWith(".tf")&&t.infrastructure.push(n.name);}catch{}for(let o of Object.values(t))o.sort((n,s)=>n.localeCompare(s));return t}function W(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,o)=>t.localeCompare(o))}async function he(e){try{let t=await g.readJson(m.join(e,"package.json")),o={runtime:W(t.dependencies),development:W(t.devDependencies),peer:W(t.peerDependencies),optional:W(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:W(t.scripts),dependencies:o,dependencyCount:new Set(Object.values(o).flat()).size}}catch{return}}async function ke(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await g.readFile(m.join(e,t),"utf8")).split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0&&!n.startsWith("#")&&n.includes("=")).map(n=>n.slice(0,n.indexOf("=")).trim()).filter(n=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)).sort((n,s)=>n.localeCompare(s))}catch{}return []}function we(e,t){try{let o=w(e);if(o.engine!=="unknown")return o;let n=g.pathExistsSync(m.join(e,"package.json"))?"npm":g.pathExistsSync(m.join(e,"pyproject.toml"))?"python":g.pathExistsSync(m.join(e,"requirements.txt"))?"pip":"unknown";return {...o,engine:n,runtime:t.runtime??o.runtime,framework:t.framework??o.framework,frameworkDisplayName:t.framework??o.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function Pe(e,t,o){let n=e.projects.map(s=>({id:s.slug,path:s.relativePath,runtime:s.runtime,framework:s.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:n,edges:[],stats:{nodeCount:n.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:n.length,connectedNodeCount:0,density:0,edgeCoverageRatio:n.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:o,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function Ke(e){let{contractPath:t,contract:o}=await ee(e),n=e.now??new Date,s=n.toISOString(),c;try{let{inferWorkspaceDependencyGraph:r}=await import('./workspace-dependency-graph-23BI2HG7.js');c=await r({workspacePath:e.workspacePath,contract:o,now:n,model:{projects:o.projects.map(p=>({name:p.slug,path:p.relativePath,...p.externalPath?{absolutePath:p.externalPath}:{},...p.runtime?{runtime:p.runtime}:{},...p.framework?{framework:p.framework}:{},...p.framework?{kind:p.framework}:{}}))}});}catch(r){c=Pe(o,s,`Graph enrichment failed: ${r instanceof Error?r.message:String(r)}`);}let d=new Map(c.nodes.map(r=>[r.id,r.operationalProfile])),{buildWorkspaceKnowledgeGraph:f}=await import('./workspace-knowledge-graph-FE2NTZKV.js'),u=await f({workspacePath:e.workspacePath,workspace:o.workspace,contract:o,projectTopology:c,now:n,projects:o.projects.map(r=>({id:r.slug,path:r.relativePath,...r.externalPath?{absolutePath:r.externalPath}:{},...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kit?{kit:r.kit}:{}}))}),l=await Promise.all(o.projects.map(async r=>{let p=ge(e.workspacePath,r),[w,y,R]=await Promise.all([fe(p),he(p),ke(p)]),P=we(p,r);return {id:r.slug,label:r.slug,relativePath:r.relativePath,source:r.source,relationship:r.relationship,externalPath:r.externalPath,runtime:r.runtime??P.runtime,framework:r.framework??P.framework,kit:r.kit,modules:r.modules,ports:r.ports,apis:r.contracts.apis,owns:r.contracts.owns,env:[...new Set([...r.contracts.env,...R])].sort((re,oe)=>re.localeCompare(oe)),contracts:{owns:[...r.contracts.owns],apis:[...r.contracts.apis],publishes:[...r.contracts.publishes],consumes:[...r.contracts.consumes],dependsOn:[...r.contracts.dependsOn],env:[...r.contracts.env]},capabilities:{engine:P.engine,supportTier:P.frameworkSupportTier,runtimeSupportTier:P.runtimeSupportTier,doctorSupport:P.runtimeDoctorSupport,moduleSupport:P.moduleSupport,fleetStages:[...P.fleetStages],localOnlyCommands:[...P.localOnlyCommands],supportedCommands:[...P.supportedCommands]},files:w,...y?{package:y}:{},...d.get(r.slug)?{operationalProfile:d.get(r.slug)}:{}}})),a=new Set(l.map(r=>r.id)),i=new Map,k=[];for(let r of o.projects){for(let p of r.contracts.dependsOn||[])a.has(p)&&k.push({from:p,to:r.slug,type:"dependency",label:"dependsOn"});for(let p of r.contracts.publishes||[])i.has(p)||i.set(p,new Set),i.get(p)?.add(r.slug);}for(let r of o.projects)for(let p of r.contracts.consumes||[]){let w=i.get(p);if(w)for(let y of w)y!==r.slug&&k.push({from:y,to:r.slug,type:"event",label:p});}let h={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:o.workspace,generatedAt:s,nodes:l.sort((r,p)=>r.id.localeCompare(p.id)),edges:k.sort((r,p)=>`${r.from}:${r.to}:${r.type}:${r.label}`.localeCompare(`${p.from}:${p.to}:${p.type}:${p.label}`)),dependencyGraph:c,knowledgeGraph:u,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:l.length,dependencyEdges:k.filter(r=>r.type==="dependency").length,eventEdges:k.filter(r=>r.type==="event").length,portCount:l.reduce((r,p)=>r+p.ports.length,0),apiCount:l.reduce((r,p)=>r+p.apis.length,0),relationshipEdges:c.stats.edgeCount,inferredEdges:c.stats.inferredEdges,authoritativeEdges:c.stats.authoritativeEdges,orphanProjects:c.stats.orphanCount,hotspotProjects:c.stats.hotspotCount,evidenceCoverageRatio:c.stats.evidenceCoverageRatio,edgeCoverageRatio:c.stats.edgeCoverageRatio,connectedProjects:c.stats.connectedNodeCount,lowConfidenceEdges:c.stats.lowConfidenceEdges,hasCycle:c.stats.hasCycle,manifestCount:l.reduce((r,p)=>r+p.files.manifests.length,0),entrypointCount:l.reduce((r,p)=>r+p.files.entrypoints.length,0),diagnostics:c.diagnostics?.length??0,relationshipKinds:Object.fromEntries(L.map(r=>[r,c.edges.filter(p=>p.kind===r).length])),relationshipSources:Object.fromEntries(U.map(r=>[r,c.edges.filter(p=>p.source===r).length])),entityCount:u.quality.entityCount,knowledgeRelations:u.quality.relationCount,proofCount:u.quality.proofCount,providerCount:u.providers.length,knowledgeUnknowns:u.quality.unknownCount}};return {contractPath:t,graph:h}}async function te(e){let t=e.contract?{contractPath:e.contractPath??a$2(e.workspacePath,C),contract:e.contract}:await ee(e),{contractPath:o,contract:n}=t,s=[],c=[];n.kind!=="rapidkit.workspace.contract"&&s.push("Contract kind must be rapidkit.workspace.contract."),n.schemaVersion!==v&&s.push(`Contract schemaVersion must be ${v}.`),n.workspace?.name||s.push("Contract workspace.name is required."),Array.isArray(n.projects)||s.push("Contract projects must be an array.");let d=new Set,f=new Map;for(let a of n.projects||[]){if(!a.slug){s.push("Every project must declare slug.");continue}d.has(a.slug)&&s.push(`Duplicate project slug: ${a.slug}.`),d.add(a.slug),a.relativePath?O(a.relativePath)||s.push(`Project ${a.slug} declares unsafe relativePath: ${a.relativePath}.`):s.push(`Project ${a.slug} must declare relativePath.`),a.externalPath&&(a.relationship==="adopted"||a.source==="adopted-local"||a.source==="local-folder"||a.source==="git-url"||s.push(`Project ${a.slug} declares externalPath without imported/adopted provenance.`),m.isAbsolute(a.externalPath)||s.push(`Project ${a.slug} declares non-absolute externalPath.`));for(let i of a.ports||[]){(!Number.isInteger(i.port)||i.port<1||i.port>65535)&&s.push(`Project ${a.slug} declares invalid port: ${i.port}.`);let k=f.get(i.port);k&&s.push(`Port ${i.port} is claimed by both ${k} and ${a.slug}.`),f.set(i.port,a.slug);}for(let i of a.contracts?.apis||[])(!i.name?.trim()||!i.basePath?.startsWith("/"))&&s.push(`Project ${a.slug} declares invalid API contract.`);for(let i of [...a.contracts?.publishes||[],...a.contracts?.consumes||[]])i.trim()||s.push(`Project ${a.slug} declares an empty event contract.`);for(let i of a.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(i)||s.push(`Project ${a.slug} declares invalid env contract: ${i}.`);for(let i of a.contracts?.dependsOn||[])d.has(i);}for(let a of n.projects||[])for(let i of a.contracts?.dependsOn||[])d.has(i)||s.push(`Project ${a.slug} depends on unknown project: ${i}.`);c.push({id:"schema",status:n.kind==="rapidkit.workspace.contract"&&n.schemaVersion===v?"passed":"failed",message:"Contract schema and kind are valid."}),c.push({id:"projects",status:Array.isArray(n.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(n.projects)?n.projects.length:0} project(s).`}),c.push({id:"ports",status:s.some(a=>a.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),c.push({id:"dependencies",status:s.some(a=>a.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),c.push({id:"contracts",status:s.some(a=>a.includes("unsafe relativePath")||a.includes("invalid API contract")||a.includes("event contract")||a.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let u=await l(e.workspacePath);if(u.moduleCount>0){for(let a of u.issues)s.push(`${m.basename(a.projectRoot)}: ${a.message} (slug=${a.slug})`);c.push({id:"module-paths",status:u.status,message:u.status==="passed"?`All ${u.moduleCount} registered module(s) resolve under canonical paths.`:`${u.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&c.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:s.length>0?"failed":"passed",contractPath:o,projectCount:Array.isArray(n.projects)?n.projects.length:0,checks:c,violations:s}}async function $e(e){let t=m.resolve(e.workspacePath),o={schemaVersion:se,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return e$1(t,ae,M(o))}
1
+ import {a as a$1}from'./chunk-FXQJX34Z.js';import {w}from'./chunk-PHXQR6PX.js';import {a as a$2,d,c,e as e$1}from'./chunk-32OJDBIG.js';import {b as b$1}from'./chunk-3NU32T4A.js';import {a,b}from'./chunk-BMWFQXGW.js';import {e}from'./chunk-RO73VVHW.js';import {p,o}from'./chunk-5XATWNME.js';import {l}from'./chunk-OCGZNSOE.js';import m from'path';import g from'fs-extra';var ne="unknown-run";function M(e$1){let t=e();return !t||t===ne?e$1:{...e$1,runId:t}}var be="workspace-dependency-graph.v1",L=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],U=["inferred","contract","manual"];var C=".workspai/workspace.contract.json",ae=a.contractVerify,v=1,se=b.contractVerify,j=class extends Error{constructor(o){super(`Workspace contract verification failed: ${o.violations.join("; ")}`);this.verification=o;this.name="WorkspaceContractVerificationError";}verification};function Z(e){return e.replace(/\\/g,"/")}function O(e){let t=Z(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(o=>o===".."||o===".")}function z(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function ce(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ie(e){let o=(Array.isArray(e.ports)?e.ports:[]).map(c=>{if(!c||typeof c!="object"||Array.isArray(c))return null;let d=c,f=Number(d.port);if(!Number.isInteger(f)||f<1||f>65535)return null;let u=d.protocol==="https"||d.protocol==="grpc"||d.protocol==="tcp"||d.protocol==="udp"?d.protocol:"http";return {name:typeof d.name=="string"&&d.name.trim()?d.name:"http",port:f,protocol:u}}).filter(c=>c!==null);if(o.length>0)return o;let n=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=Number(e.port??n?.default_port);return Number.isInteger(s)&&s>=1&&s<=65535?[{name:"http",port:s,protocol:"http"}]:[]}async function A(e){for(let t of e)if(await g.pathExists(t))return t;return null}async function pe(e){for(let t of o(e,"workspace.json"))try{let o=await g.readJson(t);return {name:typeof o.workspace_name=="string"&&o.workspace_name.trim()||typeof o.name=="string"&&o.name.trim()||m.basename(e),profile:typeof o.profile=="string"?o.profile:void 0}}catch{}return {name:m.basename(e)}}async function de(e){let t=[],o=[e],n=new Set,s=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;o.length>0;){let c=o.shift();if(!c||n.has(c))continue;n.add(c);let d=await A(p(c,"project.json")),f=await A(p(c,"context.json"));if(d||f){t.push(d??f??"");continue}let u;try{u=await g.readdir(c,{withFileTypes:true});}catch{continue}for(let l of u)!l.isDirectory()||s.has(l.name)||o.push(m.join(c,l.name));}return t.sort()}function ue(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function le(e,t){let o=(e||"").toLowerCase(),n=(t||"").toLowerCase();return o.includes("fastapi")?8e3:o.includes("nestjs")?3e3:o.includes("springboot")?8080:o.includes("gofiber")?3e3:o.includes("gogin")?8080:n==="node"?3e3:n==="python"?8e3:n==="java"||n==="go"?8080:null}function Y(e,t){let o=e;for(;t.has(o)&&o<65535;)o+=1;return o}function _(e,t,o){let n=e!==void 0&&e.source===void 0,s=le(t.kit,t.runtime),c=e?.ports||[],d=t.ports||[],u=(c.length>0?c:d.length>0?d:s?[{name:"http",port:Y(s,o),protocol:"http"}]:[]).map(i=>({...i,port:Y(i.port,o)}));for(let i of u)o.add(i.port);let l={...t,...e,slug:e?.slug||t.slug,relativePath:n&&e?.relativePath&&O(e.relativePath)?e.relativePath:t.relativePath,source:n&&e?.source||t.source,relationship:n&&e?.relationship||t.relationship,externalPath:n&&e?.externalPath||t.externalPath,runtime:e?.runtime||t.runtime,framework:e?.framework||t.framework,kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:u,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},a=JSON.stringify(e||null)!==JSON.stringify(l);return {project:l,changed:a}}async function Q(e){let t=m.resolve(e.workspacePath),o=await pe(t),n=await de(t),s=await a$1(t),c=[];for(let l of s){let a=m.resolve(l.path),i=await A(p(a,"project.json"))??await A(p(a,"context.json"));!i||n.some(k=>m.resolve(k)===m.resolve(i))||c.push({projectJsonPath:i,registryEntry:l});}let d=[],f=[...n.map(l=>({projectJsonPath:l})),...c];for(let{projectJsonPath:l,registryEntry:a}of f){let i=m.dirname(m.dirname(l)),k=Z(m.relative(t,i)),h=a!==void 0&&!O(k),r=z(a?.name||m.basename(i),m.basename(i)),p=h?`external/${r}`:k||r,w=await g.readJson(l),y=typeof w.kit_name=="string"&&w.kit_name||typeof w.kit=="string"&&w.kit||void 0,R=typeof w.framework=="string"&&w.framework||ue(y);d.push({slug:a?.name||p||m.basename(i),relativePath:p,source:a?.source??"workspace",relationship:a?.relationship,externalPath:h?i:void 0,runtime:typeof w.runtime=="string"?w.runtime:void 0,framework:R,kit:y,modules:ce(w.modules),ports:ie(w),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let u=new Map;for(let l of d){let a=z(l.slug,l.relativePath),i=u.get(a);(!i||i.source!=="workspace"&&l.source==="workspace")&&u.set(a,l);}return {schemaVersion:v,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:o,projects:[...u.values()]}}async function Te(e){let t=m.resolve(e.outputPath||a$2(e.workspacePath,C));if(await g.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let o=await Q({workspacePath:e.workspacePath,now:e.now}),n=new Set,s={...o,projects:o.projects.map(d=>_(void 0,d,n).project)},c=await te({workspacePath:e.workspacePath,contractPath:t,contract:s});if(e.strict&&c.status==="failed")throw new j(c);return await X({workspacePath:e.workspacePath,contractPath:t,contract:s,now:e.now}),{contractPath:t,contract:s}}async function Ve(e){let t=m.resolve(e.workspacePath),o=a$2(t,C),n=await d(t,C)??o,s=await Q({workspacePath:t,now:e.now}),c=await g.pathExists(n)?await g.readJson(n):null,d$1=new Map((c?.projects||[]).map(h=>[h.slug,h])),f=new Set,u=[],l=[],a=[];for(let h of s.projects){let r=d$1.get(h.slug),p=_(r,h,f);r?p.changed&&l.push(h.slug):u.push(h.slug),a.push(p.project),d$1.delete(h.slug);}for(let h of d$1.values()){if(h.source)continue;let r=_(h,h,f);a.push(r.project);}let i={schemaVersion:v,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...s.workspace,...c?.workspace||{},name:c?.workspace?.name||s.workspace.name},projects:a.sort((h,r)=>h.slug.localeCompare(r.slug))},k=await te({workspacePath:t,contractPath:o,contract:i});if(e.strict&&k.status==="failed")throw new j(k);return await X({workspacePath:t,contractPath:o,contract:i,now:e.now}),{contractPath:o,contract:i,addedProjects:u,updatedProjects:l,verification:k}}async function q(e){return await g.pathExists(e)?{exists:true,contents:await g.readFile(e)}:{exists:false}}async function B(e,t){if(!t.exists){await g.remove(e);return}await g.outputFile(e,t.contents);}async function X(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:o}=await import('./workspace-registry-summary-ORDK7A36.js'),n=await t(e.workspacePath,{now:e.now,contract:e.contract}),s=a$2(e.workspacePath,o),c$1=d=>{if(!d||typeof d!="object"||Array.isArray(d))return JSON.stringify(d);let{generatedAt:f,...u}=d;return JSON.stringify(u)};if(await g.pathExists(e.contractPath)&&await g.pathExists(s)){let[d,f]=await Promise.all([g.readJson(e.contractPath),g.readJson(s)]);if(c$1(d)===c$1(e.contract)&&c$1(f)===c$1(n))return}b$1(C,e.contract),b$1(o,n),await c(e.workspacePath,C,async()=>{let[d,f]=await Promise.all([q(e.contractPath),q(s)]);try{if(e.contractPath===a$2(e.workspacePath,C)?await e$1(e.workspacePath,C,e.contract):(await g.ensureDir(m.dirname(e.contractPath)),await g.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await e$1(e.workspacePath,o,n);}catch(u){let a=(await Promise.allSettled([B(e.contractPath,d),B(s,f)])).filter(i=>i.status==="rejected");throw a.length>0?new AggregateError([u,...a.map(i=>i.reason)],"Workspace contract publication failed and rollback was incomplete."):u}});}async function ee(e){let t=e.contractPath??(await d(e.workspacePath,C)||a$2(e.workspacePath,C)),o=await g.readJson(t);return {contractPath:t,contract:o}}var me={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function ge(e,t){return t.externalPath?m.resolve(t.externalPath):m.resolve(e,t.relativePath)}async function fe(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[o,n]of Object.entries(me))for(let s of n)await g.pathExists(m.join(e,s))&&t[o].push(s);try{let o=await g.readdir(e,{withFileTypes:true});for(let n of o)n.isFile()&&(n.name.endsWith(".csproj")||n.name.endsWith(".sln"))&&t.manifests.push(n.name),n.isFile()&&n.name.endsWith(".tf")&&t.infrastructure.push(n.name);}catch{}for(let o of Object.values(t))o.sort((n,s)=>n.localeCompare(s));return t}function W(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,o)=>t.localeCompare(o))}async function he(e){try{let t=await g.readJson(m.join(e,"package.json")),o={runtime:W(t.dependencies),development:W(t.devDependencies),peer:W(t.peerDependencies),optional:W(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:W(t.scripts),dependencies:o,dependencyCount:new Set(Object.values(o).flat()).size}}catch{return}}async function ke(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await g.readFile(m.join(e,t),"utf8")).split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0&&!n.startsWith("#")&&n.includes("=")).map(n=>n.slice(0,n.indexOf("=")).trim()).filter(n=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)).sort((n,s)=>n.localeCompare(s))}catch{}return []}function we(e,t){try{let o=w(e);if(o.engine!=="unknown")return o;let n=g.pathExistsSync(m.join(e,"package.json"))?"npm":g.pathExistsSync(m.join(e,"pyproject.toml"))?"python":g.pathExistsSync(m.join(e,"requirements.txt"))?"pip":"unknown";return {...o,engine:n,runtime:t.runtime??o.runtime,framework:t.framework??o.framework,frameworkDisplayName:t.framework??o.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function Pe(e,t,o){let n=e.projects.map(s=>({id:s.slug,path:s.relativePath,runtime:s.runtime,framework:s.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:n,edges:[],stats:{nodeCount:n.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:n.length,connectedNodeCount:0,density:0,edgeCoverageRatio:n.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:o,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function Ke(e){let{contractPath:t,contract:o}=await ee(e),n=e.now??new Date,s=n.toISOString(),c;try{let{inferWorkspaceDependencyGraph:r}=await import('./workspace-dependency-graph-BP4EXYQ5.js');c=await r({workspacePath:e.workspacePath,contract:o,now:n,model:{projects:o.projects.map(p=>({name:p.slug,path:p.relativePath,...p.externalPath?{absolutePath:p.externalPath}:{},...p.runtime?{runtime:p.runtime}:{},...p.framework?{framework:p.framework}:{},...p.framework?{kind:p.framework}:{}}))}});}catch(r){c=Pe(o,s,`Graph enrichment failed: ${r instanceof Error?r.message:String(r)}`);}let d=new Map(c.nodes.map(r=>[r.id,r.operationalProfile])),{buildWorkspaceKnowledgeGraph:f}=await import('./workspace-knowledge-graph-ARDC6HHG.js'),u=await f({workspacePath:e.workspacePath,workspace:o.workspace,contract:o,projectTopology:c,now:n,projects:o.projects.map(r=>({id:r.slug,path:r.relativePath,...r.externalPath?{absolutePath:r.externalPath}:{},...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kit?{kit:r.kit}:{}}))}),l=await Promise.all(o.projects.map(async r=>{let p=ge(e.workspacePath,r),[w,y,R]=await Promise.all([fe(p),he(p),ke(p)]),P=we(p,r);return {id:r.slug,label:r.slug,relativePath:r.relativePath,source:r.source,relationship:r.relationship,externalPath:r.externalPath,runtime:r.runtime??P.runtime,framework:r.framework??P.framework,kit:r.kit,modules:r.modules,ports:r.ports,apis:r.contracts.apis,owns:r.contracts.owns,env:[...new Set([...r.contracts.env,...R])].sort((re,oe)=>re.localeCompare(oe)),contracts:{owns:[...r.contracts.owns],apis:[...r.contracts.apis],publishes:[...r.contracts.publishes],consumes:[...r.contracts.consumes],dependsOn:[...r.contracts.dependsOn],env:[...r.contracts.env]},capabilities:{engine:P.engine,supportTier:P.frameworkSupportTier,runtimeSupportTier:P.runtimeSupportTier,doctorSupport:P.runtimeDoctorSupport,moduleSupport:P.moduleSupport,fleetStages:[...P.fleetStages],localOnlyCommands:[...P.localOnlyCommands],supportedCommands:[...P.supportedCommands]},files:w,...y?{package:y}:{},...d.get(r.slug)?{operationalProfile:d.get(r.slug)}:{}}})),a=new Set(l.map(r=>r.id)),i=new Map,k=[];for(let r of o.projects){for(let p of r.contracts.dependsOn||[])a.has(p)&&k.push({from:p,to:r.slug,type:"dependency",label:"dependsOn"});for(let p of r.contracts.publishes||[])i.has(p)||i.set(p,new Set),i.get(p)?.add(r.slug);}for(let r of o.projects)for(let p of r.contracts.consumes||[]){let w=i.get(p);if(w)for(let y of w)y!==r.slug&&k.push({from:y,to:r.slug,type:"event",label:p});}let h={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:o.workspace,generatedAt:s,nodes:l.sort((r,p)=>r.id.localeCompare(p.id)),edges:k.sort((r,p)=>`${r.from}:${r.to}:${r.type}:${r.label}`.localeCompare(`${p.from}:${p.to}:${p.type}:${p.label}`)),dependencyGraph:c,knowledgeGraph:u,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:l.length,dependencyEdges:k.filter(r=>r.type==="dependency").length,eventEdges:k.filter(r=>r.type==="event").length,portCount:l.reduce((r,p)=>r+p.ports.length,0),apiCount:l.reduce((r,p)=>r+p.apis.length,0),relationshipEdges:c.stats.edgeCount,inferredEdges:c.stats.inferredEdges,authoritativeEdges:c.stats.authoritativeEdges,orphanProjects:c.stats.orphanCount,hotspotProjects:c.stats.hotspotCount,evidenceCoverageRatio:c.stats.evidenceCoverageRatio,edgeCoverageRatio:c.stats.edgeCoverageRatio,connectedProjects:c.stats.connectedNodeCount,lowConfidenceEdges:c.stats.lowConfidenceEdges,hasCycle:c.stats.hasCycle,manifestCount:l.reduce((r,p)=>r+p.files.manifests.length,0),entrypointCount:l.reduce((r,p)=>r+p.files.entrypoints.length,0),diagnostics:c.diagnostics?.length??0,relationshipKinds:Object.fromEntries(L.map(r=>[r,c.edges.filter(p=>p.kind===r).length])),relationshipSources:Object.fromEntries(U.map(r=>[r,c.edges.filter(p=>p.source===r).length])),entityCount:u.quality.entityCount,knowledgeRelations:u.quality.relationCount,proofCount:u.quality.proofCount,providerCount:u.providers.length,knowledgeUnknowns:u.quality.unknownCount}};return {contractPath:t,graph:h}}async function te(e){let t=e.contract?{contractPath:e.contractPath??a$2(e.workspacePath,C),contract:e.contract}:await ee(e),{contractPath:o,contract:n}=t,s=[],c=[];n.kind!=="rapidkit.workspace.contract"&&s.push("Contract kind must be rapidkit.workspace.contract."),n.schemaVersion!==v&&s.push(`Contract schemaVersion must be ${v}.`),n.workspace?.name||s.push("Contract workspace.name is required."),Array.isArray(n.projects)||s.push("Contract projects must be an array.");let d=new Set,f=new Map;for(let a of n.projects||[]){if(!a.slug){s.push("Every project must declare slug.");continue}d.has(a.slug)&&s.push(`Duplicate project slug: ${a.slug}.`),d.add(a.slug),a.relativePath?O(a.relativePath)||s.push(`Project ${a.slug} declares unsafe relativePath: ${a.relativePath}.`):s.push(`Project ${a.slug} must declare relativePath.`),a.externalPath&&(a.relationship==="adopted"||a.source==="adopted-local"||a.source==="local-folder"||a.source==="git-url"||s.push(`Project ${a.slug} declares externalPath without imported/adopted provenance.`),m.isAbsolute(a.externalPath)||s.push(`Project ${a.slug} declares non-absolute externalPath.`));for(let i of a.ports||[]){(!Number.isInteger(i.port)||i.port<1||i.port>65535)&&s.push(`Project ${a.slug} declares invalid port: ${i.port}.`);let k=f.get(i.port);k&&s.push(`Port ${i.port} is claimed by both ${k} and ${a.slug}.`),f.set(i.port,a.slug);}for(let i of a.contracts?.apis||[])(!i.name?.trim()||!i.basePath?.startsWith("/"))&&s.push(`Project ${a.slug} declares invalid API contract.`);for(let i of [...a.contracts?.publishes||[],...a.contracts?.consumes||[]])i.trim()||s.push(`Project ${a.slug} declares an empty event contract.`);for(let i of a.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(i)||s.push(`Project ${a.slug} declares invalid env contract: ${i}.`);for(let i of a.contracts?.dependsOn||[])d.has(i);}for(let a of n.projects||[])for(let i of a.contracts?.dependsOn||[])d.has(i)||s.push(`Project ${a.slug} depends on unknown project: ${i}.`);c.push({id:"schema",status:n.kind==="rapidkit.workspace.contract"&&n.schemaVersion===v?"passed":"failed",message:"Contract schema and kind are valid."}),c.push({id:"projects",status:Array.isArray(n.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(n.projects)?n.projects.length:0} project(s).`}),c.push({id:"ports",status:s.some(a=>a.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),c.push({id:"dependencies",status:s.some(a=>a.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),c.push({id:"contracts",status:s.some(a=>a.includes("unsafe relativePath")||a.includes("invalid API contract")||a.includes("event contract")||a.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let u=await l(e.workspacePath);if(u.moduleCount>0){for(let a of u.issues)s.push(`${m.basename(a.projectRoot)}: ${a.message} (slug=${a.slug})`);c.push({id:"module-paths",status:u.status,message:u.status==="passed"?`All ${u.moduleCount} registered module(s) resolve under canonical paths.`:`${u.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&c.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:s.length>0?"failed":"passed",contractPath:o,projectCount:Array.isArray(n.projects)?n.projects.length:0,checks:c,violations:s}}async function $e(e){let t=m.resolve(e.workspacePath),o={schemaVersion:se,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return e$1(t,ae,M(o))}
2
2
  export{M as a,be as b,L as c,C as d,ae as e,v as f,se as g,j as h,de as i,Q as j,Te as k,Ve as l,ee as m,Ke as n,te as o,$e as p};
@@ -1,8 +1,8 @@
1
- import {c as c$2}from'./chunk-U5EZHZBX.js';import {a as a$2}from'./chunk-GZTYAEWX.js';import {a}from'./chunk-A5FBGRJA.js';import {b as b$1}from'./chunk-YCL3I2JO.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p as p$1,o}from'./chunk-5XATWNME.js';import {p as p$2,r,q as q$1}from'./chunk-EYJ2CQSK.js';import {promises}from'fs';import {randomUUID}from'crypto';import p from'path';import c from'chalk';import ae from'fs-extra';import b from'ora';import {execa}from'execa';async function ie(e){try{let t=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return t.stdout.trim()?p.resolve(e,t.stdout.trim()):null}catch{return null}}async function q(e,t,r){if(await ie(e)){t.warn("Git initialization skipped because target is already inside a git worktree");return}t.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["-c","user.name=Workspai","-c","user.email=workspai@localhost","commit","-m",r],{cwd:e,env:a$1()}),t.succeed("Git repository initialized");}catch{t.warn("Could not initialize git repository");}}function X(e){let t=a(e.path),r=Array.isArray(e.projects)?e.projects:[],a$1=[],o=new Set;for(let s of r){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let i=a(s.path);o.has(i)||(o.add(i),a$1.push({name:s.name,path:i}));}return {name:e.name,path:t,mode:e.mode,projects:a$1}}function W(e){let t=[],r=new Set;for(let a of e.workspaces||[]){if(!a||typeof a.name!="string"||typeof a.path!="string")continue;let o=X(a);r.has(o.path)||(r.add(o.path),t.push(o));}return {workspaces:t}}async function se(e){let t;try{t=await promises.readFile(e,"utf8");}catch(r){if(r.code==="ENOENT")return {workspaces:[]};throw r}try{let r=JSON.parse(t);if(!r||!Array.isArray(r.workspaces))throw new Error("missing workspaces array");return W(r)}catch(r){throw new Error(`Workspace registry is invalid: ${e}`,{cause:r})}}async function ne(e){let t;try{t=await promises.readFile(e,"utf8");}catch(a){if(a.code==="ENOENT")return {workspaces:[]};throw a}let r;try{r=JSON.parse(t);}catch(a){throw new Error(`Workspace registry is invalid: ${e}`,{cause:a})}if(!r||typeof r!="object"||!Array.isArray(r.workspaces))throw new Error(`Workspace registry is invalid: ${e}`);for(let a of r.workspaces)if(!a||typeof a.name!="string"||typeof a.path!="string"||a.mode!==void 0&&typeof a.mode!="string"||a.projects!==void 0&&!Array.isArray(a.projects)||Array.isArray(a.projects)&&a.projects.some(o=>!o||typeof o.name!="string"||typeof o.path!="string"))throw new Error(`Workspace registry contains an invalid entry: ${e}`);return W(r)}async function B(){let e={workspaces:[]},t=new Set;for(let r$1 of r()){let a=await se(r$1);for(let o of a.workspaces)t.has(o.path)||(t.add(o.path),e.workspaces.push(o));}return e}async function ce(){let e={workspaces:[]},t=new Set;for(let r$1 of r()){let a=await ne(r$1);for(let o of a.workspaces)t.has(o.path)||(t.add(o.path),e.workspaces.push(o));}return e}function pe(e){let t=e?.code;return process.platform==="win32"&&(t==="EPERM"||t==="EINVAL"||t==="ENOSYS")}async function Q(e){try{await e.sync();}catch(t){if(!pe(t))throw t}}async function V(e,t){let r=p.dirname(e);await promises.mkdir(r,{recursive:true});let a=`${p.basename(e)}.`,o=Date.now();for(let i of await promises.readdir(r)){if(!i.startsWith(a)||!i.endsWith(".tmp"))continue;let n=p.join(r,i),d=await promises.stat(n).catch(()=>null);d&&o-d.mtimeMs>3e4&&await promises.rm(n,{force:true}).catch(()=>{});}let s=await promises.readFile(e,"utf8").catch(()=>null);if(s!==null){let i=false;try{let n=JSON.parse(s);i=Array.isArray(n.workspaces);}catch{i=false;}if(!i){let n=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,n);}}await K(e,`${JSON.stringify(W(t),null,2)}
2
- `);}async function K(e,t){let r=p.dirname(e);await promises.mkdir(r,{recursive:true});let a=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await promises.writeFile(a,t);let o=await promises.open(a,"r");try{await Q(o);}finally{await o.close();}try{await promises.rename(a,e);}catch(s){let i=s.code;if(i!=="EEXIST"&&i!=="EPERM")throw s;await ae.move(a,e,{overwrite:true});}}finally{await promises.rm(a,{force:true}).catch(()=>{});}}async function Y(e){try{return {exists:true,content:await promises.readFile(e)}}catch(t){if(t.code==="ENOENT")return {exists:false};throw t}}async function H(e,t){if(!t.exists){await promises.rm(e,{force:true});return}await K(e,t.content);}async function le(e){let t=p$2(),r=p.join(t,"workspaces.json.lock");await promises.mkdir(t,{recursive:true});let a=Date.now(),o;for(;!o;)try{o=await promises.open(r,"wx"),await o.writeFile(`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
3
- `),await Q(o);}catch(s){if(s.code!=="EEXIST")throw s;let i=await promises.stat(r).catch(()=>null);if(i&&Date.now()-i.mtimeMs>3e4){let n=await promises.readFile(r,"utf8").then(f=>JSON.parse(f)).catch(()=>null),d=Number(n?.pid),m=false;if(Number.isInteger(d)&&d>0)try{process.kill(d,0),m=true;}catch(f){m=f.code==="EPERM";}if(!m){await promises.rm(r,{force:true}).catch(()=>{});continue}}if(Date.now()-a>1e4)throw new Error(`Timed out waiting for workspace registry lock: ${r}`);await new Promise(n=>setTimeout(n,25));}try{return await e()}finally{await o.close().catch(()=>{}),await promises.rm(r,{force:true}).catch(()=>{});}}async function P(e){return le(async()=>{let t=p.join(p$2(),"workspaces.json"),r=p.join(q$1(),"workspaces.json"),[a,o]=await Promise.all([Y(t),Y(r)]),s=await ce();await e(s);let i=W(s);try{await V(t,i),await V(r,i);}catch(n){let m=(await Promise.allSettled([H(t,a),H(r,o)])).filter(f=>f.status==="rejected").map(f=>f.reason);throw m.length>0?new AggregateError([n,...m],"Workspace registry transaction failed and could not be fully restored"):n}return i})}async function Z(e,t){let r=a(e);await P(a=>{let o=a.workspaces.find(s=>s.path===r);if(o){o.name=t,o.mode=o.mode||"full",o.projects=Array.isArray(o.projects)?o.projects:[];return}a.workspaces.push({name:t,path:r,mode:"full",projects:[]});});}async function de(e,t){try{await Z(e,t);}catch{console.warn(c.gray("Note: Could not register workspace in shared registry"));}}async function Fe(e,t=false){let r=a(e),a$1={workspacePath:r,workspaceFound:false,added:[],skipped:0};try{let o=await B(),s=o.workspaces.find(u=>u.path===r);if(!s){if(await de(r,p.basename(p.resolve(e))),o=await B(),s=o.workspaces.find(u=>u.path===r),!s)return t||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),a$1;t||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(s.projects)||(s.projects=[]);let i=0,n=0,d=[],m=[],f=[e],g=new Set;for(;f.length>0;){let u=f.shift();if(!u||g.has(u))continue;g.add(u);let y=await promises.readdir(u,{withFileTypes:true});for(let h of y){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let j=p.join(u,h.name),k=a(j);try{let w=false;for(let $ of [...p$1(k,"context.json"),...p$1(k,"project.json")])try{await promises.access($),w=true;break}catch{}if(w){let $=p.basename(k),E=s.projects.some(C=>C.path===k);m.push({name:$,path:k}),E?n++:(s.projects.push({name:$,path:k}),i++,d.push(k),t||console.log(`\u2714 Added: ${p.relative(e,k)}`));continue}}catch{}f.push(j);}}return await P(u=>{let y=u.workspaces.find(k=>k.path===r);if(!y)return;let h=`${r}${p.sep}`,j=(y.projects||[]).filter(k=>k.path!==r&&!k.path.startsWith(h));y.projects=X({...y,projects:[...j,...m]}).projects;}),i>0?t||console.log(`
4
- \u2705 Synced ${i} project(s) to registry`):t||console.log(`
5
- \u2705 All projects already registered (${n} found)`),{workspacePath:r,workspaceFound:true,added:d,skipped:n}}catch(o){return t||console.error("\u274C Failed to sync projects:",o.message),a$1}}async function me(e,t,r){let a$1=a(e),o=a(r);await P(s=>{let i=s.workspaces.find(m=>m.path===a$1);if(!i)throw new Error(`Workspace is not registered: ${a$1}`);i.projects=Array.isArray(i.projects)?i.projects:[];let n=i.projects.findIndex(m=>m.path===o||m.name===t),d={name:t,path:o};n>=0?i.projects[n]=d:i.projects.push(d);});}async function Be(e,t,r){try{await me(e,t,r);}catch{}}async function Te(e,t){let r=b("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(p.join(e,".workspai"),{recursive:true});let a={workspace_name:t.name,author:t.author,rapidkit_version:c$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(p.join(e,".workspai","config.json"),JSON.stringify(a,null,2));let{syncWorkspaceFoundationFiles:o}=await import('./create-7JKJDAQV.js');await o(e,{workspaceName:t.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=ge();await promises.writeFile(p.join(e,"rapidkit"),s),await promises.chmod(p.join(e,"rapidkit"),493);let i=ue();await promises.writeFile(p.join(e,"rapidkit.cmd"),i);let n=fe(t.name);await promises.writeFile(p.join(e,"README.md"),n),await promises.writeFile(p.join(e,".gitignore"),`# Workspai workspace
1
+ import {c as c$2}from'./chunk-YJZOMRAS.js';import {a as a$2}from'./chunk-GZTYAEWX.js';import {a}from'./chunk-A5FBGRJA.js';import {b}from'./chunk-3NU32T4A.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {a as a$1}from'./chunk-TQEMLBAG.js';import {p as p$1,o}from'./chunk-5XATWNME.js';import {p as p$2,q,r}from'./chunk-EYJ2CQSK.js';import {promises}from'fs';import {randomUUID}from'crypto';import p from'path';import c from'chalk';import ae from'fs-extra';import S from'ora';import {execa}from'execa';async function se(e){try{let r=await execa("git",["rev-parse","--show-toplevel"],{cwd:e,env:a$1()});return r.stdout.trim()?p.resolve(e,r.stdout.trim()):null}catch{return null}}async function X(e,r,t){if(await se(e)){r.warn("Git initialization skipped because target is already inside a git worktree");return}r.start("Initializing git repository...");try{await execa("git",["init"],{cwd:e,env:a$1()}),await execa("git",["add","."],{cwd:e,env:a$1()}),await execa("git",["-c","user.name=Workspai","-c","user.email=workspai@localhost","commit","-m",t],{cwd:e,env:a$1()}),r.succeed("Git repository initialized");}catch{r.warn("Could not initialize git repository");}}function Q(e){let r=a(e.path),t=Array.isArray(e.projects)?e.projects:[],o=[],a$1=new Set;for(let s of t){if(!s||typeof s.name!="string"||typeof s.path!="string")continue;let i=a(s.path);a$1.has(i)||(a$1.add(i),o.push({name:s.name,path:i}));}return {name:e.name,path:r,mode:e.mode,projects:o}}function W(e){let r=[],t=new Set;for(let o of e.workspaces||[]){if(!o||typeof o.name!="string"||typeof o.path!="string")continue;let a=Q(o);t.has(a.path)||(t.add(a.path),r.push(a));}return {workspaces:r}}async function ie(e){let r;try{r=await promises.readFile(e,"utf8");}catch(t){if(t.code==="ENOENT")return {workspaces:[]};throw t}try{let t=JSON.parse(r);if(!t||!Array.isArray(t.workspaces))throw new Error("missing workspaces array");return W(t)}catch(t){throw new Error(`Workspace registry is invalid: ${e}`,{cause:t})}}async function ne(e){let r;try{r=await promises.readFile(e,"utf8");}catch(o){if(o.code==="ENOENT")return {workspaces:[]};throw o}let t;try{t=JSON.parse(r);}catch(o){throw new Error(`Workspace registry is invalid: ${e}`,{cause:o})}if(!t||typeof t!="object"||!Array.isArray(t.workspaces))throw new Error(`Workspace registry is invalid: ${e}`);for(let o of t.workspaces)if(!o||typeof o.name!="string"||typeof o.path!="string"||o.mode!==void 0&&typeof o.mode!="string"||o.projects!==void 0&&!Array.isArray(o.projects)||Array.isArray(o.projects)&&o.projects.some(a=>!a||typeof a.name!="string"||typeof a.path!="string"))throw new Error(`Workspace registry contains an invalid entry: ${e}`);return W(t)}async function B(){let e={workspaces:[]},r$1=new Set;for(let t of r()){let o=await ie(t);for(let a of o.workspaces)r$1.has(a.path)||(r$1.add(a.path),e.workspaces.push(a));}return e}async function ce(e=r()){let r={workspaces:[]},t=new Set;for(let o of e){let a=await ne(o);for(let s of a.workspaces)t.has(s.path)||(t.add(s.path),r.workspaces.push(s));}return r}function pe(e){let r=e?.code;return process.platform==="win32"&&(r==="EPERM"||r==="EINVAL"||r==="ENOSYS")}async function K(e){try{await e.sync();}catch(r){if(!pe(r))throw r}}async function V(e,r){let t=p.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${p.basename(e)}.`,a=Date.now();for(let i of await promises.readdir(t)){if(!i.startsWith(o)||!i.endsWith(".tmp"))continue;let n=p.join(t,i),d=await promises.stat(n).catch(()=>null);d&&a-d.mtimeMs>3e4&&await promises.rm(n,{force:true}).catch(()=>{});}let s=await promises.readFile(e,"utf8").catch(()=>null);if(s!==null){let i=false;try{let n=JSON.parse(s);i=Array.isArray(n.workspaces);}catch{i=false;}if(!i){let n=`${e}.corrupt-${Date.now()}`;await promises.copyFile(e,n);}}await Z(e,`${JSON.stringify(W(r),null,2)}
2
+ `);}async function Z(e,r){let t=p.dirname(e);await promises.mkdir(t,{recursive:true});let o=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await promises.writeFile(o,r);let a=await promises.open(o,"r");try{await K(a);}finally{await a.close();}try{await promises.rename(o,e);}catch(s){let i=s.code;if(i!=="EEXIST"&&i!=="EPERM")throw s;await ae.move(o,e,{overwrite:true});}}finally{await promises.rm(o,{force:true}).catch(()=>{});}}async function Y(e){try{return {exists:true,content:await promises.readFile(e)}}catch(r){if(r.code==="ENOENT")return {exists:false};throw r}}async function H(e,r){if(!r.exists){await promises.rm(e,{force:true});return}await Z(e,r.content);}async function le(e,r){let t=p.join(e,"workspaces.json.lock"),o=randomUUID();await promises.mkdir(e,{recursive:true});let a=Date.now(),s;for(;!s;)try{s=await promises.open(t,"wx"),await s.writeFile(`${JSON.stringify({pid:process.pid,lockId:o,createdAt:new Date().toISOString()})}
3
+ `),await K(s);}catch(i){if(i.code!=="EEXIST")throw i;let n=await promises.stat(t).catch(()=>null);if(n&&Date.now()-n.mtimeMs>3e4){let d=await promises.readFile(t,"utf8").then(m=>JSON.parse(m)).catch(()=>null),u=Number(d?.pid),f=false;if(Number.isInteger(u)&&u>0)try{process.kill(u,0),f=true;}catch(m){f=m.code==="EPERM";}if(!f){await promises.rm(t,{force:true}).catch(()=>{});continue}}if(Date.now()-a>1e4)throw new Error(`Timed out waiting for workspace registry lock: ${t}`);await new Promise(d=>setTimeout(d,25));}try{return await r()}finally{await s.close().catch(()=>{}),await promises.readFile(t,"utf8").then(n=>JSON.parse(n).lockId===o).catch(()=>false)&&await promises.rm(t,{force:true}).catch(()=>{});}}async function P(e){let r$1=p$2(),t=p.join(r$1,"workspaces.json"),o=p.join(q(),"workspaces.json"),a=[...new Set(r())];return le(r$1,async()=>{let[s,i]=await Promise.all([Y(t),Y(o)]),n=await ce(a);await e(n);let d=W(n);try{await V(t,d),await V(o,d);}catch(u){let m=(await Promise.allSettled([H(t,s),H(o,i)])).filter(g=>g.status==="rejected").map(g=>g.reason);throw m.length>0?new AggregateError([u,...m],"Workspace registry transaction failed and could not be fully restored"):u}return d})}async function ee(e,r){let t=a(e);await P(o=>{let a=o.workspaces.find(s=>s.path===t);if(a){a.name=r,a.mode=a.mode||"full",a.projects=Array.isArray(a.projects)?a.projects:[];return}o.workspaces.push({name:r,path:t,mode:"full",projects:[]});});}async function de(e,r){try{await ee(e,r);}catch{console.warn(c.gray("Note: Could not register workspace in shared registry"));}}async function Fe(e,r=false){let t=a(e),o={workspacePath:t,workspaceFound:false,added:[],skipped:0};try{let a$1=await B(),s=a$1.workspaces.find(g=>g.path===t);if(!s){if(await de(t,p.basename(p.resolve(e))),a$1=await B(),s=a$1.workspaces.find(g=>g.path===t),!s)return r||console.log("\u26A0\uFE0F Workspace could not be registered in registry"),o;r||console.log("\u2714 Registered workspace in shared registry");}Array.isArray(s.projects)||(s.projects=[]);let i=0,n=0,d=[],u=[],f=[e],m=new Set;for(;f.length>0;){let g=f.shift();if(!g||m.has(g))continue;m.add(g);let y=await promises.readdir(g,{withFileTypes:true});for(let h of y){if(!h.isDirectory()||h.name.startsWith(".")||["node_modules","dist","build","target","coverage","htmlcov"].includes(h.name))continue;let j=p.join(g,h.name),k=a(j);try{let w=false;for(let $ of [...p$1(k,"context.json"),...p$1(k,"project.json")])try{await promises.access($),w=true;break}catch{}if(w){let $=p.basename(k),E=s.projects.some(C=>C.path===k);u.push({name:$,path:k}),E?n++:(s.projects.push({name:$,path:k}),i++,d.push(k),r||console.log(`\u2714 Added: ${p.relative(e,k)}`));continue}}catch{}f.push(j);}}return await P(g=>{let y=g.workspaces.find(k=>k.path===t);if(!y)return;let h=`${t}${p.sep}`,j=(y.projects||[]).filter(k=>k.path!==t&&!k.path.startsWith(h));y.projects=Q({...y,projects:[...j,...u]}).projects;}),i>0?r||console.log(`
4
+ \u2705 Synced ${i} project(s) to registry`):r||console.log(`
5
+ \u2705 All projects already registered (${n} found)`),{workspacePath:t,workspaceFound:true,added:d,skipped:n}}catch(a){return r||console.error("\u274C Failed to sync projects:",a.message),o}}async function me(e,r,t){let o=a(e),a$1=a(t);await P(s=>{let i=s.workspaces.find(u=>u.path===o);if(!i)throw new Error(`Workspace is not registered: ${o}`);i.projects=Array.isArray(i.projects)?i.projects:[];let n=i.projects.findIndex(u=>u.path===a$1||u.name===r),d={name:r,path:a$1};n>=0?i.projects[n]=d:i.projects.push(d);});}async function Be(e,r,t){try{await me(e,r,t);}catch{}}async function Te(e,r){let t=S("Creating Workspai workspace...").start();try{await promises.mkdir(e,{recursive:true}),await promises.mkdir(p.join(e,".workspai"),{recursive:true});let o={workspace_name:r.name,author:r.author,rapidkit_version:c$1(),created_at:new Date().toISOString(),type:"workspace"};await promises.writeFile(p.join(e,".workspai","config.json"),JSON.stringify(o,null,2));let{syncWorkspaceFoundationFiles:a}=await import('./create-S64IWHAP.js');await a(e,{workspaceName:r.name,installMethod:"venv",writeMarker:true,writeGitignore:false,onlyIfMissing:true});let s=ge();await promises.writeFile(p.join(e,"rapidkit"),s),await promises.chmod(p.join(e,"rapidkit"),493);let i=ue();await promises.writeFile(p.join(e,"rapidkit.cmd"),i);let n=we(r.name);await promises.writeFile(p.join(e,"README.md"),n),await promises.writeFile(p.join(e,".gitignore"),`# Workspai workspace
6
6
  .env
7
7
  .env.*
8
8
  !.env.example
@@ -17,7 +17,7 @@ Thumbs.db
17
17
 
18
18
  # Logs
19
19
  *.log
20
- `),await we(e),r.succeed("Workspace created!"),t.skipGit||await q(e,b(),"Initial commit: Workspai workspace"),await Z(e,t.name);let{publishWorkspaceRegistrySummary:m}=await import('./workspace-registry-summary-A3YDL63D.js');await m(e),console.log(`
20
+ `),await fe(e),t.succeed("Workspace created!"),r.skipGit||await X(e,S(),"Initial commit: Workspai workspace"),await ee(e,r.name);let{publishWorkspaceRegistrySummary:u}=await import('./workspace-registry-summary-ORDK7A36.js');await u(e),console.log(`
21
21
  ${c.green("\u2728 Workspai workspace created successfully!")}
22
22
 
23
23
  ${c.bold("\u{1F4C2} Workspace structure:")}
@@ -33,7 +33,7 @@ ${e}/
33
33
  \u2514\u2500\u2500 README.md
34
34
 
35
35
  ${c.bold("\u{1F680} Get started:")}
36
- ${c.cyan(`cd ${t.name}`)}
36
+ ${c.cyan(`cd ${r.name}`)}
37
37
  ${c.cyan("npx workspai create project fastapi.standard my-api --yes")}
38
38
  ${c.cyan("cd my-api")}
39
39
  ${c.cyan("npx workspai init")}
@@ -54,7 +54,7 @@ ${c.bold("\u{1F4DA} Commands:")}
54
54
 
55
55
  ${c.gray("Alternative: npx workspai dev, make dev")}
56
56
  ${c.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
57
- `);}catch(a){throw r.fail("Failed to create workspace"),a}}function ge(){return `#!/usr/bin/env bash
57
+ `);}catch(o){throw t.fail("Failed to create workspace"),o}}function ge(){return `#!/usr/bin/env bash
58
58
  #
59
59
  # Workspai CLI - local workspace commands
60
60
  # This script provides legacy ./rapidkit commands within the workspace
@@ -460,7 +460,7 @@ if %ERRORLEVEL%==0 (
460
460
  echo [Workspai] No sh/bash found. Falling back to npx workspai.
461
461
  npx workspai %*
462
462
  exit /b %ERRORLEVEL%
463
- `}function fe(e){return `# ${e}
463
+ `}function we(e){return `# ${e}
464
464
 
465
465
  Workspai workspace for building API projects.
466
466
 
@@ -516,8 +516,8 @@ instructions start at \`AGENTS.md\`.
516
516
  ## Learn More
517
517
 
518
518
  - [Workspai Documentation](https://workspai.dev)
519
- - [GitHub Repository](https://github.com/rapidkitlabs/workspai)
520
- `}async function we(e){let{fileURLToPath:t}=await import('url'),r=t(import.meta.url),a=p.dirname(r),o=p.resolve(a,".."),s=p.join(o,"templates","kits"),i=p.join(e,".workspai","templates"),{default:n}=await import('fs-extra');await n.copy(s,i);let d=p.join(o,"templates","generator.js"),m=p.join(e,".workspai","generator.js");await n.copy(d,m);}async function Je(e,t){let r=t.template==="fastapi",a=r?"FastAPI":"NestJS",o=b(`Creating ${a} project...`).start();try{let{fileURLToPath:s}=await import('url'),i=s(import.meta.url),n=p.dirname(i),d=p.resolve(n,".."),m=r?"fastapi-standard":"nestjs-standard",f=p.join(d,"templates","kits",m);await promises.mkdir(e,{recursive:true});let g={project_name:r?t.name.replace(/-/g,"_").toLowerCase():t.name.replace(/_/g,"-").toLowerCase(),author:t.author,description:t.description||`${a} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:t.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c$1()};await ee(f,e,g);let u=r?`# Python
519
+ - [GitHub Repository](https://github.com/chistiq/workspai)
520
+ `}async function fe(e){let{fileURLToPath:r}=await import('url'),t=r(import.meta.url),o=p.dirname(t),a=p.resolve(o,".."),s=p.join(a,"templates","kits"),i=p.join(e,".workspai","templates"),{default:n}=await import('fs-extra');await n.copy(s,i);let d=p.join(a,"templates","generator.js"),u=p.join(e,".workspai","generator.js");await n.copy(d,u);}async function Je(e,r){let t=r.template==="fastapi",o=t?"FastAPI":"NestJS",a=S(`Creating ${o} project...`).start();try{let{fileURLToPath:s}=await import('url'),i=s(import.meta.url),n=p.dirname(i),d=p.resolve(n,".."),u=t?"fastapi-standard":"nestjs-standard",f=p.join(d,"templates","kits",u);await promises.mkdir(e,{recursive:true});let m={project_name:t?r.name.replace(/-/g,"_").toLowerCase():r.name.replace(/_/g,"-").toLowerCase(),author:r.author,description:r.description||`${o} application generated with Workspai`,app_version:"0.1.0",license:"MIT",package_manager:r.package_manager||"npm",created_at:new Date().toISOString(),rapidkit_version:c$1()};await te(f,e,m);let g=t?`# Python
521
521
  __pycache__/
522
522
  *.py[cod]
523
523
  *$py.class
@@ -585,7 +585,7 @@ Thumbs.db
585
585
 
586
586
  # Coverage
587
587
  coverage/
588
- `;if(await promises.writeFile(p.join(e,".gitignore"),u),o.succeed(`${a} project created!`),t.skipGit||await q(e,b(),`Initial commit: ${a} project via Workspai`),!t.skipInstall&&!r){let h=t.package_manager||"npm",j=b(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),j.succeed("Dependencies installed");}catch{j.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let y=p.basename(e);console.log(r?`
588
+ `;if(await promises.writeFile(p.join(e,".gitignore"),g),a.succeed(`${o} project created!`),r.skipGit||await X(e,S(),`Initial commit: ${o} project via Workspai`),!r.skipInstall&&!t){let h=r.package_manager||"npm",j=S(`Installing dependencies with ${h}...`).start();try{await execa(h,["install"],{cwd:e}),j.succeed("Dependencies installed");}catch{j.warn(`Could not install dependencies. Run '${h} install' manually.`);}}let y=p.basename(e);console.log(t?`
589
589
  ${c.green("\u2728 FastAPI project created successfully!")}
590
590
 
591
591
  ${c.bold("\u{1F4C2} Project structure:")}
@@ -632,7 +632,7 @@ ${e}/
632
632
 
633
633
  ${c.bold("\u{1F680} Get started:")}
634
634
  ${c.cyan(`cd ${y}`)}
635
- ${t.skipInstall?c.cyan("npx workspai init")+c.gray(" # npm install")+`
635
+ ${r.skipInstall?c.cyan("npx workspai init")+c.gray(" # npm install")+`
636
636
  `:""}${c.cyan("cp .env.example .env")}
637
637
  ${c.cyan("npx workspai dev")} ${c.gray("# Start dev server")}
638
638
 
@@ -651,16 +651,16 @@ ${c.bold("\u{1F310} API endpoints:")}
651
651
  http://localhost:8000/examples/notes # Example API
652
652
 
653
653
  ${c.gray("\u{1F4A1} Tip: Install globally (npm i -g workspai) to use without npx")}
654
- `);}catch(s){throw o.fail(`Failed to create ${a} project`),s}}async function ee(e,t,r){let a=await promises.readdir(e,{withFileTypes:true});for(let o of a){let s=p.join(e,o.name),i=o.name.replace(/\.j2$/,""),n=p.join(t,i);if(o.isDirectory())await promises.mkdir(n,{recursive:true}),await ee(s,n,r);else {let d=await promises.readFile(s,"utf-8");o.name.endsWith(".j2")&&(d=ke(d,r)),await promises.writeFile(n,d),(i==="rapidkit"||i==="activate"||i.endsWith(".py")&&(n.includes(".workspai")||n.includes(".rapidkit")))&&await promises.chmod(n,493);}}}function ke(e,t){let r=e;for(let[a,o]of Object.entries(t)){let s=new RegExp(`\\{\\{\\s*${a}\\s*\\}\\}`,"g");r=r.replace(s,String(o));let i=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");r=r.replace(i,(m,f,g)=>String(o).replace(new RegExp(f,"g"),g));let n=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(n,String(o).toLowerCase());let d=new RegExp(`\\{\\{\\s*${a}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");r=r.replace(d,(m,f,g)=>String(o).replace(new RegExp(f,"g"),g).toLowerCase());}return r}async function Ge(e={}){let t=p$2(),r=p.join(t,"workspaces.json"),a=await B();if(a.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(c.yellow(`
654
+ `);}catch(s){throw a.fail(`Failed to create ${o} project`),s}}async function te(e,r,t){let o=await promises.readdir(e,{withFileTypes:true});for(let a of o){let s=p.join(e,a.name),i=a.name.replace(/\.j2$/,""),n=p.join(r,i);if(a.isDirectory())await promises.mkdir(n,{recursive:true}),await te(s,n,t);else {let d=await promises.readFile(s,"utf-8");a.name.endsWith(".j2")&&(d=ke(d,t)),await promises.writeFile(n,d),(i==="rapidkit"||i==="activate"||i.endsWith(".py")&&(n.includes(".workspai")||n.includes(".rapidkit")))&&await promises.chmod(n,493);}}}function ke(e,r){let t=e;for(let[o,a]of Object.entries(r)){let s=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g");t=t.replace(s,String(a));let i=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\}\\}`,"g");t=t.replace(i,(u,f,m)=>String(a).replace(new RegExp(f,"g"),m));let n=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(n,String(a).toLowerCase());let d=new RegExp(`\\{\\{\\s*${o}\\s*\\|\\s*replace\\s*\\(\\s*['"]([^'"]+)['"]\\s*,\\s*['"]([^'"]*)['"]\\s*\\)\\s*\\|\\s*lower\\s*\\}\\}`,"g");t=t.replace(d,(u,f,m)=>String(a).replace(new RegExp(f,"g"),m).toLowerCase());}return t}async function Ge(e={}){let r=p$2(),t=p.join(r,"workspaces.json"),o=await B();if(o.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:false}},null,2));return}console.log(c.yellow(`
655
655
  \u26A0\uFE0F No workspaces registered yet.
656
656
  `)),console.log(c.gray(`Create a workspace with: npx workspai <workspace-name>
657
- `));return}try{let o=a;if(!o||typeof o!="object"||!Array.isArray(o.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(c.yellow(`
657
+ `));return}try{let a=o;if(!a||typeof a!="object"||!Array.isArray(a.workspaces)){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.invalid",message:"Workspace registry is invalid."}},null,2));return}console.log(c.yellow(`
658
658
  \u26A0\uFE0F Workspace registry is invalid; resetting to empty state.
659
- `)),await P(g=>{g.workspaces=[];});return}let s=W(o),i=[],n=0;for(let g of s.workspaces)await promises.stat(g.path).catch(()=>null)?i.push(g):n+=1;let d={workspaces:i},m=JSON.stringify(o),f=JSON.stringify(d);if(!e.json&&m!==f){let g=new Set(i.map(u=>u.path));await P(u=>{u.workspaces=u.workspaces.filter(y=>g.has(y.path));});}if(!d.workspaces||d.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:n,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(c.yellow(`
659
+ `)),await P(m=>{m.workspaces=[];});return}let s=W(a),i=[],n=0;for(let m of s.workspaces)await promises.stat(m.path).catch(()=>null)?i.push(m):n+=1;let d={workspaces:i},u=JSON.stringify(a),f=JSON.stringify(d);if(!e.json&&u!==f){let m=new Set(i.map(g=>g.path));await P(g=>{g.workspaces=g.workspaces.filter(y=>m.has(y.path));});}if(!d.workspaces||d.workspaces.length===0){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:n,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(c.yellow(`
660
660
  \u26A0\uFE0F No workspaces registered yet.
661
661
  `)),n>0&&console.log(c.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.
662
- `));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:d.workspaces,summary:{total:d.workspaces.length,missing:n,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(c.bold(`
662
+ `));return}if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:d.workspaces,summary:{total:d.workspaces.length,missing:n,registryExists:true,registryValid:true,cleanupApplied:false}},null,2));return}console.log(c.bold(`
663
663
  \u{1F4E6} Registered Workspai Workspaces:
664
- `));for(let g of d.workspaces)console.log(c.cyan(` ${g.name}`)),console.log(c.gray(` Path: ${g.path}`)),console.log(c.gray(` Projects: ${g.projects?.length||0}`)),console.log();n>0&&console.log(c.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.`)),console.log(c.gray(`Total: ${d.workspaces.length} workspace(s)
665
- `));}catch(o){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:r,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:o.message}},null,2));return}console.error(c.red(`
666
- \u274C Failed to read workspace registry`)),console.error(c.gray(String(o)));}}async function he(e){try{let t=await promises.readFile(e,"utf8");return JSON.parse(t)}catch{return null}}async function L(e){for(let t of e){let r=await he(t);if(r!==null)return r}return null}function ye(e){return c$2(e)}async function $e(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function O(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(r=>r.isFile()&&r.name.toLowerCase().endsWith(".json")).map(r=>r.name).sort((r,a)=>r.localeCompare(a))}catch{return []}}async function ze(e,t){let r=t?.includePaths===true,a=t?.includeDoctorEvidence!==false,o$1=t?.includeBlueprint!==false,s=p.resolve(e),i=await L(o(s,"workspace.json")),n=typeof i?.workspace_name=="string"&&i.workspace_name.trim()||p.basename(s),d=typeof i?.profile=="string"?i.profile:void 0,m=typeof i?.rapidkit_version=="string"?i.rapidkit_version:void 0,f=await $e(s),g=[];for(let w of f){let $=await L(p$1(w,"project.json")),E=p.relative(s,w)||".",C=p.dirname(p$1(w,p.join("reports","placeholder"))[0]),T=p.dirname(p$1(w,p.join("reports","placeholder"))[1]),N={name:p.basename(w),relative_path:E,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(_=>typeof _=="string"):void 0};if(r&&(N.absolute_path=w),a){let _=await L([p.join(C,"doctor-last-run.json"),p.join(T,"doctor-last-run.json")]);ye(_)&&(N.doctor_report=_);}let J=[...await O(C),...await O(T)].filter((_,te,re)=>re.indexOf(_)===te);J.length>0&&(N.reports=J),g.push(N);}let u=o(s,"reports"),y=[...await O(u[0]),...await O(u[1])].filter((w,$,E)=>E.indexOf(w)===$),h=await L(o(s,"workspace.contract.json")),j={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:n,relative_root:".",profile:d,rapidkit_version:m,...r?{absolute_root:s}:{}},summary:{project_count:g.length,doctor_evidence_included:a,contract_included:!!h},reports:{workspace:y},projects:g,...h?{contract:h}:{}};o$1&&(j.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:n,profile:d},projects:g.map(w=>({name:w.name,relative_path:w.relative_path,runtime:w.runtime,kit_name:w.kit_name,modules:w.modules??[],recreate_commands:[...w.kit_name?[`npx workspai create project ${w.kit_name} ${w.name} --yes --skip-install`]:[],`cd ${w.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let k=t?.outputPath?p.resolve(t.outputPath):p.join(u[0],"share-bundle.json");return t?.outputPath||b$1(".workspai/reports/share-bundle.json",j),await promises.mkdir(p.dirname(k),{recursive:true}),await promises.writeFile(k,JSON.stringify(j,null,2),"utf8"),k}export{X as a,Z as b,de as c,Fe as d,me as e,Be as f,Te as g,Je as h,Ge as i,ze as j};
664
+ `));for(let m of d.workspaces)console.log(c.cyan(` ${m.name}`)),console.log(c.gray(` Path: ${m.path}`)),console.log(c.gray(` Projects: ${m.projects?.length||0}`)),console.log();n>0&&console.log(c.gray(`Cleaned ${n} stale workspace entr${n===1?"y":"ies"}.`)),console.log(c.gray(`Total: ${d.workspaces.length} workspace(s)
665
+ `));}catch(a){if(e.json){console.log(JSON.stringify({schemaVersion:"rapidkit-workspace-list-v1",registryPath:t,workspaces:[],summary:{total:0,missing:0,registryExists:true,registryValid:false},error:{code:"workspace.registry.read_failed",message:a.message}},null,2));return}console.error(c.red(`
666
+ \u274C Failed to read workspace registry`)),console.error(c.gray(String(a)));}}async function he(e){try{let r=await promises.readFile(e,"utf8");return JSON.parse(r)}catch{return null}}async function L(e){for(let r of e){let t=await he(r);if(t!==null)return t}return null}function ye(e){return c$2(e)}async function $e(e){return a$2(e,{skipDirs:new Set(["node_modules","dist","build","target","coverage","htmlcov"]),includeHiddenDirs:false,descendIntoMatchedProjects:true})}async function O(e){try{return (await promises.readdir(e,{withFileTypes:true})).filter(t=>t.isFile()&&t.name.toLowerCase().endsWith(".json")).map(t=>t.name).sort((t,o)=>t.localeCompare(o))}catch{return []}}async function ze(e,r){let t=r?.includePaths===true,o$1=r?.includeDoctorEvidence!==false,a=r?.includeBlueprint!==false,s=p.resolve(e),i=await L(o(s,"workspace.json")),n=typeof i?.workspace_name=="string"&&i.workspace_name.trim()||p.basename(s),d=typeof i?.profile=="string"?i.profile:void 0,u=typeof i?.rapidkit_version=="string"?i.rapidkit_version:void 0,f=await $e(s),m=[];for(let w of f){let $=await L(p$1(w,"project.json")),E=p.relative(s,w)||".",C=p.dirname(p$1(w,p.join("reports","placeholder"))[0]),T=p.dirname(p$1(w,p.join("reports","placeholder"))[1]),N={name:p.basename(w),relative_path:E,runtime:typeof $?.runtime=="string"?$.runtime:void 0,kit_name:typeof $?.kit_name=="string"?$.kit_name:void 0,modules:Array.isArray($?.modules)?$.modules.filter(_=>typeof _=="string"):void 0};if(t&&(N.absolute_path=w),o$1){let _=await L([p.join(C,"doctor-last-run.json"),p.join(T,"doctor-last-run.json")]);ye(_)&&(N.doctor_report=_);}let J=[...await O(C),...await O(T)].filter((_,re,oe)=>oe.indexOf(_)===re);J.length>0&&(N.reports=J),m.push(N);}let g=o(s,"reports"),y=[...await O(g[0]),...await O(g[1])].filter((w,$,E)=>E.indexOf(w)===$),h=await L(o(s,"workspace.contract.json")),j={schema_version:"1.1",generated_at:new Date().toISOString(),generated_by:"workspai",workspace:{name:n,relative_root:".",profile:d,rapidkit_version:u,...t?{absolute_root:s}:{}},summary:{project_count:m.length,doctor_evidence_included:o$1,contract_included:!!h},reports:{workspace:y},projects:m,...h?{contract:h}:{}};a&&(j.blueprint={schema_version:"rapidkit.workspace-blueprint.v1",purpose:"portable-reproducibility",workspace:{name:n,profile:d},projects:m.map(w=>({name:w.name,relative_path:w.relative_path,runtime:w.runtime,kit_name:w.kit_name,modules:w.modules??[],recreate_commands:[...w.kit_name?[`npx workspai create project ${w.kit_name} ${w.name} --yes --skip-install`]:[],`cd ${w.relative_path}`,"npx workspai init","npx workspai test"]})),recommended_commands:["npx workspai workspace contract verify --strict","npx workspai doctor workspace","npx workspai workspace run init --json","npx workspai workspace run test --strict --json","npx workspai readiness --strict --json"]});let k=r?.outputPath?p.resolve(r.outputPath):p.join(g[0],"share-bundle.json");return r?.outputPath||b(".workspai/reports/share-bundle.json",j),await promises.mkdir(p.dirname(k),{recursive:true}),await promises.writeFile(k,JSON.stringify(j,null,2),"utf8"),k}export{Q as a,ee as b,de as c,Fe as d,me as e,Be as f,Te as g,Je as h,Ge as i,ze as j};
@@ -1 +1 @@
1
- import {b}from'./chunk-LNRAB7UY.js';var i=b.explain,g=["project","release-blocked","blocker","trace"];function s(t){let r=t.trim();if(!r)return null;if(r==="release-blocked")return {kind:"release-blocked"};if(r.startsWith("project:")){let e=r.slice(8).trim();return e?{kind:"project",project:e}:null}if(r.startsWith("blocker:")){let e=r.slice(8).trim();return e?{kind:"blocker",blockerId:e}:null}if(r.startsWith("trace:")){let e=r.slice(6).trim();return e?{kind:"trace",diffRef:e}:null}return {kind:"project",project:r}}function u(t){let r=t.trim();if(!r)return null;if(r.startsWith("trace:")){let n=s(r);return n?.kind==="trace"?n:null}let e=r.replace(/\\/g,"/").trim().toLowerCase();return e.endsWith(".json")||e.includes("workspace-model-diff")||e.startsWith(".rapidkit/")||e.includes("/.rapidkit/")?{kind:"trace",diffRef:r}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let r=t;return r.schemaVersion===i&&typeof r.generatedAt=="string"&&typeof r.summary=="string"&&Array.isArray(r.sections)&&r.target!=null&&typeof r.target=="object"&&!Array.isArray(r.target)&&typeof r.target.kind=="string"}export{i as a,g as b,s as c,u as d,A as e};
1
+ import {b}from'./chunk-BMWFQXGW.js';var i=b.explain,g=["project","release-blocked","blocker","trace"];function s(t){let r=t.trim();if(!r)return null;if(r==="release-blocked")return {kind:"release-blocked"};if(r.startsWith("project:")){let e=r.slice(8).trim();return e?{kind:"project",project:e}:null}if(r.startsWith("blocker:")){let e=r.slice(8).trim();return e?{kind:"blocker",blockerId:e}:null}if(r.startsWith("trace:")){let e=r.slice(6).trim();return e?{kind:"trace",diffRef:e}:null}return {kind:"project",project:r}}function u(t){let r=t.trim();if(!r)return null;if(r.startsWith("trace:")){let n=s(r);return n?.kind==="trace"?n:null}let e=r.replace(/\\/g,"/").trim().toLowerCase();return e.endsWith(".json")||e.includes("workspace-model-diff")||e.startsWith(".rapidkit/")||e.includes("/.rapidkit/")?{kind:"trace",diffRef:r}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let r=t;return r.schemaVersion===i&&typeof r.generatedAt=="string"&&typeof r.summary=="string"&&Array.isArray(r.sections)&&r.target!=null&&typeof r.target=="object"&&!Array.isArray(r.target)&&typeof r.target.kind=="string"}export{i as a,g as b,s as c,u as d,A as e};
@@ -1 +1 @@
1
- import {b}from'./chunk-LNRAB7UY.js';var i=b.doctor,s="doctor-project-evidence-v1";function f(r){return !r||typeof r!="object"||Array.isArray(r)?null:r}function u(r,n){let t=f(r);if(!t)return false;let o=t.schemaVersion,e=t.evidenceType;return !(typeof o=="string"&&(o!==i&&o!==s||n==="workspace"&&o!==i||n==="project"&&o!==s)||typeof e=="string"&&(e!=="workspace"&&e!=="project"||n&&e!==n))}export{i as a,s as b,u as c};
1
+ import {b}from'./chunk-BMWFQXGW.js';var i=b.doctor,s="doctor-project-evidence-v1";function f(r){return !r||typeof r!="object"||Array.isArray(r)?null:r}function u(r,n){let t=f(r);if(!t)return false;let o=t.schemaVersion,e=t.evidenceType;return !(typeof o=="string"&&(o!==i&&o!==s||n==="workspace"&&o!==i||n==="project"&&o!==s)||typeof e=="string"&&(e!=="workspace"&&e!=="project"||n&&e!==n))}export{i as a,s as b,u as c};
@@ -1 +1 @@
1
- export{c as PYTHON_FREE_WORKSPACE_PROFILES,a as buildWorkspaceManifest,f as createProject,g as registerWorkspaceAtPath,d as resolvePythonFreeFallbackProfile,b as syncWorkspaceFoundationFiles,e as writeWorkspaceLauncher}from'./chunk-BSRVO52Y.js';
1
+ export{c as PYTHON_FREE_WORKSPACE_PROFILES,a as buildWorkspaceManifest,f as createProject,g as registerWorkspaceAtPath,d as resolvePythonFreeFallbackProfile,b as syncWorkspaceFoundationFiles,e as writeWorkspaceLauncher}from'./chunk-EKZLUMCS.js';
@@ -1 +1 @@
1
- export{a as DOCTOR_WORKSPACE_REPORT_PATH,m as applyEnvKeyAddFix,i as applyFileAppendFix,j as applyFileCopyFix,h as applyFileCreateFix,l as applyJsonEditFix,n as applyMakefileTargetFix,g as applyPackageScriptFix,f as assertOperationPathInsideProject,e as buildRepairOperationIdentity,p as computeDoctorFixAwareExitCode,o as computeDoctorGateExitCode,k as decodeJsonPointerSegment,d as parseInternalRepairCommand,c as parsePackageScriptFix,b as resolveDoctorPolicyProfile,q as runDoctor}from'./chunk-MEMHNE7Y.js';
1
+ export{a as DOCTOR_WORKSPACE_REPORT_PATH,m as applyEnvKeyAddFix,i as applyFileAppendFix,j as applyFileCopyFix,h as applyFileCreateFix,l as applyJsonEditFix,n as applyMakefileTargetFix,g as applyPackageScriptFix,f as assertOperationPathInsideProject,e as buildRepairOperationIdentity,p as computeDoctorFixAwareExitCode,o as computeDoctorGateExitCode,k as decodeJsonPointerSegment,d as parseInternalRepairCommand,c as parsePackageScriptFix,b as resolveDoctorPolicyProfile,q as runDoctor}from'./chunk-BFLJ2R4D.js';
@@ -1,4 +1,4 @@
1
- import {b as b$1,c}from'./chunk-IBJEQHJR.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {b as b$2,a}from'./chunk-TQEMLBAG.js';import {promises}from'fs';import n from'path';import i from'chalk';import S from'ora';import {execa}from'execa';var b="net8.0",j="8080";function y(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function E(e,r){return e.trim().replace(/[^A-Za-z0-9_.]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(a=>a.replace(/^[^A-Za-z_]+/,"").replace(/[^A-Za-z0-9_]/g,"")).filter(Boolean).join(".")||r}function _(e,r){return e.replace(/[\r\n\t]+/g," ").trim()||r}function D(e){return e.trim()===b}function $(){return JSON.stringify({engine:"npm",runtime:"dotnet"},null,2)}function I(e,r){return JSON.stringify({kit_name:"dotnet.webapi.clean",runtime:"dotnet",framework:"dotnet",module_support:false,project_name:e.project_name,root_namespace:e.root_namespace,target_framework:e.target_framework,app_version:e.app_version,created_by:"workspai",workspai_version:r,rapidkit_version:r,created_at:new Date().toISOString()},null,2)}function P(e){return `<Project Sdk="Microsoft.NET.Sdk.Web">
1
+ import {b as b$1,c}from'./chunk-IBJEQHJR.js';import {c as c$1}from'./chunk-Y45WZR5N.js';import {b as b$2,a}from'./chunk-TQEMLBAG.js';import {promises}from'fs';import o from'path';import i from'chalk';import S from'ora';import {execa}from'execa';var b="net8.0",j="8080";function y(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")}function E(e,r){return e.trim().replace(/[^A-Za-z0-9_.]+/g,".").replace(/^\.+|\.+$/g,"").replace(/\.{2,}/g,".").split(".").map(a=>a.replace(/^[^A-Za-z_]+/,"").replace(/[^A-Za-z0-9_]/g,"")).filter(Boolean).join(".")||r}function _(e,r){return e.replace(/[\r\n\t]+/g," ").trim()||r}function D(e){return e.trim()===b}function $(){return JSON.stringify({engine:"npm",runtime:"dotnet"},null,2)}function I(e,r){return JSON.stringify({kit_name:"dotnet.webapi.clean",runtime:"dotnet",framework:"dotnet",module_support:false,project_name:e.project_name,root_namespace:e.root_namespace,target_framework:e.target_framework,app_version:e.app_version,created_by:"workspai",workspai_version:r,rapidkit_version:r,created_at:new Date().toISOString()},null,2)}function P(e){return `<Project Sdk="Microsoft.NET.Sdk.Web">
2
2
  <PropertyGroup>
3
3
  <TargetFramework>${e.target_framework}</TargetFramework>
4
4
  <Nullable>enable</Nullable>
@@ -417,9 +417,9 @@ Global
417
417
  {22222222-2222-2222-2222-222222222222} = {44444444-4444-4444-4444-444444444444}
418
418
  EndGlobalSection
419
419
  EndGlobal
420
- `.trimStart()}async function q(e,r){if(!r)try{if(await b$2(e)){console.log(i.gray("\u26A0 git init skipped (target is inside an existing git worktree)"));return}await execa("git",["init"],{cwd:e,stdio:"ignore",env:a()});}catch{console.log(i.gray("\u26A0 git init skipped (git not found or error)"));}}async function B(e){try{await execa("dotnet",["--version"],{cwd:e,timeout:3e3,stdio:"pipe"});}catch{console.log(i.yellow("\u26A0 .NET SDK not found in PATH - project scaffolded, but init/build need .NET 8+")),console.log(i.gray(" Install: https://dotnet.microsoft.com/download"));}}async function oe(e,r){let s=y(r.project_name)||"dotnet-api",c$2=E(r.root_namespace||`Workspai.${b$1(s)}`,"Workspai.App"),a=r.target_framework?.trim(),C=a&&D(a)?a:b,R=r.port&&/^\d+$/.test(r.port)?r.port:j,o={project_name:s,root_namespace:c$2,description:_(r.description||"","Production-ready ASP.NET Core Web API scaffolded by Workspai."),target_framework:C,app_version:r.app_version||"0.1.0",port:R,skipGit:r.skipGit??false},A=S(`Creating ASP.NET Core Web API project ${s}`).start();await promises.mkdir(e,{recursive:true}),await c(n.join(e,`${s}.sln`),H(o)),await c(n.join(e,"src",`${s}.csproj`),P(o)),await c(n.join(e,"src","Program.cs"),T(o)),await c(n.join(e,"src","Application","ApplicationInfoOptions.cs"),w(o)),await c(n.join(e,"src","Application","ApplicationServiceRegistration.cs"),x(o)),await c(n.join(e,"src","Application","SystemInfoService.cs"),v(o)),await c(n.join(e,"src","Infrastructure","InfrastructureServiceRegistration.cs"),N(o)),await c(n.join(e,"src","Presentation","PresentationServiceRegistration.cs"),h(o)),await c(n.join(e,"src","Presentation","SystemEndpoints.cs"),V(o)),await c(n.join(e,"src","appsettings.json"),g(o)),await c(n.join(e,"src","appsettings.Development.json"),g(o)),await c(n.join(e,"tests",`${s}.Tests.csproj`),k(o)),await c(n.join(e,"tests","RuntimeSmokeTests.cs"),L(o)),await c(n.join(e,"Dockerfile"),U(o)),await c(n.join(e,"docker-compose.yml"),O(o)),await c(n.join(e,"Makefile"),W(o)),await c(n.join(e,"rapidkit"),M(o)),await c(n.join(e,"rapidkit.cmd"),G(o)),await c(n.join(e,".env.example"),`ASPNETCORE_ENVIRONMENT=Development
421
- PORT=${o.port}
422
- `),await c(n.join(e,".github","workflows","ci.yml"),F(o)),await c(n.join(e,".workspai","context.json"),$()),await c(n.join(e,".workspai","project.json"),I(o,c$1())),process.platform!=="win32"&&await promises.chmod(n.join(e,"rapidkit"),493),await q(e,o.skipGit),A.succeed("ASP.NET Core Web API project ready"),await B(e),console.log(i.green(`
420
+ `.trimStart()}async function q(e,r){if(!r)try{if(await b$2(e)){console.log(i.gray("\u26A0 git init skipped (target is inside an existing git worktree)"));return}await execa("git",["init"],{cwd:e,stdio:"ignore",env:a()});}catch{console.log(i.gray("\u26A0 git init skipped (git not found or error)"));}}async function B(e){try{await execa("dotnet",["--version"],{cwd:e,timeout:3e3,stdio:"pipe"});}catch{console.log(i.yellow("\u26A0 .NET SDK not found in PATH - project scaffolded, but init/build need .NET 8+")),console.log(i.gray(" Install: https://dotnet.microsoft.com/download"));}}async function oe(e,r){let s=y(r.project_name)||"dotnet-api",c$2=E(r.root_namespace||`Workspai.${b$1(s)}`,"Workspai.App"),a=r.target_framework?.trim(),C=a&&D(a)?a:b,R=r.port&&/^\d+$/.test(r.port)?r.port:j,t={project_name:s,root_namespace:c$2,description:_(r.description||"","Production-ready ASP.NET Core Web API scaffolded by Workspai."),target_framework:C,app_version:r.app_version||"0.1.0",port:R,skipGit:r.skipGit??false,skipInstall:r.skipInstall??false},A=S(`Creating ASP.NET Core Web API project ${s}`).start();await promises.mkdir(e,{recursive:true}),await c(o.join(e,`${s}.sln`),H(t)),await c(o.join(e,"src",`${s}.csproj`),P(t)),await c(o.join(e,"src","Program.cs"),T(t)),await c(o.join(e,"src","Application","ApplicationInfoOptions.cs"),w(t)),await c(o.join(e,"src","Application","ApplicationServiceRegistration.cs"),x(t)),await c(o.join(e,"src","Application","SystemInfoService.cs"),v(t)),await c(o.join(e,"src","Infrastructure","InfrastructureServiceRegistration.cs"),N(t)),await c(o.join(e,"src","Presentation","PresentationServiceRegistration.cs"),h(t)),await c(o.join(e,"src","Presentation","SystemEndpoints.cs"),V(t)),await c(o.join(e,"src","appsettings.json"),g(t)),await c(o.join(e,"src","appsettings.Development.json"),g(t)),await c(o.join(e,"tests",`${s}.Tests.csproj`),k(t)),await c(o.join(e,"tests","RuntimeSmokeTests.cs"),L(t)),await c(o.join(e,"Dockerfile"),U(t)),await c(o.join(e,"docker-compose.yml"),O(t)),await c(o.join(e,"Makefile"),W(t)),await c(o.join(e,"rapidkit"),M(t)),await c(o.join(e,"rapidkit.cmd"),G(t)),await c(o.join(e,".env.example"),`ASPNETCORE_ENVIRONMENT=Development
421
+ PORT=${t.port}
422
+ `),await c(o.join(e,".github","workflows","ci.yml"),F(t)),await c(o.join(e,".workspai","context.json"),$()),await c(o.join(e,".workspai","project.json"),I(t,c$1())),process.platform!=="win32"&&await promises.chmod(o.join(e,"rapidkit"),493),await q(e,t.skipGit),A.succeed("ASP.NET Core Web API project ready"),t.skipInstall||await B(e),console.log(i.green(`
423
423
  \u2705 ASP.NET Core project ready!
424
424
  `)),console.log(i.gray("Next steps:")),console.log(i.white(` cd ${s}`)),console.log(i.white(" npx workspai init")),console.log(i.white(" npx workspai dev")),console.log(i.gray(`
425
425
  Endpoints: /health/live, /health/ready, /api/v1/system/info, /docs`)),console.log(i.gray("\u2139 RapidKit Core modules are not available for .NET projects yet."));}export{j as DEFAULT_DOTNET_PORT,b as DEFAULT_DOTNET_TARGET_FRAMEWORK,oe as generateDotnetWebApiCleanKit};
@@ -1392,6 +1392,6 @@ issues:
1392
1392
  linters:
1393
1393
  - errcheck
1394
1394
  - wrapcheck
1395
- `}function z(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function Z(e$1){return e({runtimeLabel:"Go/Fiber",projectName:e$1.project_name,fallbackDevCommand:'exec go run ./cmd/server "$@"'})}function ee(e){return f({runtimeLabel:"Go/Fiber",projectName:e.project_name})}function te(e,i){return JSON.stringify({kit_name:"gofiber.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"workspai",workspai_version:i,rapidkit_version:i,created_at:new Date().toISOString()},null,2)}async function ce(e,i){let r={project_name:i.project_name,module_path:i.module_path||i.project_name,author:i.author||"Workspai User",description:i.description||`Go/Fiber REST API \u2014 ${i.project_name}`,go_version:i.go_version||a$1,app_version:i.app_version||"0.1.0",port:i.port||"3000",skipGit:i.skipGit??false,skipInstall:i.skipInstall??false},v=c();try{await execa("go",["version"],{timeout:3e3});}catch{console.log(o.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(o.gray(` Install: https://go.dev/dl/
1395
+ `}function z(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function Z(e$1){return e({runtimeLabel:"Go/Fiber",projectName:e$1.project_name,fallbackDevCommand:'exec go run ./cmd/server "$@"'})}function ee(e){return f({runtimeLabel:"Go/Fiber",projectName:e.project_name})}function te(e,i){return JSON.stringify({kit_name:"gofiber.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"workspai",workspai_version:i,rapidkit_version:i,created_at:new Date().toISOString()},null,2)}async function ce(e,i){let r={project_name:i.project_name,module_path:i.module_path||i.project_name,author:i.author||"Workspai User",description:i.description||`Go/Fiber REST API \u2014 ${i.project_name}`,go_version:i.go_version||a$1,app_version:i.app_version||"0.1.0",port:i.port||"3000",skipGit:i.skipGit??false,skipInstall:i.skipInstall??false},v=c();if(!r.skipInstall)try{await execa("go",["version"],{timeout:3e3});}catch{console.log(o.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(o.gray(` Install: https://go.dev/dl/
1396
1396
  `));}let n=T(`Generating Go/Fiber project: ${r.project_name}\u2026`).start();try{let t=(S,_)=>c$1(p.join(e,S),_),w=p.join(e,"rapidkit"),R=p.join(e,"rapidkit.cmd");if(await Promise.all([t("cmd/server/main.go",q(r)),t("go.mod",O(r)),t("internal/config/config.go",y(r)),t("internal/server/server.go",C(r)),t("internal/middleware/requestid.go",P()),t("internal/middleware/requestid_test.go",D(r)),t("internal/apierr/apierr.go",M()),t("internal/apierr/apierr_test.go",B(r)),t("internal/handlers/health.go",N()),t("internal/handlers/health_test.go",E(r)),t("internal/handlers/example.go",j(r)),t("internal/handlers/example_test.go",H(r)),t("internal/config/config_test.go",U(r)),t("internal/middleware/cors.go",V()),t("internal/middleware/cors_test.go",J(r)),t("internal/middleware/ratelimit.go",K(r)),t("internal/middleware/ratelimit_test.go",X(r)),t("internal/server/server_test.go",W(r)),t("docs/doc.go",$(r)),t(".air.toml",Q(r)),t("Dockerfile",L()),t("docker-compose.yml",G(r)),t("Makefile",A(r)),t(".golangci.yml",Y(r.module_path)),t(".env.example",I(r)),t(".gitignore",k()),t(".github/workflows/ci.yml",F(r)),t("README.md",x(r)),t(".workspai/project.json",te(r,v)),t(".workspai/context.json",z()),t("rapidkit",Z(r)),t("rapidkit.cmd",ee(r))]),await promises.chmod(w,493),await promises.chmod(R,493),n.succeed(o.green(`Project created at ${e}`)),r.skipInstall)n.info(o.gray("Skipped Go dependency warm-up (--skip-install)."));else try{n.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),n.succeed(o.gray("\u2713 go mod tidy completed"));}catch{n.warn(o.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!r.skipGit)try{await b(e)?console.log(o.gray("\u26A0 git init skipped (target is inside an existing git worktree)")):(await execa("git",["init"],{cwd:e,env:a()}),await execa("git",["add","-A"],{cwd:e,env:a()}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gofiber.standard)"],{cwd:e,env:a()}),console.log(o.gray("\u2713 git repository initialized")));}catch{console.log(o.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(o.bold("\u2705 Go/Fiber project ready!")),console.log(""),console.log(o.cyan("Next steps:")),console.log(o.white(` cd ${r.project_name}`)),console.log(o.white(" make run # start dev server")),console.log(o.white(" make test # run tests")),console.log(""),console.log(o.gray("Server will listen on port "+r.port)),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/live")),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/ready")),console.log(""),console.log(o.yellow("\u2139 RapidKit Core modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(t){throw n.fail(o.red("Failed to generate Go/Fiber project")),t}}
1397
1397
  export{ce as generateGoFiberKit};
@@ -1454,6 +1454,6 @@ issues:
1454
1454
  linters:
1455
1455
  - errcheck
1456
1456
  - wrapcheck
1457
- `}function Y(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function Z(e,n){return JSON.stringify({kit_name:"gogin.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"workspai",workspai_version:n,rapidkit_version:n,created_at:new Date().toISOString()},null,2)}function ee(e$1){return e({runtimeLabel:"Go/Gin",projectName:e$1.project_name,fallbackDevCommand:'cd "$SCRIPT_DIR" && GIN_MODE=debug exec go run ./cmd/server "$@"'})}function te(e){return f({runtimeLabel:"Go/Gin",projectName:e.project_name})}async function ge(e,n){let r={project_name:n.project_name,module_path:n.module_path||n.project_name,author:n.author||"Workspai User",description:n.description||`Go/Gin REST API \u2014 ${n.project_name}`,go_version:n.go_version||a$1,app_version:n.app_version||"0.1.0",port:n.port||"8080",skipGit:n.skipGit??false,skipInstall:n.skipInstall??false},R=c();try{await execa("go",["version"],{timeout:3e3});}catch{console.log(o.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(o.gray(` Install: https://go.dev/dl/
1457
+ `}function Y(){return JSON.stringify({engine:"npm",runtime:"go"},null,2)}function Z(e,n){return JSON.stringify({kit_name:"gogin.standard",runtime:"go",module_support:false,project_name:e.project_name,module_path:e.module_path,app_version:e.app_version,created_by:"workspai",workspai_version:n,rapidkit_version:n,created_at:new Date().toISOString()},null,2)}function ee(e$1){return e({runtimeLabel:"Go/Gin",projectName:e$1.project_name,fallbackDevCommand:'cd "$SCRIPT_DIR" && GIN_MODE=debug exec go run ./cmd/server "$@"'})}function te(e){return f({runtimeLabel:"Go/Gin",projectName:e.project_name})}async function ge(e,n){let r={project_name:n.project_name,module_path:n.module_path||n.project_name,author:n.author||"Workspai User",description:n.description||`Go/Gin REST API \u2014 ${n.project_name}`,go_version:n.go_version||a$1,app_version:n.app_version||"0.1.0",port:n.port||"8080",skipGit:n.skipGit??false,skipInstall:n.skipInstall??false},R=c();if(!r.skipInstall)try{await execa("go",["version"],{timeout:3e3});}catch{console.log(o.yellow("\n\u26A0 Go not found in PATH \u2014 project will be scaffolded, but `go mod tidy` requires Go 1.21+")),console.log(o.gray(` Install: https://go.dev/dl/
1458
1458
  `));}let i=O(`Generating Go/Gin project: ${r.project_name}\u2026`).start();try{let t=(_,T)=>c$2(c$1.join(e,_),T),v=c$1.join(e,"rapidkit"),S=c$1.join(e,"rapidkit.cmd");if(await Promise.all([t("cmd/server/main.go",N(r)),t("go.mod",b(r)),t("internal/config/config.go",G(r)),t("internal/server/server.go",q(r)),t("internal/middleware/requestid.go",P()),t("internal/middleware/requestid_test.go",D(r)),t("internal/apierr/apierr.go",H()),t("internal/apierr/apierr_test.go",F(r)),t("internal/handlers/health.go",E()),t("internal/handlers/health_test.go",C(r)),t("internal/handlers/example.go",j(r)),t("internal/handlers/example_test.go",U(r)),t("internal/config/config_test.go",B(r)),t("internal/middleware/cors.go",V()),t("internal/middleware/cors_test.go",W(r)),t("internal/middleware/ratelimit.go",K(r)),t("internal/middleware/ratelimit_test.go",X(r)),t("internal/server/server_test.go",J(r)),t("docs/doc.go",$(r)),t(".air.toml",Q(r)),t("Dockerfile",L()),t("docker-compose.yml",y(r)),t("Makefile",I(r)),t(".golangci.yml",z(r.module_path)),t(".env.example",k(r)),t(".gitignore",x()),t(".github/workflows/ci.yml",M(r)),t("README.md",A(r)),t(".workspai/project.json",Z(r,R)),t(".workspai/context.json",Y()),t("rapidkit",ee(r)),t("rapidkit.cmd",te(r))]),await promises.chmod(v,493),await promises.chmod(S,493),i.succeed(o.green(`Project created at ${e}`)),r.skipInstall)i.info(o.gray("Skipped Go dependency warm-up (--skip-install)."));else try{i.start("Fetching Go dependencies\u2026"),await execa("go",["mod","tidy"],{cwd:e,timeout:12e4}),i.succeed(o.gray("\u2713 go mod tidy completed"));}catch{i.warn(o.yellow("\u26A0 go mod tidy failed \u2014 run manually: go mod tidy"));}if(!r.skipGit)try{await b$1(e)?console.log(o.gray("\u26A0 git init skipped (target is inside an existing git worktree)")):(await execa("git",["init"],{cwd:e,env:a()}),await execa("git",["add","-A"],{cwd:e,env:a()}),await execa("git",["commit","-m","chore: initial scaffold (rapidkit gogin.standard)"],{cwd:e,env:a()}),console.log(o.gray("\u2713 git repository initialized")));}catch{console.log(o.gray("\u26A0 git init skipped (git not found or error)"));}console.log(""),console.log(o.bold("\u2705 Go/Gin project ready!")),console.log(""),console.log(o.cyan("Next steps:")),console.log(o.white(` cd ${r.project_name}`)),console.log(o.white(" make run # start dev server")),console.log(o.white(" make test # run tests")),console.log(""),console.log(o.gray("Server will listen on port "+r.port)),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/live")),console.log(o.gray(" http://localhost:"+r.port+"/api/v1/health/ready")),console.log(""),console.log(o.yellow("\u2139 RapidKit Core modules are not available for Go projects (module system uses Python/pip).")),console.log("");}catch(t){throw i.fail(o.red("Failed to generate Go/Gin project")),t}}
1459
1459
  export{ge as generateGoGinKit};