workspai 0.47.0 → 0.48.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 (90) hide show
  1. package/README.md +214 -119
  2. package/contracts/agent-customization-pack.v1.json +5 -0
  3. package/contracts/extension-cli-compatibility.v1.json +7 -2
  4. package/contracts/published-contract-catalog.v1.json +28 -1
  5. package/contracts/runtime-command-surface.v1.json +145 -1
  6. package/contracts/workspace-intelligence/model-usage-event.v1.json +82 -0
  7. package/contracts/workspace-intelligence/workspace-intelligence-evaluation-comparison.v1.json +53 -0
  8. package/contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json +120 -0
  9. package/contracts/workspace-intelligence-architecture.v1.json +31 -2
  10. package/contracts/workspace-intelligence-chain.v1.json +44 -3
  11. package/dist/analyze-EEEU3MIF.js +1 -0
  12. package/dist/{artifact-remediation-plan-EPALZ2LC.js → artifact-remediation-plan-SPOUHMK5.js} +1 -1
  13. package/dist/autopilot-release-XGVXPOZI.js +1 -0
  14. package/dist/{chunk-2TEDAKP6.js → chunk-32OJDBIG.js} +1 -1
  15. package/dist/{chunk-ZDN7RHXJ.js → chunk-37CVKXBD.js} +1 -1
  16. package/dist/{chunk-YCL3I2JO.js → chunk-3NU32T4A.js} +1 -1
  17. package/dist/chunk-3VFA7D5T.js +1 -0
  18. package/dist/{chunk-CW7PGBIQ.js → chunk-4HDYADHT.js} +1 -1
  19. package/dist/{chunk-PBHP6JNY.js → chunk-54EP5CEV.js} +1 -1
  20. package/dist/{chunk-QDWYIRHR.js → chunk-5S3DJQEP.js} +1 -1
  21. package/dist/{chunk-NOFM7MNA.js → chunk-AFL3ACCR.js} +1 -1
  22. package/dist/{chunk-MEMHNE7Y.js → chunk-BFLJ2R4D.js} +1 -1
  23. package/dist/{chunk-6SWRNA47.js → chunk-BGPXQQNY.js} +1 -1
  24. package/dist/chunk-BMWFQXGW.js +1 -0
  25. package/dist/{chunk-2GHUZDYA.js → chunk-CRHYBQI3.js} +1 -1
  26. package/dist/{chunk-76YOPAOT.js → chunk-ESLPI3XZ.js} +1 -1
  27. package/dist/{chunk-DV6GJD4K.js → chunk-HDXNIN4N.js} +1 -1
  28. package/dist/{chunk-TNQI5VCW.js → chunk-HZDXO65G.js} +14 -14
  29. package/dist/{chunk-BSRVO52Y.js → chunk-I46XEIPL.js} +1 -1
  30. package/dist/{chunk-COARSXRC.js → chunk-J5ENLXDF.js} +1 -1
  31. package/dist/chunk-LHOZXC2M.js +2 -0
  32. package/dist/{chunk-RWRLFSKW.js → chunk-NAJCUQ4X.js} +1 -1
  33. package/dist/{chunk-ZM5NQ5Z2.js → chunk-OW42TZFB.js} +1 -1
  34. package/dist/{chunk-SK6XRKGG.js → chunk-P3D5YQB2.js} +1 -1
  35. package/dist/{chunk-TWNFECMN.js → chunk-PHXQR6PX.js} +1 -1
  36. package/dist/{chunk-ITCAMC2E.js → chunk-PRTR2DQ2.js} +1 -1
  37. package/dist/{chunk-KZZ36CK5.js → chunk-QNONOO4F.js} +1 -1
  38. package/dist/{chunk-7VLCK5JW.js → chunk-RHQW3DTP.js} +1 -1
  39. package/dist/{chunk-22NJ2ZMG.js → chunk-T4YR4RAI.js} +1 -1
  40. package/dist/{chunk-HSGFUKCN.js → chunk-VU7NZHPM.js} +1 -1
  41. package/dist/{chunk-VBSQ7MF6.js → chunk-Y5UJLPS4.js} +19 -19
  42. package/dist/{chunk-U5EZHZBX.js → chunk-YJZOMRAS.js} +1 -1
  43. package/dist/{create-7JKJDAQV.js → create-DBQNAMKP.js} +1 -1
  44. package/dist/{doctor-PGPNIS76.js → doctor-4NNUDNGZ.js} +1 -1
  45. package/dist/{dotnet-webapi-clean-6TVFBTVI.js → dotnet-webapi-clean-A6MVDYXX.js} +4 -4
  46. package/dist/{gofiber-standard-2BL7GWZB.js → gofiber-standard-I5YPQG5V.js} +1 -1
  47. package/dist/{gogin-standard-XGP3KBXA.js → gogin-standard-VY2L4QT5.js} +1 -1
  48. package/dist/index.d.ts +32 -11
  49. package/dist/index.js +127 -125
  50. package/dist/{pipeline-IB6ILJSV.js → pipeline-TQM43A3K.js} +1 -1
  51. package/dist/{springboot-standard-JJNUID6M.js → springboot-standard-55XKCBIZ.js} +4 -4
  52. package/dist/{workspace-H3QXBFGB.js → workspace-NCWRINEF.js} +1 -1
  53. package/dist/{workspace-agent-sync-C7SG2Z5W.js → workspace-agent-sync-662QHXGF.js} +1 -1
  54. package/dist/{workspace-context-BKQBKA4C.js → workspace-context-23YYCUCP.js} +1 -1
  55. package/dist/{workspace-contract-RPQQBQXR.js → workspace-contract-TU2I7GC2.js} +1 -1
  56. package/dist/{workspace-dependency-graph-23BI2HG7.js → workspace-dependency-graph-BP4EXYQ5.js} +1 -1
  57. package/dist/workspace-explain-MWUEN643.js +1 -0
  58. package/dist/workspace-explain-contract-ZPI3JXJU.js +1 -0
  59. package/dist/{workspace-feedback-WAID3IOE.js → workspace-feedback-SUVH2LUJ.js} +1 -1
  60. package/dist/{workspace-foundation-5OOJEO2D.js → workspace-foundation-WXJ6I7ES.js} +1 -1
  61. package/dist/{workspace-history-C6OP3IAQ.js → workspace-history-BANOJRQ2.js} +1 -1
  62. package/dist/{workspace-intelligence-VKDL3H2J.js → workspace-intelligence-MFJE7W67.js} +1 -1
  63. package/dist/workspace-intelligence-evaluation-IPH7M3WV.js +1 -0
  64. package/dist/{workspace-intelligence-runner-LVALAZY7.js → workspace-intelligence-runner-THYLHHMF.js} +1 -1
  65. package/dist/{workspace-knowledge-graph-FE2NTZKV.js → workspace-knowledge-graph-ARDC6HHG.js} +1 -1
  66. package/dist/workspace-knowledge-graph-export-UYAYFTWX.js +10 -0
  67. package/dist/workspace-mcp-serve-EZR6O76D.js +3 -0
  68. package/dist/{workspace-model-S33CIB2R.js → workspace-model-7OU2M3LE.js} +1 -1
  69. package/dist/{workspace-registry-summary-A3YDL63D.js → workspace-registry-summary-ORDK7A36.js} +1 -1
  70. package/dist/workspace-run-RLIYSOTN.js +1 -0
  71. package/dist/{workspace-verify-ZGH3NXAH.js → workspace-verify-EBVL7FWT.js} +1 -1
  72. package/dist/{workspace-watch-EVBJTMV7.js → workspace-watch-3BPGLFLB.js} +1 -1
  73. package/docs/GLOSSARY.md +28 -24
  74. package/docs/README.md +17 -10
  75. package/docs/README_CONTENT_CONTRACT.md +154 -0
  76. package/docs/commands-reference.md +14 -1
  77. package/docs/contracts/ARTIFACT_CATALOG.md +28 -19
  78. package/docs/contracts/README.md +3 -0
  79. package/docs/graph-benchmark-methodology.md +2 -2
  80. package/docs/workspace-intelligence-evaluation.md +147 -0
  81. package/docs/workspace-knowledge-graph.md +31 -10
  82. package/package.json +1 -1
  83. package/dist/analyze-UVXPRGYZ.js +0 -1
  84. package/dist/autopilot-release-5BQ6F5L2.js +0 -1
  85. package/dist/chunk-LNRAB7UY.js +0 -1
  86. package/dist/chunk-NRYS4CLR.js +0 -2
  87. package/dist/workspace-explain-WVN7JH3U.js +0 -1
  88. package/dist/workspace-explain-contract-SEFTVF6J.js +0 -1
  89. package/dist/workspace-mcp-serve-KT2I676Z.js +0 -3
  90. package/dist/workspace-run-M4LNJILC.js +0 -1
@@ -1,2 +1,2 @@
1
- import {d,c}from'./chunk-OA537ZQ5.js';import {b as b$1,a}from'./chunk-LNRAB7UY.js';import h from'path';import {createHash}from'crypto';import P from'fs-extra';import {parseAllDocuments}from'yaml';var G=b$1.knowledgeGraph;var Ae=a.knowledgeGraph;function Se(e,t){if(e.source.kind!=="workspace-model")throw new Error(`Workspace knowledge graph is not bound to the canonical workspace model (source: ${e.source.kind}).`);if(e.source.artifact!==a.model)throw new Error(`Workspace knowledge graph source artifact is ${e.source.artifact}; expected ${a.model}.`);let r=d(t);if(e.source.hash!==r)throw new Error("Workspace knowledge graph is stale: its source hash does not match the canonical workspace model.")}var Y=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","venv","vendor","node_modules","dist","build","target","coverage",".next",".turbo",".cache"]),M=new Set(["package.json","pyproject.toml","requirements.txt","Pipfile","go.mod","Cargo.toml","pom.xml","build.gradle","build.gradle.kts","composer.json","Gemfile","mix.exs","pubspec.yaml","Package.swift","CMakeLists.txt","deno.json","deno.jsonc","project.clj","deps.edn","build.sbt","BUILD","BUILD.bazel","WORKSPACE.bazel"]),Q=new Set(["get","put","post","delete","options","head","patch","trace"]),X=new Set([".c",".cc",".cpp",".cs",".dart",".ex",".exs",".go",".h",".hpp",".java",".js",".jsx",".kt",".kts",".mjs",".php",".py",".r",".rb",".rs",".scala",".svelte",".swift",".ts",".tsx",".vue",".clj",".cljs",".fs",".fsx",".lua",".vb"]);function _(e){let t=h.extname(e).toLowerCase();return {".c":"c",".cc":"cpp",".cpp":"cpp",".cs":"csharp",".dart":"dart",".ex":"elixir",".exs":"elixir",".go":"go",".h":"c",".hpp":"cpp",".java":"java",".js":"javascript",".jsx":"javascript",".kt":"kotlin",".kts":"kotlin",".mjs":"javascript",".php":"php",".py":"python",".r":"r",".rb":"ruby",".rs":"rust",".scala":"scala",".svelte":"svelte",".swift":"swift",".ts":"typescript",".tsx":"typescript",".vue":"vue",".clj":"clojure",".cljs":"clojure",".fs":"fsharp",".fsx":"fsharp",".lua":"lua",".vb":"visual-basic"}[t]??t.slice(1)}function O(e,t,r){let a=[],o=e.split(/\r?\n/);for(let n=0;n<o.length&&a.length<r;n+=1)for(let s of t){let d=o[n].match(s.pattern)?.[1]?.trim();if(d){a.push({name:d,line:n+1,detail:s.detail});break}}return a}var x=[{pattern:/^\s*(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/,detail:"function"},{pattern:/^\s*(?:export\s+)?(?:abstract\s+)?(?:class|interface|enum|type)\s+([A-Za-z_$][\w$]*)/,detail:"type"},{pattern:/^\s*(?:async\s+)?def\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*class\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*func\s+(?:\([^)]*\)\s*)?([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:public\s+|private\s+|protected\s+|internal\s+|abstract\s+|final\s+)*(?:class|interface|record|enum)\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*(?:pub\s+)?fn\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:pub\s+)?(?:struct|trait|enum)\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*(?:public\s+|private\s+|protected\s+)?function\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:class|module|struct|protocol|mixin)\s+([A-Za-z_]\w*)/,detail:"type"}],ee=[{pattern:/^\s*import(?:.+?from\s*)?["']([^"']+)["']/,detail:"import"},{pattern:/require\(["']([^"']+)["']\)/,detail:"require"},{pattern:/^\s*from\s+([A-Za-z0-9_.]+)\s+import\s+/,detail:"import"},{pattern:/^\s*import\s+([A-Za-z0-9_.]+)(?:\s|$)/,detail:"import"},{pattern:/^\s*(?:import|using|use)\s+([A-Za-z0-9_:.*\\/.-]+)/,detail:"import"},{pattern:/^\s*require(?:_relative)?\s+["']([^"']+)["']/,detail:"require"}],te=[{pattern:/@(?:Get|Post|Put|Delete|Patch|Options|Head)\s*\(\s*["']([^"']*)["']/i,detail:"decorated route"},{pattern:/\b(?:app|router|server|api|route|fastify|fiber)\.(?:get|post|put|delete|patch|options|head)\s*\(\s*["']([^"']+)["']/i,detail:"router route"},{pattern:/@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping|RequestMapping)\s*\([^"']*["']([^"']*)["']/,detail:"mapped route"},{pattern:/\[Http(?:Get|Post|Put|Delete|Patch)\s*\(\s*["']([^"']*)["']/i,detail:"HTTP route"},{pattern:/^\s*(?:get|post|put|delete|patch)\s+["']([^"']+)["']/i,detail:"HTTP route"}];function N(e){return createHash("sha256").update(e).digest("hex")}function y(e,t){return `wkg:${e}:${N(`${e}\0${t}`).slice(0,20)}`}function R(e){return e.replace(/\\/g,"/")}function W(e){let t=R(e).replace(/^\.\//,"");return !t||t.startsWith("/")||/^[A-Za-z]:\//.test(t)?"unknown":t}function w(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function b(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function j(e){if(Array.isArray(e))return e.filter(r=>typeof r=="string").sort();let t=w(e);return t?Object.keys(t).sort():[]}function oe(e){if(Array.isArray(e))return e.map(r=>typeof r=="string"?r.split("=",1)[0]?.trim():"").filter(r=>!!r).sort();let t=w(e);return t?Object.keys(t).sort():[]}function re(e){return Object.fromEntries(Object.entries(e).filter(t=>t[1]!==void 0).sort(([t],[r])=>t.localeCompare(r)))}async function F(e,t){let r=[],a=[e],o=0;for(;o<a.length&&r.length<t;){let n=a[o++],s;try{s=await P.readdir(n,{withFileTypes:true});}catch{continue}s.sort((i,d)=>i.name.localeCompare(d.name));for(let i of s){if(r.length>=t)break;if(i.isSymbolicLink())continue;let d=h.join(n,i.name);i.isDirectory()?Y.has(i.name)||a.push(d):i.isFile()&&r.push(d);}}return r.sort((n,s)=>n.localeCompare(s))}async function S(e){let t=await P.readFile(e,"utf8");if(e.toLowerCase().endsWith(".json")){let r=JSON.parse(t),a=w(r);return a?[a]:[]}return parseAllDocuments(t).map(r=>w(r.toJSON())).filter(r=>r!==null)}function A(e,t){let r=h.resolve(t);return e.filter(a=>r===a.root||r.startsWith(`${a.root}${h.sep}`)).sort((a,o)=>o.root.length-a.root.length)[0]??null}var D=class{constructor(t,r,a){this.workspacePath=t;this.now=r;this.workspaceName=a;}workspacePath;now;workspaceName;entities=new Map;relations=new Map;proofs=new Map;providers=[];diagnostics=[];contentHashes=new Map;artifactPath(t,r){if(r){let a=R(h.relative(r.root,t));return W(h.posix.join(r.artifactPrefix,a))}return W(h.relative(this.workspacePath,t))}async addProof(t){let r;if(t.absolutePath){if(!this.contentHashes.has(t.absolutePath))try{this.contentHashes.set(t.absolutePath,N(await P.readFile(t.absolutePath)));}catch{this.contentHashes.set(t.absolutePath,null);}r=this.contentHashes.get(t.absolutePath)??void 0;}let a=W(t.artifact),o=y("proof",[t.provider,a,t.pointer??"",t.line??"",t.detail??""].join("\0"));return this.proofs.has(o)||this.proofs.set(o,{id:o,provider:t.provider,artifact:a,...t.pointer?{pointer:t.pointer}:{},...t.line?{line:t.line}:{},...t.column?{column:t.column}:{},...r?{contentHash:r}:{},observedAt:this.now.toISOString(),derivation:t.derivation??"extracted",trust:t.trust??"observed",confidence:t.confidence??"high",freshness:"fresh",...t.detail?{detail:t.detail}:{}}),o}addEntity(t){let r=y(t.kind,t.key),a=re(t.attributes??{}),o=this.entities.get(r),n={...o?.attributes??{}};for(let[d,l]of Object.entries(a)){if(d in n&&JSON.stringify(n[d])!==JSON.stringify(l)){this.diagnostics.push({code:"graph.knowledge.attribute_conflict",severity:"warning",message:`Conflicting ${d} values were observed for ${t.kind} ${t.label}.`,entityIds:[r],recommendation:"Inspect the entity proof paths and make the authoritative source explicit."});continue}n[d]=l;}let s=[...new Set([...o?.identity.aliases??[],...t.aliases??[]])].sort(),i=[...new Set([...o?.proofIds??[],...t.proofIds??[]])].sort();return this.entities.set(r,{id:r,kind:t.kind,label:t.label,...t.projectId?{projectId:t.projectId}:{},identity:{key:t.key,scope:t.projectId?"project":"workspace",aliases:s,fingerprint:N(JSON.stringify({kind:t.kind,key:t.key,attributes:n}))},attributes:n,proofIds:i}),r}addRelation(t){let r=y("relation",`${t.from}\0${t.kind}\0${t.to}`),a=this.relations.get(r),o=[...new Set([...a?.proofIds??[],...t.proofIds])].sort(),n=new Set(o.map(d=>this.proofs.get(d)?.provider).filter(Boolean)).size,s=t.trust??a?.trust??"observed",i=n>=2&&s!=="ambiguous"?"corroborated":s;return this.relations.set(r,{id:r,from:t.from,to:t.to,kind:t.kind,derivation:t.derivation??a?.derivation??"extracted",trust:i,confidence:i==="corroborated"?"high":t.confidence??a?.confidence??"high",proofIds:o}),r}};function se(e,t){let r=h.basename(e);try{if(r==="package.json"||r==="composer.json"){let s=JSON.parse(t);return {ecosystem:r==="package.json"?"npm":"composer",name:b(s.name),version:b(s.version),dependencies:[...j(s.dependencies),...j(s.devDependencies),...j(s.require),...j(s["require-dev"])].filter((i,d,l)=>l.indexOf(i)===d).sort()}}if(r==="deno.json"||r==="deno.jsonc"){let s=JSON.parse(t.replace(/\/\*[\s\S]*?\*\/|^\s*\/\/.*$/gm,""));return {ecosystem:"deno",name:b(s.name),version:b(s.version),dependencies:j(s.imports)}}}catch{}let a=s=>t.match(s)?.[1]?.trim();if(r==="pyproject.toml"){let s=t.match(/^dependencies\s*=\s*\[([\s\S]*?)\]/m)?.[1]??"";return {ecosystem:"python",name:a(/^(?:name)\s*=\s*["']([^"']+)["']/m),version:a(/^(?:version)\s*=\s*["']([^"']+)["']/m),dependencies:[...[...s.matchAll(/["']([A-Za-z0-9_.-]+)/g)].map(i=>i[1]),...[...t.matchAll(/^([A-Za-z0-9_.-]+)\s*=\s*(?:["'{[])/gm)].map(i=>i[1]).filter(i=>!["name","version","description","python","dependencies"].includes(i))].filter((i,d,l)=>l.indexOf(i)===d).sort()}}if(r==="go.mod")return {ecosystem:"go",name:a(/^module\s+(\S+)/m),dependencies:[...t.matchAll(/^\s*([A-Za-z0-9_.~/-]+)\s+v\d+/gm)].map(s=>s[1]).sort()};if(r==="Cargo.toml"){let s=t.match(/^\[dependencies\]\s*$([\s\S]*?)(?=^\[|\s*$)/m)?.[1]??"";return {ecosystem:"cargo",name:a(/^name\s*=\s*["']([^"']+)["']/m),version:a(/^version\s*=\s*["']([^"']+)["']/m),dependencies:[...s.matchAll(/^([A-Za-z0-9_.-]+)\s*=/gm)].map(i=>i[1]).sort()}}if(r==="pom.xml")return {ecosystem:"maven",name:a(/<artifactId>([^<]+)<\/artifactId>/),version:a(/<version>([^<]+)<\/version>/),dependencies:[...t.matchAll(/<artifactId>([^<]+)<\/artifactId>/g)].slice(1).map(s=>s[1]).sort()};if(/\.(?:cs|fs|vb)proj$/i.test(r))return {ecosystem:"nuget",name:a(/<AssemblyName>([^<]+)<\/AssemblyName>/)??r.replace(/\.[^.]+$/,""),version:a(/<Version>([^<]+)<\/Version>/),dependencies:[...t.matchAll(/<PackageReference\s+Include=["']([^"']+)["']/g)].map(s=>s[1]).sort()};let o={"requirements.txt":"python",Pipfile:"python","build.gradle":"gradle","build.gradle.kts":"gradle",Gemfile:"ruby","mix.exs":"elixir","pubspec.yaml":"dart","Package.swift":"swift","CMakeLists.txt":"cmake","deno.json":"deno","deno.jsonc":"deno","project.clj":"clojure","deps.edn":"clojure","build.sbt":"scala",BUILD:"bazel","BUILD.bazel":"bazel","WORKSPACE.bazel":"bazel"},n=r==="requirements.txt"?t.split(/\r?\n/).map(s=>s.trim().match(/^([A-Za-z0-9_.-]+)/)?.[1]):r.startsWith("build.gradle")?[...t.matchAll(/(?:implementation|api|compileOnly|runtimeOnly|testImplementation)\s*\(?["']([^:"']+):([^:"']+)/g)].map(s=>`${s[1]}:${s[2]}`):r==="Gemfile"?[...t.matchAll(/^\s*gem\s+["']([^"']+)["']/gm)].map(s=>s[1]):r==="mix.exs"?[...t.matchAll(/\{:\s*([A-Za-z0-9_]+)\s*,/g)].map(s=>s[1]):r==="pubspec.yaml"?[...t.matchAll(/^\s{2}([A-Za-z0-9_]+):\s+/gm)].map(s=>s[1]):r==="Package.swift"?[...t.matchAll(/\.package\s*\(\s*url:\s*["']([^"']+)["']/g)].map(s=>s[1]):r==="CMakeLists.txt"?[...t.matchAll(/find_package\s*\(\s*([A-Za-z0-9_.+-]+)/gi)].map(s=>s[1]):r==="project.clj"||r==="deps.edn"?[...t.matchAll(/\[?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)\s+/g)].map(s=>s[1]):r==="build.sbt"?[...t.matchAll(/["']([^"']+)["']\s*%%?\s*["']([^"']+)["']/g)].map(s=>`${s[1]}:${s[2]}`):[];return {ecosystem:o[r]??"unknown",dependencies:n.filter(s=>!!s).filter((s,i,d)=>d.indexOf(s)===i).sort()}}var ae={id:"workspace-foundation",version:"1.0.0",async run(e){let{state:t}=e,r=await t.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:h.join(e.workspacePath,".workspai","workspace.contract.json"),trust:"authoritative",derivation:"authored",detail:"Workspace identity and project registry boundary"}),a=t.addEntity({kind:"workspace",key:`workspace:${t.workspaceName}`,label:t.workspaceName,aliases:[t.workspaceName],proofIds:[r]});for(let o of e.projects){let n=e.filesByProject.get(o.id)??[],s=n.find(u=>/[\\/]\.(?:workspai|rapidkit)[\\/](?:project|context)\.json$/.test(u)),i=n.find(u=>M.has(h.basename(u))),d=s??i,l=await t.addProof({provider:this.id,artifact:d?t.artifactPath(d,o):W(h.posix.join(o.artifactPrefix,".workspai/project.json")),...d?{absolutePath:d}:{},trust:s?"authoritative":"observed",derivation:s?"authored":"inferred",detail:`Project ${o.id}`}),c=t.addEntity({kind:"project",key:`project:${o.id}`,label:o.id,projectId:o.id,aliases:[o.id,o.path],attributes:{path:o.path,runtime:o.runtime,framework:o.framework,kit:o.kit},proofIds:[l]});t.addRelation({from:a,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[l]});let f=new Set,m=[];for(let u of n){let g=h.basename(u);if(/^(?:\.env\.example|\.env\.sample|\.env\.template)$/i.test(g))try{let v=await P.readFile(u,"utf8");for(let p of v.split(/\r?\n/)){let k=p.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1];k&&f.add(k);}}catch{}if((/(?:^|[\\/])(?:test|tests|spec|specs|__tests__)(?:[\\/]|$)/i.test(u)||/(?:\.test|\.spec|_test)\.[A-Za-z0-9]+$/i.test(g))&&m.push(u),!(!M.has(g)&&!/\.(?:cs|fs|vb)proj$/i.test(g)))try{let v=await P.readFile(u,"utf8"),p=se(u,v),k=await t.addProof({provider:this.id,artifact:t.artifactPath(u,o),absolutePath:u,pointer:"/",confidence:p.name?"high":"medium",detail:`${p.ecosystem} manifest`}),E=t.addEntity({kind:"package",key:`package:${o.id}:${p.ecosystem}:${p.name??g}`,label:p.name??`${o.id}/${g}`,projectId:o.id,aliases:[g,...p.name?[p.name]:[]],attributes:{ecosystem:p.ecosystem,version:p.version,manifest:t.artifactPath(u,o),dependencies:p.dependencies},proofIds:[k]});t.addRelation({from:c,to:E,kind:"contains",proofIds:[k]});for(let $ of p.dependencies.slice(0,500)){let I=t.addEntity({kind:"module",key:`dependency:${p.ecosystem}:${$}`,label:$,aliases:[$],attributes:{ecosystem:p.ecosystem,external:true},proofIds:[k]});t.addRelation({from:E,to:I,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[k]});}}catch{}}if(f.size>0){let u=n.find(g=>/^\.env\.(?:example|sample|template)$/i.test(h.basename(g)));if(u){let g=await t.addProof({provider:this.id,artifact:t.artifactPath(u,o),absolutePath:u,detail:"Public environment template keys only; values are intentionally excluded"}),v=t.addEntity({kind:"environment",key:`environment:${o.id}:template`,label:`${o.id} environment contract`,projectId:o.id,attributes:{keys:[...f].sort(),valuesEmitted:false},proofIds:[g]});t.addRelation({from:c,to:v,kind:"configured-by",proofIds:[g]});}}if(m.length>0){let u=await t.addProof({provider:this.id,artifact:t.artifactPath(m[0],o),absolutePath:m[0],detail:`${m.length} test file(s) discovered`}),g=t.addEntity({kind:"test-suite",key:`tests:${o.id}`,label:`${o.id} tests`,projectId:o.id,attributes:{fileCount:m.length},proofIds:[u]});t.addRelation({from:g,to:c,kind:"tests",proofIds:[u]});}}}},ie={id:"source-structure",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(o=>X.has(h.extname(o).toLowerCase())).slice(0,1e3),a=0;for(let o of r){let n;try{if((await P.stat(o)).size>2*1024*1024)continue;n=await P.readFile(o,"utf8");}catch{continue}let s=e.state.artifactPath(o,t),i=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,derivation:"extracted",trust:"observed",confidence:"high",detail:`${_(o)} source file`}),d=e.state.addEntity({kind:"file",key:`file:${t.id}:${s}`,label:s,projectId:t.id,aliases:[h.basename(o)],attributes:{artifact:s,language:_(o),bytes:Buffer.byteLength(n)},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:d,kind:"contains",proofIds:[i]});let l=O(n,ee,250);for(let c of l){let f=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,line:c.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${c.detail}: ${c.name}`}),m=e.state.addEntity({kind:"module",key:`module:${t.id}:${c.name}`,label:c.name,projectId:t.id,aliases:[c.name],attributes:{specifier:c.name},proofIds:[f]});e.state.addRelation({from:d,to:m,kind:"imports",confidence:"medium",proofIds:[f]});}if(a<500){let c=O(n,x,Math.min(100,500-a));a+=c.length;for(let f of c){let m=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,line:f.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${f.detail}: ${f.name}`}),u=e.state.addEntity({kind:"symbol",key:`symbol:${t.id}:${s}:${f.detail}:${f.name}`,label:f.name,projectId:t.id,attributes:{symbolKind:f.detail,language:_(o)},proofIds:[m]});e.state.addRelation({from:d,to:u,kind:"defines",confidence:"medium",proofIds:[m]});}}for(let c of O(n,te,100)){let m=(n.split(/\r?\n/)[c.line-1]??"").match(/(?:@|\.|\[|^\s*)(get|post|put|delete|patch|options|head)/i)?.[1]?.toUpperCase()??"HTTP",u=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,line:c.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${m} ${c.name}`}),g=e.state.addEntity({kind:"endpoint",key:`source-endpoint:${t.id}:${s}:${m}:${c.name}`,label:`${m} ${c.name||"/"}`,projectId:t.id,attributes:{method:m,path:c.name||"/",source:s},proofIds:[u]});e.state.addRelation({from:d,to:g,kind:"defines",confidence:"medium",proofIds:[u]});}}(r.length>=1e3||a>=500)&&e.state.diagnostics.push({code:"graph.provider.source_structure.limit_reached",severity:"info",message:`Source extraction for ${t.id} reached its bounded inventory limit.`,recommendation:"Use the standalone graph package provider configuration for deeper symbol indexing."});}}},ne={id:"workspace-service-contract",version:"1.0.0",async run(e){if(!e.contract)return;let t=new Map;for(let r of [...e.contract.projects].sort((a,o)=>a.slug.localeCompare(o.slug))){let a=r.contracts,o=await e.state.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:h.join(e.workspacePath,".workspai","workspace.contract.json"),pointer:`/projects/${r.slug}/contracts`,trust:"authoritative",derivation:"authored",detail:`Service contract for ${r.slug}`}),n=y("project",`project:${r.slug}`),s=e.state.addEntity({kind:"service",key:`contract-service:${r.slug}`,label:r.slug,projectId:r.slug,attributes:{ports:r.ports.map(i=>`${i.protocol}:${i.port}`),owns:[...a.owns].sort(),environmentKeys:[...a.env].sort()},proofIds:[o]});e.state.addRelation({from:n,to:s,kind:"implements",trust:"authoritative",derivation:"authored",proofIds:[o]});for(let i of [...a.apis].sort((d,l)=>d.name.localeCompare(l.name))){let d=e.state.addEntity({kind:"api",key:`contract-api:${r.slug}:${i.name}:${i.basePath}`,label:i.name,projectId:r.slug,attributes:{basePath:i.basePath},proofIds:[o]});e.state.addRelation({from:s,to:d,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[o]});}for(let i of [...a.publishes,...a.consumes].sort())t.has(i)||t.set(i,e.state.addEntity({kind:"queue",key:`event:${i}`,label:i,attributes:{protocol:"workspace-event"},proofIds:[o]}));for(let i of [...a.publishes].sort()){let d=t.get(i);d&&e.state.addRelation({from:s,to:d,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[o]});}for(let i of [...a.consumes].sort()){let d=t.get(i);d&&e.state.addRelation({from:s,to:d,kind:"consumes",trust:"authoritative",derivation:"authored",proofIds:[o]});}}}},de={id:"openapi",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(a=>/^(?:openapi|swagger)(?:\.[^.]+)?\.(?:json|ya?ml)$/i.test(h.basename(a)));for(let a of r){let o;try{o=await S(a);}catch(n){e.state.diagnostics.push({code:"graph.provider.openapi.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(a,t)}: ${n instanceof Error?n.message:String(n)}`});continue}for(let n of o){if(!("openapi"in n)&&!("swagger"in n))continue;let s=w(n.info),i=b(s?.title)??`${t.id} API`,d=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:"/info",trust:"authoritative",detail:"Authored OpenAPI contract"}),l=y("project",`project:${t.id}`),c=e.state.addEntity({kind:"api",key:`api:${t.id}:${i}`,label:i,projectId:t.id,attributes:{version:b(s?.version),specification:b(n.openapi)??b(n.swagger)},proofIds:[d]});e.state.addRelation({from:l,to:c,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[d]});let f=w(w(n.components)?.schemas)??w(n.definitions),m=new Map;for(let g of Object.keys(f??{}).sort()){let v=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:`/components/schemas/${g}`,trust:"authoritative",detail:`OpenAPI schema ${g}`}),p=e.state.addEntity({kind:"schema",key:`schema:${t.id}:${i}:${g}`,label:g,projectId:t.id,proofIds:[v]});m.set(g,p),e.state.addRelation({from:c,to:p,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[v]});}let u=w(n.paths);for(let g of Object.keys(u??{}).sort()){let v=w(u?.[g]);for(let p of Object.keys(v??{}).filter(k=>Q.has(k.toLowerCase())).sort()){let k=w(v?.[p]),E=`/paths/${g.replace(/~/g,"~0").replace(/\//g,"~1")}/${p}`,$=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:E,trust:"authoritative",detail:`${p.toUpperCase()} ${g}`}),I=e.state.addEntity({kind:"endpoint",key:`endpoint:${t.id}:${i}:${p.toUpperCase()}:${g}`,label:`${p.toUpperCase()} ${g}`,projectId:t.id,aliases:j(k?.tags),attributes:{method:p.toUpperCase(),path:g,operationId:b(k?.operationId),deprecated:typeof k?.deprecated=="boolean"?k.deprecated:void 0,tags:j(k?.tags)},proofIds:[$]});e.state.addRelation({from:c,to:I,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[$]});let C=JSON.stringify(k??{});for(let[Z,H]of m)C.includes(`/${Z}`)&&e.state.addRelation({from:I,to:H,kind:"references",trust:"authoritative",derivation:"authored",proofIds:[$]});}}}}}}},ce={id:"interface-contracts",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(a=>{let o=h.basename(a).toLowerCase();return /\.(?:graphql|gql|proto)$/.test(o)||/^asyncapi(?:\.[^.]+)?\.(?:json|ya?ml)$/.test(o)});for(let a of r){let o=e.state.artifactPath(a,t),n=h.extname(a).toLowerCase();if(n===".graphql"||n===".gql"){let s=await P.readFile(a,"utf8"),i=await e.state.addProof({provider:this.id,artifact:o,absolutePath:a,trust:"authoritative",derivation:"authored",detail:"GraphQL schema"}),d=e.state.addEntity({kind:"api",key:`graphql:${t.id}:${o}`,label:`${t.id} GraphQL API`,projectId:t.id,attributes:{specification:"graphql",artifact:o},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:d,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[i]});for(let l of s.matchAll(/^\s*(?:type|input|interface|enum|scalar|union)\s+([A-Za-z_]\w*)/gm)){let c=e.state.addEntity({kind:"schema",key:`graphql-schema:${t.id}:${o}:${l[1]}`,label:l[1],projectId:t.id,proofIds:[i]});e.state.addRelation({from:d,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[i]});}continue}if(n===".proto"){let s=await P.readFile(a,"utf8"),i=await e.state.addProof({provider:this.id,artifact:o,absolutePath:a,trust:"authoritative",derivation:"authored",detail:"Protocol Buffers contract"});for(let d of s.matchAll(/^\s*service\s+([A-Za-z_]\w*)/gm)){let l=e.state.addEntity({kind:"api",key:`protobuf-service:${t.id}:${o}:${d[1]}`,label:d[1],projectId:t.id,attributes:{specification:"protobuf",artifact:o},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:l,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[i]});}for(let d of s.matchAll(/^\s*message\s+([A-Za-z_]\w*)/gm))e.state.addEntity({kind:"schema",key:`protobuf-message:${t.id}:${o}:${d[1]}`,label:d[1],projectId:t.id,attributes:{specification:"protobuf",artifact:o},proofIds:[i]});continue}try{let s=(await S(a))[0];if(!s||!("asyncapi"in s))continue;let i=await e.state.addProof({provider:this.id,artifact:o,absolutePath:a,trust:"authoritative",derivation:"authored",detail:"AsyncAPI contract"}),d=e.state.addEntity({kind:"api",key:`asyncapi:${t.id}:${o}`,label:b(w(s.info)?.title)??`${t.id} AsyncAPI`,projectId:t.id,attributes:{specification:`asyncapi ${String(s.asyncapi)}`,artifact:o},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:d,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[i]});for(let l of Object.keys(w(s.channels)??{}).sort()){let c=e.state.addEntity({kind:"queue",key:`asyncapi-channel:${t.id}:${l}`,label:l,projectId:t.id,attributes:{protocol:"asyncapi"},proofIds:[i]});e.state.addRelation({from:d,to:c,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[i]});}}catch{}}}}},pe={id:"infrastructure-as-code",version:"1.0.0",async run(e){let t=e.workspaceFiles.filter(r=>{let a=h.basename(r);return /^Dockerfile(?:\..+)?$/i.test(a)||/\.tf$/i.test(a)||a==="Chart.yaml"});for(let r of t){let a=A(e.projects,r),o=a?.id??e.state.workspaceName,n=a?y("project",`project:${a.id}`):y("workspace",`workspace:${e.state.workspaceName}`),s=e.state.artifactPath(r,a),i=await P.readFile(r,"utf8"),d=await e.state.addProof({provider:this.id,artifact:s,absolutePath:r,trust:"authoritative",derivation:"authored",detail:"Infrastructure definition"});if(/^Dockerfile/i.test(h.basename(r))){let c=[...i.matchAll(/^\s*FROM\s+([^\s]+)(?:\s+AS\s+([^\s]+))?/gim)],f=e.state.addEntity({kind:"container",key:`dockerfile:${o}:${s}`,label:`${o} container image`,...a?{projectId:a.id}:{},attributes:{artifact:s,baseImages:c.map(m=>m[1])},proofIds:[d]});e.state.addRelation({from:n,to:f,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[d]});continue}if(/\.tf$/i.test(r)){for(let c of i.matchAll(/^\s*resource\s+["']([^"']+)["']\s+["']([^"']+)["']/gm)){let f=c[1],m=/(?:db|sql|rds|database)/i.test(f)?"database":/(?:queue|kafka|sqs|pubsub|servicebus)/i.test(f)?"queue":"deployment",u=e.state.addEntity({kind:m,key:`terraform:${o}:${f}:${c[2]}`,label:`${f}.${c[2]}`,...a?{projectId:a.id}:{},attributes:{resourceType:f,artifact:s},proofIds:[d]});e.state.addRelation({from:n,to:u,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[d]});}continue}let l=e.state.addEntity({kind:"deployment",key:`helm:${o}:${s}`,label:`${o} Helm chart`,...a?{projectId:a.id}:{},attributes:{artifact:s,format:"helm"},proofIds:[d]});e.state.addRelation({from:n,to:l,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[d]});}}};function q(e){let t=e.toLowerCase();return /(?:postgres|mysql|mariadb|mongo|cassandra|cockroach|mssql|oracle)/.test(t)?"database":/(?:rabbitmq|kafka|nats|pulsar|activemq|redis)/.test(t)?"queue":"container"}var le={id:"compose",version:"1.0.0",async run(e){let t=new Set;for(let r of [e.workspacePath,...e.projects.map(a=>a.root)])for(let a of ["compose.yml","compose.yaml","docker-compose.yml","docker-compose.yaml"]){let o=h.join(r,a);await P.pathExists(o)&&t.add(o);}for(let r of [...t].sort()){let a;try{a=(await S(r))[0];}catch(i){e.state.diagnostics.push({code:"graph.provider.compose.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(r)}: ${i instanceof Error?i.message:String(i)}`});}let o=w(a?.services);if(!o)continue;let n=A(e.projects,r),s=new Map;for(let i of Object.keys(o).sort()){let d=w(o[i]),l=d?.build,c=b(l)??b(w(l)?.context),f=c?A(e.projects,h.resolve(h.dirname(r),c)):e.projects.find(v=>v.id.toLowerCase()===i.toLowerCase()||h.basename(v.path).toLowerCase()===i.toLowerCase())??n,m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(r,n),absolutePath:r,pointer:`/services/${i}`,trust:"authoritative",derivation:"authored",detail:`Compose service ${i}`}),u=b(d?.image),g=e.state.addEntity({kind:"service",key:`compose-service:${e.state.artifactPath(r,n)}:${i}`,label:i,...f?{projectId:f.id}:{},attributes:{image:u,ports:j(d?.ports).map(String),networks:j(d?.networks),environmentKeys:oe(d?.environment)},proofIds:[m]});if(s.set(i,g),f&&e.state.addRelation({from:y("project",`project:${f.id}`),to:g,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[m]}),u){let v=e.state.addEntity({kind:q(u),key:`image:${u}`,label:u,...f?{projectId:f.id}:{},attributes:{image:u},proofIds:[m]});e.state.addRelation({from:g,to:v,kind:q(u)==="container"?"runs-on":"depends-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}for(let i of Object.keys(o).sort()){let d=w(o[i]),l=s.get(i);if(l)for(let c of j(d?.depends_on)){let f=s.get(c);if(!f)continue;let m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(r,n),absolutePath:r,pointer:`/services/${i}/depends_on/${c}`,trust:"authoritative",derivation:"authored",detail:`${i} depends on ${c}`});e.state.addRelation({from:l,to:f,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}}}},fe={id:"documentation",version:"1.0.0",async run(e){let t=new Set,r=[e.workspaceFiles,...e.projects.map(a=>e.filesByProject.get(a.id)??[])];for(let a of r){let o=a.filter(n=>/(?:^|[\\/])(?:README|ARCHITECTURE|CONTRIBUTING|SECURITY)\.md$/i.test(n));for(let n of o){if(t.has(n))continue;t.add(n);let s=A(e.projects,n),d=(await P.readFile(n,"utf8")).match(/^#\s+(.+)$/m)?.[1]?.trim()??h.basename(n),l=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(n,s),absolutePath:n,line:1,trust:"authoritative",derivation:"authored",detail:`Documentation: ${d}`}),c=e.state.addEntity({kind:"document",key:`document:${e.state.artifactPath(n,s)}`,label:d,...s?{projectId:s.id}:{},attributes:{artifact:e.state.artifactPath(n,s)},proofIds:[l]}),f=s?y("project",`project:${s.id}`):y("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:c,to:f,kind:"documents",trust:"authoritative",derivation:"authored",proofIds:[l]});}}}},ue={id:"kubernetes",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(a=>/(?:^|[\\/])(?:k8s|kubernetes|deploy|manifests)(?:[\\/]).+\.ya?ml$/i.test(a));for(let a of r){let o;try{o=await S(a);}catch{continue}for(let n=0;n<o.length;n+=1){let s=o[n],i=b(s.kind),d=w(s.metadata),l=b(d?.name);if(!i||!l)continue;let c=b(d?.namespace)??"default",f=/Deployment|StatefulSet|DaemonSet/i.test(i)?"deployment":/Service|Ingress/i.test(i)?"service":/ConfigMap|Secret/i.test(i)?"environment":"deployment",m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:`/documents/${n}`,trust:"authoritative",derivation:"authored",detail:`${i} ${c}/${l}`}),u=e.state.addEntity({kind:f,key:`kubernetes:${i}:${c}:${l}`,label:`${i}/${l}`,projectId:t.id,attributes:{resourceKind:i,namespace:c,secret:i==="Secret",keys:i==="Secret"||i==="ConfigMap"?Object.keys(w(s.data)??{}).sort():void 0},proofIds:[m]});e.state.addRelation({from:y("project",`project:${t.id}`),to:u,kind:f==="deployment"?"deploys":"contains",trust:"authoritative",derivation:"authored",proofIds:[m]});let g=e.state.addEntity({kind:"environment",key:`kubernetes-namespace:${c}`,label:`Kubernetes namespace ${c}`,projectId:t.id,attributes:{namespace:c},proofIds:[m]});e.state.addRelation({from:u,to:g,kind:"runs-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}}}},me={id:"ci-workflow",version:"1.0.0",async run(e){let t=e.workspaceFiles.filter(r=>{let a=R(h.relative(e.workspacePath,r));return /^\.github\/workflows\/.+\.ya?ml$/i.test(a)||/^(?:\.gitlab-ci\.ya?ml|azure-pipelines\.ya?ml|Jenkinsfile|bitbucket-pipelines\.ya?ml|\.woodpecker\.ya?ml)$/i.test(a)||/^\.circleci\/config\.ya?ml$/i.test(a)});for(let r of t){let a=e.state.artifactPath(r),o=h.basename(r)==="Jenkinsfile",n=h.basename(r),s=[],i=[];if(o)s=[...(await P.readFile(r,"utf8")).matchAll(/\bstage\s*\(\s*["']([^"']+)["']/g)].map(f=>f[1]);else {let c;try{c=(await S(r))[0];}catch{continue}if(!c)continue;n=b(c.name)??n;let f=R(h.relative(e.workspacePath,r));if(/^\.gitlab-ci\./i.test(f)){let m=new Set(["stages","variables","workflow","include","default","image","services","cache","before_script","after_script"]);s=Object.keys(c).filter(u=>!u.startsWith(".")&&!m.has(u)).sort();}else s=[...new Set([...Object.keys(w(c.jobs)??{}),...Object.keys(w(w(c.workflows)?.jobs)??{}),...j(c.stages)])].sort();i=j(c.on);}s.length===0&&(s=["pipeline"]);let d=await e.state.addProof({provider:this.id,artifact:a,absolutePath:r,...o?{}:{pointer:"/jobs"},trust:"authoritative",derivation:"authored",detail:"CI/CD workflow"}),l=e.state.addEntity({kind:"pipeline",key:`pipeline:${a}`,label:n,attributes:{jobs:s,triggers:i,artifact:a},proofIds:[d]});e.state.addRelation({from:y("workspace",`workspace:${e.state.workspaceName}`),to:l,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[d]});}}},ge={id:"codeowners",version:"1.0.0",async run(e){let t=[h.join(e.workspacePath,"CODEOWNERS"),h.join(e.workspacePath,".github","CODEOWNERS"),h.join(e.workspacePath,"docs","CODEOWNERS")];for(let r of t){if(!await P.pathExists(r))continue;let o=(await P.readFile(r,"utf8")).split(/\r?\n/);for(let n=0;n<o.length;n+=1){let s=o[n].trim();if(!s||s.startsWith("#"))continue;let[i,...d]=s.split(/\s+/);for(let l of d.filter(c=>c.startsWith("@"))){let c=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(r),absolutePath:r,line:n+1,trust:"authoritative",derivation:"authored",detail:`${i} ${l}`}),f=e.state.addEntity({kind:"owner",key:`owner:${l.toLowerCase()}`,label:l,aliases:[l],proofIds:[c]}),m=e.projects.filter(g=>{let v=i.replace(/^\//,"").replace(/\*.*$/,"");return v&&g.path.startsWith(v.replace(/\/$/,""))}),u=m.length>0?m.map(g=>y("project",`project:${g.id}`)):[y("workspace",`workspace:${e.state.workspaceName}`)];for(let g of u)e.state.addRelation({from:f,to:g,kind:"owns",trust:"authoritative",derivation:"authored",proofIds:[c]});}}}}},he={id:"architecture-decisions",version:"1.0.0",async run(e){let t=new Set,r=[{root:e.workspacePath,files:e.workspaceFiles},...e.projects.map(a=>({root:a.root,files:e.filesByProject.get(a.id)??[]}))];for(let a of r){let o=a.files.filter(n=>{let s=R(h.relative(a.root,n));return /(?:^|\/)(?:adr|adrs|decisions)(?:\/).+\.md$/i.test(s)||/(?:^|\/)ADR[-_0-9].+\.md$/i.test(s)});for(let n of o){if(t.has(n))continue;t.add(n);let s=A(e.projects,n),i=await P.readFile(n,"utf8"),d=i.match(/^#\s+(.+)$/m)?.[1]?.trim()??h.basename(n,".md"),l=i.match(/^status\s*:\s*(.+)$/im)?.[1]?.trim(),c=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(n,s),absolutePath:n,line:1,trust:"authoritative",derivation:"authored",detail:`Architecture decision: ${d}`}),f=e.state.addEntity({kind:"decision",key:`decision:${e.state.artifactPath(n,s)}`,label:d,...s?{projectId:s.id}:{},attributes:{status:l,artifact:e.state.artifactPath(n,s)},proofIds:[c]}),m=s?y("project",`project:${s.id}`):y("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:m,to:f,kind:"decided-by",trust:"authoritative",derivation:"authored",proofIds:[c]});}}}},ke=[ae,ie,ne,de,ce,le,pe,ue,me,ge,fe,he];async function ye(e,t){for(let r of t.edges){let a$1=[];for(let o of r.evidence){let n=W(o.file);a$1.push(await e.addProof({provider:"project-topology",artifact:n,absolutePath:h.resolve(e.workspacePath,n),derivation:r.source==="inferred"?"inferred":"authored",trust:r.source==="inferred"?"observed":"authoritative",confidence:r.confidence,detail:o.detail??`${r.kind} relationship`}));}a$1.length===0&&a$1.push(await e.addProof({provider:"project-topology",artifact:a.model,derivation:"inferred",trust:"ambiguous",confidence:r.confidence,detail:`${r.kind} relationship without source locator`})),e.addRelation({from:y("project",`project:${r.from}`),to:y("project",`project:${r.to}`),kind:r.kind==="event-pub-sub"?"consumes":"depends-on",derivation:r.source==="inferred"?"inferred":"authored",trust:r.source==="inferred"?"observed":"authoritative",confidence:r.confidence,proofIds:a$1});}}function ve(e){let t=[...e.entities.values()].filter(a=>a.kind==="endpoint"),r=new Map;for(let a of t){let o=String(a.attributes.method??"").toUpperCase(),n=String(a.attributes.path??"");if(!a.projectId||!o||!n)continue;let s=`${a.projectId}\0${o}\0${n}`,i=r.get(s)??[];i.push(a),r.set(s,i);}for(let a of r.values()){if(a.length<2)continue;let o=a.find(n=>n.proofIds.some(s=>e.proofs.get(s)?.trust==="authoritative"));if(o)for(let n of a.filter(s=>s.id!==o.id))e.addRelation({from:n.id,to:o.id,kind:"implements",derivation:"extracted",trust:"corroborated",confidence:"high",proofIds:[...n.proofIds,...o.proofIds]});}}async function Ce(e){let t=h.resolve(e.workspacePath),r=e.now??new Date,a=e.projects.map(p=>({...p,root:p.absolutePath?h.resolve(p.absolutePath):h.resolve(t,p.path),artifactPrefix:p.absolutePath?`external/${p.id}`:R(p.path)})).sort((p,k)=>p.id.localeCompare(k.id)),o=new D(t,r,e.workspace.name),n=Math.max(100,Math.min(e.maxFilesPerProject??2e3,1e4)),s=new Map(await Promise.all(a.map(async p=>[p.id,await F(p.root,n)]))),i=await F(t,Math.min(n*Math.max(a.length,1),2e4)),d={workspacePath:t,projects:a,filesByProject:s,workspaceFiles:i,now:r,maxFilesPerProject:n,contract:e.contract??null,state:o};for(let p of ke){let k={entities:o.entities.size,relations:o.relations.size,proofs:o.proofs.size,diagnostics:o.diagnostics.length},E="passed",$=[];try{await p.run(d),o.diagnostics.length>k.diagnostics&&(E="partial");}catch(I){E="failed";let C=I instanceof Error?I.message:String(I);$.push(C),o.diagnostics.push({code:`graph.provider.${p.id}.failed`,severity:"warning",message:`${p.id} provider failed: ${C}`,recommendation:"Repair the referenced source artifact and rerun workspace graph emit."});}o.providers.push({id:p.id,version:p.version,status:E,permission:"filesystem-read",discoveredEntities:o.entities.size-k.entities,discoveredRelations:o.relations.size-k.relations,proofCount:o.proofs.size-k.proofs,diagnostics:$});}ve(o),await ye(o,e.projectTopology);let l=[...o.entities.values()].sort((p,k)=>p.id.localeCompare(k.id)),c$1=[...o.relations.values()].sort((p,k)=>p.id.localeCompare(k.id)),f=[...o.proofs.values()].sort((p,k)=>p.id.localeCompare(k.id)),m=l.filter(p=>p.proofIds.length>0).length,u=c$1.filter(p=>p.proofIds.length>0).length,g=o.providers.filter(p=>["passed","partial"].includes(p.status)).length,v=e.projectTopology.diagnostics?.filter(p=>p.code==="graph.edges.missing").flatMap(p=>p.nodeIds??[])??[];return v.length>0&&o.diagnostics.push({code:"graph.knowledge.project_relationships_unknown",severity:"warning",message:`${v.length} project(s) have no proven inter-project relationship. This is unknown topology, not proof of independence.`,entityIds:v.map(p=>y("project",`project:${p}`)),recommendation:"Author service contracts or add OpenAPI, Compose, Kubernetes, package or import evidence."}),{schemaVersion:G,generatedAt:r.toISOString(),source:e.source??{kind:"workspace-sources",artifact:".",hashAlgorithm:"sha256",hash:c({workspace:e.workspace,projects:e.projects,projectTopology:e.projectTopology,contract:e.contract??null})},workspace:e.workspace,projectTopology:e.projectTopology,entities:l,relations:c$1,proofs:f,providers:[...o.providers].sort((p,k)=>p.id.localeCompare(k.id)),quality:{entityCount:l.length,relationCount:c$1.length,proofCount:f.length,entityProofCoverageRatio:l.length===0?1:m/l.length,relationProofCoverageRatio:c$1.length===0?1:u/c$1.length,providerSuccessRatio:o.providers.length===0?1:g/o.providers.length,conflictCount:o.diagnostics.filter(p=>p.code.includes("conflict")).length,unknownCount:o.diagnostics.filter(p=>p.code.includes("unknown")).length,portable:true,secretValuesEmitted:false},diagnostics:[...o.diagnostics].sort((p,k)=>p.code.localeCompare(k.code)||p.message.localeCompare(k.message))}}function _e(e,t){return y(e,t)}
1
+ import {d,c}from'./chunk-OA537ZQ5.js';import {b as b$1,a}from'./chunk-BMWFQXGW.js';import h from'path';import {createHash}from'crypto';import P from'fs-extra';import {parseAllDocuments}from'yaml';var G=b$1.knowledgeGraph;var Ae=a.knowledgeGraph;function Se(e,t){if(e.source.kind!=="workspace-model")throw new Error(`Workspace knowledge graph is not bound to the canonical workspace model (source: ${e.source.kind}).`);if(e.source.artifact!==a.model)throw new Error(`Workspace knowledge graph source artifact is ${e.source.artifact}; expected ${a.model}.`);let r=d(t);if(e.source.hash!==r)throw new Error("Workspace knowledge graph is stale: its source hash does not match the canonical workspace model.")}var Y=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","venv","vendor","node_modules","dist","build","target","coverage",".next",".turbo",".cache"]),M=new Set(["package.json","pyproject.toml","requirements.txt","Pipfile","go.mod","Cargo.toml","pom.xml","build.gradle","build.gradle.kts","composer.json","Gemfile","mix.exs","pubspec.yaml","Package.swift","CMakeLists.txt","deno.json","deno.jsonc","project.clj","deps.edn","build.sbt","BUILD","BUILD.bazel","WORKSPACE.bazel"]),Q=new Set(["get","put","post","delete","options","head","patch","trace"]),X=new Set([".c",".cc",".cpp",".cs",".dart",".ex",".exs",".go",".h",".hpp",".java",".js",".jsx",".kt",".kts",".mjs",".php",".py",".r",".rb",".rs",".scala",".svelte",".swift",".ts",".tsx",".vue",".clj",".cljs",".fs",".fsx",".lua",".vb"]);function _(e){let t=h.extname(e).toLowerCase();return {".c":"c",".cc":"cpp",".cpp":"cpp",".cs":"csharp",".dart":"dart",".ex":"elixir",".exs":"elixir",".go":"go",".h":"c",".hpp":"cpp",".java":"java",".js":"javascript",".jsx":"javascript",".kt":"kotlin",".kts":"kotlin",".mjs":"javascript",".php":"php",".py":"python",".r":"r",".rb":"ruby",".rs":"rust",".scala":"scala",".svelte":"svelte",".swift":"swift",".ts":"typescript",".tsx":"typescript",".vue":"vue",".clj":"clojure",".cljs":"clojure",".fs":"fsharp",".fsx":"fsharp",".lua":"lua",".vb":"visual-basic"}[t]??t.slice(1)}function O(e,t,r){let a=[],o=e.split(/\r?\n/);for(let n=0;n<o.length&&a.length<r;n+=1)for(let s of t){let d=o[n].match(s.pattern)?.[1]?.trim();if(d){a.push({name:d,line:n+1,detail:s.detail});break}}return a}var x=[{pattern:/^\s*(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/,detail:"function"},{pattern:/^\s*(?:export\s+)?(?:abstract\s+)?(?:class|interface|enum|type)\s+([A-Za-z_$][\w$]*)/,detail:"type"},{pattern:/^\s*(?:async\s+)?def\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*class\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*func\s+(?:\([^)]*\)\s*)?([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:public\s+|private\s+|protected\s+|internal\s+|abstract\s+|final\s+)*(?:class|interface|record|enum)\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*(?:pub\s+)?fn\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:pub\s+)?(?:struct|trait|enum)\s+([A-Za-z_]\w*)/,detail:"type"},{pattern:/^\s*(?:public\s+|private\s+|protected\s+)?function\s+([A-Za-z_]\w*)/,detail:"function"},{pattern:/^\s*(?:class|module|struct|protocol|mixin)\s+([A-Za-z_]\w*)/,detail:"type"}],ee=[{pattern:/^\s*import(?:.+?from\s*)?["']([^"']+)["']/,detail:"import"},{pattern:/require\(["']([^"']+)["']\)/,detail:"require"},{pattern:/^\s*from\s+([A-Za-z0-9_.]+)\s+import\s+/,detail:"import"},{pattern:/^\s*import\s+([A-Za-z0-9_.]+)(?:\s|$)/,detail:"import"},{pattern:/^\s*(?:import|using|use)\s+([A-Za-z0-9_:.*\\/.-]+)/,detail:"import"},{pattern:/^\s*require(?:_relative)?\s+["']([^"']+)["']/,detail:"require"}],te=[{pattern:/@(?:Get|Post|Put|Delete|Patch|Options|Head)\s*\(\s*["']([^"']*)["']/i,detail:"decorated route"},{pattern:/\b(?:app|router|server|api|route|fastify|fiber)\.(?:get|post|put|delete|patch|options|head)\s*\(\s*["']([^"']+)["']/i,detail:"router route"},{pattern:/@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping|RequestMapping)\s*\([^"']*["']([^"']*)["']/,detail:"mapped route"},{pattern:/\[Http(?:Get|Post|Put|Delete|Patch)\s*\(\s*["']([^"']*)["']/i,detail:"HTTP route"},{pattern:/^\s*(?:get|post|put|delete|patch)\s+["']([^"']+)["']/i,detail:"HTTP route"}];function N(e){return createHash("sha256").update(e).digest("hex")}function y(e,t){return `wkg:${e}:${N(`${e}\0${t}`).slice(0,20)}`}function R(e){return e.replace(/\\/g,"/")}function W(e){let t=R(e).replace(/^\.\//,"");return !t||t.startsWith("/")||/^[A-Za-z]:\//.test(t)?"unknown":t}function w(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function b(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function j(e){if(Array.isArray(e))return e.filter(r=>typeof r=="string").sort();let t=w(e);return t?Object.keys(t).sort():[]}function oe(e){if(Array.isArray(e))return e.map(r=>typeof r=="string"?r.split("=",1)[0]?.trim():"").filter(r=>!!r).sort();let t=w(e);return t?Object.keys(t).sort():[]}function re(e){return Object.fromEntries(Object.entries(e).filter(t=>t[1]!==void 0).sort(([t],[r])=>t.localeCompare(r)))}async function F(e,t){let r=[],a=[e],o=0;for(;o<a.length&&r.length<t;){let n=a[o++],s;try{s=await P.readdir(n,{withFileTypes:true});}catch{continue}s.sort((i,d)=>i.name.localeCompare(d.name));for(let i of s){if(r.length>=t)break;if(i.isSymbolicLink())continue;let d=h.join(n,i.name);i.isDirectory()?Y.has(i.name)||a.push(d):i.isFile()&&r.push(d);}}return r.sort((n,s)=>n.localeCompare(s))}async function S(e){let t=await P.readFile(e,"utf8");if(e.toLowerCase().endsWith(".json")){let r=JSON.parse(t),a=w(r);return a?[a]:[]}return parseAllDocuments(t).map(r=>w(r.toJSON())).filter(r=>r!==null)}function A(e,t){let r=h.resolve(t);return e.filter(a=>r===a.root||r.startsWith(`${a.root}${h.sep}`)).sort((a,o)=>o.root.length-a.root.length)[0]??null}var D=class{constructor(t,r,a){this.workspacePath=t;this.now=r;this.workspaceName=a;}workspacePath;now;workspaceName;entities=new Map;relations=new Map;proofs=new Map;providers=[];diagnostics=[];contentHashes=new Map;artifactPath(t,r){if(r){let a=R(h.relative(r.root,t));return W(h.posix.join(r.artifactPrefix,a))}return W(h.relative(this.workspacePath,t))}async addProof(t){let r;if(t.absolutePath){if(!this.contentHashes.has(t.absolutePath))try{this.contentHashes.set(t.absolutePath,N(await P.readFile(t.absolutePath)));}catch{this.contentHashes.set(t.absolutePath,null);}r=this.contentHashes.get(t.absolutePath)??void 0;}let a=W(t.artifact),o=y("proof",[t.provider,a,t.pointer??"",t.line??"",t.detail??""].join("\0"));return this.proofs.has(o)||this.proofs.set(o,{id:o,provider:t.provider,artifact:a,...t.pointer?{pointer:t.pointer}:{},...t.line?{line:t.line}:{},...t.column?{column:t.column}:{},...r?{contentHash:r}:{},observedAt:this.now.toISOString(),derivation:t.derivation??"extracted",trust:t.trust??"observed",confidence:t.confidence??"high",freshness:"fresh",...t.detail?{detail:t.detail}:{}}),o}addEntity(t){let r=y(t.kind,t.key),a=re(t.attributes??{}),o=this.entities.get(r),n={...o?.attributes??{}};for(let[d,l]of Object.entries(a)){if(d in n&&JSON.stringify(n[d])!==JSON.stringify(l)){this.diagnostics.push({code:"graph.knowledge.attribute_conflict",severity:"warning",message:`Conflicting ${d} values were observed for ${t.kind} ${t.label}.`,entityIds:[r],recommendation:"Inspect the entity proof paths and make the authoritative source explicit."});continue}n[d]=l;}let s=[...new Set([...o?.identity.aliases??[],...t.aliases??[]])].sort(),i=[...new Set([...o?.proofIds??[],...t.proofIds??[]])].sort();return this.entities.set(r,{id:r,kind:t.kind,label:t.label,...t.projectId?{projectId:t.projectId}:{},identity:{key:t.key,scope:t.projectId?"project":"workspace",aliases:s,fingerprint:N(JSON.stringify({kind:t.kind,key:t.key,attributes:n}))},attributes:n,proofIds:i}),r}addRelation(t){let r=y("relation",`${t.from}\0${t.kind}\0${t.to}`),a=this.relations.get(r),o=[...new Set([...a?.proofIds??[],...t.proofIds])].sort(),n=new Set(o.map(d=>this.proofs.get(d)?.provider).filter(Boolean)).size,s=t.trust??a?.trust??"observed",i=n>=2&&s!=="ambiguous"?"corroborated":s;return this.relations.set(r,{id:r,from:t.from,to:t.to,kind:t.kind,derivation:t.derivation??a?.derivation??"extracted",trust:i,confidence:i==="corroborated"?"high":t.confidence??a?.confidence??"high",proofIds:o}),r}};function se(e,t){let r=h.basename(e);try{if(r==="package.json"||r==="composer.json"){let s=JSON.parse(t);return {ecosystem:r==="package.json"?"npm":"composer",name:b(s.name),version:b(s.version),dependencies:[...j(s.dependencies),...j(s.devDependencies),...j(s.require),...j(s["require-dev"])].filter((i,d,l)=>l.indexOf(i)===d).sort()}}if(r==="deno.json"||r==="deno.jsonc"){let s=JSON.parse(t.replace(/\/\*[\s\S]*?\*\/|^\s*\/\/.*$/gm,""));return {ecosystem:"deno",name:b(s.name),version:b(s.version),dependencies:j(s.imports)}}}catch{}let a=s=>t.match(s)?.[1]?.trim();if(r==="pyproject.toml"){let s=t.match(/^dependencies\s*=\s*\[([\s\S]*?)\]/m)?.[1]??"";return {ecosystem:"python",name:a(/^(?:name)\s*=\s*["']([^"']+)["']/m),version:a(/^(?:version)\s*=\s*["']([^"']+)["']/m),dependencies:[...[...s.matchAll(/["']([A-Za-z0-9_.-]+)/g)].map(i=>i[1]),...[...t.matchAll(/^([A-Za-z0-9_.-]+)\s*=\s*(?:["'{[])/gm)].map(i=>i[1]).filter(i=>!["name","version","description","python","dependencies"].includes(i))].filter((i,d,l)=>l.indexOf(i)===d).sort()}}if(r==="go.mod")return {ecosystem:"go",name:a(/^module\s+(\S+)/m),dependencies:[...t.matchAll(/^\s*([A-Za-z0-9_.~/-]+)\s+v\d+/gm)].map(s=>s[1]).sort()};if(r==="Cargo.toml"){let s=t.match(/^\[dependencies\]\s*$([\s\S]*?)(?=^\[|\s*$)/m)?.[1]??"";return {ecosystem:"cargo",name:a(/^name\s*=\s*["']([^"']+)["']/m),version:a(/^version\s*=\s*["']([^"']+)["']/m),dependencies:[...s.matchAll(/^([A-Za-z0-9_.-]+)\s*=/gm)].map(i=>i[1]).sort()}}if(r==="pom.xml")return {ecosystem:"maven",name:a(/<artifactId>([^<]+)<\/artifactId>/),version:a(/<version>([^<]+)<\/version>/),dependencies:[...t.matchAll(/<artifactId>([^<]+)<\/artifactId>/g)].slice(1).map(s=>s[1]).sort()};if(/\.(?:cs|fs|vb)proj$/i.test(r))return {ecosystem:"nuget",name:a(/<AssemblyName>([^<]+)<\/AssemblyName>/)??r.replace(/\.[^.]+$/,""),version:a(/<Version>([^<]+)<\/Version>/),dependencies:[...t.matchAll(/<PackageReference\s+Include=["']([^"']+)["']/g)].map(s=>s[1]).sort()};let o={"requirements.txt":"python",Pipfile:"python","build.gradle":"gradle","build.gradle.kts":"gradle",Gemfile:"ruby","mix.exs":"elixir","pubspec.yaml":"dart","Package.swift":"swift","CMakeLists.txt":"cmake","deno.json":"deno","deno.jsonc":"deno","project.clj":"clojure","deps.edn":"clojure","build.sbt":"scala",BUILD:"bazel","BUILD.bazel":"bazel","WORKSPACE.bazel":"bazel"},n=r==="requirements.txt"?t.split(/\r?\n/).map(s=>s.trim().match(/^([A-Za-z0-9_.-]+)/)?.[1]):r.startsWith("build.gradle")?[...t.matchAll(/(?:implementation|api|compileOnly|runtimeOnly|testImplementation)\s*\(?["']([^:"']+):([^:"']+)/g)].map(s=>`${s[1]}:${s[2]}`):r==="Gemfile"?[...t.matchAll(/^\s*gem\s+["']([^"']+)["']/gm)].map(s=>s[1]):r==="mix.exs"?[...t.matchAll(/\{:\s*([A-Za-z0-9_]+)\s*,/g)].map(s=>s[1]):r==="pubspec.yaml"?[...t.matchAll(/^\s{2}([A-Za-z0-9_]+):\s+/gm)].map(s=>s[1]):r==="Package.swift"?[...t.matchAll(/\.package\s*\(\s*url:\s*["']([^"']+)["']/g)].map(s=>s[1]):r==="CMakeLists.txt"?[...t.matchAll(/find_package\s*\(\s*([A-Za-z0-9_.+-]+)/gi)].map(s=>s[1]):r==="project.clj"||r==="deps.edn"?[...t.matchAll(/\[?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)\s+/g)].map(s=>s[1]):r==="build.sbt"?[...t.matchAll(/["']([^"']+)["']\s*%%?\s*["']([^"']+)["']/g)].map(s=>`${s[1]}:${s[2]}`):[];return {ecosystem:o[r]??"unknown",dependencies:n.filter(s=>!!s).filter((s,i,d)=>d.indexOf(s)===i).sort()}}var ae={id:"workspace-foundation",version:"1.0.0",async run(e){let{state:t}=e,r=await t.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:h.join(e.workspacePath,".workspai","workspace.contract.json"),trust:"authoritative",derivation:"authored",detail:"Workspace identity and project registry boundary"}),a=t.addEntity({kind:"workspace",key:`workspace:${t.workspaceName}`,label:t.workspaceName,aliases:[t.workspaceName],proofIds:[r]});for(let o of e.projects){let n=e.filesByProject.get(o.id)??[],s=n.find(u=>/[\\/]\.(?:workspai|rapidkit)[\\/](?:project|context)\.json$/.test(u)),i=n.find(u=>M.has(h.basename(u))),d=s??i,l=await t.addProof({provider:this.id,artifact:d?t.artifactPath(d,o):W(h.posix.join(o.artifactPrefix,".workspai/project.json")),...d?{absolutePath:d}:{},trust:s?"authoritative":"observed",derivation:s?"authored":"inferred",detail:`Project ${o.id}`}),c=t.addEntity({kind:"project",key:`project:${o.id}`,label:o.id,projectId:o.id,aliases:[o.id,o.path],attributes:{path:o.path,runtime:o.runtime,framework:o.framework,kit:o.kit},proofIds:[l]});t.addRelation({from:a,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[l]});let f=new Set,m=[];for(let u of n){let g=h.basename(u);if(/^(?:\.env\.example|\.env\.sample|\.env\.template)$/i.test(g))try{let v=await P.readFile(u,"utf8");for(let p of v.split(/\r?\n/)){let k=p.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1];k&&f.add(k);}}catch{}if((/(?:^|[\\/])(?:test|tests|spec|specs|__tests__)(?:[\\/]|$)/i.test(u)||/(?:\.test|\.spec|_test)\.[A-Za-z0-9]+$/i.test(g))&&m.push(u),!(!M.has(g)&&!/\.(?:cs|fs|vb)proj$/i.test(g)))try{let v=await P.readFile(u,"utf8"),p=se(u,v),k=await t.addProof({provider:this.id,artifact:t.artifactPath(u,o),absolutePath:u,pointer:"/",confidence:p.name?"high":"medium",detail:`${p.ecosystem} manifest`}),E=t.addEntity({kind:"package",key:`package:${o.id}:${p.ecosystem}:${p.name??g}`,label:p.name??`${o.id}/${g}`,projectId:o.id,aliases:[g,...p.name?[p.name]:[]],attributes:{ecosystem:p.ecosystem,version:p.version,manifest:t.artifactPath(u,o),dependencies:p.dependencies},proofIds:[k]});t.addRelation({from:c,to:E,kind:"contains",proofIds:[k]});for(let $ of p.dependencies.slice(0,500)){let I=t.addEntity({kind:"module",key:`dependency:${p.ecosystem}:${$}`,label:$,aliases:[$],attributes:{ecosystem:p.ecosystem,external:true},proofIds:[k]});t.addRelation({from:E,to:I,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[k]});}}catch{}}if(f.size>0){let u=n.find(g=>/^\.env\.(?:example|sample|template)$/i.test(h.basename(g)));if(u){let g=await t.addProof({provider:this.id,artifact:t.artifactPath(u,o),absolutePath:u,detail:"Public environment template keys only; values are intentionally excluded"}),v=t.addEntity({kind:"environment",key:`environment:${o.id}:template`,label:`${o.id} environment contract`,projectId:o.id,attributes:{keys:[...f].sort(),valuesEmitted:false},proofIds:[g]});t.addRelation({from:c,to:v,kind:"configured-by",proofIds:[g]});}}if(m.length>0){let u=await t.addProof({provider:this.id,artifact:t.artifactPath(m[0],o),absolutePath:m[0],detail:`${m.length} test file(s) discovered`}),g=t.addEntity({kind:"test-suite",key:`tests:${o.id}`,label:`${o.id} tests`,projectId:o.id,attributes:{fileCount:m.length},proofIds:[u]});t.addRelation({from:g,to:c,kind:"tests",proofIds:[u]});}}}},ie={id:"source-structure",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(o=>X.has(h.extname(o).toLowerCase())).slice(0,1e3),a=0;for(let o of r){let n;try{if((await P.stat(o)).size>2*1024*1024)continue;n=await P.readFile(o,"utf8");}catch{continue}let s=e.state.artifactPath(o,t),i=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,derivation:"extracted",trust:"observed",confidence:"high",detail:`${_(o)} source file`}),d=e.state.addEntity({kind:"file",key:`file:${t.id}:${s}`,label:s,projectId:t.id,aliases:[h.basename(o)],attributes:{artifact:s,language:_(o),bytes:Buffer.byteLength(n)},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:d,kind:"contains",proofIds:[i]});let l=O(n,ee,250);for(let c of l){let f=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,line:c.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${c.detail}: ${c.name}`}),m=e.state.addEntity({kind:"module",key:`module:${t.id}:${c.name}`,label:c.name,projectId:t.id,aliases:[c.name],attributes:{specifier:c.name},proofIds:[f]});e.state.addRelation({from:d,to:m,kind:"imports",confidence:"medium",proofIds:[f]});}if(a<500){let c=O(n,x,Math.min(100,500-a));a+=c.length;for(let f of c){let m=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,line:f.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${f.detail}: ${f.name}`}),u=e.state.addEntity({kind:"symbol",key:`symbol:${t.id}:${s}:${f.detail}:${f.name}`,label:f.name,projectId:t.id,attributes:{symbolKind:f.detail,language:_(o)},proofIds:[m]});e.state.addRelation({from:d,to:u,kind:"defines",confidence:"medium",proofIds:[m]});}}for(let c of O(n,te,100)){let m=(n.split(/\r?\n/)[c.line-1]??"").match(/(?:@|\.|\[|^\s*)(get|post|put|delete|patch|options|head)/i)?.[1]?.toUpperCase()??"HTTP",u=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,line:c.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${m} ${c.name}`}),g=e.state.addEntity({kind:"endpoint",key:`source-endpoint:${t.id}:${s}:${m}:${c.name}`,label:`${m} ${c.name||"/"}`,projectId:t.id,attributes:{method:m,path:c.name||"/",source:s},proofIds:[u]});e.state.addRelation({from:d,to:g,kind:"defines",confidence:"medium",proofIds:[u]});}}(r.length>=1e3||a>=500)&&e.state.diagnostics.push({code:"graph.provider.source_structure.limit_reached",severity:"info",message:`Source extraction for ${t.id} reached its bounded inventory limit.`,recommendation:"Use the standalone graph package provider configuration for deeper symbol indexing."});}}},ne={id:"workspace-service-contract",version:"1.0.0",async run(e){if(!e.contract)return;let t=new Map;for(let r of [...e.contract.projects].sort((a,o)=>a.slug.localeCompare(o.slug))){let a=r.contracts,o=await e.state.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:h.join(e.workspacePath,".workspai","workspace.contract.json"),pointer:`/projects/${r.slug}/contracts`,trust:"authoritative",derivation:"authored",detail:`Service contract for ${r.slug}`}),n=y("project",`project:${r.slug}`),s=e.state.addEntity({kind:"service",key:`contract-service:${r.slug}`,label:r.slug,projectId:r.slug,attributes:{ports:r.ports.map(i=>`${i.protocol}:${i.port}`),owns:[...a.owns].sort(),environmentKeys:[...a.env].sort()},proofIds:[o]});e.state.addRelation({from:n,to:s,kind:"implements",trust:"authoritative",derivation:"authored",proofIds:[o]});for(let i of [...a.apis].sort((d,l)=>d.name.localeCompare(l.name))){let d=e.state.addEntity({kind:"api",key:`contract-api:${r.slug}:${i.name}:${i.basePath}`,label:i.name,projectId:r.slug,attributes:{basePath:i.basePath},proofIds:[o]});e.state.addRelation({from:s,to:d,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[o]});}for(let i of [...a.publishes,...a.consumes].sort())t.has(i)||t.set(i,e.state.addEntity({kind:"queue",key:`event:${i}`,label:i,attributes:{protocol:"workspace-event"},proofIds:[o]}));for(let i of [...a.publishes].sort()){let d=t.get(i);d&&e.state.addRelation({from:s,to:d,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[o]});}for(let i of [...a.consumes].sort()){let d=t.get(i);d&&e.state.addRelation({from:s,to:d,kind:"consumes",trust:"authoritative",derivation:"authored",proofIds:[o]});}}}},de={id:"openapi",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(a=>/^(?:openapi|swagger)(?:\.[^.]+)?\.(?:json|ya?ml)$/i.test(h.basename(a)));for(let a of r){let o;try{o=await S(a);}catch(n){e.state.diagnostics.push({code:"graph.provider.openapi.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(a,t)}: ${n instanceof Error?n.message:String(n)}`});continue}for(let n of o){if(!("openapi"in n)&&!("swagger"in n))continue;let s=w(n.info),i=b(s?.title)??`${t.id} API`,d=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:"/info",trust:"authoritative",detail:"Authored OpenAPI contract"}),l=y("project",`project:${t.id}`),c=e.state.addEntity({kind:"api",key:`api:${t.id}:${i}`,label:i,projectId:t.id,attributes:{version:b(s?.version),specification:b(n.openapi)??b(n.swagger)},proofIds:[d]});e.state.addRelation({from:l,to:c,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[d]});let f=w(w(n.components)?.schemas)??w(n.definitions),m=new Map;for(let g of Object.keys(f??{}).sort()){let v=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:`/components/schemas/${g}`,trust:"authoritative",detail:`OpenAPI schema ${g}`}),p=e.state.addEntity({kind:"schema",key:`schema:${t.id}:${i}:${g}`,label:g,projectId:t.id,proofIds:[v]});m.set(g,p),e.state.addRelation({from:c,to:p,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[v]});}let u=w(n.paths);for(let g of Object.keys(u??{}).sort()){let v=w(u?.[g]);for(let p of Object.keys(v??{}).filter(k=>Q.has(k.toLowerCase())).sort()){let k=w(v?.[p]),E=`/paths/${g.replace(/~/g,"~0").replace(/\//g,"~1")}/${p}`,$=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:E,trust:"authoritative",detail:`${p.toUpperCase()} ${g}`}),I=e.state.addEntity({kind:"endpoint",key:`endpoint:${t.id}:${i}:${p.toUpperCase()}:${g}`,label:`${p.toUpperCase()} ${g}`,projectId:t.id,aliases:j(k?.tags),attributes:{method:p.toUpperCase(),path:g,operationId:b(k?.operationId),deprecated:typeof k?.deprecated=="boolean"?k.deprecated:void 0,tags:j(k?.tags)},proofIds:[$]});e.state.addRelation({from:c,to:I,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[$]});let C=JSON.stringify(k??{});for(let[Z,H]of m)C.includes(`/${Z}`)&&e.state.addRelation({from:I,to:H,kind:"references",trust:"authoritative",derivation:"authored",proofIds:[$]});}}}}}}},ce={id:"interface-contracts",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(a=>{let o=h.basename(a).toLowerCase();return /\.(?:graphql|gql|proto)$/.test(o)||/^asyncapi(?:\.[^.]+)?\.(?:json|ya?ml)$/.test(o)});for(let a of r){let o=e.state.artifactPath(a,t),n=h.extname(a).toLowerCase();if(n===".graphql"||n===".gql"){let s=await P.readFile(a,"utf8"),i=await e.state.addProof({provider:this.id,artifact:o,absolutePath:a,trust:"authoritative",derivation:"authored",detail:"GraphQL schema"}),d=e.state.addEntity({kind:"api",key:`graphql:${t.id}:${o}`,label:`${t.id} GraphQL API`,projectId:t.id,attributes:{specification:"graphql",artifact:o},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:d,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[i]});for(let l of s.matchAll(/^\s*(?:type|input|interface|enum|scalar|union)\s+([A-Za-z_]\w*)/gm)){let c=e.state.addEntity({kind:"schema",key:`graphql-schema:${t.id}:${o}:${l[1]}`,label:l[1],projectId:t.id,proofIds:[i]});e.state.addRelation({from:d,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[i]});}continue}if(n===".proto"){let s=await P.readFile(a,"utf8"),i=await e.state.addProof({provider:this.id,artifact:o,absolutePath:a,trust:"authoritative",derivation:"authored",detail:"Protocol Buffers contract"});for(let d of s.matchAll(/^\s*service\s+([A-Za-z_]\w*)/gm)){let l=e.state.addEntity({kind:"api",key:`protobuf-service:${t.id}:${o}:${d[1]}`,label:d[1],projectId:t.id,attributes:{specification:"protobuf",artifact:o},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:l,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[i]});}for(let d of s.matchAll(/^\s*message\s+([A-Za-z_]\w*)/gm))e.state.addEntity({kind:"schema",key:`protobuf-message:${t.id}:${o}:${d[1]}`,label:d[1],projectId:t.id,attributes:{specification:"protobuf",artifact:o},proofIds:[i]});continue}try{let s=(await S(a))[0];if(!s||!("asyncapi"in s))continue;let i=await e.state.addProof({provider:this.id,artifact:o,absolutePath:a,trust:"authoritative",derivation:"authored",detail:"AsyncAPI contract"}),d=e.state.addEntity({kind:"api",key:`asyncapi:${t.id}:${o}`,label:b(w(s.info)?.title)??`${t.id} AsyncAPI`,projectId:t.id,attributes:{specification:`asyncapi ${String(s.asyncapi)}`,artifact:o},proofIds:[i]});e.state.addRelation({from:y("project",`project:${t.id}`),to:d,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[i]});for(let l of Object.keys(w(s.channels)??{}).sort()){let c=e.state.addEntity({kind:"queue",key:`asyncapi-channel:${t.id}:${l}`,label:l,projectId:t.id,attributes:{protocol:"asyncapi"},proofIds:[i]});e.state.addRelation({from:d,to:c,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[i]});}}catch{}}}}},pe={id:"infrastructure-as-code",version:"1.0.0",async run(e){let t=e.workspaceFiles.filter(r=>{let a=h.basename(r);return /^Dockerfile(?:\..+)?$/i.test(a)||/\.tf$/i.test(a)||a==="Chart.yaml"});for(let r of t){let a=A(e.projects,r),o=a?.id??e.state.workspaceName,n=a?y("project",`project:${a.id}`):y("workspace",`workspace:${e.state.workspaceName}`),s=e.state.artifactPath(r,a),i=await P.readFile(r,"utf8"),d=await e.state.addProof({provider:this.id,artifact:s,absolutePath:r,trust:"authoritative",derivation:"authored",detail:"Infrastructure definition"});if(/^Dockerfile/i.test(h.basename(r))){let c=[...i.matchAll(/^\s*FROM\s+([^\s]+)(?:\s+AS\s+([^\s]+))?/gim)],f=e.state.addEntity({kind:"container",key:`dockerfile:${o}:${s}`,label:`${o} container image`,...a?{projectId:a.id}:{},attributes:{artifact:s,baseImages:c.map(m=>m[1])},proofIds:[d]});e.state.addRelation({from:n,to:f,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[d]});continue}if(/\.tf$/i.test(r)){for(let c of i.matchAll(/^\s*resource\s+["']([^"']+)["']\s+["']([^"']+)["']/gm)){let f=c[1],m=/(?:db|sql|rds|database)/i.test(f)?"database":/(?:queue|kafka|sqs|pubsub|servicebus)/i.test(f)?"queue":"deployment",u=e.state.addEntity({kind:m,key:`terraform:${o}:${f}:${c[2]}`,label:`${f}.${c[2]}`,...a?{projectId:a.id}:{},attributes:{resourceType:f,artifact:s},proofIds:[d]});e.state.addRelation({from:n,to:u,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[d]});}continue}let l=e.state.addEntity({kind:"deployment",key:`helm:${o}:${s}`,label:`${o} Helm chart`,...a?{projectId:a.id}:{},attributes:{artifact:s,format:"helm"},proofIds:[d]});e.state.addRelation({from:n,to:l,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[d]});}}};function q(e){let t=e.toLowerCase();return /(?:postgres|mysql|mariadb|mongo|cassandra|cockroach|mssql|oracle)/.test(t)?"database":/(?:rabbitmq|kafka|nats|pulsar|activemq|redis)/.test(t)?"queue":"container"}var le={id:"compose",version:"1.0.0",async run(e){let t=new Set;for(let r of [e.workspacePath,...e.projects.map(a=>a.root)])for(let a of ["compose.yml","compose.yaml","docker-compose.yml","docker-compose.yaml"]){let o=h.join(r,a);await P.pathExists(o)&&t.add(o);}for(let r of [...t].sort()){let a;try{a=(await S(r))[0];}catch(i){e.state.diagnostics.push({code:"graph.provider.compose.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(r)}: ${i instanceof Error?i.message:String(i)}`});}let o=w(a?.services);if(!o)continue;let n=A(e.projects,r),s=new Map;for(let i of Object.keys(o).sort()){let d=w(o[i]),l=d?.build,c=b(l)??b(w(l)?.context),f=c?A(e.projects,h.resolve(h.dirname(r),c)):e.projects.find(v=>v.id.toLowerCase()===i.toLowerCase()||h.basename(v.path).toLowerCase()===i.toLowerCase())??n,m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(r,n),absolutePath:r,pointer:`/services/${i}`,trust:"authoritative",derivation:"authored",detail:`Compose service ${i}`}),u=b(d?.image),g=e.state.addEntity({kind:"service",key:`compose-service:${e.state.artifactPath(r,n)}:${i}`,label:i,...f?{projectId:f.id}:{},attributes:{image:u,ports:j(d?.ports).map(String),networks:j(d?.networks),environmentKeys:oe(d?.environment)},proofIds:[m]});if(s.set(i,g),f&&e.state.addRelation({from:y("project",`project:${f.id}`),to:g,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[m]}),u){let v=e.state.addEntity({kind:q(u),key:`image:${u}`,label:u,...f?{projectId:f.id}:{},attributes:{image:u},proofIds:[m]});e.state.addRelation({from:g,to:v,kind:q(u)==="container"?"runs-on":"depends-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}for(let i of Object.keys(o).sort()){let d=w(o[i]),l=s.get(i);if(l)for(let c of j(d?.depends_on)){let f=s.get(c);if(!f)continue;let m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(r,n),absolutePath:r,pointer:`/services/${i}/depends_on/${c}`,trust:"authoritative",derivation:"authored",detail:`${i} depends on ${c}`});e.state.addRelation({from:l,to:f,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}}}},fe={id:"documentation",version:"1.0.0",async run(e){let t=new Set,r=[e.workspaceFiles,...e.projects.map(a=>e.filesByProject.get(a.id)??[])];for(let a of r){let o=a.filter(n=>/(?:^|[\\/])(?:README|ARCHITECTURE|CONTRIBUTING|SECURITY)\.md$/i.test(n));for(let n of o){if(t.has(n))continue;t.add(n);let s=A(e.projects,n),d=(await P.readFile(n,"utf8")).match(/^#\s+(.+)$/m)?.[1]?.trim()??h.basename(n),l=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(n,s),absolutePath:n,line:1,trust:"authoritative",derivation:"authored",detail:`Documentation: ${d}`}),c=e.state.addEntity({kind:"document",key:`document:${e.state.artifactPath(n,s)}`,label:d,...s?{projectId:s.id}:{},attributes:{artifact:e.state.artifactPath(n,s)},proofIds:[l]}),f=s?y("project",`project:${s.id}`):y("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:c,to:f,kind:"documents",trust:"authoritative",derivation:"authored",proofIds:[l]});}}}},ue={id:"kubernetes",version:"1.0.0",async run(e){for(let t of e.projects){let r=(e.filesByProject.get(t.id)??[]).filter(a=>/(?:^|[\\/])(?:k8s|kubernetes|deploy|manifests)(?:[\\/]).+\.ya?ml$/i.test(a));for(let a of r){let o;try{o=await S(a);}catch{continue}for(let n=0;n<o.length;n+=1){let s=o[n],i=b(s.kind),d=w(s.metadata),l=b(d?.name);if(!i||!l)continue;let c=b(d?.namespace)??"default",f=/Deployment|StatefulSet|DaemonSet/i.test(i)?"deployment":/Service|Ingress/i.test(i)?"service":/ConfigMap|Secret/i.test(i)?"environment":"deployment",m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(a,t),absolutePath:a,pointer:`/documents/${n}`,trust:"authoritative",derivation:"authored",detail:`${i} ${c}/${l}`}),u=e.state.addEntity({kind:f,key:`kubernetes:${i}:${c}:${l}`,label:`${i}/${l}`,projectId:t.id,attributes:{resourceKind:i,namespace:c,secret:i==="Secret",keys:i==="Secret"||i==="ConfigMap"?Object.keys(w(s.data)??{}).sort():void 0},proofIds:[m]});e.state.addRelation({from:y("project",`project:${t.id}`),to:u,kind:f==="deployment"?"deploys":"contains",trust:"authoritative",derivation:"authored",proofIds:[m]});let g=e.state.addEntity({kind:"environment",key:`kubernetes-namespace:${c}`,label:`Kubernetes namespace ${c}`,projectId:t.id,attributes:{namespace:c},proofIds:[m]});e.state.addRelation({from:u,to:g,kind:"runs-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}}}},me={id:"ci-workflow",version:"1.0.0",async run(e){let t=e.workspaceFiles.filter(r=>{let a=R(h.relative(e.workspacePath,r));return /^\.github\/workflows\/.+\.ya?ml$/i.test(a)||/^(?:\.gitlab-ci\.ya?ml|azure-pipelines\.ya?ml|Jenkinsfile|bitbucket-pipelines\.ya?ml|\.woodpecker\.ya?ml)$/i.test(a)||/^\.circleci\/config\.ya?ml$/i.test(a)});for(let r of t){let a=e.state.artifactPath(r),o=h.basename(r)==="Jenkinsfile",n=h.basename(r),s=[],i=[];if(o)s=[...(await P.readFile(r,"utf8")).matchAll(/\bstage\s*\(\s*["']([^"']+)["']/g)].map(f=>f[1]);else {let c;try{c=(await S(r))[0];}catch{continue}if(!c)continue;n=b(c.name)??n;let f=R(h.relative(e.workspacePath,r));if(/^\.gitlab-ci\./i.test(f)){let m=new Set(["stages","variables","workflow","include","default","image","services","cache","before_script","after_script"]);s=Object.keys(c).filter(u=>!u.startsWith(".")&&!m.has(u)).sort();}else s=[...new Set([...Object.keys(w(c.jobs)??{}),...Object.keys(w(w(c.workflows)?.jobs)??{}),...j(c.stages)])].sort();i=j(c.on);}s.length===0&&(s=["pipeline"]);let d=await e.state.addProof({provider:this.id,artifact:a,absolutePath:r,...o?{}:{pointer:"/jobs"},trust:"authoritative",derivation:"authored",detail:"CI/CD workflow"}),l=e.state.addEntity({kind:"pipeline",key:`pipeline:${a}`,label:n,attributes:{jobs:s,triggers:i,artifact:a},proofIds:[d]});e.state.addRelation({from:y("workspace",`workspace:${e.state.workspaceName}`),to:l,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[d]});}}},ge={id:"codeowners",version:"1.0.0",async run(e){let t=[h.join(e.workspacePath,"CODEOWNERS"),h.join(e.workspacePath,".github","CODEOWNERS"),h.join(e.workspacePath,"docs","CODEOWNERS")];for(let r of t){if(!await P.pathExists(r))continue;let o=(await P.readFile(r,"utf8")).split(/\r?\n/);for(let n=0;n<o.length;n+=1){let s=o[n].trim();if(!s||s.startsWith("#"))continue;let[i,...d]=s.split(/\s+/);for(let l of d.filter(c=>c.startsWith("@"))){let c=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(r),absolutePath:r,line:n+1,trust:"authoritative",derivation:"authored",detail:`${i} ${l}`}),f=e.state.addEntity({kind:"owner",key:`owner:${l.toLowerCase()}`,label:l,aliases:[l],proofIds:[c]}),m=e.projects.filter(g=>{let v=i.replace(/^\//,"").replace(/\*.*$/,"");return v&&g.path.startsWith(v.replace(/\/$/,""))}),u=m.length>0?m.map(g=>y("project",`project:${g.id}`)):[y("workspace",`workspace:${e.state.workspaceName}`)];for(let g of u)e.state.addRelation({from:f,to:g,kind:"owns",trust:"authoritative",derivation:"authored",proofIds:[c]});}}}}},he={id:"architecture-decisions",version:"1.0.0",async run(e){let t=new Set,r=[{root:e.workspacePath,files:e.workspaceFiles},...e.projects.map(a=>({root:a.root,files:e.filesByProject.get(a.id)??[]}))];for(let a of r){let o=a.files.filter(n=>{let s=R(h.relative(a.root,n));return /(?:^|\/)(?:adr|adrs|decisions)(?:\/).+\.md$/i.test(s)||/(?:^|\/)ADR[-_0-9].+\.md$/i.test(s)});for(let n of o){if(t.has(n))continue;t.add(n);let s=A(e.projects,n),i=await P.readFile(n,"utf8"),d=i.match(/^#\s+(.+)$/m)?.[1]?.trim()??h.basename(n,".md"),l=i.match(/^status\s*:\s*(.+)$/im)?.[1]?.trim(),c=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(n,s),absolutePath:n,line:1,trust:"authoritative",derivation:"authored",detail:`Architecture decision: ${d}`}),f=e.state.addEntity({kind:"decision",key:`decision:${e.state.artifactPath(n,s)}`,label:d,...s?{projectId:s.id}:{},attributes:{status:l,artifact:e.state.artifactPath(n,s)},proofIds:[c]}),m=s?y("project",`project:${s.id}`):y("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:m,to:f,kind:"decided-by",trust:"authoritative",derivation:"authored",proofIds:[c]});}}}},ke=[ae,ie,ne,de,ce,le,pe,ue,me,ge,fe,he];async function ye(e,t){for(let r of t.edges){let a$1=[];for(let o of r.evidence){let n=W(o.file);a$1.push(await e.addProof({provider:"project-topology",artifact:n,absolutePath:h.resolve(e.workspacePath,n),derivation:r.source==="inferred"?"inferred":"authored",trust:r.source==="inferred"?"observed":"authoritative",confidence:r.confidence,detail:o.detail??`${r.kind} relationship`}));}a$1.length===0&&a$1.push(await e.addProof({provider:"project-topology",artifact:a.model,derivation:"inferred",trust:"ambiguous",confidence:r.confidence,detail:`${r.kind} relationship without source locator`})),e.addRelation({from:y("project",`project:${r.from}`),to:y("project",`project:${r.to}`),kind:r.kind==="event-pub-sub"?"consumes":"depends-on",derivation:r.source==="inferred"?"inferred":"authored",trust:r.source==="inferred"?"observed":"authoritative",confidence:r.confidence,proofIds:a$1});}}function ve(e){let t=[...e.entities.values()].filter(a=>a.kind==="endpoint"),r=new Map;for(let a of t){let o=String(a.attributes.method??"").toUpperCase(),n=String(a.attributes.path??"");if(!a.projectId||!o||!n)continue;let s=`${a.projectId}\0${o}\0${n}`,i=r.get(s)??[];i.push(a),r.set(s,i);}for(let a of r.values()){if(a.length<2)continue;let o=a.find(n=>n.proofIds.some(s=>e.proofs.get(s)?.trust==="authoritative"));if(o)for(let n of a.filter(s=>s.id!==o.id))e.addRelation({from:n.id,to:o.id,kind:"implements",derivation:"extracted",trust:"corroborated",confidence:"high",proofIds:[...n.proofIds,...o.proofIds]});}}async function Ce(e){let t=h.resolve(e.workspacePath),r=e.now??new Date,a=e.projects.map(p=>({...p,root:p.absolutePath?h.resolve(p.absolutePath):h.resolve(t,p.path),artifactPrefix:p.absolutePath?`external/${p.id}`:R(p.path)})).sort((p,k)=>p.id.localeCompare(k.id)),o=new D(t,r,e.workspace.name),n=Math.max(100,Math.min(e.maxFilesPerProject??2e3,1e4)),s=new Map(await Promise.all(a.map(async p=>[p.id,await F(p.root,n)]))),i=await F(t,Math.min(n*Math.max(a.length,1),2e4)),d={workspacePath:t,projects:a,filesByProject:s,workspaceFiles:i,now:r,maxFilesPerProject:n,contract:e.contract??null,state:o};for(let p of ke){let k={entities:o.entities.size,relations:o.relations.size,proofs:o.proofs.size,diagnostics:o.diagnostics.length},E="passed",$=[];try{await p.run(d),o.diagnostics.length>k.diagnostics&&(E="partial");}catch(I){E="failed";let C=I instanceof Error?I.message:String(I);$.push(C),o.diagnostics.push({code:`graph.provider.${p.id}.failed`,severity:"warning",message:`${p.id} provider failed: ${C}`,recommendation:"Repair the referenced source artifact and rerun workspace graph emit."});}o.providers.push({id:p.id,version:p.version,status:E,permission:"filesystem-read",discoveredEntities:o.entities.size-k.entities,discoveredRelations:o.relations.size-k.relations,proofCount:o.proofs.size-k.proofs,diagnostics:$});}ve(o),await ye(o,e.projectTopology);let l=[...o.entities.values()].sort((p,k)=>p.id.localeCompare(k.id)),c$1=[...o.relations.values()].sort((p,k)=>p.id.localeCompare(k.id)),f=[...o.proofs.values()].sort((p,k)=>p.id.localeCompare(k.id)),m=l.filter(p=>p.proofIds.length>0).length,u=c$1.filter(p=>p.proofIds.length>0).length,g=o.providers.filter(p=>["passed","partial"].includes(p.status)).length,v=e.projectTopology.diagnostics?.filter(p=>p.code==="graph.edges.missing").flatMap(p=>p.nodeIds??[])??[];return v.length>0&&o.diagnostics.push({code:"graph.knowledge.project_relationships_unknown",severity:"warning",message:`${v.length} project(s) have no proven inter-project relationship. This is unknown topology, not proof of independence.`,entityIds:v.map(p=>y("project",`project:${p}`)),recommendation:"Author service contracts or add OpenAPI, Compose, Kubernetes, package or import evidence."}),{schemaVersion:G,generatedAt:r.toISOString(),source:e.source??{kind:"workspace-sources",artifact:".",hashAlgorithm:"sha256",hash:c({workspace:e.workspace,projects:e.projects,projectTopology:e.projectTopology,contract:e.contract??null})},workspace:e.workspace,projectTopology:e.projectTopology,entities:l,relations:c$1,proofs:f,providers:[...o.providers].sort((p,k)=>p.id.localeCompare(k.id)),quality:{entityCount:l.length,relationCount:c$1.length,proofCount:f.length,entityProofCoverageRatio:l.length===0?1:m/l.length,relationProofCoverageRatio:c$1.length===0?1:u/c$1.length,providerSuccessRatio:o.providers.length===0?1:g/o.providers.length,conflictCount:o.diagnostics.filter(p=>p.code.includes("conflict")).length,unknownCount:o.diagnostics.filter(p=>p.code.includes("unknown")).length,portable:true,secretValuesEmitted:false},diagnostics:[...o.diagnostics].sort((p,k)=>p.code.localeCompare(k.code)||p.message.localeCompare(k.message))}}function _e(e,t){return y(e,t)}
2
2
  export{G as a,Ae as b,Se as c,Ce as d,_e as e};
@@ -1 +1 @@
1
- import {a as a$2,b as b$3}from'./chunk-PYCJWW4B.js';import {b as b$2,c,d as d$1}from'./chunk-ITCAMC2E.js';import {c as c$1}from'./chunk-DV6GJD4K.js';import {o,a as a$1,n,g,d as d$3,f}from'./chunk-NOFM7MNA.js';import {k}from'./chunk-ZDN7RHXJ.js';import {b as b$4}from'./chunk-COARSXRC.js';import {d}from'./chunk-OA537ZQ5.js';import {a as a$3}from'./chunk-22NJ2ZMG.js';import {d as d$2,e}from'./chunk-2TEDAKP6.js';import {a as a$4}from'./chunk-KB44JP4M.js';import {b as b$1,a,c as c$2}from'./chunk-LNRAB7UY.js';import m from'path';import v from'fs-extra';var oe="rapidkit-blocker-resolution-v1";function ae(e){let t=e.blockers.map(s=>s.trim()).filter(Boolean).slice(0,12),r=e.stderrTail?.trim().slice(-400)??"";return b$4({blockers:t,exitCode:e.exitCode??null,stderrTail:r})}function ge(e){let t=e.trim().toLowerCase();return t?t.includes("missing evidence")||t.includes(": missing")||t.includes("artifact missing")||t.includes("not found on disk")?"artifact-missing":t.includes("policy.")||t.includes("contract")?"config-fixable":t.includes("impact")||t.includes("untracked")||t.includes("grounding")?"semantic-attention":t.includes("failed")||t.includes("blocked")||t.includes(": fail")?"command-failed-repeat":"config-fixable":"unresolvable-without-human"}function ke(e){let t=ge(e.reason),r=ae({blockers:[e.reason]}),s=t==="artifact-missing"?[{actionKind:"run-once",detail:e.sourceCommand?`Run the source command once: ${e.sourceCommand}`:"Run the mapped workspace intelligence command once to generate the missing artifact.",studioActionId:"run-analyze"}]:t==="semantic-attention"?[{actionKind:"commit-files",detail:"Review workspace-level grounding files (AGENTS.md, agent-sync outputs) and commit or refresh the impact baseline."},{actionKind:"refresh-baseline",detail:"Refresh snapshot + diff + impact before re-running verify."}]:[{actionKind:"edit-file",detail:"Apply the smallest safe file or policy fix for this blocker before re-running verification.",studioActionId:"fix-lens"}];return {schemaVersion:oe,blockerId:e.blockerId,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,resolutionClass:t,blockerSignature:r,commandRetryHint:t==="artifact-missing"?"Run the source command once, then verify.":"Do not re-run the same failing command; fix the source issue first, then verify.",fixHints:s,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}}function ce(e){return Array.from(new Set(e.blockingReasons.map(r=>r.trim()).filter(Boolean))).slice(0,12).map((r,s)=>ke({reason:r,blockerId:`blocker-${s+1}`,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}))}function ye(e){let t=e.toLowerCase();return t.includes("stale")||t.includes("missing evidence")||t.includes("no projects")||t.includes("projects.empty")||t.includes("projects discovered")||t.includes("projects.missing")||t.includes("not yet run")||t.includes("doctor-last-run")||t.includes("doctor-project-last-run")||t.includes("doctor-remediation-plan-last-run")||t.includes("doctor-fix-result-last-run")||t.includes("pipeline-last-run")||t.includes("release-readiness")||t.includes("analyze-last-run")||t.includes("analyze reported")||t.includes("analyze verdict")||t.includes("analyze needs attention")||t.includes("toolchain.lock")||t.includes("not pinned")||t.includes("readiness:")||t.includes("env:")||t.includes("workspace-run-last")||t.includes("pre-project")||t.includes("before adding projects")||t.includes("workspace.projects.missing")||t.includes("no backend projects")||t.includes("index.json")||t.includes("workspace-intelligence-history")||t.includes("validation warning")||t.includes("workspace model validation")||t.includes("workspace.marker")||t.includes("no project roots")||t.includes("no infrastructure services")||t.includes("infra/overrides")||t.includes("infra dependencies")||t.includes("contract verify")||t.includes("contract inspect")||t.includes("publish verify evidence")}function he(e){return e.length===0||e.every(t=>ye(t))}function de(e){return e.projectCount>0||e.policyErrorCount>0?{verdict:e.verdict,exitCode:e.exitCode}:e.verdict==="blocked"&&he(e.blockingReasons)?{verdict:"needs-attention",exitCode:1}:{verdict:e.verdict,exitCode:e.exitCode}}function Ue(e,t){let r=t&&t!=="ready"?` (${t.replace(/-/g," ")})`:"";return e===0?`Workspace scaffold ready${r} \u2014 add your first project to continue.`:`Workspace scaffold${r}: ${e} pre-project signal(s) \u2014 add your first project to continue.`}var ue=b$1.verify,z=a.verify;function ve(e,t){return m.isAbsolute(t)?t:m.join(e,t)}async function le(e){let t=await v.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace impact input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==f)throw new Error(`Unsupported workspace impact schema: ${String(r.schemaVersion)}`);a$4(t,"contracts/workspace-intelligence/workspace-impact.v1.json",`Workspace impact ${e}`);let s=r;a$4(s.diff,"contracts/workspace-intelligence/workspace-model-diff.v1.json",`Embedded workspace diff in ${e}`);let i=[];s.summary.affectedProjects!==s.affectedProjects.length&&i.push("summary.affectedProjects does not match affectedProjects.length"),s.summary.workspaceItems!==s.workspaceImpact.length&&i.push("summary.workspaceItems does not match workspaceImpact.length"),s.summary.recommendedCommands!==s.verificationPlan.length&&i.push("summary.recommendedCommands does not match verificationPlan.length"),s.summary.blastRadius.directlyAffected!==s.affectedProjects.length&&i.push("blastRadius.directlyAffected does not match affectedProjects.length"),s.summary.blastRadius.transitivelyAffected!==s.transitiveImpact.length&&i.push("blastRadius.transitivelyAffected does not match transitiveImpact.length");let o=s.transitiveImpact.reduce((u,d)=>Math.max(u,d.distance??0),0);s.summary.blastRadius.maxDistance!==o&&i.push("blastRadius.maxDistance does not match transitive impact distances");let k=s.diff.currentModel.graph?.edges.length??0;if(s.summary.blastRadius.graphEdges!==k&&i.push("blastRadius.graphEdges does not match the embedded model graph"),s.summary.changed!==s.diff.summary.changed&&i.push("summary.changed does not match embedded diff summary"),s.fromRef!==s.diff.fromRef&&i.push("fromRef does not match embedded diff fromRef"),s.workspace.name!==s.diff.currentModel.workspace.name&&i.push("workspace.name does not match the embedded model"),s.diff.toHash!==d(s.diff.currentModel)&&i.push("embedded diff current-model hash does not match toHash"),i.length>0)throw new Error(`Workspace impact semantic integrity failed: ${i.join("; ")} (${e})`);return s}function be(e){let t=new Set,r=[];for(let s of e){let i=`${s.scope}:${s.project??""}:${s.display}`;t.has(i)||(t.add(i),r.push(s));}return r}function we(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return t.scope==="workspace"?true:(t.project??"").trim().toLowerCase()===r}function Re(e,t){if(e.id==="workspace.doctor")return m.join(t,a.doctor);if(e.id==="workspace.contract.verify")return m.join(t,a.contractVerify);if(e.id==="workspace.readiness")return m.join(t,a.readiness);if(e.id==="workspace.analyze")return m.join(t,".workspai","reports","analyze-last-run.json");if(e.id==="workspace.pipeline")return m.join(t,".workspai","reports","pipeline-last-run.json");if(e.id==="workspace.doctor-fix")return m.join(t,".workspai","reports","doctor-fix-result-last-run.json");if(e.id.startsWith("project.")&&e.id.includes("."))return m.join(t,".workspai","reports","workspace-run-last.json")}function b(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function Ce(e){let t=b(e.healthScore),r=b(e.summary),s=typeof t?.errors=="number"?t.errors:0,i=typeof t?.percent=="number"?t.percent:void 0;return s>0||r?.hasSystemErrors===true?{status:"fail",message:`Doctor evidence reports ${s} error(s).`}:typeof i=="number"&&i<70?{status:"warn",message:`Doctor health score is ${i}%.`}:{status:"pass",message:"Doctor evidence is present and healthy."}}function Ae(e){let t=typeof e.overallStatus=="string"?e.overallStatus:"unknown";return t==="fail"?{status:"fail",message:"Release readiness evidence reports blocking failures."}:t==="warn"?{status:"warn",message:"Release readiness evidence reports warnings."}:t==="pass"?{status:"pass",message:"Release readiness evidence passed."}:{status:"warn",message:`Release readiness evidence status is ${t}.`}}function Ee(e){let t=typeof e.status=="string"?e.status:"unknown";return t==="failed"||t==="fail"?{status:"fail",message:"Workspace contract verify evidence failed."}:t==="passed"||t==="pass"?{status:"pass",message:"Workspace contract verify evidence passed."}:{status:"warn",message:`Workspace contract verify evidence status is ${t}.`}}function Se(e){let t=b(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Analyze evidence reports blocking findings."}:r==="needs-attention"?{status:"warn",message:"Analyze evidence reports warnings."}:{status:"pass",message:"Analyze evidence is ready."}}function We(e){let t=e.schemaVersion==="rapidkit-doctor-fix-result-v1"?e:e.fixResult;if(!t||typeof t!="object"||Array.isArray(t))return {status:"skipped",message:"Doctor fix result not present; run doctor workspace --fix --json to record fixes."};let r=t,s=Array.isArray(r.remainingBlockers)?r.remainingBlockers:[];if(s.length>0)return {status:"fail",message:`Doctor fix result reports ${s.length} remaining blocker(s).`};let i=Array.isArray(r.appliedFixes)?r.appliedFixes:[];return i.length===0?{status:"pass",message:"Doctor fix result recorded with no remaining blockers."}:{status:"pass",message:`Doctor fix result recorded ${i.length} applied fix(es) with no remaining blockers.`}}async function je(e,t){let r=await d$2(e,".workspai/reports/doctor-remediation-plan-last-run.json");if(!r)return false;try{let s=b(await v.readJson(r));if(!s||(Array.isArray(s.steps)?s.steps:[]).length>0)return false;let o=typeof s.generatedAt=="string"?s.generatedAt:void 0;if(!o||!t)return true;let k=Date.parse(o),u=Date.parse(t);return !Number.isFinite(k)||!Number.isFinite(u)?true:k>=u}catch{return false}}function xe(e){return e.id.endsWith(".init")?"init":e.id.endsWith(".test")?"test":e.id.endsWith(".build")?"build":e.id.endsWith(".start")?"start":null}function Pe(e){let t=b(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Pipeline evidence is blocked."}:r==="needs-attention"?{status:"warn",message:"Pipeline evidence needs attention."}:r==="ready"?{status:"pass",message:"Pipeline evidence is ready."}:{status:"warn",message:"Pipeline evidence status is unknown."}}function Ie(e,t,r){let s=xe(t),i=c$1(e,s??void 0);if(!i)return {status:"missing",message:"Workspace run evidence is missing or unreadable."};let o=i.stage;if(s&&o!==s)return {status:"missing",message:`Workspace run evidence is for stage "${o}", expected "${s}".`};let k=Array.isArray(i.projects)?i.projects:[],u=t.project?.toLowerCase();if(!u)return {status:"missing",message:"Project-scoped workspace run evidence is missing a project identifier."};let d=k.find(g=>{let c=b(g);if(!c)return false;let n=typeof c.projectName=="string"?c.projectName.toLowerCase():"",a=["projectPath","relativePath","path"].map(f=>c[f]).filter(f=>typeof f=="string"&&f.trim().length>0).map(f=>f.replace(/\\/g,"/").toLowerCase());return n===u||a.some(f=>f.endsWith(`/${u}`)||f===u)});if(d){let g=C(i.generatedAt,r,`Workspace run evidence for ${t.project??t.id}`);if(g)return {status:"fail",message:g};let c=b(d),n=typeof c?.status=="string"?c.status:"unknown";return n==="failed"?{status:"fail",message:`Workspace run evidence failed for ${t.project}.`}:n==="passed"?{status:"pass",message:`Workspace run evidence passed for ${t.project}.`}:n==="skipped"?{status:"warn",message:`Workspace run evidence skipped for ${t.project}.`}:{status:"warn",message:`Workspace run evidence status is ${n} for ${t.project}.`}}return {status:"missing",message:`Workspace run evidence does not include project ${t.project}.`}}function C(e,t,r){if(!t)return null;if(typeof e!="string"||e.trim().length===0)return `${r} is stale: missing generatedAt timestamp (required after impact ${t}).`;let s=Date.parse(e),i=Date.parse(t);return Number.isFinite(s)?Number.isFinite(i)&&s<i?`${r} is stale: generated at ${e}, before impact ${t}.`:null:`${r} is stale: invalid generatedAt timestamp (required after impact ${t}).`}function Ve(e){if(e.id==="workspace.doctor")return c$2.doctor;if(e.id==="workspace.readiness")return c$2.readiness;if(e.id==="workspace.contract.verify")return c$2.contractVerify;if(e.id==="workspace.analyze")return c$2.analyze;if(e.id==="workspace.pipeline")return "contracts/pipeline-last-run.v1.json"}async function $e(e,t,r,s){let i=Re(e,t),o=i?m.relative(t,i).split(m.sep).join("/"):void 0;if(e.id==="workspace.contract.verify"&&!r)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"skipped",required:e.required,message:"Workspace contract is not present; contract verify skipped."};let k=i?await d$2(t,o??""):null;if(!i||!k)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"missing",required:e.required,evidencePath:o,message:o?`Missing evidence report: ${o}`:"No evidence mapping exists for this command."};let u;try{u=await v.readJson(k);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is unreadable JSON: ${n instanceof Error?n.message:String(n)}`}}let d=b(u);if(!d)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:"Evidence report is not a JSON object."};let g=Ve(e);if(g)try{a$4(d,g,`${e.label} evidence`);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is invalid: ${n instanceof Error?n.message:String(n)}`}}let c;if(e.id==="workspace.doctor"){let n=C(d.generatedAt,s,"Doctor evidence");n?c={status:"fail",message:n}:c=Ce(d);}else if(e.id==="workspace.readiness"){let n=C(d.generatedAt,s,"Release readiness evidence");n?c={status:"fail",message:n}:c=Ae(d);}else if(e.id==="workspace.contract.verify"){let n=C(d.generatedAt,s,"Workspace contract verify evidence");n?c={status:"fail",message:n}:c=Ee(d);}else if(e.id==="workspace.analyze"){let n=C(d.generatedAt,s,"Analyze evidence");n?c={status:"fail",message:n}:c=Se(d);}else if(e.id==="workspace.pipeline"){let n=C(d.generatedAt,s,"Pipeline evidence");n?c={status:"fail",message:n}:c=Pe(d);}else if(e.id==="workspace.doctor-fix"){let n=d.schemaVersion==="rapidkit-doctor-fix-result-v1"?d:d.fixResult,a=b(n),f=typeof a?.generatedAt=="string"?a.generatedAt:void 0,y=C(f,s,"Doctor fix result");y?c={status:"fail",message:y}:await je(t,f)?c={status:"skipped",message:"No current doctor remediation steps are pending."}:c=We(d);}else if(e.id.startsWith("project."))c=Ie(d,e,s);else {let n=C(d.generatedAt,s,"Evidence report");n?c={status:"fail",message:n}:c={status:"pass",message:"Evidence report is present."};}return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:c.status,required:e.required,evidencePath:o,message:c.message}}function Fe(e,t={blockingReasons:[],needsAttention:false}){let r=e.filter(n=>n.status==="pass").length,s=e.filter(n=>n.status==="warn").length,i=e.filter(n=>n.status==="fail").length,o=e.filter(n=>n.status==="missing").length,k=e.filter(n=>n.status==="skipped").length,u=e.filter(n=>n.required&&(n.status==="fail"||n.status==="missing")).map(n=>`${n.id}: ${n.message}`),d=e.filter(n=>n.required&&n.status==="missing").length,g="ready",c=0;return u.length>0||t.blockingReasons.length>0?(g="blocked",c=2):(s>0||e.some(n=>!n.required&&n.status==="fail")||d>0||t.needsAttention)&&(g="needs-attention",c=1),{verdict:g,exitCode:c,stepsPassed:r,stepsWarn:s,stepsFailed:i,stepsMissing:o,stepsSkipped:k}}function Oe(e,t){let r=W(e.affectedProjects.map(a=>a.project?.name).filter(a=>typeof a=="string")),s=new Set(r.map(a=>a.toLowerCase())),i=W(e.transitiveImpact.map(a=>a.project?.name).filter(a=>typeof a=="string").filter(a=>!s.has(a.toLowerCase()))),o=new Map;for(let a of t){if(a.scope!=="project"||!a.project)continue;let f=a.project.toLowerCase(),y=o.get(f)??[];y.push(a),o.set(f,y);}let k=[],u=[],d=[],g=[],c=false,n=(a,f)=>{let y=o.get(a.toLowerCase())??[];if(y.length===0){d.push(a);return}let j=y.filter(p=>p.status==="fail"),w=j.filter(p=>p.required),x=y.filter(p=>p.status==="missing"),A=x.filter(p=>p.required),P=y.some(p=>p.status==="pass"||p.status==="warn");if(w.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has failed verification evidence (${w.map(p=>p.id).join(", ")}).`);return}if(j.length>0){u.push(a),c=true;return}if(A.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has missing required verification evidence (${A.map(p=>p.id).join(", ")}).`);return}if(x.length>0){u.push(a),c=true;return}if(P){k.push(a);return}d.push(a);};for(let a of r)n(a,"directly-changed");for(let a of i)n(a,"transitive dependent");return {subgraph:{totalProjects:r.length+i.length,directlyChanged:r,transitiveDependents:i,covered:W(k),uncovered:W(u),unverifiable:W(d)},blockingReasons:g,needsAttention:c}}function W(e){return [...new Set(e)].sort((t,r)=>t.localeCompare(r))}async function Be(e){let t=m.resolve(e.workspacePath);if(e.fromImpactPath){let o=ve(t,e.fromImpactPath);return {impact:await le(o),fromImpactRef:m.relative(t,o).split(m.sep).join("/"),impactFromDisk:true}}let r=m.join(t,g);if(await v.pathExists(r))return {impact:await le(r),fromImpactRef:g,impactFromDisk:true};let s=m.join(t,d$3);if(await v.pathExists(s))return {impact:await o({workspacePath:t,fromPath:d$3,scope:e.scope,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),fromImpactRef:d$3,impactFromDisk:false};let i=await k({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {impact:{schemaVersion:f,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",diffRef:a.diff,workspace:{name:i.workspace.name,profile:i.workspace.profile,type:i.workspace.type},summary:{changed:false,risk:"none",affectedProjects:0,workspaceItems:0,recommendedCommands:0,blastRadius:{directlyAffected:0,transitivelyAffected:0,maxDistance:0,graphEdges:i.graph?.edges.length??0}},affectedProjects:[],transitiveImpact:[],criticalPathHotspots:[],workspaceImpact:[],verificationPlan:[],agentBrief:{headline:"Baseline workspace verify run.",bullets:["No impact report or snapshot was available; baseline gates were evaluated."],unsafeAssumptions:["Do not claim runtime verification passed unless evidence exists."]},diff:{schemaVersion:b$1.diff,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",toRef:a.model,fromHash:"baseline",toHash:"baseline",summary:{changed:false,addedProjects:0,removedProjects:0,changedProjects:0,workspaceChanges:0,validationChanges:0,gitChangedFiles:0},git:{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:[],currentModel:i}},impactFromDisk:false}}function _e(e,t){if(t)return e.generatedAt}async function ft(e){let t=m.resolve(e.workspacePath),{impact:r,fromImpactRef:s,impactFromDisk:i}=await Be(e),o$1=r.diff.currentModel,k$1=i?await k({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}):o$1,u=[];if(i){let l=await o({workspacePath:t,fromPath:r.diff.fromRef,diff:r.diff,scope:e.scope,now:e.now}),B=[r.affectedProjects,r.transitiveImpact,r.verificationPlan],_=[l.affectedProjects,l.transitiveImpact,l.verificationPlan];JSON.stringify(B)!==JSON.stringify(_)&&u.push("workspace.impact: Persisted impact semantics do not match the impact re-derived from the embedded diff. Regenerate diff and impact.");}i&&d(k$1)!==r.diff.toHash&&u.push("workspace.impact: Impact evidence is stale because the current workspace model no longer matches the embedded model. Regenerate diff and impact.");let d$2=r.diff.git;if(i&&d$2?.available){let l=a$1(t,{ref:d$2.ref}),B=r.diff.changes.filter(h=>h.type.startsWith("git.")).map(h=>`${h.type}:${h.target.replace(/^git:/,"")}`).sort(),_=[...l.changedFiles.map(h=>`git.file.changed:${h}`),...l.untrackedFiles.map(h=>`git.untracked:${h}`),...l.deletedFiles.map(h=>`git.deleted:${h}`)].sort();(!l.available||l.commit!==d$2.commit||JSON.stringify(_)!==JSON.stringify(B))&&u.push("workspace.impact: Impact evidence is stale because Git changes no longer match the diff observation. Regenerate diff and impact.");}let g=_e(r,i),c$1=be([...n(),...r.verificationPlan]).filter(l=>we(e.scope,l)),n$1=[];for(let l of c$1)n$1.push(await $e(l,t,o$1.contracts.exists===true,g));let a=Oe(r,n$1),f=a$2(o$1.graph??{nodes:[],edges:[]}),y=b$2(o$1),j=await Ne(t),w=c(y,j?.freshness?.projectHashes),x={verdict:w.verdict,baseline:w.baseline,changed:w.changed,added:w.added,removed:w.removed,projectHashes:d$1(y)},A=b$3(f),P=o$1.policies?.mode??"warn",p=await De(o$1,t),O=He(P,p),E=Fe(n$1,{blockingReasons:[...a.blockingReasons,...A,...O.blockingReasons,...u],needsAttention:a.needsAttention||O.needsAttention}),fe=n$1.filter(l=>l.status==="missing"&&l.evidencePath).map(l=>l.evidencePath),I=[...n$1.filter(l=>l.required&&(l.status==="fail"||l.status==="missing")).map(l=>`${l.id}: ${l.message}`),...a.blockingReasons,...A,...O.blockingReasons,...u],pe=p.filter(l=>l.severity==="error").length,me=o$1.summary?.projectCount??o$1.projects.length,J=de({projectCount:me,verdict:E.verdict,exitCode:E.exitCode,blockingReasons:I,policyErrorCount:pe});E.verdict=J.verdict,E.exitCode=J.exitCode;let G=I.length>0?ce({blockingReasons:I,verifyCommand:"npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json",verifyArtifact:z}):[];return {schemaVersion:ue,generatedAt:(e.now??new Date).toISOString(),workspacePath:t,mode:"evidence",fromImpactRef:s,scope:e.scope,impact:{changed:r.summary.changed,risk:r.summary.risk,affectedProjects:r.summary.affectedProjects,recommendedCommands:r.summary.recommendedCommands},summary:E,steps:n$1,missingEvidence:fe,blockingReasons:I,...G.length>0?{resolutionHints:G}:{},verificationPlan:c$1,affectedSubgraph:a.subgraph,graphIntegrity:f,freshness:x,policyMode:P,policyViolations:p}}async function De(e,t){let r=[];for(let i of e.validation?.issues??[])r.push({source:"model",severity:i.severity,code:i.code,message:i.message,target:i.target});let s=await d$2(t,a.contractVerify);try{if(s&&await v.pathExists(s)){let i=await v.readJson(s);if(Array.isArray(i.violations))for(let o of i.violations)typeof o=="string"&&o.trim().length>0&&r.push({source:"contract",severity:"error",code:"contract.violation",message:o});}}catch{}return r.sort((i,o)=>i.source!==o.source?i.source.localeCompare(o.source):i.code!==o.code?i.code.localeCompare(o.code):i.message.localeCompare(o.message))}function He(e,t){let r=t.filter(s=>s.severity==="error");return e==="enforce"&&r.length>0?{blockingReasons:r.map(s=>`policy.${s.code}: ${s.message}`),needsAttention:false}:{blockingReasons:[],needsAttention:r.length>0}}async function Ne(e){let t=m.join(e,z);try{if(!await v.pathExists(t))return null;let r=await v.readJson(t);return r&&r.schemaVersion===ue?r:null}catch{return null}}async function pt(e$1,t){return e(t,z,a$3(e$1))}function Me(e,t){let r=t?.strict?"strict":"default",s=[];if(e.summary.verdict==="blocked")return s.push(...e.blockingReasons),s.length===0&&s.push("verify verdict is blocked."),{passed:false,mode:r,exitCode:2,reasons:s};if(r==="strict"){if(e.summary.verdict!=="ready"&&s.push(`verify verdict is ${e.summary.verdict} (strict requires ready).`),e.freshness.verdict==="stale"){let i=[...e.freshness.changed,...e.freshness.added].slice(0,5);s.push(`freshness is stale${i.length>0?`: ${i.join(", ")}`:""} (strict requires fresh).`);}if(s.length>0)return {passed:false,mode:r,exitCode:1,reasons:s}}return {passed:true,mode:r,exitCode:0,reasons:s}}function mt(e,t){return Me(e,t).exitCode}export{oe as a,Ue as b,ue as c,z as d,Oe as e,ft as f,pt as g,Me as h,mt as i};
1
+ import {a as a$2,b as b$3}from'./chunk-PYCJWW4B.js';import {b as b$2,c,d as d$1}from'./chunk-PRTR2DQ2.js';import {c as c$1}from'./chunk-HDXNIN4N.js';import {o,a as a$1,n,g,d as d$3,f}from'./chunk-AFL3ACCR.js';import {k}from'./chunk-37CVKXBD.js';import {b as b$4}from'./chunk-J5ENLXDF.js';import {d}from'./chunk-OA537ZQ5.js';import {a as a$3}from'./chunk-T4YR4RAI.js';import {d as d$2,e}from'./chunk-32OJDBIG.js';import {a as a$4}from'./chunk-KB44JP4M.js';import {b as b$1,a,c as c$2}from'./chunk-BMWFQXGW.js';import m from'path';import v from'fs-extra';var oe="rapidkit-blocker-resolution-v1";function ae(e){let t=e.blockers.map(s=>s.trim()).filter(Boolean).slice(0,12),r=e.stderrTail?.trim().slice(-400)??"";return b$4({blockers:t,exitCode:e.exitCode??null,stderrTail:r})}function ge(e){let t=e.trim().toLowerCase();return t?t.includes("missing evidence")||t.includes(": missing")||t.includes("artifact missing")||t.includes("not found on disk")?"artifact-missing":t.includes("policy.")||t.includes("contract")?"config-fixable":t.includes("impact")||t.includes("untracked")||t.includes("grounding")?"semantic-attention":t.includes("failed")||t.includes("blocked")||t.includes(": fail")?"command-failed-repeat":"config-fixable":"unresolvable-without-human"}function ke(e){let t=ge(e.reason),r=ae({blockers:[e.reason]}),s=t==="artifact-missing"?[{actionKind:"run-once",detail:e.sourceCommand?`Run the source command once: ${e.sourceCommand}`:"Run the mapped workspace intelligence command once to generate the missing artifact.",studioActionId:"run-analyze"}]:t==="semantic-attention"?[{actionKind:"commit-files",detail:"Review workspace-level grounding files (AGENTS.md, agent-sync outputs) and commit or refresh the impact baseline."},{actionKind:"refresh-baseline",detail:"Refresh snapshot + diff + impact before re-running verify."}]:[{actionKind:"edit-file",detail:"Apply the smallest safe file or policy fix for this blocker before re-running verification.",studioActionId:"fix-lens"}];return {schemaVersion:oe,blockerId:e.blockerId,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,resolutionClass:t,blockerSignature:r,commandRetryHint:t==="artifact-missing"?"Run the source command once, then verify.":"Do not re-run the same failing command; fix the source issue first, then verify.",fixHints:s,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}}function ce(e){return Array.from(new Set(e.blockingReasons.map(r=>r.trim()).filter(Boolean))).slice(0,12).map((r,s)=>ke({reason:r,blockerId:`blocker-${s+1}`,sourceCommand:e.sourceCommand,sourceArtifact:e.sourceArtifact,verifyCommand:e.verifyCommand,verifyArtifact:e.verifyArtifact}))}function ye(e){let t=e.toLowerCase();return t.includes("stale")||t.includes("missing evidence")||t.includes("no projects")||t.includes("projects.empty")||t.includes("projects discovered")||t.includes("projects.missing")||t.includes("not yet run")||t.includes("doctor-last-run")||t.includes("doctor-project-last-run")||t.includes("doctor-remediation-plan-last-run")||t.includes("doctor-fix-result-last-run")||t.includes("pipeline-last-run")||t.includes("release-readiness")||t.includes("analyze-last-run")||t.includes("analyze reported")||t.includes("analyze verdict")||t.includes("analyze needs attention")||t.includes("toolchain.lock")||t.includes("not pinned")||t.includes("readiness:")||t.includes("env:")||t.includes("workspace-run-last")||t.includes("pre-project")||t.includes("before adding projects")||t.includes("workspace.projects.missing")||t.includes("no backend projects")||t.includes("index.json")||t.includes("workspace-intelligence-history")||t.includes("validation warning")||t.includes("workspace model validation")||t.includes("workspace.marker")||t.includes("no project roots")||t.includes("no infrastructure services")||t.includes("infra/overrides")||t.includes("infra dependencies")||t.includes("contract verify")||t.includes("contract inspect")||t.includes("publish verify evidence")}function he(e){return e.length===0||e.every(t=>ye(t))}function de(e){return e.projectCount>0||e.policyErrorCount>0?{verdict:e.verdict,exitCode:e.exitCode}:e.verdict==="blocked"&&he(e.blockingReasons)?{verdict:"needs-attention",exitCode:1}:{verdict:e.verdict,exitCode:e.exitCode}}function Ue(e,t){let r=t&&t!=="ready"?` (${t.replace(/-/g," ")})`:"";return e===0?`Workspace scaffold ready${r} \u2014 add your first project to continue.`:`Workspace scaffold${r}: ${e} pre-project signal(s) \u2014 add your first project to continue.`}var ue=b$1.verify,z=a.verify;function ve(e,t){return m.isAbsolute(t)?t:m.join(e,t)}async function le(e){let t=await v.readJson(e);if(!t||typeof t!="object"||Array.isArray(t))throw new Error(`Workspace impact input is not a JSON object: ${e}`);let r=t;if(r.schemaVersion!==f)throw new Error(`Unsupported workspace impact schema: ${String(r.schemaVersion)}`);a$4(t,"contracts/workspace-intelligence/workspace-impact.v1.json",`Workspace impact ${e}`);let s=r;a$4(s.diff,"contracts/workspace-intelligence/workspace-model-diff.v1.json",`Embedded workspace diff in ${e}`);let i=[];s.summary.affectedProjects!==s.affectedProjects.length&&i.push("summary.affectedProjects does not match affectedProjects.length"),s.summary.workspaceItems!==s.workspaceImpact.length&&i.push("summary.workspaceItems does not match workspaceImpact.length"),s.summary.recommendedCommands!==s.verificationPlan.length&&i.push("summary.recommendedCommands does not match verificationPlan.length"),s.summary.blastRadius.directlyAffected!==s.affectedProjects.length&&i.push("blastRadius.directlyAffected does not match affectedProjects.length"),s.summary.blastRadius.transitivelyAffected!==s.transitiveImpact.length&&i.push("blastRadius.transitivelyAffected does not match transitiveImpact.length");let o=s.transitiveImpact.reduce((u,d)=>Math.max(u,d.distance??0),0);s.summary.blastRadius.maxDistance!==o&&i.push("blastRadius.maxDistance does not match transitive impact distances");let k=s.diff.currentModel.graph?.edges.length??0;if(s.summary.blastRadius.graphEdges!==k&&i.push("blastRadius.graphEdges does not match the embedded model graph"),s.summary.changed!==s.diff.summary.changed&&i.push("summary.changed does not match embedded diff summary"),s.fromRef!==s.diff.fromRef&&i.push("fromRef does not match embedded diff fromRef"),s.workspace.name!==s.diff.currentModel.workspace.name&&i.push("workspace.name does not match the embedded model"),s.diff.toHash!==d(s.diff.currentModel)&&i.push("embedded diff current-model hash does not match toHash"),i.length>0)throw new Error(`Workspace impact semantic integrity failed: ${i.join("; ")} (${e})`);return s}function be(e){let t=new Set,r=[];for(let s of e){let i=`${s.scope}:${s.project??""}:${s.display}`;t.has(i)||(t.add(i),r.push(s));}return r}function we(e,t){if(!e||e==="workspace")return true;let r=(e.startsWith("project:")?e.slice(8):e).trim().toLowerCase();return t.scope==="workspace"?true:(t.project??"").trim().toLowerCase()===r}function Re(e,t){if(e.id==="workspace.doctor")return m.join(t,a.doctor);if(e.id==="workspace.contract.verify")return m.join(t,a.contractVerify);if(e.id==="workspace.readiness")return m.join(t,a.readiness);if(e.id==="workspace.analyze")return m.join(t,".workspai","reports","analyze-last-run.json");if(e.id==="workspace.pipeline")return m.join(t,".workspai","reports","pipeline-last-run.json");if(e.id==="workspace.doctor-fix")return m.join(t,".workspai","reports","doctor-fix-result-last-run.json");if(e.id.startsWith("project.")&&e.id.includes("."))return m.join(t,".workspai","reports","workspace-run-last.json")}function b(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function Ce(e){let t=b(e.healthScore),r=b(e.summary),s=typeof t?.errors=="number"?t.errors:0,i=typeof t?.percent=="number"?t.percent:void 0;return s>0||r?.hasSystemErrors===true?{status:"fail",message:`Doctor evidence reports ${s} error(s).`}:typeof i=="number"&&i<70?{status:"warn",message:`Doctor health score is ${i}%.`}:{status:"pass",message:"Doctor evidence is present and healthy."}}function Ae(e){let t=typeof e.overallStatus=="string"?e.overallStatus:"unknown";return t==="fail"?{status:"fail",message:"Release readiness evidence reports blocking failures."}:t==="warn"?{status:"warn",message:"Release readiness evidence reports warnings."}:t==="pass"?{status:"pass",message:"Release readiness evidence passed."}:{status:"warn",message:`Release readiness evidence status is ${t}.`}}function Ee(e){let t=typeof e.status=="string"?e.status:"unknown";return t==="failed"||t==="fail"?{status:"fail",message:"Workspace contract verify evidence failed."}:t==="passed"||t==="pass"?{status:"pass",message:"Workspace contract verify evidence passed."}:{status:"warn",message:`Workspace contract verify evidence status is ${t}.`}}function Se(e){let t=b(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Analyze evidence reports blocking findings."}:r==="needs-attention"?{status:"warn",message:"Analyze evidence reports warnings."}:{status:"pass",message:"Analyze evidence is ready."}}function We(e){let t=e.schemaVersion==="rapidkit-doctor-fix-result-v1"?e:e.fixResult;if(!t||typeof t!="object"||Array.isArray(t))return {status:"skipped",message:"Doctor fix result not present; run doctor workspace --fix --json to record fixes."};let r=t,s=Array.isArray(r.remainingBlockers)?r.remainingBlockers:[];if(s.length>0)return {status:"fail",message:`Doctor fix result reports ${s.length} remaining blocker(s).`};let i=Array.isArray(r.appliedFixes)?r.appliedFixes:[];return i.length===0?{status:"pass",message:"Doctor fix result recorded with no remaining blockers."}:{status:"pass",message:`Doctor fix result recorded ${i.length} applied fix(es) with no remaining blockers.`}}async function je(e,t){let r=await d$2(e,".workspai/reports/doctor-remediation-plan-last-run.json");if(!r)return false;try{let s=b(await v.readJson(r));if(!s||(Array.isArray(s.steps)?s.steps:[]).length>0)return false;let o=typeof s.generatedAt=="string"?s.generatedAt:void 0;if(!o||!t)return true;let k=Date.parse(o),u=Date.parse(t);return !Number.isFinite(k)||!Number.isFinite(u)?true:k>=u}catch{return false}}function xe(e){return e.id.endsWith(".init")?"init":e.id.endsWith(".test")?"test":e.id.endsWith(".build")?"build":e.id.endsWith(".start")?"start":null}function Pe(e){let t=b(e.summary),r=typeof t?.verdict=="string"?t.verdict:void 0;return r==="blocked"?{status:"fail",message:"Pipeline evidence is blocked."}:r==="needs-attention"?{status:"warn",message:"Pipeline evidence needs attention."}:r==="ready"?{status:"pass",message:"Pipeline evidence is ready."}:{status:"warn",message:"Pipeline evidence status is unknown."}}function Ie(e,t,r){let s=xe(t),i=c$1(e,s??void 0);if(!i)return {status:"missing",message:"Workspace run evidence is missing or unreadable."};let o=i.stage;if(s&&o!==s)return {status:"missing",message:`Workspace run evidence is for stage "${o}", expected "${s}".`};let k=Array.isArray(i.projects)?i.projects:[],u=t.project?.toLowerCase();if(!u)return {status:"missing",message:"Project-scoped workspace run evidence is missing a project identifier."};let d=k.find(g=>{let c=b(g);if(!c)return false;let n=typeof c.projectName=="string"?c.projectName.toLowerCase():"",a=["projectPath","relativePath","path"].map(f=>c[f]).filter(f=>typeof f=="string"&&f.trim().length>0).map(f=>f.replace(/\\/g,"/").toLowerCase());return n===u||a.some(f=>f.endsWith(`/${u}`)||f===u)});if(d){let g=C(i.generatedAt,r,`Workspace run evidence for ${t.project??t.id}`);if(g)return {status:"fail",message:g};let c=b(d),n=typeof c?.status=="string"?c.status:"unknown";return n==="failed"?{status:"fail",message:`Workspace run evidence failed for ${t.project}.`}:n==="passed"?{status:"pass",message:`Workspace run evidence passed for ${t.project}.`}:n==="skipped"?{status:"warn",message:`Workspace run evidence skipped for ${t.project}.`}:{status:"warn",message:`Workspace run evidence status is ${n} for ${t.project}.`}}return {status:"missing",message:`Workspace run evidence does not include project ${t.project}.`}}function C(e,t,r){if(!t)return null;if(typeof e!="string"||e.trim().length===0)return `${r} is stale: missing generatedAt timestamp (required after impact ${t}).`;let s=Date.parse(e),i=Date.parse(t);return Number.isFinite(s)?Number.isFinite(i)&&s<i?`${r} is stale: generated at ${e}, before impact ${t}.`:null:`${r} is stale: invalid generatedAt timestamp (required after impact ${t}).`}function Ve(e){if(e.id==="workspace.doctor")return c$2.doctor;if(e.id==="workspace.readiness")return c$2.readiness;if(e.id==="workspace.contract.verify")return c$2.contractVerify;if(e.id==="workspace.analyze")return c$2.analyze;if(e.id==="workspace.pipeline")return "contracts/pipeline-last-run.v1.json"}async function $e(e,t,r,s){let i=Re(e,t),o=i?m.relative(t,i).split(m.sep).join("/"):void 0;if(e.id==="workspace.contract.verify"&&!r)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"skipped",required:e.required,message:"Workspace contract is not present; contract verify skipped."};let k=i?await d$2(t,o??""):null;if(!i||!k)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"missing",required:e.required,evidencePath:o,message:o?`Missing evidence report: ${o}`:"No evidence mapping exists for this command."};let u;try{u=await v.readJson(k);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is unreadable JSON: ${n instanceof Error?n.message:String(n)}`}}let d=b(u);if(!d)return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:"Evidence report is not a JSON object."};let g=Ve(e);if(g)try{a$4(d,g,`${e.label} evidence`);}catch(n){return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:"fail",required:e.required,evidencePath:o,message:`Evidence report is invalid: ${n instanceof Error?n.message:String(n)}`}}let c;if(e.id==="workspace.doctor"){let n=C(d.generatedAt,s,"Doctor evidence");n?c={status:"fail",message:n}:c=Ce(d);}else if(e.id==="workspace.readiness"){let n=C(d.generatedAt,s,"Release readiness evidence");n?c={status:"fail",message:n}:c=Ae(d);}else if(e.id==="workspace.contract.verify"){let n=C(d.generatedAt,s,"Workspace contract verify evidence");n?c={status:"fail",message:n}:c=Ee(d);}else if(e.id==="workspace.analyze"){let n=C(d.generatedAt,s,"Analyze evidence");n?c={status:"fail",message:n}:c=Se(d);}else if(e.id==="workspace.pipeline"){let n=C(d.generatedAt,s,"Pipeline evidence");n?c={status:"fail",message:n}:c=Pe(d);}else if(e.id==="workspace.doctor-fix"){let n=d.schemaVersion==="rapidkit-doctor-fix-result-v1"?d:d.fixResult,a=b(n),f=typeof a?.generatedAt=="string"?a.generatedAt:void 0,y=C(f,s,"Doctor fix result");y?c={status:"fail",message:y}:await je(t,f)?c={status:"skipped",message:"No current doctor remediation steps are pending."}:c=We(d);}else if(e.id.startsWith("project."))c=Ie(d,e,s);else {let n=C(d.generatedAt,s,"Evidence report");n?c={status:"fail",message:n}:c={status:"pass",message:"Evidence report is present."};}return {id:e.id,label:e.label,scope:e.scope,project:e.project,command:e,status:c.status,required:e.required,evidencePath:o,message:c.message}}function Fe(e,t={blockingReasons:[],needsAttention:false}){let r=e.filter(n=>n.status==="pass").length,s=e.filter(n=>n.status==="warn").length,i=e.filter(n=>n.status==="fail").length,o=e.filter(n=>n.status==="missing").length,k=e.filter(n=>n.status==="skipped").length,u=e.filter(n=>n.required&&(n.status==="fail"||n.status==="missing")).map(n=>`${n.id}: ${n.message}`),d=e.filter(n=>n.required&&n.status==="missing").length,g="ready",c=0;return u.length>0||t.blockingReasons.length>0?(g="blocked",c=2):(s>0||e.some(n=>!n.required&&n.status==="fail")||d>0||t.needsAttention)&&(g="needs-attention",c=1),{verdict:g,exitCode:c,stepsPassed:r,stepsWarn:s,stepsFailed:i,stepsMissing:o,stepsSkipped:k}}function Oe(e,t){let r=W(e.affectedProjects.map(a=>a.project?.name).filter(a=>typeof a=="string")),s=new Set(r.map(a=>a.toLowerCase())),i=W(e.transitiveImpact.map(a=>a.project?.name).filter(a=>typeof a=="string").filter(a=>!s.has(a.toLowerCase()))),o=new Map;for(let a of t){if(a.scope!=="project"||!a.project)continue;let f=a.project.toLowerCase(),y=o.get(f)??[];y.push(a),o.set(f,y);}let k=[],u=[],d=[],g=[],c=false,n=(a,f)=>{let y=o.get(a.toLowerCase())??[];if(y.length===0){d.push(a);return}let j=y.filter(p=>p.status==="fail"),w=j.filter(p=>p.required),x=y.filter(p=>p.status==="missing"),A=x.filter(p=>p.required),P=y.some(p=>p.status==="pass"||p.status==="warn");if(w.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has failed verification evidence (${w.map(p=>p.id).join(", ")}).`);return}if(j.length>0){u.push(a),c=true;return}if(A.length>0){u.push(a),g.push(`graph.subgraph.${a}: ${f} has missing required verification evidence (${A.map(p=>p.id).join(", ")}).`);return}if(x.length>0){u.push(a),c=true;return}if(P){k.push(a);return}d.push(a);};for(let a of r)n(a,"directly-changed");for(let a of i)n(a,"transitive dependent");return {subgraph:{totalProjects:r.length+i.length,directlyChanged:r,transitiveDependents:i,covered:W(k),uncovered:W(u),unverifiable:W(d)},blockingReasons:g,needsAttention:c}}function W(e){return [...new Set(e)].sort((t,r)=>t.localeCompare(r))}async function Be(e){let t=m.resolve(e.workspacePath);if(e.fromImpactPath){let o=ve(t,e.fromImpactPath);return {impact:await le(o),fromImpactRef:m.relative(t,o).split(m.sep).join("/"),impactFromDisk:true}}let r=m.join(t,g);if(await v.pathExists(r))return {impact:await le(r),fromImpactRef:g,impactFromDisk:true};let s=m.join(t,d$3);if(await v.pathExists(s))return {impact:await o({workspacePath:t,fromPath:d$3,scope:e.scope,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}),fromImpactRef:d$3,impactFromDisk:false};let i=await k({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now});return {impact:{schemaVersion:f,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",diffRef:a.diff,workspace:{name:i.workspace.name,profile:i.workspace.profile,type:i.workspace.type},summary:{changed:false,risk:"none",affectedProjects:0,workspaceItems:0,recommendedCommands:0,blastRadius:{directlyAffected:0,transitivelyAffected:0,maxDistance:0,graphEdges:i.graph?.edges.length??0}},affectedProjects:[],transitiveImpact:[],criticalPathHotspots:[],workspaceImpact:[],verificationPlan:[],agentBrief:{headline:"Baseline workspace verify run.",bullets:["No impact report or snapshot was available; baseline gates were evaluated."],unsafeAssumptions:["Do not claim runtime verification passed unless evidence exists."]},diff:{schemaVersion:b$1.diff,generatedAt:(e.now??new Date).toISOString(),fromRef:"baseline",toRef:a.model,fromHash:"baseline",toHash:"baseline",summary:{changed:false,addedProjects:0,removedProjects:0,changedProjects:0,workspaceChanges:0,validationChanges:0,gitChangedFiles:0},git:{available:false,dirty:false,changedFiles:0,untrackedFiles:0,deletedFiles:0},changes:[],currentModel:i}},impactFromDisk:false}}function _e(e,t){if(t)return e.generatedAt}async function ft(e){let t=m.resolve(e.workspacePath),{impact:r,fromImpactRef:s,impactFromDisk:i}=await Be(e),o$1=r.diff.currentModel,k$1=i?await k({workspacePath:t,includeAbsolutePaths:e.includeAbsolutePaths,includeEvidence:e.includeEvidence,observableScanDepth:e.observableScanDepth,now:e.now}):o$1,u=[];if(i){let l=await o({workspacePath:t,fromPath:r.diff.fromRef,diff:r.diff,scope:e.scope,now:e.now}),B=[r.affectedProjects,r.transitiveImpact,r.verificationPlan],_=[l.affectedProjects,l.transitiveImpact,l.verificationPlan];JSON.stringify(B)!==JSON.stringify(_)&&u.push("workspace.impact: Persisted impact semantics do not match the impact re-derived from the embedded diff. Regenerate diff and impact.");}i&&d(k$1)!==r.diff.toHash&&u.push("workspace.impact: Impact evidence is stale because the current workspace model no longer matches the embedded model. Regenerate diff and impact.");let d$2=r.diff.git;if(i&&d$2?.available){let l=a$1(t,{ref:d$2.ref}),B=r.diff.changes.filter(h=>h.type.startsWith("git.")).map(h=>`${h.type}:${h.target.replace(/^git:/,"")}`).sort(),_=[...l.changedFiles.map(h=>`git.file.changed:${h}`),...l.untrackedFiles.map(h=>`git.untracked:${h}`),...l.deletedFiles.map(h=>`git.deleted:${h}`)].sort();(!l.available||l.commit!==d$2.commit||JSON.stringify(_)!==JSON.stringify(B))&&u.push("workspace.impact: Impact evidence is stale because Git changes no longer match the diff observation. Regenerate diff and impact.");}let g=_e(r,i),c$1=be([...n(),...r.verificationPlan]).filter(l=>we(e.scope,l)),n$1=[];for(let l of c$1)n$1.push(await $e(l,t,o$1.contracts.exists===true,g));let a=Oe(r,n$1),f=a$2(o$1.graph??{nodes:[],edges:[]}),y=b$2(o$1),j=await Ne(t),w=c(y,j?.freshness?.projectHashes),x={verdict:w.verdict,baseline:w.baseline,changed:w.changed,added:w.added,removed:w.removed,projectHashes:d$1(y)},A=b$3(f),P=o$1.policies?.mode??"warn",p=await De(o$1,t),O=He(P,p),E=Fe(n$1,{blockingReasons:[...a.blockingReasons,...A,...O.blockingReasons,...u],needsAttention:a.needsAttention||O.needsAttention}),fe=n$1.filter(l=>l.status==="missing"&&l.evidencePath).map(l=>l.evidencePath),I=[...n$1.filter(l=>l.required&&(l.status==="fail"||l.status==="missing")).map(l=>`${l.id}: ${l.message}`),...a.blockingReasons,...A,...O.blockingReasons,...u],pe=p.filter(l=>l.severity==="error").length,me=o$1.summary?.projectCount??o$1.projects.length,J=de({projectCount:me,verdict:E.verdict,exitCode:E.exitCode,blockingReasons:I,policyErrorCount:pe});E.verdict=J.verdict,E.exitCode=J.exitCode;let G=I.length>0?ce({blockingReasons:I,verifyCommand:"npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json",verifyArtifact:z}):[];return {schemaVersion:ue,generatedAt:(e.now??new Date).toISOString(),workspacePath:t,mode:"evidence",fromImpactRef:s,scope:e.scope,impact:{changed:r.summary.changed,risk:r.summary.risk,affectedProjects:r.summary.affectedProjects,recommendedCommands:r.summary.recommendedCommands},summary:E,steps:n$1,missingEvidence:fe,blockingReasons:I,...G.length>0?{resolutionHints:G}:{},verificationPlan:c$1,affectedSubgraph:a.subgraph,graphIntegrity:f,freshness:x,policyMode:P,policyViolations:p}}async function De(e,t){let r=[];for(let i of e.validation?.issues??[])r.push({source:"model",severity:i.severity,code:i.code,message:i.message,target:i.target});let s=await d$2(t,a.contractVerify);try{if(s&&await v.pathExists(s)){let i=await v.readJson(s);if(Array.isArray(i.violations))for(let o of i.violations)typeof o=="string"&&o.trim().length>0&&r.push({source:"contract",severity:"error",code:"contract.violation",message:o});}}catch{}return r.sort((i,o)=>i.source!==o.source?i.source.localeCompare(o.source):i.code!==o.code?i.code.localeCompare(o.code):i.message.localeCompare(o.message))}function He(e,t){let r=t.filter(s=>s.severity==="error");return e==="enforce"&&r.length>0?{blockingReasons:r.map(s=>`policy.${s.code}: ${s.message}`),needsAttention:false}:{blockingReasons:[],needsAttention:r.length>0}}async function Ne(e){let t=m.join(e,z);try{if(!await v.pathExists(t))return null;let r=await v.readJson(t);return r&&r.schemaVersion===ue?r:null}catch{return null}}async function pt(e$1,t){return e(t,z,a$3(e$1))}function Me(e,t){let r=t?.strict?"strict":"default",s=[];if(e.summary.verdict==="blocked")return s.push(...e.blockingReasons),s.length===0&&s.push("verify verdict is blocked."),{passed:false,mode:r,exitCode:2,reasons:s};if(r==="strict"){if(e.summary.verdict!=="ready"&&s.push(`verify verdict is ${e.summary.verdict} (strict requires ready).`),e.freshness.verdict==="stale"){let i=[...e.freshness.changed,...e.freshness.added].slice(0,5);s.push(`freshness is stale${i.length>0?`: ${i.join(", ")}`:""} (strict requires fresh).`);}if(s.length>0)return {passed:false,mode:r,exitCode:1,reasons:s}}return {passed:true,mode:r,exitCode:0,reasons:s}}function mt(e,t){return Me(e,t).exitCode}export{oe as a,Ue as b,ue as c,z as d,Oe as e,ft as f,pt as g,Me as h,mt as i};
@@ -1 +1 @@
1
- import {b as b$1}from'./chunk-NHN4QXPP.js';import {i}from'./chunk-MER6ZBN2.js';import {c}from'./chunk-TWNFECMN.js';import {a}from'./chunk-Y45WZR5N.js';import {f}from'./chunk-7YHK5NM3.js';import {b}from'./chunk-RO73VVHW.js';import {h as h$1,g}from'./chunk-5XATWNME.js';import {promises}from'fs';import c$1 from'path';import v,{homedir}from'os';import {pathToFileURL}from'url';import d from'process';function E(t){let e=t.label.indexOf(" \u2014 ");return e>=0?t.label.slice(e+3).trim():t.label.trim()}function F(){let t=c().map(e=>({value:e.id,label:E(e),hint:e.description,name:e.label})),o=i().map(e=>({value:e.kitId,label:e.displayName,hint:e.commandDisplay("my-app"),name:`${e.displayName} \u2014 ${e.framework}`}));return [...t,...o]}var I=".workspairc.json",N=".rapidkitrc.json",D=["workspai.config.js","workspai.config.mjs","workspai.config.cjs","rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"],S=["workspai.config.json","rapidkit.config.json"];function W(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="ENOENT"}function h(t,o){let e=o instanceof Error?o.message:String(o),n=t.endsWith(".js")&&/module is not defined in ES module scope/i.test(e)?' CommonJS syntax in a .js config is not valid when the project package uses "type": "module"; rename the file to .cjs or use export default.':"";return `Failed to load Workspai config at ${t}.${n} Cause: ${e}`}async function he(){for(let t of [c$1.join(v.homedir(),I),c$1.join(v.homedir(),N)])try{let o=await promises.readFile(t,"utf-8"),e=JSON.parse(o);return f.debug(`Loaded config from ${t}`),e}catch{}return f.debug("No user config found, using defaults"),{}}async function ke(t=process.cwd(),o={}){let e=t,n=c$1.parse(e).root;for(;e!==n;){for(let r of S){let i=c$1.join(e,r);try{let s=await promises.readFile(i,"utf-8"),a=JSON.parse(s);if(!a||typeof a!="object"||Array.isArray(a))throw new Error("configuration root must be a JSON object");return f.debug(`Loaded data-only Workspai config from ${r}`),a}catch(s){if(W(s))continue;throw new Error(h(i,s))}}for(let r of D){let i=c$1.join(e,r);try{await promises.access(i);}catch(s){if(W(s))continue;throw new Error(h(i,s))}if(f.debug(`Found config file: ${i}`),!o.trustExecutableConfig)throw new Error(`Refusing to execute Workspai config at ${i} without explicit trust. Use a data-only workspai.config.json file, pass --trust-config, or set WORKSPAI_TRUST_CONFIG=1.`);try{let a=await import(pathToFileURL(i).href),u=a.default||a;return f.debug(`Loaded Workspai config from ${r}`),u}catch(s){throw new Error(h(i,s))}}e=c$1.dirname(e);}return f.debug("No Workspai config file found, using defaults"),{}}function ye(t,o,e){return {author:e.author||o.workspace?.defaultAuthor||t.author,pythonVersion:e.pythonVersion||o.workspace?.pythonVersion||t.pythonVersion,defaultInstallMethod:e.defaultInstallMethod||o.workspace?.installMethod||t.defaultInstallMethod,defaultKit:e.defaultKit||o.projects?.defaultKit||t.defaultKit,skipGit:e.skipGit??o.projects?.skipGit??t.skipGit,license:e.license||t.license,testRapidKitPath:e.testRapidKitPath||t.testRapidKitPath}}function we(t){return a("DEV_PATH")||t.testRapidKitPath||void 0}function A(t,o){let e=t.indexOf(o);if(e>=0&&e+1<t.length)return t[e+1];let n=t.find(r=>r.startsWith(`${o}=`));if(n)return n.slice(o.length+1)}function L(t){return t.includes("--here")}function j(t,o=d.cwd()){if(L(t))return c$1.resolve(o);let e=A(t,"--output");if(e)return c$1.resolve(e)}function Fe(t,o=d.cwd()){let e=c$1.resolve(t),n=c$1.resolve(o),r=c$1.relative(n,e);return r.length>0&&!r.startsWith("..")&&!c$1.isAbsolute(r)?`cd ${r}`:`cd ${e}`}function Ke(t,o={}){let e=o.argv??[],n=o.outputParent??j(e,d.cwd());return h$1(t.trim(),{homeDir:o.homeDir,outputDir:n})}function Ie(t,o,e={}){return t?c$1.resolve(t)===c$1.resolve(o)?true:e.outputParent===void 0:false}async function Ne(t,o={}){let e=o.cwd??d.cwd(),n=o.homeDir??homedir(),r=j(t,e);if(r!==void 0)return r;let i=o.hasYes??(t.includes("--yes")||t.includes("-y"));if(!(o.interactive??(!i&&!!d.stdin.isTTY&&!b())))return;let a=g(n),{location:u}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:[{value:"managed",label:"Managed home",hint:a},{value:"here",label:"Current directory",hint:e}],default:0}]);if(u==="here")return c$1.resolve(e)}export{F as a,he as b,ke as c,ye as d,we as e,Fe as f,Ke as g,Ie as h,Ne as i};
1
+ import {b as b$1}from'./chunk-NHN4QXPP.js';import {i}from'./chunk-MER6ZBN2.js';import {c}from'./chunk-PHXQR6PX.js';import {a}from'./chunk-Y45WZR5N.js';import {f}from'./chunk-7YHK5NM3.js';import {b}from'./chunk-RO73VVHW.js';import {h as h$1,g}from'./chunk-5XATWNME.js';import {promises}from'fs';import c$1 from'path';import v,{homedir}from'os';import {pathToFileURL}from'url';import d from'process';function E(t){let e=t.label.indexOf(" \u2014 ");return e>=0?t.label.slice(e+3).trim():t.label.trim()}function F(){let t=c().map(e=>({value:e.id,label:E(e),hint:e.description,name:e.label})),o=i().map(e=>({value:e.kitId,label:e.displayName,hint:e.commandDisplay("my-app"),name:`${e.displayName} \u2014 ${e.framework}`}));return [...t,...o]}var I=".workspairc.json",N=".rapidkitrc.json",D=["workspai.config.js","workspai.config.mjs","workspai.config.cjs","rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"],S=["workspai.config.json","rapidkit.config.json"];function W(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="ENOENT"}function h(t,o){let e=o instanceof Error?o.message:String(o),n=t.endsWith(".js")&&/module is not defined in ES module scope/i.test(e)?' CommonJS syntax in a .js config is not valid when the project package uses "type": "module"; rename the file to .cjs or use export default.':"";return `Failed to load Workspai config at ${t}.${n} Cause: ${e}`}async function he(){for(let t of [c$1.join(v.homedir(),I),c$1.join(v.homedir(),N)])try{let o=await promises.readFile(t,"utf-8"),e=JSON.parse(o);return f.debug(`Loaded config from ${t}`),e}catch{}return f.debug("No user config found, using defaults"),{}}async function ke(t=process.cwd(),o={}){let e=t,n=c$1.parse(e).root;for(;e!==n;){for(let r of S){let i=c$1.join(e,r);try{let s=await promises.readFile(i,"utf-8"),a=JSON.parse(s);if(!a||typeof a!="object"||Array.isArray(a))throw new Error("configuration root must be a JSON object");return f.debug(`Loaded data-only Workspai config from ${r}`),a}catch(s){if(W(s))continue;throw new Error(h(i,s))}}for(let r of D){let i=c$1.join(e,r);try{await promises.access(i);}catch(s){if(W(s))continue;throw new Error(h(i,s))}if(f.debug(`Found config file: ${i}`),!o.trustExecutableConfig)throw new Error(`Refusing to execute Workspai config at ${i} without explicit trust. Use a data-only workspai.config.json file, pass --trust-config, or set WORKSPAI_TRUST_CONFIG=1.`);try{let a=await import(pathToFileURL(i).href),u=a.default||a;return f.debug(`Loaded Workspai config from ${r}`),u}catch(s){throw new Error(h(i,s))}}e=c$1.dirname(e);}return f.debug("No Workspai config file found, using defaults"),{}}function ye(t,o,e){return {author:e.author||o.workspace?.defaultAuthor||t.author,pythonVersion:e.pythonVersion||o.workspace?.pythonVersion||t.pythonVersion,defaultInstallMethod:e.defaultInstallMethod||o.workspace?.installMethod||t.defaultInstallMethod,defaultKit:e.defaultKit||o.projects?.defaultKit||t.defaultKit,skipGit:e.skipGit??o.projects?.skipGit??t.skipGit,license:e.license||t.license,testRapidKitPath:e.testRapidKitPath||t.testRapidKitPath}}function we(t){return a("DEV_PATH")||t.testRapidKitPath||void 0}function A(t,o){let e=t.indexOf(o);if(e>=0&&e+1<t.length)return t[e+1];let n=t.find(r=>r.startsWith(`${o}=`));if(n)return n.slice(o.length+1)}function L(t){return t.includes("--here")}function j(t,o=d.cwd()){if(L(t))return c$1.resolve(o);let e=A(t,"--output");if(e)return c$1.resolve(e)}function Fe(t,o=d.cwd()){let e=c$1.resolve(t),n=c$1.resolve(o),r=c$1.relative(n,e);return r.length>0&&!r.startsWith("..")&&!c$1.isAbsolute(r)?`cd ${r}`:`cd ${e}`}function Ke(t,o={}){let e=o.argv??[],n=o.outputParent??j(e,d.cwd());return h$1(t.trim(),{homeDir:o.homeDir,outputDir:n})}function Ie(t,o,e={}){return t?c$1.resolve(t)===c$1.resolve(o)?true:e.outputParent===void 0:false}async function Ne(t,o={}){let e=o.cwd??d.cwd(),n=o.homeDir??homedir(),r=j(t,e);if(r!==void 0)return r;let i=o.hasYes??(t.includes("--yes")||t.includes("-y"));if(!(o.interactive??(!i&&!!d.stdin.isTTY&&!b())))return;let a=g(n),{location:u}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:[{value:"managed",label:"Managed home",hint:a},{value:"here",label:"Current directory",hint:e}],default:0}]);if(u==="here")return c$1.resolve(e)}export{F as a,he as b,ke as c,ye as d,we as e,Fe as f,Ke as g,Ie as h,Ne as i};
@@ -1,2 +1,2 @@
1
- import {a as a$1,c as c$1,i,g,h as h$1}from'./chunk-4KUIFXHM.js';import {p,q}from'./chunk-5XATWNME.js';import T from'fs';import a from'path';import y from'fs-extra';var V=[{id:"fastapi.standard",aliases:["fastapi","fastapi.standard"],label:"fastapi \u2014 FastAPI Standard Kit",description:"Core-backed FastAPI service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"fastapi.ddd",aliases:["fastapi.ddd","fastapi-ddd"],label:"fastapi \u2014 FastAPI DDD Kit",description:"Core-backed FastAPI DDD service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"nestjs.standard",aliases:["nestjs","nest","nestjs.standard"],label:"nestjs \u2014 NestJS Standard Kit",description:"Core-backed NestJS service scaffold.",owner:"core",runtime:"node",framework:"nestjs",moduleSupport:true,stability:"stable"},{id:"springboot.standard",aliases:["spring","springboot","springboot.standard","java"],label:"spring \u2014 Spring Boot Standard Kit",description:"npm-backed Spring Boot service scaffold.",owner:"npm",runtime:"java",framework:"springboot",moduleSupport:false,stability:"stable",generator:"springboot",createUsage:"workspai create project springboot.standard <name> [--java-version <major>] [--spring-boot-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]"},{id:"gofiber.standard",aliases:["go","go.standard","fiber","gofiber","gofiber.standard","go/fiber"],label:"go/fiber \u2014 Go Fiber Standard Kit",description:"npm-backed Go Fiber service scaffold.",owner:"npm",runtime:"go",framework:"gofiber",moduleSupport:false,stability:"stable",generator:"gofiber",createUsage:"workspai create project gofiber.standard <name> [--output <dir>]"},{id:"gogin.standard",aliases:["gin","gogin","gogin.standard","go/gin"],label:"go/gin \u2014 Go Gin Standard Kit",description:"npm-backed Go Gin service scaffold.",owner:"npm",runtime:"go",framework:"gogin",moduleSupport:false,stability:"stable",generator:"gogin",createUsage:"workspai create project gogin.standard <name> [--output <dir>]"},{id:"dotnet.webapi.clean",aliases:["dotnet","dotnet.webapi","dotnet.webapi.clean","aspnet","aspnetcore","asp.net","asp.net-core","csharp","c#"],label:"dotnet \u2014 ASP.NET Core Clean Web API",description:"npm-backed ASP.NET Core Web API with clean architecture boundaries.",owner:"npm",runtime:"dotnet",framework:"dotnet",moduleSupport:false,stability:"preview",generator:"dotnet-webapi-clean",createUsage:"workspai create project dotnet.webapi.clean <name> [--target-framework net8.0] [--root-namespace <Company.Product>] [--port <number>]"}],O=new Map;for(let e of V){O.set(e.id.toLowerCase(),e);for(let t of e.aliases)O.set(t.toLowerCase(),e);}function P(e){return e?O.get(e.trim().toLowerCase())??null:null}function qe(e){return P(e)?.id??e}function Ye(){return V.filter(e=>e.owner==="core"||e.generator)}function He(e){return P(e)?.owner==="npm"}async function ze(e,t){if(!e.generator)throw new Error(`Kit is not backed by an npm generator: ${e.id}`);if(e.generator==="gofiber"){let{generateGoFiberKit:r}=await import('./gofiber-standard-2BL7GWZB.js');await r(t.projectPath,{project_name:t.projectName,module_path:t.projectName,skipGit:t.skipGit,skipInstall:t.skipInstall});return}if(e.generator==="gogin"){let{generateGoGinKit:r}=await import('./gogin-standard-XGP3KBXA.js');await r(t.projectPath,{project_name:t.projectName,module_path:t.projectName,skipGit:t.skipGit,skipInstall:t.skipInstall});return}if(e.generator==="springboot"){let{generateSpringBootKit:r}=await import('./springboot-standard-JJNUID6M.js');await r(t.projectPath,{project_name:t.projectName,artifact_id:t.projectName,java_version:c(t.args,"--java-version")?.trim(),spring_boot_version:c(t.args,"--spring-boot-version")?.trim(),springdoc_version:c(t.args,"--springdoc-version")?.trim(),group_id:c(t.args,"--group-id")?.trim(),package_name:c(t.args,"--package-name")?.trim(),description:c(t.args,"--description")?.trim(),port:c(t.args,"--port")?.trim(),skipGit:t.skipGit,skipInstall:t.skipInstall});return}if(e.generator==="dotnet-webapi-clean"){let{generateDotnetWebApiCleanKit:r}=await import('./dotnet-webapi-clean-6TVFBTVI.js');await r(t.projectPath,{project_name:t.projectName,target_framework:c(t.args,"--target-framework")?.trim(),root_namespace:c(t.args,"--root-namespace")?.trim(),description:c(t.args,"--description")?.trim(),port:c(t.args,"--port")?.trim(),skipGit:t.skipGit,skipInstall:t.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${e.generator}`)}function c(e,t){let r=e.indexOf(t);if(r>=0&&r+1<e.length)return e[r+1];let n=e.find(i=>i.startsWith(`${t}=`));return n?n.slice(t.length+1):void 0}var j=["init","dev","start","build","test","lint","format","help"],X={python:{runtime:"python",displayName:"Python",tier:"first-class",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:true,doctorSupport:"full",notes:["Core-backed Python projects support RapidKit Core modules and lifecycle commands."]},node:{runtime:"node",displayName:"Node.js",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:true,doctorSupport:"full",notes:["Node projects support npm-owned lifecycle commands; NestJS is the first-class Node framework."]},go:{runtime:"go",displayName:"Go",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:false,doctorSupport:"readiness",notes:["Go projects support workspace governance and lifecycle commands via Go tooling."]},java:{runtime:"java",displayName:"Java / Spring Boot",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:false,doctorSupport:"readiness",notes:["Java projects support Maven/Gradle lifecycle commands and workspace governance."]},dotnet:{runtime:"dotnet",displayName:".NET / ASP.NET Core",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:false,doctorSupport:"readiness",notes:[".NET projects support dotnet CLI lifecycle commands and workspace governance."]},php:{runtime:"php",displayName:"PHP",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["PHP projects are importable and governed as observed projects until a kit exists."]},ruby:{runtime:"ruby",displayName:"Ruby",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Ruby projects are importable and governed as observed projects until a kit exists."]},rust:{runtime:"rust",displayName:"Rust",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Rust projects are importable and governed as observed projects until a kit exists."]},elixir:{runtime:"elixir",displayName:"Elixir",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Elixir projects are importable and governed as observed projects until a kit exists."]},clojure:{runtime:"clojure",displayName:"Clojure",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Clojure projects are importable and governed as observed projects until a kit exists."]},scala:{runtime:"scala",displayName:"Scala",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Scala projects are importable and governed as observed projects until a kit exists."]},kotlin:{runtime:"kotlin",displayName:"Kotlin",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Kotlin projects are importable and governed as observed projects until a kit exists."]},deno:{runtime:"deno",displayName:"Deno",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Deno projects are importable and governed as observed projects until a kit exists."]},bun:{runtime:"bun",displayName:"Bun",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Bun projects are importable and governed as observed projects until a kit exists."]},unknown:{runtime:"unknown",displayName:"Unknown",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Unknown projects are tracked safely but require manual command configuration."]}},fe=["fastapi","nestjs"],ge=["django","flask","nextjs","remix","nuxt","react","vite","vue","sveltekit","svelte","angular","astro","solid","express","fastify","koa","echo","gofiber","gogin","springboot","dotnet","laravel","symfony","rails","sinatra","actix","axum","rocket","phoenix","clojure","scala","kotlin","deno","bun"];function x(e){return X[e||"unknown"]??X.unknown}function Q(e){return fe.includes(e)?"first-class":ge.includes(e)?"extended":"observed"}function Z(e){let t=x(e.runtime);return {lifecycleCommands:t.lifecycleCommands,moduleCommands:e.moduleSupport&&t.moduleCommands,unsupportedLifecycleCommands:j.filter(r=>!t.lifecycleCommands.includes(r))}}var ye=["python","node","go","java","dotnet"];function w(e){return !!e&&ye.includes(e)}function E(e,t){return t!=="lint"&&t!=="format"&&t!=="docs"?false:e==="python"}function ee(e){let t=x(e),r=w(t.runtime),n=be[t.runtime]??[],i=Ce[t.runtime]??[];return {runtime:t.runtime,displayName:t.displayName,lifecycleCommands:t.lifecycleCommands,hasExecutor:r,packageManagers:n,primaryFiles:i,notes:t.notes}}var be={python:["poetry","pip","uv"],node:["npm","pnpm","yarn","bun"],go:["go"],java:["maven","gradle"],dotnet:["dotnet"],php:["composer"],ruby:["bundle"],rust:["cargo"],elixir:["mix"],kotlin:["gradle"],deno:["deno"],bun:["bun"]},Ce={python:["pyproject.toml","requirements.txt","requirements.in"],node:["package.json"],go:["go.mod"],java:["pom.xml","build.gradle","build.gradle.kts"],dotnet:["*.csproj","*.sln"],php:["composer.json"],ruby:["Gemfile"],rust:["Cargo.toml"],elixir:["mix.exs"],kotlin:["settings.gradle.kts"],deno:["deno.json","deno.jsonc"],bun:["package.json","bunfig.toml"]};function h(e,t){let r=g({runtime:typeof e?.runtime=="string"?e.runtime:void 0,framework:typeof e?.framework=="string"?e.framework:void 0,kitName:typeof e?.kit_name=="string"?e.kit_name:typeof e?.kit=="string"?e.kit:void 0});return r.runtime!=="unknown"?r.runtime:i(t,e).runtime}function re(e){let t=e;for(;;){for(let n of p(t,"project.json"))if(T.existsSync(n))try{return JSON.parse(T.readFileSync(n,"utf8"))}catch{return null}let r=a.dirname(t);if(r===t)break;t=r;}return null}function st(e,t){return h(e,t)==="go"}function mt(e,t){return h(e,t)==="node"}function ct(e,t){return h(e,t)==="java"}function dt(e,t){return h(e,t)==="dotnet"}function pt(e,t){return h(e,t)==="python"}var Se=["project.json","context.json","file-hashes.json"];async function jt(e){let t=a.resolve(e),r=[];for(let n of Se){let i=q(t,n);if(await y.pathExists(i))continue;let m=a.join(t,".rapidkit",n);if(!await y.pathExists(m))continue;let f=await y.readJson(m);await y.ensureDir(a.dirname(i));let C=`${i}.${process.pid}.${Date.now()}.tmp`;try{await y.writeJson(C,f,{spaces:2}),await y.move(C,i,{overwrite:false}),r.push(i);}finally{await y.remove(C).catch(()=>{});}}return r}function je(e){for(let t of p(e,"context.json"))if(T.existsSync(t))try{return JSON.parse(T.readFileSync(t,"utf8"))}catch{return null}return null}function we(e){let t=e?.engine;return t==="npm"||t==="pip"||t==="python"?t:"unknown"}function xe(e,t){if(e?.module_support===false||t?.module_support===false||!e&&t)return false;let r=typeof e?.kit_name=="string"?e.kit_name:typeof e?.kit=="string"?e.kit:typeof t?.kit=="string"?t.kit:void 0,n=r?P(r):void 0;return n?.owner==="core"&&n.moduleSupport===true}function he(e,t,r){let n=g({runtime:typeof t?.runtime=="string"?t.runtime:typeof r?.runtime=="string"?r.runtime:void 0,framework:typeof t?.framework=="string"?t.framework:typeof r?.framework=="string"?r.framework:void 0,kitName:typeof t?.kit_name=="string"?t.kit_name:typeof t?.kit=="string"?t.kit:typeof r?.kit=="string"?r.kit:void 0});return n.key!=="unknown"?n:i(e,t)}function ne(e){let t=a.resolve(e);if(![...p(t,"project.json"),...p(t,"context.json")].some(f=>T.existsSync(f)))return null;let n=re(t),i=je(t),m=he(t,n,i);return {projectRoot:t,projectJson:n,contextJson:i,detection:m,moduleSupport:xe(n,i),engine:we(i)}}var Ne=["build","dev","start","test","lint","format"],I=["init","test","build","start"],ht=["lint","format","docs"];function Nt(e){return !!e&&Ne.includes(e)}var ve={dev:["dev","start:dev"],start:["start","start:prod","preview"],build:["build"],test:["test","test:unit","test:ci"],lint:["lint"],format:["format","prettier"]},ie={nestjs:{dev:["dev","start:dev"],start:["start","start:prod"],build:["build"],test:["test","test:e2e"],lint:["lint"],format:["format"]},express:{dev:["dev","start:dev"],start:["start"],build:["build"],test:["test"],lint:["lint"],format:["format"]},fastify:{dev:["dev","start:dev"],start:["start"],build:["build"],test:["test"],lint:["lint"],format:["format"]},koa:{dev:["dev","start:dev"],start:["start"],build:["build"],test:["test"],lint:["lint"],format:["format"]}};function Re(e){let t=a.join(e,"package.json");if(!T.existsSync(t))return {};try{let n=JSON.parse(T.readFileSync(t,"utf8")).scripts??{};return Object.fromEntries(Object.entries(n).filter(i=>typeof i[1]=="string"))}catch{return {}}}function Pe(e,t){let r=t?c$1(t):"unknown",n=r!=="unknown"?a$1(r,e):[],i=t?ie[t]?.[e]??[]:[],m=ve[e]??[],f=[...n,...i,...m];return [...new Set(f)]}function ae(e,t,r){let n=Re(e),i=new Set(Object.keys(n));if(i.has(t))return {scriptName:t,source:"package.json"};for(let m of Pe(t,r?.framework))if(i.has(m))return {scriptName:m,source:a$1(c$1(r?.framework??"unknown"),t).includes(m)||ie[r?.framework??""]?.[t]?.includes(m)?"framework-candidate":"generic-candidate"};return null}function B(e){return T.existsSync(a.join(e,"package.json"))}function se(e){let t=ee(e);return t.runtime==="unknown"&&e!=="unknown"?null:{runtime:t.runtime,displayName:t.displayName,supportedCommands:t.lifecycleCommands,packageManagers:t.packageManagers,primaryFiles:t.primaryFiles,notes:t.notes,hasExecutor:t.hasExecutor}}function s(e){try{return T.existsSync(e)}catch{return false}}function b(e){try{return s(e)?T.readFileSync(e,"utf8"):""}catch{return ""}}function u(e,t){let r=b(a.join(e,"Makefile"));return r?new RegExp(`^${t}\\s*:`).test(r):false}function Ee(e){let t=[e];for(;t.length>0;){let r=t.shift();if(!r)break;let n=[];try{n=T.readdirSync(r,{withFileTypes:true});}catch{continue}for(let i of n){if(i.name==="node_modules"||i.name===".git"||i.name==="dist")continue;let m=a.join(r,i.name);if(i.isFile()&&i.name.endsWith(".csproj"))return true;i.isDirectory()&&t.push(m);}}return false}function me(e,t){let r=s(a.join(e,"pyproject.toml")),n=s(a.join(e,"requirements.txt"))||s(a.join(e,"requirements.in")),i=s(a.join(e,"manage.py"));switch(t){case "init":return r||n;case "dev":case "start":return r||i||n;case "test":return r||n||s(a.join(e,"tests"));case "build":return r||n;case "lint":case "format":return r||n||i||s(a.join(e,"setup.py"))||s(a.join(e,"setup.cfg"));default:return false}}function Me(e,t){if(!s(a.join(e,"go.mod")))return false;switch(t){case "init":return true;case "dev":return u(e,"run")||s(a.join(e,"main.go"));case "test":return true;case "build":return true;case "start":return u(e,"run")||s(a.join(e,"main.go"))||s(a.join(e,"cmd"));case "lint":return s(a.join(e,".golangci.yml"))||s(a.join(e,".golangci.yaml"))||u(e,"lint");case "format":return u(e,"fmt")||u(e,"format");default:return false}}function _e(e,t){let r=s(a.join(e,"pom.xml")),n=s(a.join(e,"build.gradle"))||s(a.join(e,"build.gradle.kts"));if(!r&&!n)return false;switch(t){case "init":case "test":case "build":case "dev":case "start":return true;case "lint":return u(e,"lint")||b(a.join(e,"pom.xml")).includes("checkstyle")||b(a.join(e,"build.gradle")).includes("checkstyle")||b(a.join(e,"build.gradle.kts")).includes("checkstyle");case "format":return u(e,"format")||b(a.join(e,"build.gradle")).includes("spotless")||b(a.join(e,"build.gradle.kts")).includes("spotless");default:return false}}function Ae(e,t){if(!Ee(e))return false;switch(t){case "init":case "dev":case "test":case "build":case "start":return true;case "lint":return u(e,"lint")||b(a.join(e,"Directory.Build.props")).includes("EnforceCodeStyleInBuild");case "format":return u(e,"format")||s(a.join(e,".editorconfig"));default:return false}}function Fe(e,t,r){return t==="init"?B(e):ae(e,t,{framework:r})!==null}function Le(e,t,r){switch(t){case "php":return r==="init"&&s(a.join(e,"composer.json"));case "ruby":return r==="init"&&s(a.join(e,"Gemfile"));case "rust":return s(a.join(e,"Cargo.toml"))?r==="init"||r==="test"||r==="build"||r==="start":false;case "elixir":return r==="init"&&s(a.join(e,"mix.exs"));case "deno":return s(a.join(e,"deno.json"))||s(a.join(e,"deno.jsonc"))?r==="init"||r==="dev"||r==="test"||r==="start":r==="init"&&s(a.join(e,"package.json"));case "bun":return s(a.join(e,"bunfig.toml"))||s(a.join(e,"bun.lock"))?r==="init"||r==="dev"||r==="test"||r==="build"||r==="start":r==="init"&&s(a.join(e,"package.json"));default:return false}}function _(e,t,r,n){if(E(t,r))return me(e,r);if(!w(t))return Le(e,t,r);switch(t){case "node":return Fe(e,r,n);case "python":return me(e,r);case "go":return Me(e,r);case "java":return _e(e,r);case "dotnet":return Ae(e,r);default:return false}}function De(e,t,r){return ["init","dev","start","build","test","lint","format"].filter(i=>_(e,t,i,r))}function ce(e){let t=Z({runtime:e.runtime,moduleSupport:e.moduleSupport});if(!e.projectPath)return t;let r=De(e.projectPath,e.runtime,e.framework),n=new Set(["help"]);for(let m of r)t.lifecycleCommands.includes(m)&&n.add(m);e.runtime==="node"&&B(e.projectPath)&&n.add("init");let i=[...n].sort();return {lifecycleCommands:i,moduleCommands:t.moduleCommands,unsupportedLifecycleCommands:t.lifecycleCommands.filter(m=>!i.includes(m)).sort()}}var W=["version","commands","doctor","project","help"],A=["init","dev","start","build","test","lint","format"],$=["add","modules","upgrade","diff","merge","reconcile","rollback","uninstall","checkpoint","snapshot","optimize"],J=["create","list","info","frameworks","license"];W.filter(e=>e!=="help");function Te(e){let t=a.resolve(e);for(;;){if([...p(t,"project.json"),...p(t,"context.json")].some(i=>T.existsSync(i)))return t;let n=a.dirname(t);if(n===t)break;t=n;}return null}function N(e,t){return {command:e,...t}}var Ie=new Set(["dev","lint","format"]),Ke=new Set(I);function Be(e,t){return t?Ke.has(e)?{executionScope:"fleet",fleetEligible:true}:Ie.has(e)?{executionScope:"local-only",fleetEligible:false}:{executionScope:"local-only",fleetEligible:false}:{executionScope:"local-only",fleetEligible:false}}function Ge(e,t){return E(t.runtime,e)?"core":"runtime"}function Ue(e,t,r,n){return !e||!n.lifecycleCommands.includes(t)?false:_(e,r.runtime,t,r.key)}function We(e,t){let r=!!e&&(t.runtime==="python"||w(t.runtime)&&_(e,t.runtime,"build",t.key));return N("docs",{owner:t.runtime==="python"?"core":"runtime",status:r?"supported":"unsupported",reason:r?t.runtime==="python"?"Documentation generation is delegated to Python Core for this project.":"Project documentation commands are available through the npm wrapper for this runtime.":"Documentation commands require a supported Python or npm-executor project manifest."})}function $e(e){let t=a.resolve(e),r=Te(e);return r||(h$1(t).length>0?t:null)}function Je(e=process.cwd()){let t=$e(e),r=t?ne(t):null,n=r?.detection??i(e,r?.projectJson??null),i$1=r?.moduleSupport??false,m=r?.engine??"unknown",f=se(n.runtime),C=x(n.runtime),pe=ce({runtime:n.runtime,moduleSupport:i$1,projectPath:t??void 0,framework:n.key}),g={};for(let o of W)g[o]=N(o,{owner:o==="project"?"core":"npm",status:"supported",reason:o==="project"?"Project detection is a Core contract; workspace project lifecycle remains npm-owned.":o==="help"?"Help is available for every Workspai project through the npm CLI.":"Universal command available across Workspai project types."});for(let o of A){let k=Ue(t,o,n,pe),Y=Ge(o,n),F=Be(o,k);g[o]=N(o,{owner:Y,status:k?"supported":"unsupported",executionScope:F.executionScope,fleetEligible:F.fleetEligible,reason:k?Y==="core"?`Delegated to Python Core for ${n.displayName} projects.`:F.fleetEligible?`Handled by runtime adapter and eligible for workspace fleet stages (${o}).`:o==="dev"?"Local development command only; workspace fleet excludes dev by design.":n.runtime==="node"?`Handled by npm/pnpm/yarn via the resolved ${o} script in package.json.`:`Handled by the ${f?.displayName??n.displayName} runtime adapter for local project execution.`:t?n.runtime==="node"?`No ${o} script was found in package.json for this ${n.displayName} project.`:w(n.runtime)?`The ${n.displayName} runtime is tracked, but ${o} is not available from detected project manifests.`:`${n.displayName} is tracked as an observed runtime; ${o} requires project manifests or explicit scripts.`:"No Workspai project was detected."});}g.docs=We(t,n);for(let o of $)g[o]=N(o,{owner:i$1?"core":"none",status:i$1?"supported":"unsupported",reason:i$1?"Core module/template command supported for this project.":`Core module/template commands are not available for ${n.displayName} projects.`});for(let o of J)g[o]=N(o,{owner:o==="create"?"npm":"core",status:"global",reason:o==="create"?"Create is orchestrated by npm for multi-language workspace support.":"Engine catalog command; not specific to the selected project runtime."});let v=Object.values(g),q=v.filter(o=>A.includes(o.command)).filter(o=>o.status==="supported"),le=I.filter(o=>q.some(k=>k.fleetEligible===true&&k.command===o)),ue=q.filter(o=>o.executionScope==="local-only").map(o=>o.command).sort();return {schemaVersion:1,scope:"project",projectRoot:t,engine:m,runtime:n.runtime,framework:n.key,frameworkDisplayName:n.displayName,frameworkConfidence:n.confidence,frameworkSupportTier:Q(n.key),runtimeSupportTier:C.tier,runtimeDoctorSupport:C.doctorSupport,moduleSupport:i$1,fleetStages:le,localOnlyCommands:ue,commandMap:g,supportedCommands:v.filter(o=>o.status==="supported").map(o=>o.command).sort(),unsupportedCommands:v.filter(o=>o.status==="unsupported").map(o=>o.command).sort(),globalCommands:v.filter(o=>o.status==="global").map(o=>o.command).sort()}}function ir(e,t=process.cwd()){let r=e[0];return r?Je(t).commandMap[r]??null:null}function ar(e){if(e[0]==="project"&&e[1]==="commands")return true;if(e[0]==="commands"&&e.includes("--scope")){let t=e.indexOf("--scope");return e[t+1]==="project"}return e.some(t=>t==="--scope=project")&&e[0]==="commands"}function sr(e,t){return [`Workspai command not supported for this project: ${e.command}`,"",`Project: ${t.projectRoot??"not detected"}`,`Runtime: ${t.runtime}`,`Framework: ${t.frameworkDisplayName}`,`Reason: ${e.reason??"Unsupported for this project type."}`,"","Run `workspai project commands` to inspect supported commands for this project."].join(`
1
+ import {a as a$1,c as c$1,i,g,h as h$1}from'./chunk-4KUIFXHM.js';import {p,q}from'./chunk-5XATWNME.js';import T from'fs';import a from'path';import y from'fs-extra';var V=[{id:"fastapi.standard",aliases:["fastapi","fastapi.standard"],label:"fastapi \u2014 FastAPI Standard Kit",description:"Core-backed FastAPI service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"fastapi.ddd",aliases:["fastapi.ddd","fastapi-ddd"],label:"fastapi \u2014 FastAPI DDD Kit",description:"Core-backed FastAPI DDD service scaffold.",owner:"core",runtime:"python",framework:"fastapi",moduleSupport:true,stability:"stable"},{id:"nestjs.standard",aliases:["nestjs","nest","nestjs.standard"],label:"nestjs \u2014 NestJS Standard Kit",description:"Core-backed NestJS service scaffold.",owner:"core",runtime:"node",framework:"nestjs",moduleSupport:true,stability:"stable"},{id:"springboot.standard",aliases:["spring","springboot","springboot.standard","java"],label:"spring \u2014 Spring Boot Standard Kit",description:"npm-backed Spring Boot service scaffold.",owner:"npm",runtime:"java",framework:"springboot",moduleSupport:false,stability:"stable",generator:"springboot",createUsage:"workspai create project springboot.standard <name> [--java-version <major>] [--spring-boot-version <semver>] [--group-id <com.example>] [--package-name <com.example.app>] [--port <number>]"},{id:"gofiber.standard",aliases:["go","go.standard","fiber","gofiber","gofiber.standard","go/fiber"],label:"go/fiber \u2014 Go Fiber Standard Kit",description:"npm-backed Go Fiber service scaffold.",owner:"npm",runtime:"go",framework:"gofiber",moduleSupport:false,stability:"stable",generator:"gofiber",createUsage:"workspai create project gofiber.standard <name> [--output <dir>]"},{id:"gogin.standard",aliases:["gin","gogin","gogin.standard","go/gin"],label:"go/gin \u2014 Go Gin Standard Kit",description:"npm-backed Go Gin service scaffold.",owner:"npm",runtime:"go",framework:"gogin",moduleSupport:false,stability:"stable",generator:"gogin",createUsage:"workspai create project gogin.standard <name> [--output <dir>]"},{id:"dotnet.webapi.clean",aliases:["dotnet","dotnet.webapi","dotnet.webapi.clean","aspnet","aspnetcore","asp.net","asp.net-core","csharp","c#"],label:"dotnet \u2014 ASP.NET Core Clean Web API",description:"npm-backed ASP.NET Core Web API with clean architecture boundaries.",owner:"npm",runtime:"dotnet",framework:"dotnet",moduleSupport:false,stability:"preview",generator:"dotnet-webapi-clean",createUsage:"workspai create project dotnet.webapi.clean <name> [--target-framework net8.0] [--root-namespace <Company.Product>] [--port <number>]"}],O=new Map;for(let e of V){O.set(e.id.toLowerCase(),e);for(let t of e.aliases)O.set(t.toLowerCase(),e);}function P(e){return e?O.get(e.trim().toLowerCase())??null:null}function qe(e){return P(e)?.id??e}function Ye(){return V.filter(e=>e.owner==="core"||e.generator)}function He(e){return P(e)?.owner==="npm"}async function ze(e,t){if(!e.generator)throw new Error(`Kit is not backed by an npm generator: ${e.id}`);if(e.generator==="gofiber"){let{generateGoFiberKit:r}=await import('./gofiber-standard-I5YPQG5V.js');await r(t.projectPath,{project_name:t.projectName,module_path:t.projectName,skipGit:t.skipGit,skipInstall:t.skipInstall});return}if(e.generator==="gogin"){let{generateGoGinKit:r}=await import('./gogin-standard-VY2L4QT5.js');await r(t.projectPath,{project_name:t.projectName,module_path:t.projectName,skipGit:t.skipGit,skipInstall:t.skipInstall});return}if(e.generator==="springboot"){let{generateSpringBootKit:r}=await import('./springboot-standard-55XKCBIZ.js');await r(t.projectPath,{project_name:t.projectName,artifact_id:t.projectName,java_version:c(t.args,"--java-version")?.trim(),spring_boot_version:c(t.args,"--spring-boot-version")?.trim(),springdoc_version:c(t.args,"--springdoc-version")?.trim(),group_id:c(t.args,"--group-id")?.trim(),package_name:c(t.args,"--package-name")?.trim(),description:c(t.args,"--description")?.trim(),port:c(t.args,"--port")?.trim(),skipGit:t.skipGit,skipInstall:t.skipInstall});return}if(e.generator==="dotnet-webapi-clean"){let{generateDotnetWebApiCleanKit:r}=await import('./dotnet-webapi-clean-A6MVDYXX.js');await r(t.projectPath,{project_name:t.projectName,target_framework:c(t.args,"--target-framework")?.trim(),root_namespace:c(t.args,"--root-namespace")?.trim(),description:c(t.args,"--description")?.trim(),port:c(t.args,"--port")?.trim(),skipGit:t.skipGit,skipInstall:t.skipInstall});return}throw new Error(`Unhandled npm kit generator: ${e.generator}`)}function c(e,t){let r=e.indexOf(t);if(r>=0&&r+1<e.length)return e[r+1];let n=e.find(i=>i.startsWith(`${t}=`));return n?n.slice(t.length+1):void 0}var j=["init","dev","start","build","test","lint","format","help"],X={python:{runtime:"python",displayName:"Python",tier:"first-class",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:true,doctorSupport:"full",notes:["Core-backed Python projects support RapidKit Core modules and lifecycle commands."]},node:{runtime:"node",displayName:"Node.js",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:true,doctorSupport:"full",notes:["Node projects support npm-owned lifecycle commands; NestJS is the first-class Node framework."]},go:{runtime:"go",displayName:"Go",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:false,doctorSupport:"readiness",notes:["Go projects support workspace governance and lifecycle commands via Go tooling."]},java:{runtime:"java",displayName:"Java / Spring Boot",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:false,doctorSupport:"readiness",notes:["Java projects support Maven/Gradle lifecycle commands and workspace governance."]},dotnet:{runtime:"dotnet",displayName:".NET / ASP.NET Core",tier:"extended",scaffoldSupport:true,importSupport:true,lifecycleCommands:j,moduleCommands:false,doctorSupport:"readiness",notes:[".NET projects support dotnet CLI lifecycle commands and workspace governance."]},php:{runtime:"php",displayName:"PHP",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["PHP projects are importable and governed as observed projects until a kit exists."]},ruby:{runtime:"ruby",displayName:"Ruby",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Ruby projects are importable and governed as observed projects until a kit exists."]},rust:{runtime:"rust",displayName:"Rust",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Rust projects are importable and governed as observed projects until a kit exists."]},elixir:{runtime:"elixir",displayName:"Elixir",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Elixir projects are importable and governed as observed projects until a kit exists."]},clojure:{runtime:"clojure",displayName:"Clojure",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Clojure projects are importable and governed as observed projects until a kit exists."]},scala:{runtime:"scala",displayName:"Scala",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Scala projects are importable and governed as observed projects until a kit exists."]},kotlin:{runtime:"kotlin",displayName:"Kotlin",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Kotlin projects are importable and governed as observed projects until a kit exists."]},deno:{runtime:"deno",displayName:"Deno",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Deno projects are importable and governed as observed projects until a kit exists."]},bun:{runtime:"bun",displayName:"Bun",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Bun projects are importable and governed as observed projects until a kit exists."]},unknown:{runtime:"unknown",displayName:"Unknown",tier:"observed",scaffoldSupport:false,importSupport:true,lifecycleCommands:["help"],moduleCommands:false,doctorSupport:"observed",notes:["Unknown projects are tracked safely but require manual command configuration."]}},fe=["fastapi","nestjs"],ge=["django","flask","nextjs","remix","nuxt","react","vite","vue","sveltekit","svelte","angular","astro","solid","express","fastify","koa","echo","gofiber","gogin","springboot","dotnet","laravel","symfony","rails","sinatra","actix","axum","rocket","phoenix","clojure","scala","kotlin","deno","bun"];function x(e){return X[e||"unknown"]??X.unknown}function Q(e){return fe.includes(e)?"first-class":ge.includes(e)?"extended":"observed"}function Z(e){let t=x(e.runtime);return {lifecycleCommands:t.lifecycleCommands,moduleCommands:e.moduleSupport&&t.moduleCommands,unsupportedLifecycleCommands:j.filter(r=>!t.lifecycleCommands.includes(r))}}var ye=["python","node","go","java","dotnet"];function w(e){return !!e&&ye.includes(e)}function E(e,t){return t!=="lint"&&t!=="format"&&t!=="docs"?false:e==="python"}function ee(e){let t=x(e),r=w(t.runtime),n=be[t.runtime]??[],i=Ce[t.runtime]??[];return {runtime:t.runtime,displayName:t.displayName,lifecycleCommands:t.lifecycleCommands,hasExecutor:r,packageManagers:n,primaryFiles:i,notes:t.notes}}var be={python:["poetry","pip","uv"],node:["npm","pnpm","yarn","bun"],go:["go"],java:["maven","gradle"],dotnet:["dotnet"],php:["composer"],ruby:["bundle"],rust:["cargo"],elixir:["mix"],kotlin:["gradle"],deno:["deno"],bun:["bun"]},Ce={python:["pyproject.toml","requirements.txt","requirements.in"],node:["package.json"],go:["go.mod"],java:["pom.xml","build.gradle","build.gradle.kts"],dotnet:["*.csproj","*.sln"],php:["composer.json"],ruby:["Gemfile"],rust:["Cargo.toml"],elixir:["mix.exs"],kotlin:["settings.gradle.kts"],deno:["deno.json","deno.jsonc"],bun:["package.json","bunfig.toml"]};function h(e,t){let r=g({runtime:typeof e?.runtime=="string"?e.runtime:void 0,framework:typeof e?.framework=="string"?e.framework:void 0,kitName:typeof e?.kit_name=="string"?e.kit_name:typeof e?.kit=="string"?e.kit:void 0});return r.runtime!=="unknown"?r.runtime:i(t,e).runtime}function re(e){let t=e;for(;;){for(let n of p(t,"project.json"))if(T.existsSync(n))try{return JSON.parse(T.readFileSync(n,"utf8"))}catch{return null}let r=a.dirname(t);if(r===t)break;t=r;}return null}function st(e,t){return h(e,t)==="go"}function mt(e,t){return h(e,t)==="node"}function ct(e,t){return h(e,t)==="java"}function dt(e,t){return h(e,t)==="dotnet"}function pt(e,t){return h(e,t)==="python"}var Se=["project.json","context.json","file-hashes.json"];async function jt(e){let t=a.resolve(e),r=[];for(let n of Se){let i=q(t,n);if(await y.pathExists(i))continue;let m=a.join(t,".rapidkit",n);if(!await y.pathExists(m))continue;let f=await y.readJson(m);await y.ensureDir(a.dirname(i));let C=`${i}.${process.pid}.${Date.now()}.tmp`;try{await y.writeJson(C,f,{spaces:2}),await y.move(C,i,{overwrite:false}),r.push(i);}finally{await y.remove(C).catch(()=>{});}}return r}function je(e){for(let t of p(e,"context.json"))if(T.existsSync(t))try{return JSON.parse(T.readFileSync(t,"utf8"))}catch{return null}return null}function we(e){let t=e?.engine;return t==="npm"||t==="pip"||t==="python"?t:"unknown"}function xe(e,t){if(e?.module_support===false||t?.module_support===false||!e&&t)return false;let r=typeof e?.kit_name=="string"?e.kit_name:typeof e?.kit=="string"?e.kit:typeof t?.kit=="string"?t.kit:void 0,n=r?P(r):void 0;return n?.owner==="core"&&n.moduleSupport===true}function he(e,t,r){let n=g({runtime:typeof t?.runtime=="string"?t.runtime:typeof r?.runtime=="string"?r.runtime:void 0,framework:typeof t?.framework=="string"?t.framework:typeof r?.framework=="string"?r.framework:void 0,kitName:typeof t?.kit_name=="string"?t.kit_name:typeof t?.kit=="string"?t.kit:typeof r?.kit=="string"?r.kit:void 0});return n.key!=="unknown"?n:i(e,t)}function ne(e){let t=a.resolve(e);if(![...p(t,"project.json"),...p(t,"context.json")].some(f=>T.existsSync(f)))return null;let n=re(t),i=je(t),m=he(t,n,i);return {projectRoot:t,projectJson:n,contextJson:i,detection:m,moduleSupport:xe(n,i),engine:we(i)}}var Ne=["build","dev","start","test","lint","format"],I=["init","test","build","start"],ht=["lint","format","docs"];function Nt(e){return !!e&&Ne.includes(e)}var ve={dev:["dev","start:dev"],start:["start","start:prod","preview"],build:["build"],test:["test","test:unit","test:ci"],lint:["lint"],format:["format","prettier"]},ie={nestjs:{dev:["dev","start:dev"],start:["start","start:prod"],build:["build"],test:["test","test:e2e"],lint:["lint"],format:["format"]},express:{dev:["dev","start:dev"],start:["start"],build:["build"],test:["test"],lint:["lint"],format:["format"]},fastify:{dev:["dev","start:dev"],start:["start"],build:["build"],test:["test"],lint:["lint"],format:["format"]},koa:{dev:["dev","start:dev"],start:["start"],build:["build"],test:["test"],lint:["lint"],format:["format"]}};function Re(e){let t=a.join(e,"package.json");if(!T.existsSync(t))return {};try{let n=JSON.parse(T.readFileSync(t,"utf8")).scripts??{};return Object.fromEntries(Object.entries(n).filter(i=>typeof i[1]=="string"))}catch{return {}}}function Pe(e,t){let r=t?c$1(t):"unknown",n=r!=="unknown"?a$1(r,e):[],i=t?ie[t]?.[e]??[]:[],m=ve[e]??[],f=[...n,...i,...m];return [...new Set(f)]}function ae(e,t,r){let n=Re(e),i=new Set(Object.keys(n));if(i.has(t))return {scriptName:t,source:"package.json"};for(let m of Pe(t,r?.framework))if(i.has(m))return {scriptName:m,source:a$1(c$1(r?.framework??"unknown"),t).includes(m)||ie[r?.framework??""]?.[t]?.includes(m)?"framework-candidate":"generic-candidate"};return null}function B(e){return T.existsSync(a.join(e,"package.json"))}function se(e){let t=ee(e);return t.runtime==="unknown"&&e!=="unknown"?null:{runtime:t.runtime,displayName:t.displayName,supportedCommands:t.lifecycleCommands,packageManagers:t.packageManagers,primaryFiles:t.primaryFiles,notes:t.notes,hasExecutor:t.hasExecutor}}function s(e){try{return T.existsSync(e)}catch{return false}}function b(e){try{return s(e)?T.readFileSync(e,"utf8"):""}catch{return ""}}function u(e,t){let r=b(a.join(e,"Makefile"));return r?new RegExp(`^${t}\\s*:`).test(r):false}function Ee(e){let t=[e];for(;t.length>0;){let r=t.shift();if(!r)break;let n=[];try{n=T.readdirSync(r,{withFileTypes:true});}catch{continue}for(let i of n){if(i.name==="node_modules"||i.name===".git"||i.name==="dist")continue;let m=a.join(r,i.name);if(i.isFile()&&i.name.endsWith(".csproj"))return true;i.isDirectory()&&t.push(m);}}return false}function me(e,t){let r=s(a.join(e,"pyproject.toml")),n=s(a.join(e,"requirements.txt"))||s(a.join(e,"requirements.in")),i=s(a.join(e,"manage.py"));switch(t){case "init":return r||n;case "dev":case "start":return r||i||n;case "test":return r||n||s(a.join(e,"tests"));case "build":return r||n;case "lint":case "format":return r||n||i||s(a.join(e,"setup.py"))||s(a.join(e,"setup.cfg"));default:return false}}function Me(e,t){if(!s(a.join(e,"go.mod")))return false;switch(t){case "init":return true;case "dev":return u(e,"run")||s(a.join(e,"main.go"));case "test":return true;case "build":return true;case "start":return u(e,"run")||s(a.join(e,"main.go"))||s(a.join(e,"cmd"));case "lint":return s(a.join(e,".golangci.yml"))||s(a.join(e,".golangci.yaml"))||u(e,"lint");case "format":return u(e,"fmt")||u(e,"format");default:return false}}function _e(e,t){let r=s(a.join(e,"pom.xml")),n=s(a.join(e,"build.gradle"))||s(a.join(e,"build.gradle.kts"));if(!r&&!n)return false;switch(t){case "init":case "test":case "build":case "dev":case "start":return true;case "lint":return u(e,"lint")||b(a.join(e,"pom.xml")).includes("checkstyle")||b(a.join(e,"build.gradle")).includes("checkstyle")||b(a.join(e,"build.gradle.kts")).includes("checkstyle");case "format":return u(e,"format")||b(a.join(e,"build.gradle")).includes("spotless")||b(a.join(e,"build.gradle.kts")).includes("spotless");default:return false}}function Ae(e,t){if(!Ee(e))return false;switch(t){case "init":case "dev":case "test":case "build":case "start":return true;case "lint":return u(e,"lint")||b(a.join(e,"Directory.Build.props")).includes("EnforceCodeStyleInBuild");case "format":return u(e,"format")||s(a.join(e,".editorconfig"));default:return false}}function Fe(e,t,r){return t==="init"?B(e):ae(e,t,{framework:r})!==null}function Le(e,t,r){switch(t){case "php":return r==="init"&&s(a.join(e,"composer.json"));case "ruby":return r==="init"&&s(a.join(e,"Gemfile"));case "rust":return s(a.join(e,"Cargo.toml"))?r==="init"||r==="test"||r==="build"||r==="start":false;case "elixir":return r==="init"&&s(a.join(e,"mix.exs"));case "deno":return s(a.join(e,"deno.json"))||s(a.join(e,"deno.jsonc"))?r==="init"||r==="dev"||r==="test"||r==="start":r==="init"&&s(a.join(e,"package.json"));case "bun":return s(a.join(e,"bunfig.toml"))||s(a.join(e,"bun.lock"))?r==="init"||r==="dev"||r==="test"||r==="build"||r==="start":r==="init"&&s(a.join(e,"package.json"));default:return false}}function _(e,t,r,n){if(E(t,r))return me(e,r);if(!w(t))return Le(e,t,r);switch(t){case "node":return Fe(e,r,n);case "python":return me(e,r);case "go":return Me(e,r);case "java":return _e(e,r);case "dotnet":return Ae(e,r);default:return false}}function De(e,t,r){return ["init","dev","start","build","test","lint","format"].filter(i=>_(e,t,i,r))}function ce(e){let t=Z({runtime:e.runtime,moduleSupport:e.moduleSupport});if(!e.projectPath)return t;let r=De(e.projectPath,e.runtime,e.framework),n=new Set(["help"]);for(let m of r)t.lifecycleCommands.includes(m)&&n.add(m);e.runtime==="node"&&B(e.projectPath)&&n.add("init");let i=[...n].sort();return {lifecycleCommands:i,moduleCommands:t.moduleCommands,unsupportedLifecycleCommands:t.lifecycleCommands.filter(m=>!i.includes(m)).sort()}}var W=["version","commands","doctor","project","help"],A=["init","dev","start","build","test","lint","format"],$=["add","modules","upgrade","diff","merge","reconcile","rollback","uninstall","checkpoint","snapshot","optimize"],J=["create","list","info","frameworks","license"];W.filter(e=>e!=="help");function Te(e){let t=a.resolve(e);for(;;){if([...p(t,"project.json"),...p(t,"context.json")].some(i=>T.existsSync(i)))return t;let n=a.dirname(t);if(n===t)break;t=n;}return null}function N(e,t){return {command:e,...t}}var Ie=new Set(["dev","lint","format"]),Ke=new Set(I);function Be(e,t){return t?Ke.has(e)?{executionScope:"fleet",fleetEligible:true}:Ie.has(e)?{executionScope:"local-only",fleetEligible:false}:{executionScope:"local-only",fleetEligible:false}:{executionScope:"local-only",fleetEligible:false}}function Ge(e,t){return E(t.runtime,e)?"core":"runtime"}function Ue(e,t,r,n){return !e||!n.lifecycleCommands.includes(t)?false:_(e,r.runtime,t,r.key)}function We(e,t){let r=!!e&&(t.runtime==="python"||w(t.runtime)&&_(e,t.runtime,"build",t.key));return N("docs",{owner:t.runtime==="python"?"core":"runtime",status:r?"supported":"unsupported",reason:r?t.runtime==="python"?"Documentation generation is delegated to Python Core for this project.":"Project documentation commands are available through the npm wrapper for this runtime.":"Documentation commands require a supported Python or npm-executor project manifest."})}function $e(e){let t=a.resolve(e),r=Te(e);return r||(h$1(t).length>0?t:null)}function Je(e=process.cwd()){let t=$e(e),r=t?ne(t):null,n=r?.detection??i(e,r?.projectJson??null),i$1=r?.moduleSupport??false,m=r?.engine??"unknown",f=se(n.runtime),C=x(n.runtime),pe=ce({runtime:n.runtime,moduleSupport:i$1,projectPath:t??void 0,framework:n.key}),g={};for(let o of W)g[o]=N(o,{owner:o==="project"?"core":"npm",status:"supported",reason:o==="project"?"Project detection is a Core contract; workspace project lifecycle remains npm-owned.":o==="help"?"Help is available for every Workspai project through the npm CLI.":"Universal command available across Workspai project types."});for(let o of A){let k=Ue(t,o,n,pe),Y=Ge(o,n),F=Be(o,k);g[o]=N(o,{owner:Y,status:k?"supported":"unsupported",executionScope:F.executionScope,fleetEligible:F.fleetEligible,reason:k?Y==="core"?`Delegated to Python Core for ${n.displayName} projects.`:F.fleetEligible?`Handled by runtime adapter and eligible for workspace fleet stages (${o}).`:o==="dev"?"Local development command only; workspace fleet excludes dev by design.":n.runtime==="node"?`Handled by npm/pnpm/yarn via the resolved ${o} script in package.json.`:`Handled by the ${f?.displayName??n.displayName} runtime adapter for local project execution.`:t?n.runtime==="node"?`No ${o} script was found in package.json for this ${n.displayName} project.`:w(n.runtime)?`The ${n.displayName} runtime is tracked, but ${o} is not available from detected project manifests.`:`${n.displayName} is tracked as an observed runtime; ${o} requires project manifests or explicit scripts.`:"No Workspai project was detected."});}g.docs=We(t,n);for(let o of $)g[o]=N(o,{owner:i$1?"core":"none",status:i$1?"supported":"unsupported",reason:i$1?"Core module/template command supported for this project.":`Core module/template commands are not available for ${n.displayName} projects.`});for(let o of J)g[o]=N(o,{owner:o==="create"?"npm":"core",status:"global",reason:o==="create"?"Create is orchestrated by npm for multi-language workspace support.":"Engine catalog command; not specific to the selected project runtime."});let v=Object.values(g),q=v.filter(o=>A.includes(o.command)).filter(o=>o.status==="supported"),le=I.filter(o=>q.some(k=>k.fleetEligible===true&&k.command===o)),ue=q.filter(o=>o.executionScope==="local-only").map(o=>o.command).sort();return {schemaVersion:1,scope:"project",projectRoot:t,engine:m,runtime:n.runtime,framework:n.key,frameworkDisplayName:n.displayName,frameworkConfidence:n.confidence,frameworkSupportTier:Q(n.key),runtimeSupportTier:C.tier,runtimeDoctorSupport:C.doctorSupport,moduleSupport:i$1,fleetStages:le,localOnlyCommands:ue,commandMap:g,supportedCommands:v.filter(o=>o.status==="supported").map(o=>o.command).sort(),unsupportedCommands:v.filter(o=>o.status==="unsupported").map(o=>o.command).sort(),globalCommands:v.filter(o=>o.status==="global").map(o=>o.command).sort()}}function ir(e,t=process.cwd()){let r=e[0];return r?Je(t).commandMap[r]??null:null}function ar(e){if(e[0]==="project"&&e[1]==="commands")return true;if(e[0]==="commands"&&e.includes("--scope")){let t=e.indexOf("--scope");return e[t+1]==="project"}return e.some(t=>t==="--scope=project")&&e[0]==="commands"}function sr(e,t){return [`Workspai command not supported for this project: ${e.command}`,"",`Project: ${t.projectRoot??"not detected"}`,`Runtime: ${t.runtime}`,`Framework: ${t.frameworkDisplayName}`,`Reason: ${e.reason??"Unsupported for this project type."}`,"","Run `workspai project commands` to inspect supported commands for this project."].join(`
2
2
  `)}export{P as a,qe as b,Ye as c,He as d,ze as e,x as f,Q as g,w as h,re as i,st as j,mt as k,ct as l,dt as m,pt as n,jt as o,ne as p,Ne as q,ht as r,Nt as s,ae as t,ce as u,Te as v,Je as w,ir as x,ar as y,sr as z};
@@ -1 +1 @@
1
- import {b}from'./chunk-COARSXRC.js';import {a,b as b$1}from'./chunk-S5KTATOU.js';function f(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,b(n));return s}function j(r){let s=f(r),n=r.graph??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??b({missing:t.id}),g=[...b$1(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,l)=>c.localeCompare(l)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:b({own:e,dependencies:g})});}return o}function v(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function w(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{f as a,j as b,v as c,w as d};
1
+ import {b}from'./chunk-J5ENLXDF.js';import {a,b as b$1}from'./chunk-S5KTATOU.js';function f(r){let s=new Map;for(let n of r.projects)s.has(n.name)||s.set(n.name,b(n));return s}function j(r){let s=f(r),n=r.graph??{nodes:r.projects.map(t=>({id:t.name,path:t.path})),edges:[]},a$1=a(n),o=new Map;for(let t of n.nodes){let e=s.get(t.id)??b({missing:t.id}),g=[...b$1(a$1,[t.id],{direction:"dependencies"}).keys()].filter(c=>c!==t.id).sort((c,l)=>c.localeCompare(l)).map(c=>({id:c,hash:s.get(c)??"<unknown>"}));o.set(t.id,{id:t.id,ownHash:e,transitiveInputsHash:b({own:e,dependencies:g})});}return o}function v(r,s){if(!s||Object.keys(s).length===0)return {verdict:"unknown",baseline:"none",changed:[],added:[],removed:[]};let n=[],a=[];for(let[e,i]of r.entries())e in s?s[e]!==i.transitiveInputsHash&&n.push(e):a.push(e);let o=[];for(let e of Object.keys(s))r.has(e)||o.push(e);return n.sort((e,i)=>e.localeCompare(i)),a.sort((e,i)=>e.localeCompare(i)),o.sort((e,i)=>e.localeCompare(i)),{verdict:n.length>0||a.length>0||o.length>0?"stale":"fresh",baseline:"recorded",changed:n,added:a,removed:o}}function w(r){let s={};for(let[n,a]of [...r.entries()].sort((o,t)=>o[0].localeCompare(t[0])))s[n]=a.transitiveInputsHash;return s}export{f as a,j as b,v as c,w as d};