workspai 0.49.0 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -434
- package/contracts/analyze-last-run.v1.json +2 -2
- package/contracts/artifact-remediation-plan.v1.json +3 -9
- package/contracts/autopilot-release.v1.json +2 -0
- package/contracts/bootstrap-compliance.v1.json +2 -1
- package/contracts/cli-log-event.v1.json +1 -1
- package/contracts/cli-runtime-command-inventory.v1.snapshot.json +80 -0
- package/contracts/compatibility-matrix.v1.json +2 -0
- package/contracts/create-planner-capabilities.v1.json +153 -32
- package/contracts/doctor-project-evidence.v1.json +191 -11
- package/contracts/doctor-project-scan.v2.json +2 -0
- package/contracts/doctor-remediation-plan.v1.json +2 -2
- package/contracts/doctor-remediation-plan.v2.json +2 -2
- package/contracts/doctor-workspace-cache.v2.json +2 -0
- package/contracts/doctor-workspace-evidence.v1.json +189 -10
- package/contracts/extension-cli-compatibility.v1.json +10 -1
- package/contracts/infra-plan.v1.json +2 -0
- package/contracts/ingestion-plan.v1.json +85 -0
- package/contracts/ingestion-result.v1.json +59 -0
- package/contracts/mirror-ops.v1.json +2 -1
- package/contracts/pipeline-last-run.v1.json +2 -2
- package/contracts/private-product-manifest.v1.json +2 -0
- package/contracts/product-factory-plan.v1.json +2 -0
- package/contracts/project-archive.v1.json +2 -0
- package/contracts/project-entry-capability.v1.json +2 -3
- package/contracts/project-test-coverage.v1.json +189 -0
- package/contracts/project-workspace-link.v1.json +66 -0
- package/contracts/project-workspace-resolution.v1.json +28 -0
- package/contracts/published-contract-catalog.v1.json +45 -0
- package/contracts/release-readiness.v1.json +2 -2
- package/contracts/runtime-command-surface.v1.json +1456 -139
- package/contracts/transparency-evidence.v1.json +2 -1
- package/contracts/workspace-archive-capabilities.v1.json +11 -5
- package/contracts/workspace-archive-manifest.v1.json +236 -0
- package/contracts/workspace-archive-operation-result.v1.json +236 -0
- package/contracts/workspace-contract.v1.json +1 -1
- package/contracts/workspace-intelligence/agent-action-outcome.v1.json +2 -2
- package/contracts/workspace-intelligence/agent-customization-pack-report.v1.json +1 -1
- package/contracts/workspace-intelligence/agent-hooks.v1.json +2 -0
- package/contracts/workspace-intelligence/agent-reports-index.v1.json +1 -1
- package/contracts/workspace-intelligence/blocker-resolution.v1.json +3 -9
- package/contracts/workspace-intelligence/doctor-fix-result.v1.json +2 -2
- package/contracts/workspace-intelligence/doctor-graph-diagnosis.v1.json +208 -0
- package/contracts/workspace-intelligence/fact-freshness.v1.json +2 -2
- package/contracts/workspace-intelligence/mcp-design.v1.json +2 -0
- package/contracts/workspace-intelligence/model-usage-event.v1.json +1 -1
- package/contracts/workspace-intelligence/project-context-agent.v1.json +360 -0
- package/contracts/workspace-intelligence/studio-blocker-handoff.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-context.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-contract-verify.v1.json +2 -2
- package/contracts/workspace-intelligence/workspace-dependency-graph.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-explain.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-graph-stream.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-graph-token-efficiency.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-impact.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-evaluation-comparison.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-history.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-intelligence-run.v1.json +2 -2
- package/contracts/workspace-intelligence/workspace-knowledge-graph-change-overlay.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-knowledge-graph.v1.json +48 -5
- package/contracts/workspace-intelligence/workspace-knowledge-search.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-model-diff.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-model-snapshot.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-model.v1.json +97 -5
- package/contracts/workspace-intelligence/workspace-operational-skill.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-skills-index.v1.json +1 -1
- package/contracts/workspace-intelligence/workspace-verify.v1.json +1 -1
- package/contracts/workspace-intelligence-architecture.v1.json +33 -7
- package/contracts/workspace-intelligence-chain.v1.json +1 -1
- package/contracts/workspace-list.v1.json +2 -0
- package/contracts/workspace-model-cache.v1.json +2 -0
- package/contracts/workspace-registry.v1.json +1 -1
- package/contracts/workspace-run-last.v1.json +1 -1
- package/contracts/workspace-share-bundle.v1.json +2 -1
- package/contracts/workspace-snapshot.v1.json +2 -0
- package/contracts/workspace-snapshot.v2.json +2 -0
- package/contracts/workspace-sync.v1.json +2 -0
- package/contracts/workspace-watch-event.v1.json +2 -0
- package/dist/analyze-4H33PAUB.js +1 -0
- package/dist/{artifact-remediation-plan-SPOUHMK5.js → artifact-remediation-plan-TQ6KTTXD.js} +1 -1
- package/dist/autopilot-release-BHZYM5KX.js +1 -0
- package/dist/chunk-2D4UOYOJ.js +1 -0
- package/dist/chunk-2OIBHUVH.js +1 -0
- package/dist/chunk-3D2PAIRH.js +3 -0
- package/dist/chunk-3GRKUP5W.js +33 -0
- package/dist/{managed-agent-markers-AXUM75OE.js → chunk-3RBUSW7H.js} +1 -1
- package/dist/chunk-4WJC5QCD.js +2 -0
- package/dist/chunk-6HLPTJZ3.js +13 -0
- package/dist/{chunk-CV5HKU4P.js → chunk-7T4TSV5C.js} +1 -1
- package/dist/chunk-AFIFZTOY.js +2 -0
- package/dist/{chunk-BMWFQXGW.js → chunk-AHLMIL2T.js} +1 -1
- package/dist/chunk-AL237TSJ.js +7 -0
- package/dist/chunk-BBGNDMRU.js +2 -0
- package/dist/chunk-BG4FWJJ3.js +1 -0
- package/dist/{chunk-VU7NZHPM.js → chunk-BHYTI3RH.js} +1 -1
- package/dist/chunk-BYTFXQ6G.js +1 -0
- package/dist/chunk-CZC5P2MF.js +1 -0
- package/dist/chunk-DLM6C7FU.js +8 -0
- package/dist/{chunk-CRHYBQI3.js → chunk-DQ3PI7EP.js} +1 -1
- package/dist/chunk-E3CT7TYT.js +1 -0
- package/dist/chunk-EPVFKJF4.js +1 -0
- package/dist/chunk-EWZZUQBR.js +1 -0
- package/dist/chunk-FKWB66NQ.js +4 -0
- package/dist/{chunk-BGPXQQNY.js → chunk-FZ76CF2W.js} +1 -1
- package/dist/chunk-GBAO4GSW.js +2 -0
- package/dist/chunk-GQRWRHSR.js +86 -0
- package/dist/{chunk-ESLPI3XZ.js → chunk-HE4PUMU4.js} +1 -1
- package/dist/chunk-HMGPELXS.js +1 -0
- package/dist/chunk-HSZCINFX.js +2 -0
- package/dist/{chunk-3VFA7D5T.js → chunk-IND3TUVU.js} +1 -1
- package/dist/{chunk-NHN4QXPP.js → chunk-KVSYBHUR.js} +1 -1
- package/dist/chunk-L2E2Z4OE.js +5 -0
- package/dist/chunk-MAF3LLGK.js +691 -0
- package/dist/chunk-MOSXTVPU.js +1 -0
- package/dist/chunk-MVLIONQD.js +1 -0
- package/dist/chunk-PS5F4DCT.js +1 -0
- package/dist/{chunk-K4X3DM7R.js → chunk-Q6TKQVKQ.js} +1 -1
- package/dist/chunk-RJIYCDVC.js +1 -0
- package/dist/chunk-RVQLMTTI.js +2 -0
- package/dist/chunk-SHXJ2GDR.js +75 -0
- package/dist/chunk-TDTCMZK7.js +10 -0
- package/dist/chunk-TROHVI2V.js +2 -0
- package/dist/chunk-U2LR73E2.js +1 -0
- package/dist/chunk-U2QL5733.js +36 -0
- package/dist/{chunk-TIE2XMGH.js → chunk-VCW5HSPC.js} +12 -12
- package/dist/chunk-VRW6KXNK.js +6 -0
- package/dist/chunk-VU2BKKMB.js +1 -0
- package/dist/chunk-WJVB6SSD.js +16 -0
- package/dist/{chunk-32OJDBIG.js → chunk-XBM2P45G.js} +2 -2
- package/dist/chunk-Y5YAP4F3.js +2 -0
- package/dist/{create-S64IWHAP.js → create-SBFBFXKN.js} +1 -1
- package/dist/{demo-kit-DZ7TPG7K.js → demo-kit-KHH63TNA.js} +2 -2
- package/dist/{doctor-4NNUDNGZ.js → doctor-OPCMTBJB.js} +1 -1
- package/dist/{dotnet-webapi-clean-A6MVDYXX.js → dotnet-webapi-clean-VXEF4SHM.js} +5 -5
- package/dist/{gofiber-standard-I5YPQG5V.js → gofiber-standard-AQGSC7ON.js} +3 -3
- package/dist/{gogin-standard-VY2L4QT5.js → gogin-standard-7DU3OCBX.js} +3 -3
- package/dist/index.d.ts +38 -6
- package/dist/index.js +267 -355
- package/dist/managed-agent-markers-COE5DJ3W.js +1 -0
- package/dist/pipeline-7BUXAFS2.js +5 -0
- package/dist/platform-capabilities-PR6YL4KC.js +1 -0
- package/dist/project-intelligence-lens-BKKVPCLC.js +1 -0
- package/dist/project-test-coverage-BALEHHTT.js +1 -0
- package/dist/{pythonRapidkitExec-CVCIK225.js → pythonRapidkitExec-YR7P5LWG.js} +1 -1
- package/dist/rust-axum-4HXDICIB.js +140 -0
- package/dist/{springboot-standard-55XKCBIZ.js → springboot-standard-EK6GYN5T.js} +7 -7
- package/dist/workspace-U6ZQLELX.js +1 -0
- package/dist/{workspace-agent-sync-662QHXGF.js → workspace-agent-sync-L4SY7B4Q.js} +1 -1
- package/dist/workspace-archive-4JNT4S7N.js +1 -0
- package/dist/workspace-context-KOBSLZTI.js +1 -0
- package/dist/workspace-contract-SOD3OOVF.js +1 -0
- package/dist/workspace-explain-2CTMW2YW.js +1 -0
- package/dist/workspace-explain-contract-H7O26QJU.js +1 -0
- package/dist/{workspace-feedback-SUVH2LUJ.js → workspace-feedback-ZZ4HPW2T.js} +1 -1
- package/dist/{workspace-foundation-WPLD7OEO.js → workspace-foundation-PUIYBQUF.js} +1 -1
- package/dist/workspace-graph-stream-BLKIC7VN.js +1 -0
- package/dist/workspace-graph-token-efficiency-5FNH4JZ5.js +1 -0
- package/dist/{workspace-history-BANOJRQ2.js → workspace-history-SPKNRHIX.js} +1 -1
- package/dist/workspace-intelligence-I3ABOH2F.js +1 -0
- package/dist/{workspace-intelligence-evaluation-IPH7M3WV.js → workspace-intelligence-evaluation-7CABG5Y6.js} +1 -1
- package/dist/workspace-intelligence-runner-Q2XSR3ZL.js +1 -0
- package/dist/workspace-intelligence-runtime-registry-ZZ3GRAL2.js +1 -0
- package/dist/{workspace-knowledge-graph-ARDC6HHG.js → workspace-knowledge-graph-5MKEI4Z5.js} +1 -1
- package/dist/{workspace-knowledge-graph-query-VOSPPH4W.js → workspace-knowledge-graph-query-EKHIE3E2.js} +1 -1
- package/dist/{workspace-marker-SMBC3Z2Q.js → workspace-marker-7NHMDIRL.js} +1 -1
- package/dist/workspace-mcp-serve-ETNUA72W.js +3 -0
- package/dist/workspace-model-HHA37SNH.js +1 -0
- package/dist/workspace-model-hash-ZXYPIGCW.js +1 -0
- package/dist/workspace-onboarding-ELHZABJE.js +1 -0
- package/dist/{workspace-python-engine-state-2MLKJYQG.js → workspace-python-engine-state-J4QKW55K.js} +1 -1
- package/dist/workspace-readme-HGGZ4AZB.js +77 -0
- package/dist/{workspace-registry-summary-ORDK7A36.js → workspace-registry-summary-D2QM5JF6.js} +1 -1
- package/dist/workspace-run-DAAZBCN7.js +1 -0
- package/dist/{workspace-verify-EBVL7FWT.js → workspace-verify-4WJTLXRA.js} +1 -1
- package/dist/workspace-watch-2PIFTQ6B.js +1 -0
- package/docs/GLOSSARY.md +17 -16
- package/docs/OPEN_SOURCE_USER_SCENARIOS.md +8 -3
- package/docs/README.md +6 -3
- package/docs/README_CONTENT_CONTRACT.md +98 -115
- package/docs/ci-workflows.md +13 -4
- package/docs/commands-reference.md +43 -10
- package/docs/contracts/ARTIFACT_CATALOG.md +65 -26
- package/docs/contracts/COMMAND_OWNERSHIP_MATRIX.md +2 -0
- package/docs/contracts/RUNTIME_SUPPORT_MATRIX.md +3 -3
- package/docs/contracts/rapidkit-cli-contracts.json +2 -2
- package/docs/create-planner-capabilities.md +36 -5
- package/docs/creating-workspaces-and-projects.md +59 -3
- package/docs/doctor-command.md +118 -11
- package/docs/from-code-to-shared-understanding.md +4 -1
- package/docs/graph-benchmark-methodology.md +2 -2
- package/docs/workspace-intelligence-evaluation.md +5 -0
- package/docs/workspace-knowledge-graph.md +141 -7
- package/docs/workspace-operations.md +149 -10
- package/package.json +7 -4
- package/scripts/enterprise-package-smoke.mjs +24 -1
- package/templates/kits/fastapi-ddd/README.md.j2 +1 -1
- package/templates/kits/fastapi-standard/README.md.j2 +1 -1
- package/templates/kits/nestjs-standard/Dockerfile.j2 +1 -1
- package/templates/kits/nestjs-standard/README.md.j2 +1 -1
- package/templates/kits/nestjs-standard/package.json.j2 +11 -2
- package/dist/analyze-EEEU3MIF.js +0 -1
- package/dist/autopilot-release-R4XRTWEM.js +0 -1
- package/dist/chunk-22DT744Z.js +0 -1
- package/dist/chunk-37CVKXBD.js +0 -1
- package/dist/chunk-3NU32T4A.js +0 -2
- package/dist/chunk-3ZK2GU7C.js +0 -1
- package/dist/chunk-4HDYADHT.js +0 -13
- package/dist/chunk-4KUIFXHM.js +0 -5
- package/dist/chunk-52PBRX7F.js +0 -1
- package/dist/chunk-54EP5CEV.js +0 -8
- package/dist/chunk-5XATWNME.js +0 -1
- package/dist/chunk-7YHK5NM3.js +0 -2
- package/dist/chunk-AFL3ACCR.js +0 -2
- package/dist/chunk-BFLJ2R4D.js +0 -80
- package/dist/chunk-E2KJ5QWY.js +0 -4
- package/dist/chunk-EKZLUMCS.js +0 -933
- package/dist/chunk-EYJ2CQSK.js +0 -1
- package/dist/chunk-FTY7GGXJ.js +0 -33
- package/dist/chunk-FXQJX34Z.js +0 -1
- package/dist/chunk-GSWPGELT.js +0 -2
- package/dist/chunk-GZTYAEWX.js +0 -1
- package/dist/chunk-HDXNIN4N.js +0 -1
- package/dist/chunk-HZDXO65G.js +0 -36
- package/dist/chunk-J5ENLXDF.js +0 -1
- package/dist/chunk-KB44JP4M.js +0 -2
- package/dist/chunk-LHOZXC2M.js +0 -2
- package/dist/chunk-MER6ZBN2.js +0 -13
- package/dist/chunk-NAJCUQ4X.js +0 -2
- package/dist/chunk-OA537ZQ5.js +0 -1
- package/dist/chunk-OW42TZFB.js +0 -1
- package/dist/chunk-P3D5YQB2.js +0 -1
- package/dist/chunk-PHXQR6PX.js +0 -2
- package/dist/chunk-PRTR2DQ2.js +0 -1
- package/dist/chunk-RHQW3DTP.js +0 -1
- package/dist/chunk-T4YR4RAI.js +0 -2
- package/dist/chunk-WDKNMTJQ.js +0 -1
- package/dist/chunk-Y45WZR5N.js +0 -5
- package/dist/chunk-YJZOMRAS.js +0 -1
- package/dist/pipeline-LHTPE3DR.js +0 -5
- package/dist/platform-capabilities-2B4QMZXE.js +0 -1
- package/dist/workspace-PJPRBUMQ.js +0 -1
- package/dist/workspace-archive-P76EDIUG.js +0 -10
- package/dist/workspace-context-23YYCUCP.js +0 -1
- package/dist/workspace-contract-TU2I7GC2.js +0 -1
- package/dist/workspace-dependency-graph-BP4EXYQ5.js +0 -1
- package/dist/workspace-explain-MWUEN643.js +0 -1
- package/dist/workspace-explain-contract-ZPI3JXJU.js +0 -1
- package/dist/workspace-graph-stream-KAGGQPJT.js +0 -1
- package/dist/workspace-graph-token-efficiency-CFGFCJ5V.js +0 -1
- package/dist/workspace-intelligence-MFJE7W67.js +0 -1
- package/dist/workspace-intelligence-runner-OTYTHV6B.js +0 -1
- package/dist/workspace-mcp-serve-EZR6O76D.js +0 -3
- package/dist/workspace-model-7OU2M3LE.js +0 -1
- package/dist/workspace-model-hash-MHXK5MEI.js +0 -1
- package/dist/workspace-run-QND2SIYA.js +0 -1
- package/dist/workspace-watch-7HWGA5TF.js +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {l}from'./chunk-BYTFXQ6G.js';import {d,c}from'./chunk-EWZZUQBR.js';import {b as b$1,a}from'./chunk-AHLMIL2T.js';import h from'path';import {createHash}from'crypto';import $ from'fs-extra';import {parseAllDocuments}from'yaml';var U=b$1.knowledgeGraph;var Ye=a.knowledgeGraph;function Qe(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}.`);if(e.source.hashAlgorithm!=="sha256")throw new Error(`Workspace knowledge graph source hash algorithm is ${e.source.hashAlgorithm}; expected sha256.`);let o=d(t);if(e.source.hash!==o)throw new Error("Workspace knowledge graph is stale: its source hash does not match the canonical workspace model.");if(e.workspace.name!==t.workspace.name||(e.workspace.profile??void 0)!==(t.workspace.profile??void 0))throw new Error("Workspace knowledge graph identity does not match the canonical workspace model.");let i=l(t);if(!i)throw new Error("Canonical workspace model has no project topology for the workspace knowledge graph.");let r=d=>({...d,generatedAt:"<ignored>"});if(c(r(e.projectTopology))!==c(r(i)))throw new Error("Workspace knowledge graph project topology does not match the canonical workspace model.")}var ue=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","venv","vendor","node_modules","dist","build","target","coverage",".next",".turbo",".cache"]),V=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"]),me=new Set(["get","put","post","delete","options","head","patch","trace"]),L=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 F(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 B(e,t,o){let i=[],r=e.split(/\r?\n/);for(let d=0;d<r.length&&i.length<o;d+=1)for(let s of t){let a=r[d].match(s.pattern)?.[1]?.trim();if(a){i.push({name:a,line:d+1,detail:s.detail});break}}return i}var ge=[{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"}],he=[{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"}];function ke(e,t,o){if(!t.startsWith("."))return null;let i=h.resolve(h.dirname(e),t),r=h.extname(i).toLowerCase(),d=L.has(r),s=new Set([i]);if(d){let n=i.slice(0,-r.length);if([".js",".jsx",".mjs"].includes(r))for(let a of [".ts",".tsx",".js",".jsx",".mjs"])s.add(`${n}${a}`);}else for(let n of L)s.add(`${i}${n}`),s.add(h.join(i,`index${n}`));return [...s].find(n=>o.has(h.resolve(n)))??null}var ye=[{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 z(e){return createHash("sha256").update(e).digest("hex")}function w(e,t){return `wkg:${e}:${z(`${e}\0${t}`).slice(0,20)}`}function K(e){return e.replace(/\\/g,"/")}function N(e){let t=K(e).replace(/^\.\//,"");return !t||t.startsWith("/")||/^[A-Za-z]:\//.test(t)?"unknown":t}function b(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function j(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function E(e){if(Array.isArray(e))return e.filter(o=>typeof o=="string").sort();let t=b(e);return t?Object.keys(t).sort():[]}function ve(e){if(Array.isArray(e))return e.map(o=>typeof o=="string"?o.split("=",1)[0]?.trim():"").filter(o=>!!o).sort();let t=b(e);return t?Object.keys(t).sort():[]}function we(e){return Object.fromEntries(Object.entries(e).filter(t=>t[1]!==void 0).sort(([t],[o])=>t.localeCompare(o)))}async function x(e,t){let o=[],i=[e],r=0;for(;r<i.length&&o.length<t;){let d=i[r++],s;try{s=await $.readdir(d,{withFileTypes:true});}catch{continue}s.sort((n,a)=>n.name.localeCompare(a.name));for(let n of s){if(o.length>=t)break;if(n.isSymbolicLink())continue;let a=h.join(d,n.name);n.isDirectory()?ue.has(n.name)||i.push(a):n.isFile()&&o.push(a);}}return o.sort((d,s)=>d.localeCompare(s))}async function A(e){let t=await $.readFile(e,"utf8");if(e.toLowerCase().endsWith(".json")){let o=JSON.parse(t),i=b(o);return i?[i]:[]}return parseAllDocuments(t,{logLevel:"silent"}).map(o=>b(o.toJSON())).filter(o=>o!==null)}function G(e){return [...new Set([...e.workspaceFiles,...e.projects.flatMap(t=>e.filesByProject.get(t.id)??[])])].sort((t,o)=>t.localeCompare(o))}function Y(e){return /^(?:openapi|swagger)(?:\.[^.]+)?\.(?:json|ya?ml)$/i.test(h.basename(e))}function Q(e){let t=h.basename(e).toLowerCase();return /\.(?:graphql|gql|proto)$/.test(t)||/^asyncapi(?:\.[^.]+)?\.(?:json|ya?ml)$/.test(t)}function X(e){let t=h.basename(e);return /^Dockerfile(?:\..+)?$/i.test(t)||/\.tf$/i.test(t)||t==="Chart.yaml"}function ee(e){return /(?:^|[\\/])(?:README|ARCHITECTURE|CONTRIBUTING|SECURITY)\.md$/i.test(e)}function be(e,t){let o=K(h.relative(e,t));return /^\.github\/workflows\/.+\.ya?ml$/i.test(o)||/^(?:\.gitlab-ci\.ya?ml|azure-pipelines\.ya?ml|Jenkinsfile|bitbucket-pipelines\.ya?ml|\.woodpecker\.ya?ml)$/i.test(o)||/^\.circleci\/config\.ya?ml$/i.test(o)}function te(e,t){let o=K(h.relative(e,t));return /(?:^|\/)(?:adr|adrs|decisions)(?:\/).+\.md$/i.test(o)||/(?:^|\/)ADR[-_0-9].+\.md$/i.test(o)}async function oe(e){let t=new Set;for(let o of [e.workspacePath,...e.projects.map(i=>i.root)])for(let i of ["compose.yml","compose.yaml","docker-compose.yml","docker-compose.yaml"]){let r=h.join(o,i);await $.pathExists(r)&&t.add(r);}return [...t].sort((o,i)=>o.localeCompare(i))}async function re(e){let o=[e.workspacePath,...e.projects.map(r=>r.root)].flatMap(r=>[h.join(r,"CODEOWNERS"),h.join(r,".github","CODEOWNERS"),h.join(r,"docs","CODEOWNERS")]),i=await Promise.all(o.map(async r=>await $.pathExists(r)?r:null));return [...new Set(i.filter(r=>!!r))].sort((r,d)=>r.localeCompare(d))}function se(e){let t=[{root:e.workspacePath,files:e.workspaceFiles},...e.projects.map(o=>({root:o.root,files:e.filesByProject.get(o.id)??[]}))];return [...new Set(t.flatMap(o=>o.files.filter(i=>be(o.root,i))))].sort((o,i)=>o.localeCompare(i))}async function ie(e){let t=[];for(let o of G(e))if(/\.ya?ml$/i.test(o))try{(await A(o)).some(r=>{let d=b(r.metadata);return !!(j(r.apiVersion)&&j(r.kind)&&j(d?.name))})&&t.push(o);}catch{}return t.sort((o,i)=>o.localeCompare(i))}function C(e,t){let o=h.resolve(t);return e.filter(i=>o===i.root||o.startsWith(`${i.root}${h.sep}`)).sort((i,r)=>r.root.length-i.root.length)[0]??null}var q=class{constructor(t,o,i){this.workspacePath=t;this.now=o;this.workspaceName=i;}workspacePath;now;workspaceName;entities=new Map;relations=new Map;proofs=new Map;providers=[];diagnostics=[];contentHashes=new Map;attributeConflicts=new Set;artifactPath(t,o){if(o){let i=K(h.relative(o.root,t));return N(h.posix.join(o.artifactPrefix,i))}return N(h.relative(this.workspacePath,t))}async addProof(t){let o;if(t.absolutePath){if(!this.contentHashes.has(t.absolutePath))try{this.contentHashes.set(t.absolutePath,z(await $.readFile(t.absolutePath)));}catch{this.contentHashes.set(t.absolutePath,null);}o=this.contentHashes.get(t.absolutePath)??void 0;}let i=N(t.artifact),r=w("proof",[t.provider,i,t.pointer??"",t.line??"",t.detail??""].join("\0"));return this.proofs.has(r)||this.proofs.set(r,{id:r,provider:t.provider,artifact:i,...t.pointer?{pointer:t.pointer}:{},...t.line?{line:t.line}:{},...t.column?{column:t.column}:{},...o?{contentHash:o}:{},observedAt:this.now.toISOString(),derivation:t.derivation??"extracted",trust:t.trust??"observed",confidence:t.confidence??"high",freshness:"fresh",...t.detail?{detail:t.detail}:{}}),r}addEntity(t){let o=w(t.kind,t.key),i=we(t.attributes??{}),r=this.entities.get(o),d={...r?.attributes??{}};for(let[a,f]of Object.entries(i)){if(a in d&&JSON.stringify(d[a])!==JSON.stringify(f)){let c=`${o}\0${a}`;this.attributeConflicts.has(c)||(this.attributeConflicts.add(c),this.diagnostics.push({code:"graph.knowledge.attribute_conflict",severity:"warning",message:`Conflicting ${a} values were observed for ${t.kind} ${t.label}.`,entityIds:[o],recommendation:"Inspect the entity proof paths and make the authoritative source explicit."}));continue}d[a]=f;}let s=[...new Set([...r?.identity.aliases??[],...t.aliases??[]])].sort(),n=[...new Set([...r?.proofIds??[],...t.proofIds??[]])].sort();return this.entities.set(o,{id:o,kind:t.kind,label:t.label,...t.projectId?{projectId:t.projectId}:{},identity:{key:t.key,scope:t.projectId?"project":"workspace",aliases:s,fingerprint:z(JSON.stringify({kind:t.kind,key:t.key,attributes:d}))},attributes:d,proofIds:n}),o}addRelation(t){let o=w("relation",`${t.from}\0${t.kind}\0${t.to}`),i=this.relations.get(o),r=[...new Set([...i?.proofIds??[],...t.proofIds])].sort(),d=new Set(r.map(a=>this.proofs.get(a)?.provider).filter(Boolean)).size,s=t.trust??i?.trust??"observed",n=d>=2&&s!=="ambiguous"?"corroborated":s;return this.relations.set(o,{id:o,from:t.from,to:t.to,kind:t.kind,derivation:t.derivation??i?.derivation??"extracted",trust:n,confidence:n==="corroborated"?"high":t.confidence??i?.confidence??"high",proofIds:r}),o}};function Pe(e,t){let o=h.basename(e);try{if(o==="package.json"||o==="composer.json"){let s=JSON.parse(t);return {ecosystem:o==="package.json"?"npm":"composer",name:j(s.name),version:j(s.version),dependencies:[...E(s.dependencies),...E(s.devDependencies),...E(s.require),...E(s["require-dev"])].filter((n,a,f)=>f.indexOf(n)===a).sort()}}if(o==="deno.json"||o==="deno.jsonc"){let s=JSON.parse(t.replace(/\/\*[\s\S]*?\*\/|^\s*\/\/.*$/gm,""));return {ecosystem:"deno",name:j(s.name),version:j(s.version),dependencies:E(s.imports)}}}catch{}let i=s=>t.match(s)?.[1]?.trim();if(o==="pyproject.toml"){let s=t.match(/^dependencies\s*=\s*\[([\s\S]*?)\]/m)?.[1]??"";return {ecosystem:"python",name:i(/^(?:name)\s*=\s*["']([^"']+)["']/m),version:i(/^(?:version)\s*=\s*["']([^"']+)["']/m),dependencies:[...[...s.matchAll(/["']([A-Za-z0-9_.-]+)/g)].map(n=>n[1]),...[...t.matchAll(/^([A-Za-z0-9_.-]+)\s*=\s*(?:["'{[])/gm)].map(n=>n[1]).filter(n=>!["name","version","description","python","dependencies"].includes(n))].filter((n,a,f)=>f.indexOf(n)===a).sort()}}if(o==="go.mod")return {ecosystem:"go",name:i(/^module\s+(\S+)/m),dependencies:[...t.matchAll(/^\s*([A-Za-z0-9_.~/-]+)\s+v\d+/gm)].map(s=>s[1]).sort()};if(o==="Cargo.toml"){let s=t.match(/^\[dependencies\]\s*$([\s\S]*?)(?=^\[|\s*$)/m)?.[1]??"";return {ecosystem:"cargo",name:i(/^name\s*=\s*["']([^"']+)["']/m),version:i(/^version\s*=\s*["']([^"']+)["']/m),dependencies:[...s.matchAll(/^([A-Za-z0-9_.-]+)\s*=/gm)].map(n=>n[1]).sort()}}if(o==="pom.xml")return {ecosystem:"maven",name:i(/<artifactId>([^<]+)<\/artifactId>/),version:i(/<version>([^<]+)<\/version>/),dependencies:[...t.matchAll(/<artifactId>([^<]+)<\/artifactId>/g)].slice(1).map(s=>s[1]).sort()};if(/\.(?:cs|fs|vb)proj$/i.test(o))return {ecosystem:"nuget",name:i(/<AssemblyName>([^<]+)<\/AssemblyName>/)??o.replace(/\.[^.]+$/,""),version:i(/<Version>([^<]+)<\/Version>/),dependencies:[...t.matchAll(/<PackageReference\s+Include=["']([^"']+)["']/g)].map(s=>s[1]).sort()};let r={"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"},d=o==="requirements.txt"?t.split(/\r?\n/).map(s=>s.trim().match(/^([A-Za-z0-9_.-]+)/)?.[1]):o.startsWith("build.gradle")?[...t.matchAll(/(?:implementation|api|compileOnly|runtimeOnly|testImplementation)\s*\(?["']([^:"']+):([^:"']+)/g)].map(s=>`${s[1]}:${s[2]}`):o==="Gemfile"?[...t.matchAll(/^\s*gem\s+["']([^"']+)["']/gm)].map(s=>s[1]):o==="mix.exs"?[...t.matchAll(/\{:\s*([A-Za-z0-9_]+)\s*,/g)].map(s=>s[1]):o==="pubspec.yaml"?[...t.matchAll(/^\s{2}([A-Za-z0-9_]+):\s+/gm)].map(s=>s[1]):o==="Package.swift"?[...t.matchAll(/\.package\s*\(\s*url:\s*["']([^"']+)["']/g)].map(s=>s[1]):o==="CMakeLists.txt"?[...t.matchAll(/find_package\s*\(\s*([A-Za-z0-9_.+-]+)/gi)].map(s=>s[1]):o==="project.clj"||o==="deps.edn"?[...t.matchAll(/\[?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)\s+/g)].map(s=>s[1]):o==="build.sbt"?[...t.matchAll(/["']([^"']+)["']\s*%%?\s*["']([^"']+)["']/g)].map(s=>`${s[1]}:${s[2]}`):[];return {ecosystem:r[o]??"unknown",dependencies:d.filter(s=>!!s).filter((s,n,a)=>a.indexOf(s)===n).sort()}}var je={id:"workspace-foundation",version:"1.0.0",async run(e){let{state:t}=e,o=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"}),i=t.addEntity({kind:"workspace",key:`workspace:${t.workspaceName}`,label:t.workspaceName,aliases:[t.workspaceName],proofIds:[o]});for(let r of e.projects){let d=e.filesByProject.get(r.id)??[],s=d.find(g=>/[\\/]\.(?:workspai|rapidkit)[\\/](?:project|context)\.json$/.test(g)),n=d.find(g=>V.has(h.basename(g))),a=s??n,f=await t.addProof({provider:this.id,artifact:a?t.artifactPath(a,r):N(h.posix.join(r.artifactPrefix,".workspai/project.json")),...a?{absolutePath:a}:{},trust:s?"authoritative":"observed",derivation:s?"authored":"inferred",detail:`Project ${r.id}`}),c=t.addEntity({kind:"project",key:`project:${r.id}`,label:r.id,projectId:r.id,aliases:[r.id,r.path],attributes:{path:r.path,runtime:r.runtime,runtimeCandidates:r.runtimeCandidates,framework:r.framework,kit:r.kit,kind:r.kind,category:r.category},proofIds:[f]});t.addRelation({from:i,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[f]});let m=new Set,l=[];for(let g of d){let u=h.basename(g);if(/^(?:\.env\.example|\.env\.sample|\.env\.template)$/i.test(u))try{let v=await $.readFile(g,"utf8");for(let k of v.split(/\r?\n/)){let P=k.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=/)?.[1];P&&m.add(P);}}catch{}if((/(?:^|[\\/])(?:test|tests|spec|specs|__tests__)(?:[\\/]|$)/i.test(g)||/(?:\.test|\.spec|_test)\.[A-Za-z0-9]+$/i.test(u))&&l.push(g),!(!V.has(u)&&!/\.(?:cs|fs|vb)proj$/i.test(u)))try{let v=await $.readFile(g,"utf8"),k=Pe(g,v),P=await t.addProof({provider:this.id,artifact:t.artifactPath(g,r),absolutePath:g,pointer:"/",confidence:k.name?"high":"medium",detail:`${k.ecosystem} manifest`}),I=t.addEntity({kind:"package",key:`package:${r.id}:${k.ecosystem}:${k.name??u}`,label:k.name??`${r.id}/${u}`,projectId:r.id,aliases:[u,...k.name?[k.name]:[]],attributes:{ecosystem:k.ecosystem,version:k.version,manifest:t.artifactPath(g,r),dependencies:k.dependencies},proofIds:[P]});t.addRelation({from:c,to:I,kind:"contains",proofIds:[P]});for(let p of k.dependencies.slice(0,500)){let y=t.addEntity({kind:"module",key:`dependency:${k.ecosystem}:${p}`,label:p,aliases:[p],attributes:{ecosystem:k.ecosystem,external:true},proofIds:[P]});t.addRelation({from:I,to:y,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[P]});}}catch{}}if(m.size>0){let g=d.find(u=>/^\.env\.(?:example|sample|template)$/i.test(h.basename(u)));if(g){let u=await t.addProof({provider:this.id,artifact:t.artifactPath(g,r),absolutePath:g,detail:"Public environment template keys only; values are intentionally excluded"}),v=t.addEntity({kind:"environment",key:`environment:${r.id}:template`,label:`${r.id} environment contract`,projectId:r.id,attributes:{keys:[...m].sort(),valuesEmitted:false},proofIds:[u]});t.addRelation({from:c,to:v,kind:"configured-by",proofIds:[u]});}}if(l.length>0){let g=await t.addProof({provider:this.id,artifact:t.artifactPath(l[0],r),absolutePath:l[0],detail:`${l.length} test file(s) discovered`}),u=t.addEntity({kind:"test-suite",key:`tests:${r.id}`,label:`${r.id} tests`,projectId:r.id,attributes:{fileCount:l.length},proofIds:[g]});t.addRelation({from:u,to:c,kind:"tests",proofIds:[g]});}}}},$e={id:"source-structure",version:"1.0.0",applicable(e){return e.projects.some(t=>(e.filesByProject.get(t.id)??[]).some(o=>L.has(h.extname(o).toLowerCase())))},async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(s=>L.has(h.extname(s).toLowerCase())).slice(0,1e3),i=new Set;await Promise.all(o.map(async s=>{try{let n=await $.stat(s);n.isFile()&&n.size<=2*1024*1024&&i.add(h.resolve(s));}catch{}}));let r=0,d=0;for(let s of o){let n;try{if((await $.stat(s)).size>2*1024*1024)continue;n=await $.readFile(s,"utf8");}catch{continue}let a=e.state.artifactPath(s,t),f=await e.state.addProof({provider:this.id,artifact:a,absolutePath:s,derivation:"extracted",trust:"observed",confidence:"high",detail:`${F(s)} source file`}),c=e.state.addEntity({kind:"file",key:`file:${t.id}:${a}`,label:a,projectId:t.id,aliases:[h.basename(s)],attributes:{artifact:a,language:F(s),bytes:Buffer.byteLength(n)},proofIds:[f]});e.state.addRelation({from:w("project",`project:${t.id}`),to:c,kind:"contains",proofIds:[f]});let m=B(n,he,250);for(let l of m){let g=await e.state.addProof({provider:this.id,artifact:a,absolutePath:s,line:l.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${l.detail}: ${l.name}`}),u=ke(s,l.name,i);if(u){let v=e.state.artifactPath(u,t);e.state.addRelation({from:c,to:w("file",`file:${t.id}:${v}`),kind:"imports",confidence:"high",proofIds:[g]});}else {let v=l.name.startsWith(".");v&&(d+=1);let k=e.state.addEntity({kind:"module",key:`module:${t.id}:${l.name}`,label:l.name,projectId:t.id,aliases:[l.name],attributes:{specifier:l.name,resolution:v?"unresolved-local":"external"},proofIds:[g]});e.state.addRelation({from:c,to:k,kind:"imports",confidence:v?"low":"medium",proofIds:[g]});}}if(r<500){let l=B(n,ge,Math.min(100,500-r));r+=l.length;for(let g of l){let u=await e.state.addProof({provider:this.id,artifact:a,absolutePath:s,line:g.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${g.detail}: ${g.name}`}),v=e.state.addEntity({kind:"symbol",key:`symbol:${t.id}:${a}:${g.detail}:${g.name}`,label:g.name,projectId:t.id,attributes:{symbolKind:g.detail,language:F(s)},proofIds:[u]});e.state.addRelation({from:c,to:v,kind:"defines",confidence:"medium",proofIds:[u]});}}for(let l of B(n,ye,100)){let u=(n.split(/\r?\n/)[l.line-1]??"").match(/(?:@|\.|\[|^\s*)(get|post|put|delete|patch|options|head)/i)?.[1]?.toUpperCase()??"HTTP",v=await e.state.addProof({provider:this.id,artifact:a,absolutePath:s,line:l.line,derivation:"extracted",trust:"observed",confidence:"medium",detail:`${u} ${l.name}`}),k=e.state.addEntity({kind:"endpoint",key:`source-endpoint:${t.id}:${a}:${u}:${l.name}`,label:`${u} ${l.name||"/"}`,projectId:t.id,attributes:{method:u,path:l.name||"/",source:a},proofIds:[v]});e.state.addRelation({from:c,to:k,kind:"defines",confidence:"medium",proofIds:[v]});}}(o.length>=1e3||r>=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."}),d>0&&e.state.diagnostics.push({code:"graph.provider.source_structure.unresolved_local_imports",severity:"warning",message:`${d} local import(s) in ${t.id} could not be resolved to an indexed source file.`,recommendation:"Check path aliases, generated sources, extension mapping, or provider limits before treating the import graph as complete."});}}},Ee={id:"workspace-service-contract",version:"1.0.0",applicable(e){return !!e.contract?.projects.length},async run(e){if(!e.contract)return;let t=new Map;for(let o of [...e.contract.projects].sort((i,r)=>i.slug.localeCompare(r.slug))){let i=o.contracts,r=await e.state.addProof({provider:this.id,artifact:".workspai/workspace.contract.json",absolutePath:h.join(e.workspacePath,".workspai","workspace.contract.json"),pointer:`/projects/${o.slug}/contracts`,trust:"authoritative",derivation:"authored",detail:`Service contract for ${o.slug}`}),d=w("project",`project:${o.slug}`),s=e.state.addEntity({kind:"service",key:`contract-service:${o.slug}`,label:o.slug,projectId:o.slug,attributes:{ports:o.ports.map(n=>`${n.protocol}:${n.port}`),owns:[...i.owns].sort(),environmentKeys:[...i.env].sort()},proofIds:[r]});e.state.addRelation({from:d,to:s,kind:"implements",trust:"authoritative",derivation:"authored",proofIds:[r]});for(let n of [...i.apis].sort((a,f)=>a.name.localeCompare(f.name))){let a=e.state.addEntity({kind:"api",key:`contract-api:${o.slug}:${n.name}:${n.basePath}`,label:n.name,projectId:o.slug,attributes:{basePath:n.basePath},proofIds:[r]});e.state.addRelation({from:s,to:a,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[r]});}for(let n of [...i.publishes,...i.consumes].sort())t.has(n)||t.set(n,e.state.addEntity({kind:"queue",key:`event:${n}`,label:n,attributes:{protocol:"workspace-event"},proofIds:[r]}));for(let n of [...i.publishes].sort()){let a=t.get(n);a&&e.state.addRelation({from:s,to:a,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[r]});}for(let n of [...i.consumes].sort()){let a=t.get(n);a&&e.state.addRelation({from:s,to:a,kind:"consumes",trust:"authoritative",derivation:"authored",proofIds:[r]});}}}},Ie={id:"openapi",version:"1.0.0",applicable(e){return e.projects.some(t=>(e.filesByProject.get(t.id)??[]).some(Y))},async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(Y);for(let i of o){let r;try{r=await A(i);}catch(d){e.state.diagnostics.push({code:"graph.provider.openapi.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(i,t)}: ${d instanceof Error?d.message:String(d)}`});continue}for(let d of r){if(!("openapi"in d)&&!("swagger"in d))continue;let s=b(d.info),n=j(s?.title)??`${t.id} API`,a=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:"/info",trust:"authoritative",detail:"Authored OpenAPI contract"}),f=w("project",`project:${t.id}`),c=e.state.addEntity({kind:"api",key:`api:${t.id}:${n}`,label:n,projectId:t.id,attributes:{version:j(s?.version),specification:j(d.openapi)??j(d.swagger)},proofIds:[a]});e.state.addRelation({from:f,to:c,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[a]});let m=b(b(d.components)?.schemas)??b(d.definitions),l=new Map;for(let u of Object.keys(m??{}).sort()){let v=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:`/components/schemas/${u}`,trust:"authoritative",detail:`OpenAPI schema ${u}`}),k=e.state.addEntity({kind:"schema",key:`schema:${t.id}:${n}:${u}`,label:u,projectId:t.id,proofIds:[v]});l.set(u,k),e.state.addRelation({from:c,to:k,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[v]});}let g=b(d.paths);for(let u of Object.keys(g??{}).sort()){let v=b(g?.[u]);for(let k of Object.keys(v??{}).filter(P=>me.has(P.toLowerCase())).sort()){let P=b(v?.[k]),I=`/paths/${u.replace(/~/g,"~0").replace(/\//g,"~1")}/${k}`,p=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(i,t),absolutePath:i,pointer:I,trust:"authoritative",detail:`${k.toUpperCase()} ${u}`}),y=e.state.addEntity({kind:"endpoint",key:`endpoint:${t.id}:${n}:${k.toUpperCase()}:${u}`,label:`${k.toUpperCase()} ${u}`,projectId:t.id,aliases:E(P?.tags),attributes:{method:k.toUpperCase(),path:u,operationId:j(P?.operationId),deprecated:typeof P?.deprecated=="boolean"?P.deprecated:void 0,tags:E(P?.tags)},proofIds:[p]});e.state.addRelation({from:c,to:y,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[p]});let R=JSON.stringify(P??{});for(let[S,_]of l)R.includes(`/${S}`)&&e.state.addRelation({from:y,to:_,kind:"references",trust:"authoritative",derivation:"authored",proofIds:[p]});}}}}}}},Ce={id:"interface-contracts",version:"1.0.0",applicable(e){return e.projects.some(t=>(e.filesByProject.get(t.id)??[]).some(Q))},async run(e){for(let t of e.projects){let o=(e.filesByProject.get(t.id)??[]).filter(Q);for(let i of o){let r=e.state.artifactPath(i,t),d=h.extname(i).toLowerCase();if(d===".graphql"||d===".gql"){let s=await $.readFile(i,"utf8"),n=await e.state.addProof({provider:this.id,artifact:r,absolutePath:i,trust:"authoritative",derivation:"authored",detail:"GraphQL schema"}),a=e.state.addEntity({kind:"api",key:`graphql:${t.id}:${r}`,label:`${t.id} GraphQL API`,projectId:t.id,attributes:{specification:"graphql",artifact:r},proofIds:[n]});e.state.addRelation({from:w("project",`project:${t.id}`),to:a,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[n]});for(let f 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}:${r}:${f[1]}`,label:f[1],projectId:t.id,proofIds:[n]});e.state.addRelation({from:a,to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[n]});}continue}if(d===".proto"){let s=await $.readFile(i,"utf8"),n=z(s.replace(/\r\n/g,`
|
|
2
|
+
`).trim()),a=s.match(/^\s*package\s+([A-Za-z_][\w.]*)\s*;/m)?.[1],f=a||`unscoped:${n.slice(0,16)}`,c=await e.state.addProof({provider:this.id,artifact:r,absolutePath:i,trust:"authoritative",derivation:"authored",detail:"Protocol Buffers contract"});for(let m of s.matchAll(/^\s*service\s+([A-Za-z_]\w*)/gm)){let l=e.state.addEntity({kind:"api",key:`protobuf-service:${f}:${m[1]}`,label:m[1],aliases:[...a?[`${a}.${m[1]}`]:[],m[1]],attributes:{specification:"protobuf",package:a,definitionHash:n},proofIds:[c]});e.state.addRelation({from:w("project",`project:${t.id}`),to:l,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[c]});}for(let m of s.matchAll(/^\s*message\s+([A-Za-z_]\w*)/gm))e.state.addEntity({kind:"schema",key:`protobuf-message:${f}:${m[1]}`,label:m[1],aliases:[...a?[`${a}.${m[1]}`]:[],m[1]],attributes:{specification:"protobuf",package:a,definitionHash:n},proofIds:[c]});continue}try{let s=(await A(i))[0];if(!s||!("asyncapi"in s))continue;let n=await e.state.addProof({provider:this.id,artifact:r,absolutePath:i,trust:"authoritative",derivation:"authored",detail:"AsyncAPI contract"}),a=e.state.addEntity({kind:"api",key:`asyncapi:${t.id}:${r}`,label:j(b(s.info)?.title)??`${t.id} AsyncAPI`,projectId:t.id,attributes:{specification:`asyncapi ${String(s.asyncapi)}`,artifact:r},proofIds:[n]});e.state.addRelation({from:w("project",`project:${t.id}`),to:a,kind:"exposes",trust:"authoritative",derivation:"authored",proofIds:[n]});for(let f of Object.keys(b(s.channels)??{}).sort()){let c=e.state.addEntity({kind:"queue",key:`asyncapi-channel:${t.id}:${f}`,label:f,projectId:t.id,attributes:{protocol:"asyncapi"},proofIds:[n]});e.state.addRelation({from:a,to:c,kind:"publishes",trust:"authoritative",derivation:"authored",proofIds:[n]});}}catch{}}}}},Re={id:"infrastructure-as-code",version:"1.0.0",applicable(e){return G(e).some(X)},async run(e){let t=G(e).filter(X);for(let o of t){let i=C(e.projects,o),r=i?.id??e.state.workspaceName,d=i?w("project",`project:${i.id}`):w("workspace",`workspace:${e.state.workspaceName}`),s=e.state.artifactPath(o,i),n=await $.readFile(o,"utf8"),a=await e.state.addProof({provider:this.id,artifact:s,absolutePath:o,trust:"authoritative",derivation:"authored",detail:"Infrastructure definition"});if(/^Dockerfile/i.test(h.basename(o))){let c=[...n.matchAll(/^\s*FROM\s+([^\s]+)(?:\s+AS\s+([^\s]+))?/gim)],m=e.state.addEntity({kind:"container",key:`dockerfile:${r}:${s}`,label:`${r} container image`,...i?{projectId:i.id}:{},attributes:{artifact:s,baseImages:c.map(l=>l[1])},proofIds:[a]});e.state.addRelation({from:d,to:m,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[a]});continue}if(/\.tf$/i.test(o)){for(let c of n.matchAll(/^\s*resource\s+["']([^"']+)["']\s+["']([^"']+)["']/gm)){let m=c[1],l=/(?:db|sql|rds|database)/i.test(m)?"database":/(?:queue|kafka|sqs|pubsub|servicebus)/i.test(m)?"queue":"deployment",g=e.state.addEntity({kind:l,key:`terraform:${r}:${m}:${c[2]}`,label:`${m}.${c[2]}`,...i?{projectId:i.id}:{},attributes:{resourceType:m,artifact:s},proofIds:[a]});e.state.addRelation({from:d,to:g,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[a]});}continue}let f=e.state.addEntity({kind:"deployment",key:`helm:${r}:${s}`,label:`${r} Helm chart`,...i?{projectId:i.id}:{},attributes:{artifact:s,format:"helm"},proofIds:[a]});e.state.addRelation({from:d,to:f,kind:"deploys",trust:"authoritative",derivation:"authored",proofIds:[a]});}}};function ae(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 We={id:"compose",version:"1.0.0",async applicable(e){return (await oe(e)).length>0},async run(e){for(let t of await oe(e)){let o;try{o=(await A(t))[0];}catch(s){e.state.diagnostics.push({code:"graph.provider.compose.parse_failed",severity:"warning",message:`Could not parse ${e.state.artifactPath(t)}: ${s instanceof Error?s.message:String(s)}`});}let i=b(o?.services);if(!i)continue;let r=C(e.projects,t),d=new Map;for(let s of Object.keys(i).sort()){let n=b(i[s]),a=n?.build,f=j(a)??j(b(a)?.context),c=f?C(e.projects,h.resolve(h.dirname(t),f)):e.projects.find(u=>u.id.toLowerCase()===s.toLowerCase()||h.basename(u.path).toLowerCase()===s.toLowerCase())??r,m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(t,r),absolutePath:t,pointer:`/services/${s}`,trust:"authoritative",derivation:"authored",detail:`Compose service ${s}`}),l=j(n?.image),g=e.state.addEntity({kind:"service",key:`compose-service:${e.state.artifactPath(t,r)}:${s}`,label:s,...c?{projectId:c.id}:{},attributes:{image:l,ports:E(n?.ports).map(String),networks:E(n?.networks),environmentKeys:ve(n?.environment)},proofIds:[m]});if(d.set(s,g),c&&e.state.addRelation({from:w("project",`project:${c.id}`),to:g,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[m]}),l){let u=e.state.addEntity({kind:ae(l),key:`image:${l}`,label:l,...c?{projectId:c.id}:{},attributes:{image:l},proofIds:[m]});e.state.addRelation({from:g,to:u,kind:ae(l)==="container"?"runs-on":"depends-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}for(let s of Object.keys(i).sort()){let n=b(i[s]),a=d.get(s);if(a)for(let f of E(n?.depends_on)){let c=d.get(f);if(!c)continue;let m=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(t,r),absolutePath:t,pointer:`/services/${s}/depends_on/${f}`,trust:"authoritative",derivation:"authored",detail:`${s} depends on ${f}`});e.state.addRelation({from:a,to:c,kind:"depends-on",trust:"authoritative",derivation:"authored",proofIds:[m]});}}}}},Ke={id:"documentation",version:"1.0.0",applicable(e){return G(e).some(ee)},async run(e){let t=new Set,o=[e.workspaceFiles,...e.projects.map(i=>e.filesByProject.get(i.id)??[])];for(let i of o){let r=i.filter(ee);for(let d of r){if(t.has(d))continue;t.add(d);let s=C(e.projects,d),a=(await $.readFile(d,"utf8")).match(/^#\s+(.+)$/m)?.[1]?.trim()??h.basename(d),f=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(d,s),absolutePath:d,line:1,trust:"authoritative",derivation:"authored",detail:`Documentation: ${a}`}),c=e.state.addEntity({kind:"document",key:`document:${e.state.artifactPath(d,s)}`,label:a,...s?{projectId:s.id}:{},attributes:{artifact:e.state.artifactPath(d,s)},proofIds:[f]}),m=s?w("project",`project:${s.id}`):w("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:c,to:m,kind:"documents",trust:"authoritative",derivation:"authored",proofIds:[f]});}}}},Ae={id:"kubernetes",version:"1.0.0",async applicable(e){return (await ie(e)).length>0},async run(e){for(let t of await ie(e)){let o=C(e.projects,t),i=o?w("project",`project:${o.id}`):w("workspace",`workspace:${e.state.workspaceName}`),r=await A(t);for(let d=0;d<r.length;d+=1){let s=r[d],n=j(s.kind),a=b(s.metadata),f=j(a?.name);if(!n||!f)continue;let c=j(a?.namespace)??"default",m=/Deployment|StatefulSet|DaemonSet/i.test(n)?"deployment":/Service|Ingress/i.test(n)?"service":/ConfigMap|Secret/i.test(n)?"environment":"deployment",l=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(t,o),absolutePath:t,pointer:`/documents/${d}`,trust:"authoritative",derivation:"authored",detail:`${n} ${c}/${f}`}),g=e.state.addEntity({kind:m,key:`kubernetes:${n}:${c}:${f}`,label:`${n}/${f}`,...o?{projectId:o.id}:{},attributes:{resourceKind:n,namespace:c,secret:n==="Secret",keys:n==="Secret"||n==="ConfigMap"?Object.keys(b(s.data)??{}).sort():void 0},proofIds:[l]});e.state.addRelation({from:i,to:g,kind:m==="deployment"?"deploys":"contains",trust:"authoritative",derivation:"authored",proofIds:[l]});let u=e.state.addEntity({kind:"environment",key:`kubernetes-namespace:${c}`,label:`Kubernetes namespace ${c}`,attributes:{namespace:c},proofIds:[l]});e.state.addRelation({from:g,to:u,kind:"runs-on",trust:"authoritative",derivation:"authored",proofIds:[l]});}}}},Se={id:"ci-workflow",version:"1.0.0",applicable(e){return se(e).length>0},async run(e){let t=se(e);for(let o of t){let i=C(e.projects,o),r=e.state.artifactPath(o,i),d=h.basename(o)==="Jenkinsfile",s=h.basename(o),n=[],a=[];if(d)n=[...(await $.readFile(o,"utf8")).matchAll(/\bstage\s*\(\s*["']([^"']+)["']/g)].map(l=>l[1]);else {let m;try{m=(await A(o))[0];}catch{continue}if(!m)continue;s=j(m.name)??s;let l=K(h.relative(i?.root??e.workspacePath,o));if(/^\.gitlab-ci\./i.test(l)){let g=new Set(["stages","variables","workflow","include","default","image","services","cache","before_script","after_script"]);n=Object.keys(m).filter(u=>!u.startsWith(".")&&!g.has(u)).sort();}else n=[...new Set([...Object.keys(b(m.jobs)??{}),...Object.keys(b(b(m.workflows)?.jobs)??{}),...E(m.stages)])].sort();a=E(m.on);}n.length===0&&(n=["pipeline"]);let f=await e.state.addProof({provider:this.id,artifact:r,absolutePath:o,...d?{}:{pointer:"/jobs"},trust:"authoritative",derivation:"authored",detail:"CI/CD workflow"}),c=e.state.addEntity({kind:"pipeline",key:`pipeline:${r}`,label:s,attributes:{jobs:n,triggers:a,artifact:r},proofIds:[f]});e.state.addRelation({from:i?w("project",`project:${i.id}`):w("workspace",`workspace:${e.state.workspaceName}`),to:c,kind:"contains",trust:"authoritative",derivation:"authored",proofIds:[f]});}}},_e={id:"codeowners",version:"1.0.0",async applicable(e){return (await re(e)).length>0},async run(e){for(let t of await re(e)){let o=C(e.projects,t),r=(await $.readFile(t,"utf8")).split(/\r?\n/);for(let d=0;d<r.length;d+=1){let s=r[d].trim();if(!s||s.startsWith("#"))continue;let[n,...a]=s.split(/\s+/);for(let f of a.filter(c=>c.startsWith("@"))){let c=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(t,o),absolutePath:t,line:d+1,trust:"authoritative",derivation:"authored",detail:`${n} ${f}`}),m=e.state.addEntity({kind:"owner",key:`owner:${f.toLowerCase()}`,label:f,aliases:[f],proofIds:[c]}),l=e.projects.filter(u=>{let v=n.replace(/^\//,"").replace(/\*.*$/,""),k=h.dirname(t),P=[".github","docs"].includes(h.basename(k))?h.dirname(k):k,I=K(h.relative(P,u.root));return v&&(I==="."||I.startsWith(v.replace(/\/$/,""))||u.path.startsWith(v.replace(/\/$/,"")))}),g=l.length>0?l.map(u=>w("project",`project:${u.id}`)):o?[w("project",`project:${o.id}`)]:[w("workspace",`workspace:${e.state.workspaceName}`)];for(let u of g)e.state.addRelation({from:m,to:u,kind:"owns",trust:"authoritative",derivation:"authored",proofIds:[c]});}}}}},Oe={id:"architecture-decisions",version:"1.0.0",applicable(e){return [{root:e.workspacePath,files:e.workspaceFiles},...e.projects.map(t=>({root:t.root,files:e.filesByProject.get(t.id)??[]}))].some(t=>t.files.some(o=>te(t.root,o)))},async run(e){let t=new Set,o=[{root:e.workspacePath,files:e.workspaceFiles},...e.projects.map(i=>({root:i.root,files:e.filesByProject.get(i.id)??[]}))];for(let i of o){let r=i.files.filter(d=>te(i.root,d));for(let d of r){if(t.has(d))continue;t.add(d);let s=C(e.projects,d),n=await $.readFile(d,"utf8"),a=n.match(/^#\s+(.+)$/m)?.[1]?.trim()??h.basename(d,".md"),f=n.match(/^status\s*:\s*(.+)$/im)?.[1]?.trim(),c=await e.state.addProof({provider:this.id,artifact:e.state.artifactPath(d,s),absolutePath:d,line:1,trust:"authoritative",derivation:"authored",detail:`Architecture decision: ${a}`}),m=e.state.addEntity({kind:"decision",key:`decision:${e.state.artifactPath(d,s)}`,label:a,...s?{projectId:s.id}:{},attributes:{status:f,artifact:e.state.artifactPath(d,s)},proofIds:[c]}),l=s?w("project",`project:${s.id}`):w("workspace",`workspace:${e.state.workspaceName}`);e.state.addRelation({from:l,to:m,kind:"decided-by",trust:"authoritative",derivation:"authored",proofIds:[c]});}}}},Ne=[je,$e,Ee,Ie,Ce,We,Re,Ae,Se,_e,Ke,Oe];async function De(e,t){for(let o of t.edges){let i=[];for(let r of o.evidence){let d=N(r.file);i.push(await e.addProof({provider:"project-topology",artifact:d,absolutePath:h.resolve(e.workspacePath,d),derivation:o.source==="inferred"?"inferred":"authored",trust:o.source==="inferred"?"observed":"authoritative",confidence:o.confidence,detail:r.detail??`${o.kind} relationship`}));}i.length===0&&i.push(await e.addProof({provider:"project-topology",artifact:a.model,derivation:"inferred",trust:"ambiguous",confidence:o.confidence,detail:`${o.kind} relationship without source locator`})),e.addRelation({from:w("project",`project:${o.from}`),to:w("project",`project:${o.to}`),kind:o.kind==="event-pub-sub"?"consumes":"depends-on",derivation:o.source==="inferred"?"inferred":"authored",trust:o.source==="inferred"?"observed":"authoritative",confidence:o.confidence,proofIds:i});}}function Te(e){let t=[...e.entities.values()].filter(i=>i.kind==="endpoint"),o=new Map;for(let i of t){let r=String(i.attributes.method??"").toUpperCase(),d=String(i.attributes.path??"");if(!i.projectId||!r||!d)continue;let s=`${i.projectId}\0${r}\0${d}`,n=o.get(s)??[];n.push(i),o.set(s,n);}for(let i of o.values()){if(i.length<2)continue;let r=i.find(d=>d.proofIds.some(s=>e.proofs.get(s)?.trust==="authoritative"));if(r)for(let d of i.filter(s=>s.id!==r.id))e.addRelation({from:d.id,to:r.id,kind:"implements",derivation:"extracted",trust:"corroborated",confidence:"high",proofIds:[...d.proofIds,...r.proofIds]});}}function T(e,t){let o=[...new Set(e)],i=o.filter(r=>t.has(r)).length;return {eligibleCount:o.length,boundCount:i,unknownCount:o.length-i,coverageRatio:o.length===0?null:i/o.length}}function Le(e,t){let o=e.filter(a=>a.kind==="project").map(a=>a.id),i=e.filter(a=>a.kind==="endpoint").map(a=>a.id),r=new Set(t.filter(a=>a.kind==="implements").flatMap(a=>[a.from,a.to])),d=new Set(t.filter(a=>a.kind==="tests").flatMap(a=>[a.from,a.to]).filter(a=>o.includes(a))),s=new Set(t.filter(a=>a.kind==="deploys").flatMap(a=>[a.from,a.to]).filter(a=>o.includes(a))),n=new Set(t.filter(a=>a.kind==="owns").flatMap(a=>[a.from,a.to]).filter(a=>o.includes(a)));return {apiImplementation:T(i,r),projectTests:T(o,d),projectDeployment:T(o,s),projectOwnership:T(o,n)}}async function Xe(e){let t=h.resolve(e.workspacePath),o=e.now??new Date,i=e.projects.map(p=>({...p,root:p.absolutePath?h.resolve(p.absolutePath):h.resolve(t,p.path),artifactPrefix:p.absolutePath?`external/${p.id}`:K(p.path)})).sort((p,y)=>p.id.localeCompare(y.id)),r=new q(t,o,e.workspace.name),d=Math.max(100,Math.min(e.maxFilesPerProject??2e3,1e4)),s=new Map(await Promise.all(i.map(async p=>[p.id,await x(p.root,d)]))),n=await x(t,Math.min(d*Math.max(i.length,1),2e4)),a={workspacePath:t,projects:i,filesByProject:s,workspaceFiles:n,now:o,maxFilesPerProject:d,contract:e.contract??null,state:r};for(let p of Ne){let y={entities:r.entities.size,relations:r.relations.size,proofs:r.proofs.size,diagnostics:r.diagnostics.length},R="passed",S=null;try{if(!(p.applicable?await p.applicable(a):true))R="skipped";else {await p.run(a);let D=r.entities.size-y.entities,ne=r.relations.size-y.relations,de=r.proofs.size-y.proofs;D===0&&ne===0&&de===0?(R="partial",r.diagnostics.push({code:`graph.provider.${p.id}.empty_result`,severity:"warning",message:`${p.id} found an applicable source surface but produced no graph evidence.`,recommendation:"Inspect the matching source format or extend the provider before treating this graph dimension as complete."})):r.diagnostics.length>y.diagnostics&&(R="partial");}}catch(W){R="failed";let D=W instanceof Error?W.message:String(W);S=D,r.diagnostics.push({code:`graph.provider.${p.id}.failed`,severity:"warning",message:`${p.id} provider failed: ${D}`,recommendation:"Repair the referenced source artifact and rerun workspace graph emit."});}let _=r.diagnostics.slice(y.diagnostics).map(W=>`${W.code}: ${W.message}`);S&&_.length===0&&_.push(S),r.providers.push({id:p.id,version:p.version,status:R,permission:"filesystem-read",discoveredEntities:r.entities.size-y.entities,discoveredRelations:r.relations.size-y.relations,proofCount:r.proofs.size-y.proofs,diagnostics:_});}Te(r),await De(r,e.projectTopology);let f=[...r.entities.values()].sort((p,y)=>p.id.localeCompare(y.id)),c=[...r.relations.values()].sort((p,y)=>p.id.localeCompare(y.id)),m=[...r.proofs.values()].sort((p,y)=>p.id.localeCompare(y.id)),l=f.filter(p=>p.proofIds.length>0).length,g=c.filter(p=>p.proofIds.length>0).length,u=r.providers.filter(p=>p.status!=="failed").length,v=e.projectTopology.diagnostics?.filter(p=>p.code==="graph.edges.missing").flatMap(p=>p.nodeIds??[])??[];v.length>0&&r.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=>w("project",`project:${p}`)),recommendation:"Author service contracts or add OpenAPI, Compose, Kubernetes, package or import evidence."});let k=r.diagnostics.filter(p=>p.code.includes("unknown")||p.code.includes("unresolved")||p.code.includes("limit_reached")||p.code.endsWith(".empty_result")).reduce((p,y)=>p+Math.max(y.entityIds?.length??0,y.relationIds?.length??0,1),0),P=Le(f,c),I=Object.values(P).reduce((p,y)=>p+y.unknownCount,0);return {schemaVersion:U,generatedAt:o.toISOString(),source:e.source,workspace:e.workspace,projectTopology:e.projectTopology,entities:f,relations:c,proofs:m,providers:[...r.providers].sort((p,y)=>p.id.localeCompare(y.id)),quality:{entityCount:f.length,relationCount:c.length,proofCount:m.length,entityProofCoverageRatio:f.length===0?1:l/f.length,relationProofCoverageRatio:c.length===0?1:g/c.length,providerSuccessRatio:r.providers.length===0?1:u/r.providers.length,conflictCount:r.diagnostics.filter(p=>p.code.includes("conflict")).length,unknownCount:k+I,bindingCoverage:P,portable:true,secretValuesEmitted:false},diagnostics:[...r.diagnostics].sort((p,y)=>p.code.localeCompare(y.code)||p.message.localeCompare(y.message))}}function et(e,t){return w(e,t)}
|
|
3
|
+
export{U as a,Ye as b,Qe as c,Xe as d,et as e};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {c,d}from'./chunk-MOSXTVPU.js';import {m,k as k$1,j as j$1,b,t,n,i}from'./chunk-RJIYCDVC.js';import {a}from'./chunk-2FIX2MDC.js';import wt from'crypto';import tt from'os';import l from'path';import*as p from'fs-extra';import {execa}from'execa';var yt=["version","project","create","add","list","info","upgrade","diff","doctor","license","commands","reconcile","rollback","uninstall","checkpoint","optimize","snapshot","frameworks","modules","merge"],M=new Set(yt);var g=a();async function et(t){for(let e of [c,d]){let r=l.join(t,e);if(await p.pathExists(r))try{let n=await p.readJson(r);if(n&&typeof n=="object")return n}catch{return null}}return null}function O(){let t=[],e=i=>{let o=i?.trim();o&&t.push(o);};e(process.env.RAPIDKIT_BRIDGE_PYTHON),e(process.env.RAPIDKIT_PYTHON_CMD),e(process.env.POETRY_PYTHON);let r=_();(r.startsWith("/")||r.startsWith(".")||r.startsWith(".."))&&!r.startsWith("file:")&&e(m(l.join(l.resolve(r),".venv")));for(let i of k$1())i.args.length===1&&i.args[0]==="--version"&&e(i.command);for(let i of j$1())e(i);return [...new Set(t)]}function v(t,e){return t==="py"?["-3",...e]:e}function H(t){if(!t)return t;let e=["Installed Poetry version does not support '--no-update'. Falling back to 'poetry lock'."];return t.split(/\r?\n/).filter(i=>!e.some(o=>i.includes(o))).join(`
|
|
2
|
+
`)}var w=class extends Error{code;constructor(e,r){super(r),this.code=e;}};function D(t){if(t instanceof w)switch(t.code){case "PYTHON_NOT_FOUND":return `Workspai could not find Python (python3/python/py) on your PATH.
|
|
3
|
+
Install Python 3.10+ and ensure \`${i()}\` is available, then retry.
|
|
4
|
+
Tip: if you are inside a RapidKit project, use the local ./rapidkit launcher.`;case "BRIDGE_VENV_CREATE_FAILED":return `Workspai failed to create its bridge virtual environment.
|
|
5
|
+
`+(b()?`Ensure Python is installed with venv support.
|
|
6
|
+
`:`Ensure Python venv support is installed (e.g., python3-venv).
|
|
7
|
+
`)+`Details: ${t.message}`;case "BRIDGE_PIP_BOOTSTRAP_FAILED":return `Workspai could not bootstrap pip inside the bridge virtual environment.
|
|
8
|
+
`+(b()?`Ensure pip is available for your Python installation and retry.
|
|
9
|
+
`:`Install python3-venv/python3-pip and retry.
|
|
10
|
+
`)+`Details: ${t.message}`;case "BRIDGE_PIP_UPGRADE_FAILED":return `Workspai could not upgrade pip in the bridge virtual environment.
|
|
11
|
+
Check your network/proxy or disable RAPIDKIT_BRIDGE_UPGRADE_PIP.
|
|
12
|
+
Details: ${t.message}`;case "BRIDGE_PIP_INSTALL_FAILED":return `Workspai could not install rapidkit-core in the bridge virtual environment.
|
|
13
|
+
Check your network/proxy, or install manually with: pipx install rapidkit-core.
|
|
14
|
+
Details: ${t.message}`;default:return `Workspai bridge error: ${t.message}`}return `Workspai failed to run the Python core engine: ${t instanceof Error?t.message:String(t)}`}function _(){let t=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE;return t&&t.trim()?t.trim():"rapidkit-core"}function vt(){let t=_(),e=process.env.RAPIDKIT_CORE_PYTHON_PACKAGE_ID,r=e&&e.trim()?`${t}|${e.trim()}`:t;return wt.createHash("sha256").update(r).digest("hex").slice(0,12)}function j(){let t=process.env.XDG_CACHE_HOME;return t&&t.trim()?t:l.join(tt.homedir(),".cache")}function Pt(){return l.join(j(),"rapidkit","npm-bridge","venv")}function nt(){let t=vt();return l.join(j(),"rapidkit","npm-bridge",`venv-${t}`)}function Y(t){return m(t)}function U(t){return n(t)}async function rt(t$1=process.platform,e=process.env){let r=b(t$1)?["rapidkit.exe","rapidkit.cmd"]:["rapidkit"],n=t(e,t$1).flatMap(i=>r.map(o=>l.join(i,o)));for(let i of [...new Set(n)])try{if(!await p.pathExists(i))continue;let o=await execa(i,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(o.exitCode===0&&await k(o.stdout))return {cmd:i,baseArgs:[]}}catch{}return null}async function it(t=process.platform,e=process.env){let r=b(t)?"rapidkit.exe":"rapidkit",n=(e.PATH??"").split(l.delimiter).filter(Boolean);for(let i of n){let o=l.join(i,r);try{if(!await p.pathExists(o))continue;let c=await execa(o,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(c.exitCode===0&&await k(c.stdout,{requireSchema:true}))return {cmd:o,baseArgs:[]}}catch{}}return null}function ot(t){return /[<>=!~]=|@|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(t)}function Ct(t){return l.dirname(l.dirname(t))}function st(){return l.join(j(),"rapidkit","npm-bridge","core-commands.json")}async function at(t){let e=!!process.env.RAPIDKIT_DEBUG,r=n=>{e&&process.stderr.write(`[DEBUG] tryRapidkit(${t}): ${n}
|
|
15
|
+
`);};try{r("probing interpreter-specific rapidkit script");let i=((await execa(t,v(t,["-c","import sysconfig, os; print(os.path.join(sysconfig.get_path('scripts'), 'rapidkit'))"]),{reject:false,stdio:"pipe",timeout:2e3})).stdout??"").toString().trim();if(r(`script path: ${i}`),i)try{if(await p.pathExists(i)){r(`found script at ${i}; invoking --version --json`);let o=await execa(i,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`script exitCode=${o.exitCode}`),o.exitCode===0){let c=(o.stdout??"").toString().trim();try{let s=JSON.parse(c),a=!!s&&typeof s=="object"&&s!==null&&"version"in s;if(r(`script JSON parse ok=${a}`),a)return true}catch{r("script output not valid JSON");}}}}catch(o){r(`interpreter-specific script probe failed: ${String(o)}`);}}catch(n){r(`interpreter-specific script probe error: ${String(n)}`);}try{r('probing importlib.find_spec("rapidkit")');let n=await execa(t,v(t,["-c","import importlib.util; print(1 if importlib.util.find_spec('rapidkit') else 0)"]),{reject:false,stdio:"pipe",timeout:2e3});if(r(`import probe exitCode=${n.exitCode} stdout=${(n.stdout??"").toString().trim()}`),n.exitCode===0&&(n.stdout??"").toString().trim()==="1")return true}catch(n){r(`import probe error: ${String(n)}`);}try{r("probing python -m rapidkit");let n=await execa(t,v(t,["-m","rapidkit","--version","--json"]),{reject:false,stdio:"pipe",timeout:8e3});if(r(`-m probe exitCode=${n.exitCode}`),n.exitCode===0)return true}catch(n){r(`-m probe error: ${String(n)}`);}try{r("probing PATH for rapidkit executables");let n=(process.env.PATH??"").split(l.delimiter).filter(Boolean);for(let i of n){let o=l.join(i,b()?"rapidkit.exe":"rapidkit");try{if(await p.pathExists(o)){r(`found candidate on PATH: ${o}; invoking --version --json`);let c=await execa(o,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(r(`candidate exitCode=${c.exitCode}`),c.exitCode===0){let s=(c.stdout??"").toString().trim();try{let a=JSON.parse(s),d=a;if(a&&typeof a=="object"&&a!==null&&"version"in d&&d.schema_version===1)return true}catch{r("candidate output not valid JSON, skipping");}}}}catch(c){r(`error probing candidate ${o}: ${String(c)}`);}}return r("no valid rapidkit found on PATH"),false}catch(n){return r(`PATH probe error: ${String(n)}`),false}}async function k(t,e){let r=(t??"").toString().trim();if(!r)return false;try{let n=JSON.parse(r);if(!n||typeof n!="object"||n===null)return false;let i=n;return "version"in i?e?.requireSchema?i.schema_version===1||i.schemaVersion==="rapidkit-core-version-v1":true:false}catch{return false}}async function ct(t,e=process.platform){let r=async o=>{try{let a=(await et(o))?.metadata?.python?.venvPath;return typeof a!="string"||!a.trim()?null:l.isAbsolute(a)?a:l.join(o,a)}catch{return null}},n$1=async(o,c)=>{let s=n(c,e);if(await p.pathExists(s)){let d=await execa(s,["--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(d.exitCode===0&&await k(d.stdout))return {cmd:s,baseArgs:[],workspaceDir:o}}let a=m(c,e);if(await p.pathExists(a)){let d=await execa(a,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:1500,cwd:o});if(d.exitCode===0&&await k(d.stdout))return {cmd:a,baseArgs:["-m","rapidkit"],workspaceDir:o}}return null},i=t;for(let o=0;o<25;o+=1){let c=await r(i),s=[l.join(i,".venv"),c].filter(d=>!!d);for(let d of [...new Set(s)]){let P=await n$1(i,d);if(P)return P}let a=l.dirname(i);if(a===i)break;i=a;}return null}async function Et(t){try{let e=l.join(t,".python-version");if(await p.pathExists(e)){let n=(await p.readFile(e,"utf-8")).trim();if(n)return n}}catch{}try{let e=await et(t);if(typeof e?.pythonVersion=="string"&&e.pythonVersion.trim())return e.pythonVersion.trim();let n=e?.metadata?.python?.pythonVersion;if(typeof n=="string"&&n.trim())return n.trim()}catch{}return null}async function F(t){if(t&&t.trim())try{let s=await ct(t);if(s){let a=s.workspaceDir??(l.dirname(s.cmd).includes(".venv")?l.dirname(l.dirname(l.dirname(s.cmd))):l.dirname(s.cmd)),d=await Et(a);return d&&(process.env.PYENV_VERSION=d),s}}catch{}let e=await St();if(e.kind==="venv"){let s=Ct(e.pythonPath),a=U(s);return await p.pathExists(a)?{cmd:a,baseArgs:[]}:{cmd:e.pythonPath,baseArgs:["-m","rapidkit"]}}try{if((await execa(e.cmd,["-m","rapidkit","--version","--json"],{reject:false,stdio:"pipe",timeout:4e3})).exitCode===0)return {cmd:e.cmd,baseArgs:["-m","rapidkit"]}}catch{}try{let a=((await execa(e.cmd,["-c","import sysconfig, os; print(os.path.join(sysconfig.get_path('scripts'), 'rapidkit'))"],{reject:false,stdio:"pipe",timeout:2e3})).stdout??"").toString().trim();if(a&&await p.pathExists(a))try{let d=await execa(a,["--version","--json"],{reject:false,stdio:"pipe",timeout:4e3});if(d.exitCode===0&&await k(d.stdout))return {cmd:a,baseArgs:[]}}catch{}}catch{}let r=await rt();if(r)return r;let n=await it();if(n)return n;let i=nt(),o=await N(e.cmd),c=U(i);return await p.pathExists(c)?{cmd:c,baseArgs:[]}:{cmd:o,baseArgs:["-m","rapidkit"]}}async function dt(){for(let t of O())try{if((await execa(t,v(t,["--version"]),{reject:false,stdio:"pipe",timeout:2e3})).exitCode===0)return t}catch{}return null}async function B(){let t=null;for(let e of O()){try{let r=await execa(e,v(e,["--version"]),{reject:false,stdio:"pipe",timeout:2e3});if(r.exitCode!==0){t=new Error(`${e} --version exited with code ${r.exitCode}`);continue}}catch(r){t=r;continue}try{return await N(e)}catch(r){t=r;continue}}throw t instanceof w?t:t instanceof Error?new w("BRIDGE_VENV_BOOTSTRAP_FAILED",t.message):new w("PYTHON_NOT_FOUND","No Python interpreter found (python3/python/py).")}async function _t(){let t=!!process.env.RAPIDKIT_DEBUG,e=n=>{t&&process.stderr.write(`[DEBUG] checkRapidkitCore: ${n}
|
|
16
|
+
`);},r=Array.from(new Set([...j$1(),...k$1(14,10).map(n=>n.command)]));for(let n of r)try{e(`Method 1: trying ${n} import`);let i=await execa(n,v(n,["-c","import rapidkit_core; print(1)"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.trim()==="1")return e(`\u2713 Found via ${n} import`),true}catch{continue}for(let n of r)try{e(`Method 2: trying ${n} -m pip show`);let i=await execa(n,v(n,["-m","pip","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found via ${n} -m pip show`),true}catch{continue}for(let n of ["pip","pip3"])try{e(`Method 3: trying ${n} show`);let i=await execa(n,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found via ${n} show`),true}catch{continue}try{e("Method 4: checking pyenv versions");let n=await execa("pyenv",["versions","--bare"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout){let i=n.stdout.split(`
|
|
17
|
+
`).filter(o=>o.trim());e(`Found pyenv versions: ${i.join(", ")}`);for(let o of i){let c=process.env.PYENV_ROOT||l.join(tt.homedir(),".pyenv"),s=l.join(c,"versions",o.trim(),"bin","pip");try{let a=await execa(s,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(a.exitCode===0&&a.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found in pyenv ${o}`),true}catch{try{let a=await execa("pyenv",["exec","pip","show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g,env:{...process.env,PYENV_VERSION:o.trim()}});if(a.exitCode===0&&a.stdout?.includes("Name: rapidkit-core"))return e(`\u2713 Found in pyenv ${o} via PYENV_VERSION`),true}catch{continue}}}}}catch{e("pyenv not available");}for(let n of r)try{e(`Method 5: checking ${n} user site`);let i=await execa(n,v(n,["-m","site","--user-site"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout){let o=i.stdout.trim(),c=l.join(o,"rapidkit_core");if(await p.pathExists(c))return e("\u2713 Found in user site-packages"),true}}catch{continue}try{e("Method 6: checking pipx");let n=await execa("pipx",["list"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout?.includes("rapidkit-core"))return e("\u2713 Found via pipx"),true}catch{e("pipx not available");}for(let n of r)try{e(`Method 6: checking ${n} -m pipx list`);let i=await execa(n,v(n,["-m","pipx","list"]),{reject:false,stdio:"pipe",timeout:g});if(i.exitCode===0&&i.stdout?.includes("rapidkit-core"))return e(`\u2713 Found via ${n} -m pipx list`),true}catch{continue}try{if(e("Method 7: checking poetry"),(await execa("poetry",["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g})).exitCode===0)return e("\u2713 Found via poetry"),true}catch{e("poetry check failed");}for(let n of r)try{if(e(`Method 7: checking ${n} -m poetry show rapidkit-core`),(await execa(n,v(n,["-m","poetry","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g})).exitCode===0)return e(`\u2713 Found via ${n} -m poetry`),true}catch{continue}try{e("Method 8: checking conda");let n=await execa("conda",["list","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0&&n.stdout?.includes("rapidkit-core"))return e("\u2713 Found via conda"),true}catch{e("conda not available");}return e("\u2717 Not found in any environment"),false}function kt(t){let e=t.trim();if(!e||!e.startsWith("rapidkit-core"))return null;let r=e.slice(13).trim();return !r||/[\/@]|\.whl$|\.tar\.gz$|\.zip$|git\+|https?:\/\//.test(r)?null:r}function z(t){let e=t.trim();if(!e)return null;let r=e.split("."),n=[];for(let i of r){let o=i.match(/^(\d+)/);if(!o){n.push(0);continue}n.push(Number.parseInt(o[1],10));}return n}function q(t,e){let r=Math.max(t.length,e.length);for(let n=0;n<r;n+=1){let i=n<t.length?t[n]:0,o=n<e.length?e[n]:0;if(i>o)return 1;if(i<o)return -1}return 0}function xt(t){return t.length<=1?[t[0]+1]:t.length===2?[t[0]+1,0]:[t[0],t[1]+1,0]}function Rt(t){let e=t.split(",").map(n=>n.trim()).filter(Boolean);if(e.length===0)return null;let r=[];for(let n of e){let i=n.match(/^(==|>=|<=|>|<|~=)\s*([0-9][0-9A-Za-z+._-]*)$/);if(!i)return null;r.push({op:i[1],version:i[2]});}return r}function ut(t,e){let r=z(t);if(!r)return false;let n=Rt(e);if(!n)return false;for(let i of n){let o=z(i.version);if(!o)return false;let c=q(r,o);if(i.op==="=="&&c!==0||i.op===">="&&c<0||i.op==="<="&&c>0||i.op===">"&&c<=0||i.op==="<"&&c>=0)return false;if(i.op==="~="){if(c<0)return false;let s=xt(o);if(q(r,s)>=0)return false}}return true}async function bt(){let t=Array.from(new Set([...j$1(),...k$1(14,10).map(r=>r.command)])),e=r=>{let n=r.match(/^Version:\s*(.+)$/m);return n?n[1].trim():null};for(let r of t)try{let n=await execa(r,v(r,["-m","pip","show","rapidkit-core"]),{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0){let i=e(n.stdout||"");if(i)return i}}catch{continue}for(let r of ["pip","pip3"])try{let n=await execa(r,["show","rapidkit-core"],{reject:false,stdio:"pipe",timeout:g});if(n.exitCode===0){let i=e(n.stdout||"");if(i)return i}}catch{continue}try{let r=await execa("pipx",["list"],{reject:false,stdio:"pipe",timeout:g});if(r.exitCode===0&&r.stdout){let n=r.stdout.match(/rapidkit-core\s+([0-9][0-9A-Za-z+._-]*)/i);if(n?.[1])return n[1]}}catch{}return null}async function At(){let t=_(),e=kt(t);if(!e)return {isCompatible:false,installedVersion:null,expectedConstraint:null,reason:ot(t)?"constraint-unsupported":"constraint-missing"};let r=await bt();if(!r)return {isCompatible:false,installedVersion:null,expectedConstraint:e,reason:"version-not-detected"};let n=ut(r,e);return {isCompatible:n,installedVersion:r,expectedConstraint:e,reason:n?"compatible":"incompatible-version"}}async function N(t){let e=nt(),r=Pt(),n=_(),i=[e];!ot(n)&&!await p.pathExists(e)&&await p.pathExists(r)&&i.push(r);for(let m of i){let h=Y(m);if(await p.pathExists(h))try{let f=await execa(h,["-c","import importlib.util; print(1 if importlib.util.find_spec('rapidkit') else 0)"],{reject:false,stdio:"pipe",timeout:2e3});if(f.exitCode===0&&(f.stdout??"").toString().trim()==="1")return h;await p.remove(m);}catch{await p.remove(m);}}let o=e,c={...process.env,PIP_DISABLE_PIP_VERSION_CHECK:"1",PIP_NO_PYTHON_VERSION_WARNING:"1"},s=Math.max(0,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY??"2")),a=Math.max(200,Number(process.env.RAPIDKIT_BRIDGE_PIP_RETRY_DELAY_MS??"800")),d=Math.max(1e4,Number(process.env.RAPIDKIT_BRIDGE_PIP_TIMEOUT_MS??"120000")),P=m=>new Promise(h=>setTimeout(h,m)),E=async(m,h,f)=>{let y=await execa(m,h,{reject:false,stdio:["ignore","pipe","inherit"],env:c,timeout:f});if(y.exitCode===0)return;let T=(y.stdout??"").toString(),$=(y.stderr??"").toString(),b=[T,$].filter(Boolean).join(`
|
|
18
|
+
`),ft=b?`${m} ${h.join(" ")}
|
|
19
|
+
${b}`:`${m} ${h.join(" ")}`;throw new Error(ft)},R=async(m,h,f)=>{let y=0;for(;;)try{await E(m,h,f);return}catch(T){if(y>=s)throw T;let $=Math.floor(Math.random()*200),b=a*Math.pow(2,y)+$;y+=1,await P(b);}};try{await p.ensureDir(l.dirname(o));try{await E(t,v(t,["-m","venv",o]),6e4);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_VENV_CREATE_FAILED",y)}let m=Y(o);if((await execa(m,["-m","pip","--version"],{reject:false,stdio:"pipe",timeout:2e3})).exitCode!==0&&(await execa(m,["-m","ensurepip","--default-pip"],{reject:false,stdio:["ignore","pipe","inherit"],env:c,timeout:6e4})).exitCode!==0)throw new w("BRIDGE_PIP_BOOTSTRAP_FAILED","ensurepip failed; install python3-venv/python3-pip and retry.");if(process.env.RAPIDKIT_BRIDGE_UPGRADE_PIP==="1")try{await R(m,["-m","pip","install","-U","pip"],d);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_UPGRADE_FAILED",y)}try{await R(m,["-m","pip","install","-U",_()],d);}catch(f){let y=f instanceof Error?f.message:String(f);throw new w("BRIDGE_PIP_INSTALL_FAILED",y)}return m}catch(m){if(m instanceof w)throw m;let h=m instanceof Error?m.message:String(m);throw new w("BRIDGE_VENV_BOOTSTRAP_FAILED",h)}}async function St(){if(process.env.RAPIDKIT_BRIDGE_FORCE_VENV==="1")return {kind:"venv",pythonPath:await B()};for(let r of O())if(await at(r))return {kind:"system",cmd:r};let t=await dt();if(!t)throw new w("PYTHON_NOT_FOUND","No Python interpreter found (python3/python/py).");let e;try{e=await N(t);}catch{e=await B();}return {kind:"venv",pythonPath:e}}async function Jt(t,e){try{let r=await F(e?.cwd),n=r.cmd,i=[...r.baseArgs,...t];if(t[0]==="init"){let s=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"pipe"}),a=H((s.stdout??"").toString()),d=H((s.stderr??"").toString());return a&&process.stdout.write(a.endsWith(`
|
|
20
|
+
`)?a:`${a}
|
|
21
|
+
`),d&&process.stderr.write(d.endsWith(`
|
|
22
|
+
`)?d:`${d}
|
|
23
|
+
`),typeof s.exitCode=="number"?s.exitCode:1}let c=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"inherit"});return typeof c.exitCode=="number"?c.exitCode:1}catch(r){return process.stderr.write(`${D(r)}
|
|
24
|
+
`),1}}var It=[{pattern:/RapidKitError:\s*Directory '([^']+)' exists and force is not set/,message:t=>`\u274C Directory "${l.basename(t[1])}" already exists.
|
|
25
|
+
\u{1F4A1} Choose a different name, or remove the existing directory first:
|
|
26
|
+
rm -rf ${t[1]}`},{pattern:/RapidKitError:\s*Project name '([^']+)' is (invalid|not allowed)/i,message:t=>`\u274C Invalid project name: "${t[1]}"
|
|
27
|
+
\u{1F4A1} Use lowercase letters, numbers, and hyphens only (e.g. my-api).`},{pattern:/RapidKitError:\s*Kit '([^']+)' not found/i,message:t=>`\u274C Unknown kit: "${t[1]}"
|
|
28
|
+
\u{1F4A1} Run "npx workspai list" to see available kits.`},{pattern:/RapidKitError:\s*(.+)/,message:t=>`\u274C ${t[1].trim()}`}];async function Wt(t,e){let{spawn:r}=await import('child_process');try{let n=await F(e?.cwd),i=n.cmd,o=[...n.baseArgs,...t];return await new Promise(c=>{let s=r(i,o,{cwd:e?.cwd,env:{...process.env,...e?.env},stdio:["inherit","inherit","pipe"]}),a=[];s.stderr?.on("data",d=>{a.push(d);}),s.on("close",d=>{let P=d??1;if(P!==0&&a.length>0){let E=Buffer.concat(a).toString("utf8");for(let{pattern:R,message:m}of It){let h=E.match(R);if(h){process.stderr.write(m(h)+`
|
|
29
|
+
`),c(P);return}}process.stderr.write(E);}c(P);}),s.on("error",d=>{process.stderr.write(`${D(d)}
|
|
30
|
+
`),c(1);});})}catch(n){return process.stderr.write(`${D(n)}
|
|
31
|
+
`),1}}async function x(t,e){try{let r=await F(e?.cwd),n=r.cmd,i=[...r.baseArgs,...t],o=await execa(n,i,{cwd:e?.cwd,env:{...process.env,...e?.env},reject:false,stdio:"pipe"});return {exitCode:typeof o.exitCode=="number"?o.exitCode:1,stdout:(o.stdout??"").toString(),stderr:(o.stderr??"").toString()}}catch(r){return {exitCode:1,stdout:"",stderr:`${D(r)}
|
|
32
|
+
`}}}function pt(t){let e=new Set,r=t.split(`
|
|
33
|
+
`),n=false;for(let i of r){let o=i.replace(/\r$/,"");if(!n){/^\s*Commands:\s*$/i.test(o)&&(n=true);let a=o.match(/^\s*rapidkit\s+([a-z0-9_-]+)\b/i);if(a){let d=a[1].trim();d&&!d.startsWith("-")&&e.add(d);}continue}if(!o.trim())break;if(/^\s*(Options|Arguments|Usage|Commands)\s*:/i.test(o))continue;let c=o.match(/^\s*([a-z0-9][a-z0-9_-]*)\b/i);if(!c)continue;let s=c[1].trim();s&&!s.startsWith("-")&&e.add(s);}return e}async function lt(){let t=st();if(!await p.pathExists(t))return null;try{let e=await p.readJson(t);if(e&&e.schema_version===1&&Array.isArray(e.commands))return e}catch{}return null}async function Z(t){let e=st();await p.ensureDir(l.dirname(e)),await p.writeJson(e,t,{spaces:2});}async function Dt(){let t=await x(["version","--json"],{cwd:process.cwd()});if(t.exitCode===0)try{let r=JSON.parse(t.stdout)?.version;return typeof r=="string"?r:void 0}catch{return}}async function Ot(){let t=await x(["commands","--json"],{cwd:process.cwd()});if(t.exitCode!==0)return null;try{let e=JSON.parse(t.stdout);if(e?.schema_version!==1||!Array.isArray(e.commands))return null;let r=e.commands.filter(n=>typeof n=="string");return r.length?r:null}catch{return null}}async function Ht(){let e=Date.now(),r=await lt(),n=await Dt(),i=!!r?.commands?.length;if(i&&e-r.fetched_at<864e5&&(!n||!r.rapidkit_version||r.rapidkit_version===n))return new Set(r.commands);let o=await Ot();if(o?.length){let d=Array.from(new Set(o)).sort();return await Z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:d}),new Set(d)}let c=await x(["--help"],{cwd:process.cwd()});if(c.exitCode!==0)return i&&r?.commands?new Set(r.commands):new Set(M);let s=pt(c.stdout);if(s.size===0)return new Set(M);let a=Array.from(s).sort();return await Z({schema_version:1,fetched_at:e,rapidkit_version:n,commands:a}),s}async function Yt(){let e=Date.now(),r=await lt();return !r||e-r.fetched_at>=864e5||!r.commands?.length?null:new Set(r.commands)}function mt(){return l.join(j(),"rapidkit","npm-bridge","modules-catalog.json")}async function jt(){let t=mt();if(!await p.pathExists(t))return null;try{let e=await p.readJson(t);if(e&&e.schema_version===1&&Array.isArray(e.modules))return e}catch{}return null}async function X(t){let e=mt();await p.ensureDir(l.dirname(e)),await p.writeJson(e,t,{spaces:2});}function Q(t){try{return JSON.parse(t)}catch{return null}}async function Ut(t={}){let e=typeof t.ttlMs=="number"?t.ttlMs:18e5,r=Date.now(),n=await jt();if(n?.fetched_at&&r-n.fetched_at<e)return n;let i=["modules","list","--json-schema","1"];t.category&&i.push("--category",t.category),t.tag&&i.push("--tag",t.tag),t.detailed&&i.push("--detailed");let o=await x(i,{cwd:t.cwd,env:t.env});if(o.exitCode===0){let s=Q(o.stdout);if(s&&s.schema_version===1&&Array.isArray(s.modules)){let a={...s,fetched_at:r};return await X(a),a}}let c=await x(["modules","list","--json"],{cwd:t.cwd,env:t.env});if(c.exitCode===0){let s=Q(c.stdout);if(Array.isArray(s)){let a={schema_version:1,generated_at:new Date().toISOString(),filters:{category:t.category??null,tag:t.tag??null,detailed:!!t.detailed},stats:{total:s.length,returned:s.length,invalid:0},modules:s,source:"legacy-json",fetched_at:r};return await X(a),a}}return n||null}var zt={pythonCommandCandidates:O,pickSystemPython:dt,ensureBridgeVenv:N,ensureBridgeVenvFromCandidates:B,parseCoreCommandsFromHelp:pt,tryRapidkit:at,findUserLocalRapidkitRunner:rt,findPathRapidkitRunner:it,findWorkspaceRunner:ct,checkRapidkitCoreAvailable:_t,checkRapidkitCoreVersionCompatible:At,isVersionSatisfyingConstraint:ut};export{M as a,_t as b,At as c,St as d,Jt as e,Wt as f,x as g,Ht as h,Yt as i,Ut as j,zt as k};
|
|
@@ -5,4 +5,4 @@ ${s}`,e=typeof n=="string"?n.trimEnd():"";return e?i.test(e)?`${e.replace(i,r).t
|
|
|
5
5
|
|
|
6
6
|
${r}
|
|
7
7
|
`:`${r}
|
|
8
|
-
`}function l(n){if(!n)return null;let t=n.match(i);return t?t[0].replace(c,"").replace(s,"").trim():null}export{
|
|
8
|
+
`}function l(n){if(!n)return null;let t=n.match(i);return t?t[0].replace(c,"").replace(s,"").trim():null}export{c as a,s as b,g as c,l as d};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {b as b$1}from'./chunk-KVSYBHUR.js';import {i,o}from'./chunk-WJVB6SSD.js';import {c}from'./chunk-TROHVI2V.js';import {f,g}from'./chunk-VRW6KXNK.js';import {b}from'./chunk-RO73VVHW.js';import {l,k}from'./chunk-MOSXTVPU.js';import {promises}from'fs';import s from'path';import F,{homedir}from'os';import {pathToFileURL}from'url';import f$1 from'process';import T from'fs-extra';function I(e){let o=e.label.indexOf(" \u2014 ");return o>=0?e.label.slice(o+3).trim():e.label.trim()}function L(){let e=c().map(r=>({value:r.id,label:`${j(r.category)} \xB7 ${I(r)}`,hint:`${r.runtime} \xB7 tested baseline`,name:r.label})),t=i().map(r=>({value:r.kitId,label:`Frontend \xB7 ${r.displayName}`,hint:"official \xB7 latest stable",name:`${r.displayName} \u2014 ${r.framework}`})),o$1=o().map(r=>({value:r.kitId,label:`${j(r.category)} \xB7 ${r.displayName}`,hint:`${r.runtimeCandidates.join(" + ")} \xB7 official latest stable`,name:`${r.displayName} \u2014 ${r.category}`})),n=[...e,...t,...o$1].sort((r,i)=>{let a=["Backend","Frontend","Desktop","Extension"],c=r.label?.split(" \xB7 ")[0]??"",p=i.label?.split(" \xB7 ")[0]??"";return a.indexOf(c)-a.indexOf(p)||(r.label??"").localeCompare(i.label??"")});return E(n),n}function j(e){return e.charAt(0).toUpperCase()+e.slice(1)}function E(e){let t=new Set,o=new Set;for(let n of e){let r=n.label??n.name??String(n.value),i=String(n.value);if(t.has(r))throw new Error(`Duplicate kit picker label: ${r}`);if(o.has(i))throw new Error(`Duplicate kit picker value: ${i}`);t.add(r),o.add(i);}}var U=".workspairc.json",A=".rapidkitrc.json",O=["workspai.config.js","workspai.config.mjs","workspai.config.cjs","rapidkit.config.js","rapidkit.config.mjs","rapidkit.config.cjs"],R=["workspai.config.json","rapidkit.config.json"];function $(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT"}function h(e,t){let o=t instanceof Error?t.message:String(t),n=e.endsWith(".js")&&/module is not defined in ES module scope/i.test(o)?' 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 ${e}.${n} Cause: ${o}`}async function We(){for(let e of [s.join(F.homedir(),U),s.join(F.homedir(),A)])try{let t=await promises.readFile(e,"utf-8"),o=JSON.parse(t);return f.debug(`Loaded config from ${e}`),o}catch{}return f.debug("No user config found, using defaults"),{}}async function je(e=process.cwd(),t={}){let o=e,n=s.parse(o).root;for(;o!==n;){for(let r of R){let i=s.join(o,r);try{let a=await promises.readFile(i,"utf-8"),c=JSON.parse(a);if(!c||typeof c!="object"||Array.isArray(c))throw new Error("configuration root must be a JSON object");return f.debug(`Loaded data-only Workspai config from ${r}`),c}catch(a){if($(a))continue;throw new Error(h(i,a))}}for(let r of O){let i=s.join(o,r);try{await promises.access(i);}catch(a){if($(a))continue;throw new Error(h(i,a))}if(f.debug(`Found config file: ${i}`),!t.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 c=await import(pathToFileURL(i).href),p=c.default||c;return f.debug(`Loaded Workspai config from ${r}`),p}catch(a){throw new Error(h(i,a))}}o=s.dirname(o);}return f.debug("No Workspai config file found, using defaults"),{}}function Ee(e,t,o){return {author:o.author||t.workspace?.defaultAuthor||e.author,pythonVersion:o.pythonVersion||t.workspace?.pythonVersion||e.pythonVersion,defaultInstallMethod:o.defaultInstallMethod||t.workspace?.installMethod||e.defaultInstallMethod,defaultKit:o.defaultKit||t.projects?.defaultKit||e.defaultKit,skipGit:o.skipGit??t.projects?.skipGit??e.skipGit,license:o.license||e.license,testRapidKitPath:o.testRapidKitPath||e.testRapidKitPath}}function Fe(e){return g("DEV_PATH")||e.testRapidKitPath||void 0}var w=class extends Error{constructor(o,n){super(["Workspai workspaces cannot be nested.",`Target: ${o}`,`Containing workspace: ${n}`,"Choose Managed home or pass --output <path> with a location outside the current workspace."].join(`
|
|
2
|
+
`));this.targetPath=o;this.containingWorkspacePath=n;this.name="NestedWorkspaceCreationError";}targetPath;containingWorkspacePath;code="WORKSPACE_NESTING_NOT_SUPPORTED"};async function _(e){try{return !!await T.stat(e)}catch{return false}}function G(e,t){let o=e.indexOf(t);if(o>=0&&o+1<e.length)return e[o+1];let n=e.find(r=>r.startsWith(`${t}=`));if(n)return n.slice(t.length+1)}function M(e){return e.includes("--here")}async function N(e){let t=s.resolve(e);for(;;){let o=[s.join(t,".workspai-workspace"),s.join(t,".rapidkit-workspace"),s.join(t,".workspai","workspace.json"),s.join(t,".rapidkit","workspace.json")];if((await Promise.all(o.map(_))).some(Boolean))return t;let n=s.dirname(t);if(n===t)return;t=n;}}async function Oe(e){let t=s.resolve(e),o=await N(s.dirname(t));if(o)throw new w(t,o)}async function V(e,t=homedir()){let n=[{value:"managed",label:"Managed home",hint:k(t)}];return await N(e)||n.push({value:"here",label:"Current directory",hint:e}),n}function S(e,t=f$1.cwd()){if(M(e))return s.resolve(t);let o=G(e,"--output");if(o)return s.resolve(o)}function Re(e,t=f$1.cwd()){let o=s.resolve(e),n=s.resolve(t),r=s.relative(n,o);return r.length>0&&!r.startsWith("..")&&!s.isAbsolute(r)?`cd ${r}`:`cd ${o}`}function Te(e,t={}){let o=t.argv??[],n=t.outputParent??S(o,f$1.cwd());return l(e.trim(),{homeDir:t.homeDir,outputDir:n})}function _e(e,t,o={}){return e?s.resolve(e)===s.resolve(t)?true:o.outputParent===void 0:false}async function Ge(e,t={}){let o=t.cwd??f$1.cwd(),n=t.homeDir??homedir(),r=S(e,o);if(r!==void 0)return r;let i=t.hasYes??(e.includes("--yes")||e.includes("-y"));if(!(t.interactive??(!i&&!!f$1.stdin.isTTY&&!b())))return;let c=await V(o,n);if(c.length===1)return;let{location:p}=await b$1([{type:"rawlist",name:"location",message:"Where should the workspace be created?",choices:c,default:0}]);if(p==="here")return s.resolve(o)}export{L as a,We as b,je as c,Ee as d,Fe as e,Oe as f,Re as g,Te as h,_e as i,Ge as j};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-JEI6BTZI.js';import {a}from'./chunk-BHYTI3RH.js';import {c,e,d}from'./chunk-DQ3PI7EP.js';import {d as d$1,b}from'./chunk-VU2BKKMB.js';import {g}from'./chunk-GBAO4GSW.js';import {p as p$1,l}from'./chunk-BYTFXQ6G.js';import {p as p$2,d as d$2}from'./chunk-BBGNDMRU.js';import {e as e$1}from'./chunk-XBM2P45G.js';import {b as b$1}from'./chunk-RVQLMTTI.js';import {a as a$2}from'./chunk-AFIFZTOY.js';import j from'path';import P from'fs-extra';function J(e$1){switch(e$1){case "why":return d;case "trace":return e;default:return c}}async function E(e,o,n){try{if(!await P.pathExists(e))return null;let r=await P.readJson(e);return o?b$1(o,r,e):n&&a$2(r,n,e),r}catch(r){if((o||n)&&await P.pathExists(e))throw r;return null}}function G(e,o){if(!e)return null;let n=o.trim().toLowerCase();return e.projects.find(r=>r.slug.toLowerCase()===n||r.relativePath.toLowerCase()===n)??null}function X(e,o,n){let r=n.trim().toLowerCase(),t=(l(e)?.nodes.map(a=>a.id)??e.projects.map(a=>a.name)).find(a=>a.toLowerCase()===r);if(t)return t;let d=e.projects.find(a=>[a.name,a.path,j.basename(a.path)].filter(u=>u.trim().length>0).some(u=>u.toLowerCase()===r));if(d)return d.name;let c=G(o,n);if(c){let a=e.projects.find(u=>u.path===c.relativePath||u.path.endsWith(`/${c.relativePath}`));if(a)return a.name}return n}function Y(e,o){if(!e)return [];let n=o.trim().toLowerCase(),r=new Set;for(let l of e.projects){l.contracts.dependsOn?.some(t=>t.toLowerCase()===n)&&r.add(l.slug);for(let t of l.contracts.consumes??[])for(let d of e.projects)d.contracts.publishes?.includes(t)&&d.slug===n&&r.add(l.slug);}return [...r].sort()}function q(e,o){if(!e)return [];let n=o.trim().toLowerCase();return e.steps.filter(r=>r.scope==="project"&&r.project?.toLowerCase()===n&&r.command?.display).map(r=>r.command.display).slice(0,8)}function p(e,o,n){return {id:e,title:o,body:n.trim()}}async function fe(e){let o=j.resolve(e.workspacePath),n=(e.now??new Date).toISOString(),r=e.model??await p$1({workspacePath:o,includeEvidence:true}),l$1=e.contract;if(l$1===void 0)try{l$1=(await p$2({workspacePath:o})).contract;}catch{l$1=null;}let t=e.verify;t===void 0&&(t=await E(j.join(o,d$1),d$1));let d=e.impact;if(d===void 0&&(d=await E(j.join(o,g),g)),e.target.kind==="release-blocked"){let s=t?.blockingReasons??[],i=(r.summary?.projectCount??r.projects.length)===0,g=[p("verdict",i?"Workspace scaffold posture":"Release verdict",t?i?`Scaffold posture: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Freshness: **${t.freshness.verdict}**. No registered projects yet \u2014 release gates apply after the first project is added.`:`Verdict: **${t.summary.verdict}** (exit ${t.summary.exitCode}). Risk: **${t.impact.risk}**. Freshness: **${t.freshness.verdict}**.`:"No workspace verify report found. Run `npx workspai workspace verify --json --write` first."),p("blockers",i?"Pre-project signals":"Blocking reasons",s.length?s.map(h=>`- ${h}`).join(`
|
|
2
|
+
`):i?"No pre-project signals in the latest verify report.":"No blocking reasons in the latest verify report.")];return t?.resolutionHints?.length&&g.push(p("resolution","Resolution hints",t.resolutionHints.map(h=>`- **${h.blockerId}** (${h.resolutionClass}): ${h.commandRetryHint??h.fixHints[0]?.detail??"See fix hints"}`).join(`
|
|
3
|
+
`))),{schemaVersion:a,generatedAt:n,workspacePath:o,target:e.target,summary:t?i?b(s.length,t.summary.verdict):`${s.length>0||t.summary.verdict==="blocked"?"Release blocked":"Release posture"}: ${t.summary.verdict} with ${s.length} blocking reason(s).`:"Release posture unknown \u2014 verify report missing.",sections:g,releaseRisk:t?.impact.risk,blockingReasons:s,resolutionHints:t?.resolutionHints}}if(e.target.kind==="blocker"){let s=e.target,m=t?.resolutionHints?.find(g=>g.blockerId===s.blockerId),i=t?.blockingReasons.find(g=>g.includes(s.blockerId))??t?.blockingReasons[0];return {schemaVersion:a,generatedAt:n,workspacePath:o,target:s,summary:m?`Blocker ${s.blockerId}: ${m.resolutionClass}`:`Blocker ${s.blockerId} (no structured hint)`,sections:[p("reason","Blocking signal",i??"No matching blocking reason in verify."),p("hint","Resolution class",m?`${m.resolutionClass}
|
|
4
|
+
|
|
5
|
+
${m.commandRetryHint??""}
|
|
6
|
+
|
|
7
|
+
${m.fixHints.map(g=>`- ${g.detail}`).join(`
|
|
8
|
+
`)}`:"Run workspace verify to emit resolutionHints for this blocker.")],blockingReasons:i?[i]:[],resolutionHints:m?[m]:[]}}if(e.target.kind==="trace"){let s=j.isAbsolute(e.target.diffRef)?e.target.diffRef:j.join(o,e.target.diffRef),m=await E(s,void 0,"contracts/workspace-intelligence/workspace-model-diff.v1.json"),i=m?.summary?.changedProjects??[...new Set((m?.changes??[]).map(f=>f.project).filter(Boolean))],h=(r.summary?.projectCount??r.projects.length)===0,_=d?.transitiveImpact?.map(f=>`${f.project?.name??f.target} (d${f.distance??0}, via ${f.via??"\u2014"})`)??[],y=t?.affectedSubgraph;return {schemaVersion:a,generatedAt:n,workspacePath:o,target:e.target,summary:i?.length?`Trace from ${i.length} changed project(s) through blast radius to gate coverage.`:h?"Trace: workspace scaffold baseline \u2014 no project changes in the latest diff.":"Trace: diff baseline present with no project changes.",sections:[p("origin","Change origin",i?.length?i.map(f=>`- ${f}`).join(`
|
|
9
|
+
`):"No changed projects in diff."),p("blast-radius","Transitive impact",_.length?_.map(f=>`- ${f}`).join(`
|
|
10
|
+
`):"No transitive impact report."),p("gate","Subgraph gate",y?`Directly changed: ${y.directlyChanged}; transitive dependents: ${y.transitiveDependents}; covered: ${y.covered}; uncovered: ${y.uncovered}; unverifiable: ${y.unverifiable}.`:"No verify subgraph coverage available.")],releaseRisk:d?.summary?.risk??t?.impact.risk,blockingReasons:t?.blockingReasons}}let c=e.target.project,a$2=X(r,l$1,c),u=l(r),k=u?a$1(u,a$2):{found:false,centrality:null,directDependents:[],transitiveDependents:[]},w=G(l$1,c),b$1=Y(l$1,c),x=q(t,c),v=r.projects.find(s=>s.name.toLowerCase()===c.toLowerCase()),I=[p("overview","Project overview",v?`${v.name} (${v.frameworkDisplayName}, ${v.runtime}) at \`${v.path}\`.`:`Project **${c}** ${k.found?"exists in graph":"not found in workspace model"}.`),p("consumers","Consumers / dependents",[`Direct dependents: ${k.directDependents.join(", ")||"none"}`,`Contract consumers: ${b$1.join(", ")||"none"}`,`Transitive dependents (blast radius): ${k.transitiveDependents.length}`].join(`
|
|
11
|
+
`)),p("contracts","Critical contracts",w?[`Owns: ${w.contracts?.owns?.join(", ")||"none"}`,`Publishes: ${w.contracts.publishes.join(", ")||"none"}`,`Consumes: ${w.contracts.consumes.join(", ")||"none"}`,`APIs: ${w.contracts.apis.map(s=>s.name).join(", ")||"none"}`].join(`
|
|
12
|
+
`):"No workspace.contract.json entry for this project."),p("verification","Required verification",x.length?x.map(s=>`- ${s}`).join(`
|
|
13
|
+
`):"- `npx workspai workspace verify --json`\n- Project test/build via `workspace run` when configured")];k.centrality&&I.push(p("centrality","Graph centrality",`fanIn ${k.centrality.fanIn}, fanOut ${k.centrality.fanOut}, reach ${k.centrality.reach}, hotspot ${k.centrality.isHotspot?"yes":"no"}.`));let A=c.trim().toLowerCase(),T=s=>s.project?.name?.toLowerCase()===A||s.target.toLowerCase()===A,S=d?.affectedProjects?.find(T)?.risk??d?.transitiveImpact?.find(T)?.risk??t?.impact.risk??"unknown";return {schemaVersion:a,generatedAt:n,workspacePath:o,target:e.target,summary:`${c}: ${b$1.length} consumer(s), release risk **${S}**.`,sections:I,releaseRisk:String(S)}}async function ue(e,o,n="explain"){let r=J(n);return await e$1(o,r,d$2(e)),r}export{J as a,fe as b,ue as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {f as f$1}from'./chunk-
|
|
1
|
+
import {f as f$1}from'./chunk-PS5F4DCT.js';import a from'path';import b from'fs-extra';var f=4,y="workspace-graph-token-efficiency.v1";function g(e){return Math.ceil(e/f)}function v(e,o){if(!o||a.isAbsolute(o))return null;let r=a.resolve(e),i=a.resolve(r,o),t=a.relative(r,i);return !t||t.startsWith("..")||a.isAbsolute(t)?null:i}async function P(e){let o=a.resolve(e.workspacePath),r=f$1(e.graph,{query:e.query,...e.kind?{kind:e.kind}:{},limit:e.limit}),i=[...new Set(e.graph.proofs.map(s=>s.artifact))].sort(),t=[],u=0,d=0;for(let s of i){let m=v(o,s);if(!m){t.push(s);continue}try{let k=await b.readFile(m,"utf8");u+=k.length,d+=1;}catch{t.push(s);}}let l=JSON.stringify(r).length,n=g(u),c=g(l),h=Math.max(0,n-c);return {schemaVersion:y,generatedAt:(e.now??new Date).toISOString(),workspacePath:o,query:e.query,graph:{schemaVersion:e.graph.schemaVersion,sourceArtifact:e.graph.source.artifact,sourceHash:e.graph.source.hash,entityCount:e.graph.entities.length,relationCount:e.graph.relations.length,proofCount:e.graph.proofs.length},methodology:{id:"indexed-corpus-vs-bounded-retrieval.v1",estimated:true,charsPerToken:f,claimBoundary:"Measures retrieval payload reduction against readable proof-source text; it does not claim equivalent answer quality or model-specific billing savings."},corpus:{artifactCount:d,characterCount:u,estimatedTokens:n,unreadableArtifacts:t},retrieval:{matchCount:r.entities.length,characterCount:l,estimatedTokens:c,truncated:r.truncated,payload:r},savings:{estimatedTokensAvoided:h,reductionRatio:c===0?0:Number((n/c).toFixed(2)),reductionPercent:n===0?0:Number((h/n*100).toFixed(2))}}}export{y as a,P as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import m from'fs';import i from'path';import {fileURLToPath}from'url';import y from'ajv';import w from'ajv/dist/2020.js';import $ from'ajv-formats';var d=new Map,A=["https://workspai.dev/schemas/","https://workspai.dev/contracts/"];function p(n,e){let r=A.find(t=>n.startsWith(t));if(r){let t=decodeURIComponent(n.slice(r.length)),s=t.split("/");if(!t||i.isAbsolute(t)||t.includes("\\")||t.includes("\0")||t.includes("?")||s.some(o=>o===".."||o==="."))throw new Error(`Unsafe Workspai JSON Schema reference: ${n}`);return `contracts/${t}`}if(!/^https?:\/\//i.test(n))return i.join(i.dirname(e),n).split(i.sep).join("/")}function f(n,e=new Set){if(Array.isArray(n)){for(let r of n)f(r,e);return e}if(!n||typeof n!="object")return e;for(let[r,t]of Object.entries(n))r==="$ref"&&typeof t=="string"&&!t.startsWith("#")?e.add(t.split("#",1)[0]??t):f(t,e);return e}function l(n,e,r,t=new Set){for(let s of f(e)){if(!s)continue;let o=p(s,r);if(!o)continue;let c=h(o);if(t.has(c))continue;t.add(c);let a=JSON.parse(m.readFileSync(c,"utf8"));l(n,a,o,t),n.addSchema(a);}}function h(n){let e=i.dirname(fileURLToPath(import.meta.url)),t=[i.resolve(e,"..",n),i.resolve(e,"../..",n),i.resolve(process.cwd(),n)].find(s=>m.existsSync(s));if(!t)throw new Error(`JSON Schema contract is unavailable: ${n}`);return t}function S(n){let e=h(n),r=d.get(e);if(r)return r;let t=JSON.parse(m.readFileSync(e,"utf8"));if(typeof t.$ref=="string"&&!t.$ref.startsWith("#")){let a=p(t.$ref.split("#",1)[0]??t.$ref,n);if(a){let u=S(a);return d.set(e,u),u}}let s=t.$schema?.includes("2020-12")?w:y,o=new s({allErrors:true,strict:true,allowUnionTypes:true});$(o),l(o,t,n);let c=o.compile(t);return d.set(e,c),c}function j(n){return (n??[]).slice(0,8).map(e=>{let r=e.instancePath||"/",t=e.keyword==="additionalProperties"?` (${String(e.params.additionalProperty)})`:"";return `${r} ${e.message??e.keyword}${t}`}).join("; ")}function T(n,e,r){let t=S(e);if(!t(n))throw new Error(`${r} violates ${e}: ${j(t.errors)}`)}
|
|
2
|
+
export{T as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var o={model:".workspai/reports/workspace-model.json",knowledgeGraph:".workspai/reports/workspace-knowledge-graph.json",snapshot:".workspai/reports/workspace-model-snapshot.json",diff:".workspai/reports/workspace-model-diff-last-run.json",impact:".workspai/reports/workspace-impact-last-run.json",analyze:".workspai/reports/analyze-last-run.json",doctor:".workspai/reports/doctor-last-run.json",contractVerify:".workspai/reports/workspace-contract-verify-last-run.json",readiness:".workspai/reports/release-readiness-last-run.json",verify:".workspai/reports/workspace-verify-last-run.json",history:".workspai/reports/workspace-intelligence-history.json",agentContext:".workspai/reports/workspace-context-agent.json",agentIndex:".workspai/reports/INDEX.json",agentCustomizationPack:".workspai/reports/agent-customization-pack.json",skillsIndex:".workspai/reports/workspace-skills-index.json",agents:"AGENTS.md",explain:".workspai/reports/workspace-explain-last-run.json",intelligenceRun:".workspai/reports/workspace-intelligence-run-last-run.json",evaluationLive:".workspai/reports/workspace-intelligence-evaluation-live.json",evaluationLastRun:".workspai/reports/workspace-intelligence-evaluation-last-run.json"},
|
|
1
|
+
var o={model:".workspai/reports/workspace-model.json",knowledgeGraph:".workspai/reports/workspace-knowledge-graph.json",snapshot:".workspai/reports/workspace-model-snapshot.json",diff:".workspai/reports/workspace-model-diff-last-run.json",impact:".workspai/reports/workspace-impact-last-run.json",analyze:".workspai/reports/analyze-last-run.json",doctor:".workspai/reports/doctor-last-run.json",contractVerify:".workspai/reports/workspace-contract-verify-last-run.json",readiness:".workspai/reports/release-readiness-last-run.json",verify:".workspai/reports/workspace-verify-last-run.json",history:".workspai/reports/workspace-intelligence-history.json",agentContext:".workspai/reports/workspace-context-agent.json",agentIndex:".workspai/reports/INDEX.json",agentCustomizationPack:".workspai/reports/agent-customization-pack.json",skillsIndex:".workspai/reports/workspace-skills-index.json",agents:"AGENTS.md",explain:".workspai/reports/workspace-explain-last-run.json",intelligenceRun:".workspai/reports/workspace-intelligence-run-last-run.json",evaluationLive:".workspai/reports/workspace-intelligence-evaluation-live.json",evaluationLastRun:".workspai/reports/workspace-intelligence-evaluation-last-run.json"},r={model:"workspace-model.v1",knowledgeGraph:"workspace-knowledge-graph.v1",snapshot:"workspace-model-snapshot.v1",diff:"workspace-model-diff.v1",impact:"workspace-impact.v1",analyze:"rapidkit-analyze-v1",doctor:"doctor-workspace-evidence-v1",contractVerify:"workspace-contract-verify.v1",readiness:"release-readiness-v1",verify:"workspace-verify.v1",history:"workspace-intelligence-history.v1",agentContext:"workspace-context.v1",agentIndex:"rapidkit-agent-reports-index.v1",agentCustomizationPack:"rapidkit-agent-customization-pack.v1",skillsIndex:"workspace-skills-index.v1",agents:null,explain:"workspace-explain.v1",intelligenceRun:"workspace-intelligence-run.v1",evaluationLive:"workspace-intelligence-evaluation.v1",evaluationLastRun:"workspace-intelligence-evaluation.v1"},c={model:"contracts/workspace-intelligence/workspace-model.v1.json",knowledgeGraph:"contracts/workspace-intelligence/workspace-knowledge-graph.v1.json",snapshot:"contracts/workspace-intelligence/workspace-model-snapshot.v1.json",diff:"contracts/workspace-intelligence/workspace-model-diff.v1.json",impact:"contracts/workspace-intelligence/workspace-impact.v1.json",analyze:"contracts/analyze-last-run.v1.json",doctor:"contracts/doctor-workspace-evidence.v1.json",contractVerify:"contracts/workspace-intelligence/workspace-contract-verify.v1.json",readiness:"contracts/release-readiness.v1.json",verify:"contracts/workspace-intelligence/workspace-verify.v1.json",history:"contracts/workspace-intelligence/workspace-intelligence-history.v1.json",agentContext:"contracts/workspace-intelligence/workspace-context.v1.json",agentIndex:"contracts/workspace-intelligence/agent-reports-index.v1.json",agentCustomizationPack:"contracts/workspace-intelligence/agent-customization-pack-report.v1.json",skillsIndex:"contracts/workspace-intelligence/workspace-skills-index.v1.json",agents:null,explain:"contracts/workspace-intelligence/workspace-explain.v1.json",intelligenceRun:"contracts/workspace-intelligence/workspace-intelligence-run.v1.json",evaluationLive:"contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json",evaluationLastRun:"contracts/workspace-intelligence/workspace-intelligence-evaluation.v1.json"},i={analyze:"analyze",workspace:"workspace <action> [subaction] [key] [value]",doctor:"doctor [scope]",readiness:"readiness"},p=["analyze","readiness","doctor","workspace"],l=["model","diff","impact","doctor-evidence","contract-evidence","analyze-evidence","readiness-evidence","verify","context","agent-sync","explain"],k=["sync","baseline"],d={sync:[".workspai/workspace.contract.json",".workspai/workspace-registry.v1.json"],baseline:[o.snapshot]},e=o,s={model:{command:["workspace","model","--json","--write"],produces:[e.model,e.knowledgeGraph]},diff:{command:["workspace","diff","--from",e.snapshot,"--json"],produces:[e.diff]},impact:{command:["workspace","impact","--from",e.diff,"--json"],produces:[e.impact]},"doctor-evidence":{command:["doctor","workspace","--json"],produces:[e.doctor]},"contract-evidence":{command:["workspace","contract","verify","--strict","--json"],produces:[e.contractVerify]},"analyze-evidence":{command:["analyze","--json"],produces:[e.analyze]},"readiness-evidence":{command:["readiness","--json","--skip-verify"],produces:[e.readiness]},verify:{command:["workspace","verify","--from-impact",e.impact,"--json"],produces:[e.verify,e.history]},context:{command:["workspace","context","--for-agent","--json","--write","--no-agent-sync"],produces:[e.agentContext]},"agent-sync":{command:["workspace","agent-sync","--write","--json","--preset","enterprise"],produces:[e.agentIndex,e.agentCustomizationPack,e.skillsIndex,e.agents]},explain:{command:["workspace","explain","release-blocked","--json","--write"],produces:[e.explain]}};function w(n){return s[n]}export{o as a,r as b,c,i as d,p as e,l as f,k as g,d as h,s as i,w as j};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import {a}from'./chunk-A5FBGRJA.js';import {a as a$1}from'./chunk-AFIFZTOY.js';import {j,u as u$1,e,a as a$2,t,f as f$1}from'./chunk-MOSXTVPU.js';import {s}from'./chunk-RJIYCDVC.js';import b from'crypto';import P from'fs';import d from'fs/promises';import i from'path';import O from'fs-extra';var x="project-workspace-link.v1",A="workspai.project-workspace-link",l=class extends Error{constructor(r,a,o={}){super(a);this.code=r;this.context=o;this.name="ProjectWorkspaceResolutionError";}code;context};function _(e){return P.existsSync(i.join(e,".workspai-workspace"))?".workspai-workspace":".workspai/workspace.json"}function L(e){return b.createHash("sha256").update([e.workspaceName,a(e.workspacePath),e.projectName,a(e.projectPath),e.relativePath.replace(/\\/g,"/"),e.relationship].join("\0")).digest("hex")}function $(e){let t=i.resolve(e);for(;;){if(j(t))return t;let r=i.dirname(t);if(r===t)return null;t=r;}}function J(e){let t$1=i.resolve(e);for(;;){if([...t(t$1,"project.json"),...t(t$1,"context.json")].some(a=>P.existsSync(a)))return t$1;let r=i.dirname(t$1);if(r===t$1)return null;t$1=r;}}function y(e){return JSON.parse(P.readFileSync(e,"utf8"))}function I(e){let t=y(e);if(!t||typeof t!="object"||Array.isArray(t))throw new l("project.workspace.link-invalid",`Project workspace link is not a JSON object: ${e}`,{linkPath:e});let r=t;if(r.schemaVersion!==x||r.kind!==A||r.state!=="active"||!r.workspace||typeof r.workspace.name!="string"||r.workspace.name.trim().length===0||typeof r.workspace.root!="string"||!i.isAbsolute(r.workspace.root)||![".workspai-workspace",".workspai/workspace.json"].includes(r.workspace.marker??"")||r.workspace.contract!==".workspai/workspace.contract.json"||!r.project||typeof r.project.name!="string"||r.project.name.trim().length===0||typeof r.project.relativePath!="string"||i.isAbsolute(r.project.relativePath)||r.project.relativePath.split(/[\\/]/).includes("..")||!["managed","adopted","imported","linked","restored"].includes(r.project.relationship??"")||!r.integrity||r.integrity.algorithm!=="sha256"||typeof r.integrity.binding!="string"||!/^[a-f0-9]{64}$/.test(r.integrity.binding))throw new l("project.workspace.link-invalid",`Project workspace link does not satisfy ${x}: ${e}`,{linkPath:e});try{a$1(t,"contracts/project-workspace-link.v1.json","Project workspace link");}catch(a){throw new l("project.workspace.link-invalid",`Project workspace link does not satisfy ${x}: ${e}`,{linkPath:e,validationError:a instanceof Error?a.message:String(a)})}return r}function f(e,t){let r=i.join(e,".workspai","workspace.contract.json");if(!P.existsSync(r))return null;try{let a$1=y(r);if(!Array.isArray(a$1.projects))return false;let o=a(t);return a$1.projects.some(n=>typeof n.externalPath=="string"?a(n.externalPath)===o:typeof n.relativePath!="string"||n.relativePath.startsWith("external/")?false:a(i.resolve(e,n.relativePath))===o)}catch{return false}}function K(e,t,r){let a$1=a(e),o=new Map;for(let n of s(t,r)){if(!P.existsSync(n))continue;let c;try{c=y(n);}catch{continue}if(Array.isArray(c.workspaces))for(let p of c.workspaces){if(!p||typeof p.name!="string"||typeof p.path!="string"||!Array.isArray(p.projects)||!p.projects.some(w=>w&&typeof w.path=="string"&&a(w.path)===a$1))continue;let s=a(p.path);!j(s)||f(s,e)!==true||o.set(s,{name:p.name,path:s});}}return [...o.values()].sort((n,c)=>n.path.localeCompare(c.path))}function u(e,t){if(e)throw t;return null}function Z(e$1){let t=e$1.strict===true,r=i.resolve(e$1.startPath),a=e$1.explicitWorkspacePath?i.resolve(e$1.explicitWorkspacePath):null,o=J(r);if(a)return j(a)?e$1.requireProjectMembership===true&&o&&f(a,o)!==true?u(t,new l("project.workspace.membership-missing",`Project is not registered in the explicit workspace contract: ${a}`,{workspacePath:a,projectPath:o})):{workspacePath:a,projectPath:o,source:"explicit",linkPath:o?u$1(o,e):null,recovered:false}:u(t,new l("project.workspace.explicit-invalid",`Explicit workspace path is not a Workspai workspace: ${a}`,{workspacePath:a,projectPath:o}));let n=$(r);if(n)return e$1.requireProjectMembership===true&&o&&f(n,o)!==true?u(t,new l("project.workspace.membership-missing",`Project is not registered in its parent workspace contract: ${n}`,{workspacePath:n,projectPath:o})):{workspacePath:n,projectPath:o,source:"parent",linkPath:o?u$1(o,e):null,recovered:false};if(!o)return u(t,new l("project.workspace.unlinked","No Workspai project or workspace could be resolved from the current directory.",{startPath:r}));let c=u$1(o,e),p=null;if(P.existsSync(c)){let s;try{s=I(c);}catch(C){if(t)throw C;return null}let m=L({workspaceName:s.workspace.name,workspacePath:s.workspace.root,projectName:s.project.name,projectPath:o,relativePath:s.project.relativePath,relationship:s.project.relationship}),w=f(s.workspace.root,o);if(s.integrity.binding===m&&j(s.workspace.root)&&P.existsSync(i.join(s.workspace.root,s.workspace.marker))&&w===true)return {workspacePath:i.resolve(s.workspace.root),projectPath:o,source:"local-link",linkPath:c,recovered:false};p=s;}let h=K(o,e$1.env??process.env,e$1.platform??process.platform);return h.length>1?u(t,new l("project.workspace.ambiguous",`Project is registered in more than one valid workspace: ${h.map(s=>s.name).join(", ")}. Pass --workspace <path> or run project workspace relink.`,{projectPath:o,candidates:h})):h.length===1?{workspacePath:h[0].path,projectPath:o,source:"registry",linkPath:c,recovered:p!==null}:p?u(t,new l("project.workspace.link-stale",`Project workspace link is stale and no valid registry relocation was found: ${p.workspace.root}`,{projectPath:o,linkPath:c,linkedWorkspacePath:p.workspace.root})):u(t,new l("project.workspace.unlinked","This Workspai project is not linked to a valid workspace. Run `npx workspai adopt .` or `npx workspai project workspace relink --workspace <path>`.",{projectPath:o,linkPath:c}))}async function T(e,t){await d.mkdir(i.dirname(e),{recursive:true});let r=`${e}.${process.pid}.${b.randomUUID()}.tmp`;try{await d.writeFile(r,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`,{encoding:"utf8",mode:384});try{await d.rename(r,e);}catch(a){let o=a.code;if(o!=="EEXIST"&&o!=="EPERM")throw a;await O.move(r,e,{overwrite:true});}}finally{await d.rm(r,{force:true}).catch(()=>{});}}async function M(e){let t=i.join(e,".gitignore"),r=await d.readFile(t,"utf8").catch(c=>{if(c.code==="ENOENT")return "";throw c});if(r.split(/\r?\n/).map(c=>c.trim()).includes(f$1))return;let n=`${r.length>0&&!r.endsWith(`
|
|
3
|
+
`)?`
|
|
4
|
+
`:""}
|
|
5
|
+
# Workspai machine-local workspace binding
|
|
6
|
+
${f$1}
|
|
7
|
+
`;await d.writeFile(t,`${r}${n}`,"utf8");}async function F(e$1){let t=i.resolve(e$1.workspacePath),r=i.resolve(e$1.projectPath);if(!j(t))throw new l("project.workspace.explicit-invalid",`Cannot link project to an invalid Workspai workspace: ${t}`,{workspacePath:t,projectPath:r});let a$3=i.join(t,".workspai","workspace.contract.json"),o=e$1.workspaceName??i.basename(t),n=e$1.relativePath;if(P.existsSync(a$3)){let h=y(a$3);typeof h.workspace?.name=="string"&&(o=h.workspace.name);let s=a(r),m=h.projects?.find(w=>typeof w.externalPath=="string"?a(w.externalPath)===s:typeof w.relativePath=="string"&&!w.relativePath.startsWith("external/")&&a(i.resolve(t,w.relativePath))===s);m&&typeof m.relativePath=="string"&&(n=m.relativePath);}if(n??=i.relative(t,r).replace(/\\/g,"/"),(!n||n.startsWith(".."))&&(n=`external/${e$1.projectName}`),f(t,r)!==true)throw new l("project.workspace.membership-missing",`Project is not registered in the canonical workspace contract: ${e$1.projectName}`,{workspacePath:t,projectPath:r,projectName:e$1.projectName});let c={schemaVersion:x,kind:A,generatedAt:(e$1.now??new Date).toISOString(),state:"active",workspace:{name:o,root:t,marker:_(t),contract:".workspai/workspace.contract.json"},project:{name:e$1.projectName,relativePath:n,relationship:e$1.relationship},integrity:{algorithm:"sha256",binding:L({workspaceName:o,workspacePath:t,projectName:e$1.projectName,projectPath:r,relativePath:n,relationship:e$1.relationship})}};a$1(c,"contracts/project-workspace-link.v1.json","Project workspace link");let p=i.join(r,a$2,e);return await M(r),await T(p,c),{linkPath:p,link:c}}async function ee(e,t$1="linked"){if(!e.projectPath)return null;let r=t(e.projectPath,"project.json").find(o=>P.existsSync(o)),a=i.basename(e.projectPath);if(r)try{let o=y(r);typeof o.name=="string"?a=o.name:typeof o.slug=="string"&&(a=o.slug);}catch{}return F({workspacePath:e.workspacePath,projectPath:e.projectPath,projectName:a,relationship:t$1})}export{l as a,Z as b,F as c,ee as d};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {w}from'./chunk-TROHVI2V.js';import {a as a$1,d,c,e as e$1}from'./chunk-XBM2P45G.js';import {b as b$1}from'./chunk-RVQLMTTI.js';import {a,b}from'./chunk-AHLMIL2T.js';import {l}from'./chunk-OCGZNSOE.js';import {e}from'./chunk-RO73VVHW.js';import {s,t,p}from'./chunk-MOSXTVPU.js';import*as g from'path';import g__default from'path';import h from'fs-extra';var me="unknown-run";function q(e$1){let t=e();return !t||t===me?e$1:{...e$1,runId:t}}async function Z(e,t){await h.ensureDir(g.dirname(e));let r=`${e}.${process.pid}.${Date.now()}.tmp`;try{await h.writeJSON(r,t,{spaces:2}),await h.move(r,e,{overwrite:true});}finally{await h.remove(r).catch(()=>{});}}function Q(e){return p(e,"imported-projects.json")}async function I(e){let t=(await Promise.all(s(e,"imported-projects.json").map(async r=>await h.pathExists(r)?r:null))).find(r=>typeof r=="string");if(!t)return [];try{let r=await h.readJSON(t);if(!r||typeof r!="object"||r.version!==1||!Array.isArray(r.projects))throw new Error("expected a version 1 registry with a projects array");let o=r.projects,a=o.filter(c=>{if(!c||typeof c!="object")return false;let i=c;return typeof i.name=="string"&&typeof i.path=="string"&&typeof i.stack=="string"&&typeof i.confidence=="string"&&typeof i.importedAt=="string"});if(a.length!==o.length)throw new Error("one or more project entries are invalid");return a}catch(r){throw new Error(`Imported-project registry is invalid: ${t}`,{cause:r})}}async function Ie(e,t){if(t.length===0)return;let r=await I(e),o=new Map;for(let l of r)o.set(l.path,l);for(let l of t)o.set(l.path,l);let a=Array.from(o.values()).sort((l,u)=>l.name.localeCompare(u.name)).map(l=>({...l})),c={version:1,updatedAt:new Date().toISOString(),projects:a},i=Q(e);await Z(i,c);}async function Ne(e,t){if(t.length===0)return;let r=await I(e),o=new Set(t.map(l=>g.resolve(l))),a=r.filter(l=>!o.has(g.resolve(l.path))),c={version:1,updatedAt:new Date().toISOString(),projects:a},i=Q(e);await Z(i,c);}var Ve="workspace-dependency-graph.v1",X=["code-import","package-dep","event-pub-sub","service-dependsOn","shared-resource"],ee=["inferred","contract","manual"];var E=".workspai/workspace.contract.json",ge=a.contractVerify,R=1,fe=b.contractVerify,N=class extends Error{constructor(r){super(`Workspace contract verification failed: ${r.violations.join("; ")}`);this.verification=r;this.name="WorkspaceContractVerificationError";}verification};function ae(e){return e.replace(/\\/g,"/")}function H(e){let t=ae(e).trim();return !t||t.startsWith("/")||t.startsWith("~")||/^[a-zA-Z]:\//.test(t)||t.includes("\0")?false:!t.split("/").filter(Boolean).some(r=>r===".."||r===".")}function te(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^[-_.]+|[-_.]+$/g,"").slice(0,80)||t}function he(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function ke(e){let r=(Array.isArray(e.ports)?e.ports:[]).map(c=>{if(!c||typeof c!="object"||Array.isArray(c))return null;let i=c,l=Number(i.port);if(!Number.isInteger(l)||l<1||l>65535)return null;let u=i.protocol==="https"||i.protocol==="grpc"||i.protocol==="tcp"||i.protocol==="udp"?i.protocol:"http";return {name:typeof i.name=="string"&&i.name.trim()?i.name:"http",port:l,protocol:u}}).filter(c=>c!==null);if(r.length>0)return r;let o=e.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,a=Number(e.port??o?.default_port);return Number.isInteger(a)&&a>=1&&a<=65535?[{name:"http",port:a,protocol:"http"}]:[]}async function D(e){for(let t of e)if(await h.pathExists(t))return t;return null}async function we(e){for(let t of s(e,"workspace.json"))try{let r=await h.readJson(t);return {name:typeof r.workspace_name=="string"&&r.workspace_name.trim()||typeof r.name=="string"&&r.name.trim()||g__default.basename(e),profile:typeof r.profile=="string"?r.profile:void 0}}catch{}return {name:g__default.basename(e)}}async function Pe(e){let t$1=[],r=[e],o=new Set,a=new Set([".git",".workspai",".rapidkit","node_modules",".venv","venv","dist","build","target",".next",".turbo",".cache"]);for(;r.length>0;){let c=r.shift();if(!c||o.has(c))continue;o.add(c);let i=await D(t(c,"project.json")),l=await D(t(c,"context.json"));if(i||l){t$1.push(i??l??"");continue}let u;try{u=await h.readdir(c,{withFileTypes:true});}catch{continue}for(let d of u)!d.isDirectory()||a.has(d.name)||r.push(g__default.join(c,d.name));}return t$1.sort()}function ye(e){let t=(e||"").toLowerCase();if(t.includes("fastapi"))return "fastapi";if(t.includes("nestjs"))return "nestjs";if(t.includes("springboot"))return "springboot";if(t.includes("gofiber"))return "fiber";if(t.includes("gogin"))return "gin"}function Ce(e,t){let r=(e||"").toLowerCase(),o=(t||"").toLowerCase();return r.includes("fastapi")?8e3:r.includes("nestjs")?3e3:r.includes("springboot")?8080:r.includes("gofiber")?3e3:r.includes("gogin")?8080:o==="node"?3e3:o==="python"?8e3:o==="java"||o==="go"?8080:null}function re(e,t){let r=e;for(;t.has(r)&&r<65535;)r+=1;return r}function M(e,t,r){let o=e!==void 0&&e.source===void 0,a=Ce(t.kit,t.runtime),c=e?.ports||[],i=t.ports||[],u=(c.length>0?c:i.length>0?i:a?[{name:"http",port:re(a,r),protocol:"http"}]:[]).map(p=>({...p,port:re(p.port,r)}));for(let p of u)r.add(p.port);let d={...t,...e,slug:e?.slug||t.slug,relativePath:o&&e?.relativePath&&H(e.relativePath)?e.relativePath:t.relativePath,source:o&&e?.source||t.source,relationship:o&&e?.relationship||t.relationship,externalPath:o&&e?.externalPath||t.externalPath,runtime:e?.runtime||t.runtime,framework:e?.framework||t.framework,kit:e?.kit||t.kit,modules:e?.modules?.length?e.modules:t.modules,ports:u,contracts:{owns:e?.contracts?.owns||[],apis:e?.contracts?.apis||[],publishes:e?.contracts?.publishes||[],consumes:e?.contracts?.consumes||[],dependsOn:e?.contracts?.dependsOn||[],env:e?.contracts?.env||[]}},s=JSON.stringify(e||null)!==JSON.stringify(d);return {project:d,changed:s}}async function se(e){let t$1=g__default.resolve(e.workspacePath),r=await we(t$1),o=await Pe(t$1),a=await I(t$1),c=[];for(let d of a){let s=g__default.resolve(d.path),p=await D(t(s,"project.json"))??await D(t(s,"context.json"));!p||o.some(k=>g__default.resolve(k)===g__default.resolve(p))||c.push({projectJsonPath:p,registryEntry:d});}let i=[],l=[...o.map(d=>({projectJsonPath:d})),...c];for(let{projectJsonPath:d,registryEntry:s}of l){let p=g__default.dirname(g__default.dirname(d)),k=ae(g__default.relative(t$1,p)),f=s!==void 0&&!H(k),P=te(s?.name||g__default.basename(p),g__default.basename(p)),y=f?`external/${P}`:k||P,w=await h.readJson(d),x=typeof w.kit_name=="string"&&w.kit_name||typeof w.kit=="string"&&w.kit||void 0,n=typeof w.framework=="string"&&w.framework||ye(x);i.push({slug:s?.name||y||g__default.basename(p),relativePath:y,source:s?.source??"workspace",relationship:s?.relationship,externalPath:f?p:void 0,runtime:typeof w.runtime=="string"?w.runtime:void 0,framework:n,kit:x,modules:he(w.modules),ports:ke(w),contracts:{owns:[],apis:[],publishes:[],consumes:[],dependsOn:[],env:[]}});}let u=new Map;for(let d of i){let s=te(d.slug,d.relativePath),p=u.get(s);(!p||p.source!=="workspace"&&d.source==="workspace")&&u.set(s,d);}return {schemaVersion:R,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:r,projects:[...u.values()]}}async function Qe(e){let t=g__default.resolve(e.outputPath||a$1(e.workspacePath,E));if(await h.pathExists(t)&&e.force!==true)throw new Error(`Workspace contract already exists: ${t}. Use --force to overwrite.`);let r=await se({workspacePath:e.workspacePath,now:e.now}),o=new Set,a={...r,projects:r.projects.map(i=>M(void 0,i,o).project)},c=await pe({workspacePath:e.workspacePath,contractPath:t,contract:a});if(e.strict&&c.status==="failed")throw new N(c);return await ce({workspacePath:e.workspacePath,contractPath:t,contract:a,now:e.now}),{contractPath:t,contract:a}}async function Xe(e){let t=g__default.resolve(e.workspacePath),r=a$1(t,E),o=await d(t,E)??r,a=await se({workspacePath:t,now:e.now}),c=await h.pathExists(o)?await h.readJson(o):null,i=new Map((c?.projects||[]).map(f=>[f.slug,f])),l=new Set,u=[],d$1=[],s=[];for(let f of a.projects){let P=i.get(f.slug),y=M(P,f,l);P?y.changed&&d$1.push(f.slug):u.push(f.slug),s.push(y.project),i.delete(f.slug);}for(let f of i.values()){if(f.source)continue;let P=M(f,f,l);s.push(P.project);}let p={schemaVersion:R,kind:"rapidkit.workspace.contract",generatedAt:(e.now??new Date).toISOString(),workspace:{...c?.workspace||{},...a.workspace,name:a.workspace.name||c?.workspace?.name||g__default.basename(t)},projects:s.sort((f,P)=>f.slug.localeCompare(P.slug))},k=await pe({workspacePath:t,contractPath:r,contract:p});if(e.strict&&k.status==="failed")throw new N(k);return await ce({workspacePath:t,contractPath:r,contract:p,now:e.now}),{contractPath:r,contract:p,addedProjects:u,updatedProjects:d$1,verification:k}}async function oe(e){return await h.pathExists(e)?{exists:true,contents:await h.readFile(e)}:{exists:false}}async function ne(e,t){if(!t.exists){await h.remove(e);return}await h.outputFile(e,t.contents);}async function ce(e){let{buildWorkspaceRegistrySummary:t,WORKSPACE_REGISTRY_SUMMARY_RELATIVE_PATH:r}=await import('./workspace-registry-summary-D2QM5JF6.js'),o=await t(e.workspacePath,{now:e.now,contract:e.contract}),a=a$1(e.workspacePath,r),c$1=i=>{if(!i||typeof i!="object"||Array.isArray(i))return JSON.stringify(i);let{generatedAt:l,...u}=i;return JSON.stringify(u)};if(await h.pathExists(e.contractPath)&&await h.pathExists(a)){let[i,l]=await Promise.all([h.readJson(e.contractPath),h.readJson(a)]);if(c$1(i)===c$1(e.contract)&&c$1(l)===c$1(o))return}b$1(E,e.contract),b$1(r,o),await c(e.workspacePath,E,async()=>{let[i,l]=await Promise.all([oe(e.contractPath),oe(a)]);try{if(e.contractPath===a$1(e.workspacePath,E)?await e$1(e.workspacePath,E,e.contract):(await h.ensureDir(g__default.dirname(e.contractPath)),await h.writeJson(e.contractPath,e.contract,{spaces:2})),process.env.WORKSPAI_TEST_FAIL_WORKSPACE_REGISTRY_PUBLISH==="1")throw new Error("Injected workspace registry summary publication failure.");await e$1(e.workspacePath,r,o);}catch(u){let s=(await Promise.allSettled([ne(e.contractPath,i),ne(a,l)])).filter(p=>p.status==="rejected");throw s.length>0?new AggregateError([u,...s.map(p=>p.reason)],"Workspace contract publication failed and rollback was incomplete."):u}});}async function ie(e){let t=e.contractPath??(await d(e.workspacePath,E)||a$1(e.workspacePath,E)),r=await h.readJson(t);return {contractPath:t,contract:r}}var Ee={metadata:[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json"],manifests:["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","pyproject.toml","poetry.lock","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","Gemfile","composer.json"],entrypoints:["src/main.ts","src/index.ts","src/app.ts","src/main.js","src/index.js","main.py","app/main.py","manage.py","main.go","cmd/main.go","Program.cs"],apiSpecifications:["openapi.yaml","openapi.yml","openapi.json","swagger.yaml","swagger.yml","swagger.json"],infrastructure:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","k8s","kubernetes","terraform"],documentation:["README.md","ARCHITECTURE.md","CONTRIBUTING.md","docs"]};function je(e,t){return t.externalPath?g__default.resolve(t.externalPath):g__default.resolve(e,t.relativePath)}async function be(e){let t={metadata:[],manifests:[],entrypoints:[],apiSpecifications:[],infrastructure:[],documentation:[]};for(let[r,o]of Object.entries(Ee))for(let a of o)await h.pathExists(g__default.join(e,a))&&t[r].push(a);try{let r=await h.readdir(e,{withFileTypes:true});for(let o of r)o.isFile()&&(o.name.endsWith(".csproj")||o.name.endsWith(".sln"))&&t.manifests.push(o.name),o.isFile()&&o.name.endsWith(".tf")&&t.infrastructure.push(o.name);}catch{}for(let r of Object.values(t))r.sort((o,a)=>o.localeCompare(a));return t}function A(e){return !e||typeof e!="object"||Array.isArray(e)?[]:Object.keys(e).sort((t,r)=>t.localeCompare(r))}async function ve(e){try{let t=await h.readJson(g__default.join(e,"package.json")),r={runtime:A(t.dependencies),development:A(t.devDependencies),peer:A(t.peerDependencies),optional:A(t.optionalDependencies)};return {...typeof t.name=="string"?{name:t.name}:{},...typeof t.version=="string"?{version:t.version}:{},...typeof t.private=="boolean"?{private:t.private}:{},scripts:A(t.scripts),dependencies:r,dependencyCount:new Set(Object.values(r).flat()).size}}catch{return}}async function We(e){for(let t of [".env.example",".env.sample",".env.template"])try{return (await h.readFile(g__default.join(e,t),"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")&&o.includes("=")).map(o=>o.slice(0,o.indexOf("=")).trim()).filter(o=>/^[A-Za-z_][A-Za-z0-9_]*$/.test(o)).sort((o,a)=>o.localeCompare(a))}catch{}return []}function Se(e,t){try{let r=w(e);if(r.engine!=="unknown")return r;let o=h.pathExistsSync(g__default.join(e,"package.json"))?"npm":h.pathExistsSync(g__default.join(e,"pyproject.toml"))?"python":h.pathExistsSync(g__default.join(e,"requirements.txt"))?"pip":"unknown";return {...r,engine:o,runtime:t.runtime??r.runtime,framework:t.framework??r.framework,frameworkDisplayName:t.framework??r.frameworkDisplayName}}catch{return {schemaVersion:1,scope:"project",projectRoot:null,engine:"unknown",runtime:"unknown",framework:"unknown",frameworkDisplayName:"Unknown",frameworkConfidence:"low",frameworkSupportTier:"observed",runtimeSupportTier:"observed",runtimeDoctorSupport:"observed",moduleSupport:false,fleetStages:[],localOnlyCommands:[],commandMap:{},supportedCommands:[],unsupportedCommands:[],globalCommands:[]}}}function Ae(e,t,r){let o=e.projects.map(a=>({id:a.slug,path:a.relativePath,runtime:a.runtime,framework:a.framework}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:t,nodes:o,edges:[],stats:{nodeCount:o.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:o.length,connectedNodeCount:0,density:0,edgeCoverageRatio:o.length===0?1:0,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:[{code:"graph.enrichment.failed",severity:"warning",message:r,recommendation:"Review project manifests and graph overrides, then rerun workspace contract graph."}]}}async function et(e){let{contractPath:t,contract:r}=await ie(e),o=e.now??new Date,a$1=o.toISOString(),{buildWorkspaceModel:c,workspaceModelProjectTopology:i}=await import('./workspace-model-HHA37SNH.js'),{hashWorkspaceModel:l}=await import('./workspace-model-hash-ZXYPIGCW.js'),u=await c({workspacePath:e.workspacePath,includeEvidence:false,now:o}),d=i(u)??Ae(r,a$1,"The canonical Workspace Model did not provide a project dependency topology."),s=new Map(d.nodes.map(n=>[n.id,n.operationalProfile])),{buildWorkspaceKnowledgeGraph:p}=await import('./workspace-knowledge-graph-5MKEI4Z5.js'),k=await p({workspacePath:e.workspacePath,workspace:{name:u.workspace.name,...u.workspace.profile?{profile:u.workspace.profile}:{}},contract:r,projectTopology:d,now:o,projects:u.projects.map(n=>({id:n.name,path:n.path,...n.absolutePath?{absolutePath:n.absolutePath}:{},runtime:n.runtime,runtimeCandidates:n.runtimeCandidates,framework:n.framework,...n.kit?{kit:n.kit}:{}})),source:{kind:"workspace-model",artifact:a.model,hashAlgorithm:"sha256",hash:l(u)}}),f=await Promise.all(r.projects.map(async n=>{let m=je(e.workspacePath,n),[_,v,de]=await Promise.all([be(m),ve(m),We(m)]),C=Se(m,n);return {id:n.slug,label:n.slug,relativePath:n.relativePath,source:n.source,relationship:n.relationship,externalPath:n.externalPath,runtime:n.runtime??C.runtime,framework:n.framework??C.framework,kit:n.kit,modules:n.modules,ports:n.ports,apis:n.contracts.apis,owns:n.contracts.owns,env:[...new Set([...n.contracts.env,...de])].sort((le,ue)=>le.localeCompare(ue)),contracts:{owns:[...n.contracts.owns],apis:[...n.contracts.apis],publishes:[...n.contracts.publishes],consumes:[...n.contracts.consumes],dependsOn:[...n.contracts.dependsOn],env:[...n.contracts.env]},capabilities:{engine:C.engine,supportTier:C.frameworkSupportTier,runtimeSupportTier:C.runtimeSupportTier,doctorSupport:C.runtimeDoctorSupport,moduleSupport:C.moduleSupport,fleetStages:[...C.fleetStages],localOnlyCommands:[...C.localOnlyCommands],supportedCommands:[...C.supportedCommands]},files:_,...v?{package:v}:{},...s.get(n.slug)?{operationalProfile:s.get(n.slug)}:{}}})),P=new Set(f.map(n=>n.id)),y=new Map,w=[];for(let n of r.projects){for(let m of n.contracts.dependsOn||[])P.has(m)&&w.push({from:m,to:n.slug,type:"dependency",label:"dependsOn"});for(let m of n.contracts.publishes||[])y.has(m)||y.set(m,new Set),y.get(m)?.add(n.slug);}for(let n of r.projects)for(let m of n.contracts.consumes||[]){let _=y.get(m);if(_)for(let v of _)v!==n.slug&&w.push({from:v,to:n.slug,type:"event",label:m});}let x={schemaVersion:1,kind:"rapidkit.workspace.contract.graph",workspace:r.workspace,generatedAt:a$1,nodes:f.sort((n,m)=>n.id.localeCompare(m.id)),edges:w.sort((n,m)=>`${n.from}:${n.to}:${n.type}:${n.label}`.localeCompare(`${m.from}:${m.to}:${m.type}:${m.label}`)),dependencyGraph:d,knowledgeGraph:k,semantics:{legacyEdges:"producer-to-consumer",dependencyGraphEdges:"consumer-to-dependency"},summary:{projectCount:f.length,dependencyEdges:w.filter(n=>n.type==="dependency").length,eventEdges:w.filter(n=>n.type==="event").length,portCount:f.reduce((n,m)=>n+m.ports.length,0),apiCount:f.reduce((n,m)=>n+m.apis.length,0),relationshipEdges:d.stats.edgeCount,inferredEdges:d.stats.inferredEdges,authoritativeEdges:d.stats.authoritativeEdges,orphanProjects:d.stats.orphanCount,hotspotProjects:d.stats.hotspotCount,evidenceCoverageRatio:d.stats.evidenceCoverageRatio,edgeCoverageRatio:d.stats.edgeCoverageRatio,connectedProjects:d.stats.connectedNodeCount,lowConfidenceEdges:d.stats.lowConfidenceEdges,hasCycle:d.stats.hasCycle,manifestCount:f.reduce((n,m)=>n+m.files.manifests.length,0),entrypointCount:f.reduce((n,m)=>n+m.files.entrypoints.length,0),diagnostics:d.diagnostics?.length??0,relationshipKinds:Object.fromEntries(X.map(n=>[n,d.edges.filter(m=>m.kind===n).length])),relationshipSources:Object.fromEntries(ee.map(n=>[n,d.edges.filter(m=>m.source===n).length])),entityCount:k.quality.entityCount,knowledgeRelations:k.quality.relationCount,proofCount:k.quality.proofCount,providerCount:k.providers.length,knowledgeUnknowns:k.quality.unknownCount}};return {contractPath:t,graph:x}}async function pe(e){let t=e.contract?{contractPath:e.contractPath??a$1(e.workspacePath,E),contract:e.contract}:await ie(e),{contractPath:r,contract:o}=t,a=[],c=[];o.kind!=="rapidkit.workspace.contract"&&a.push("Contract kind must be rapidkit.workspace.contract."),o.schemaVersion!==R&&a.push(`Contract schemaVersion must be ${R}.`),o.workspace?.name||a.push("Contract workspace.name is required."),Array.isArray(o.projects)||a.push("Contract projects must be an array.");let i=new Set,l$1=new Map;for(let s of o.projects||[]){if(!s.slug){a.push("Every project must declare slug.");continue}i.has(s.slug)&&a.push(`Duplicate project slug: ${s.slug}.`),i.add(s.slug),s.relativePath?H(s.relativePath)||a.push(`Project ${s.slug} declares unsafe relativePath: ${s.relativePath}.`):a.push(`Project ${s.slug} must declare relativePath.`),s.externalPath&&(s.relationship==="adopted"||s.source==="adopted-local"||s.source==="local-folder"||s.source==="git-url"||a.push(`Project ${s.slug} declares externalPath without imported/adopted provenance.`),g__default.isAbsolute(s.externalPath)||a.push(`Project ${s.slug} declares non-absolute externalPath.`));for(let p of s.ports||[]){(!Number.isInteger(p.port)||p.port<1||p.port>65535)&&a.push(`Project ${s.slug} declares invalid port: ${p.port}.`);let k=l$1.get(p.port);k&&a.push(`Port ${p.port} is claimed by both ${k} and ${s.slug}.`),l$1.set(p.port,s.slug);}for(let p of s.contracts?.apis||[])(!p.name?.trim()||!p.basePath?.startsWith("/"))&&a.push(`Project ${s.slug} declares invalid API contract.`);for(let p of [...s.contracts?.publishes||[],...s.contracts?.consumes||[]])p.trim()||a.push(`Project ${s.slug} declares an empty event contract.`);for(let p of s.contracts?.env||[])/^[A-Z_][A-Z0-9_]*$/.test(p)||a.push(`Project ${s.slug} declares invalid env contract: ${p}.`);for(let p of s.contracts?.dependsOn||[])i.has(p);}for(let s of o.projects||[])for(let p of s.contracts?.dependsOn||[])i.has(p)||a.push(`Project ${s.slug} depends on unknown project: ${p}.`);c.push({id:"schema",status:o.kind==="rapidkit.workspace.contract"&&o.schemaVersion===R?"passed":"failed",message:"Contract schema and kind are valid."}),c.push({id:"projects",status:Array.isArray(o.projects)?"passed":"failed",message:`Contract declares ${Array.isArray(o.projects)?o.projects.length:0} project(s).`}),c.push({id:"ports",status:a.some(s=>s.toLowerCase().includes("port"))?"failed":"passed",message:"Project port declarations are valid and collision-free."}),c.push({id:"dependencies",status:a.some(s=>s.includes("depends on unknown project"))?"failed":"passed",message:"Project dependencies point to known project slugs."}),c.push({id:"contracts",status:a.some(s=>s.includes("unsafe relativePath")||s.includes("invalid API contract")||s.includes("event contract")||s.includes("env contract"))?"failed":"passed",message:"Project path, API, event, and env contracts are valid."});let u=await l(e.workspacePath);if(u.moduleCount>0){for(let s of u.issues)a.push(`${g__default.basename(s.projectRoot)}: ${s.message} (slug=${s.slug})`);c.push({id:"module-paths",status:u.status,message:u.status==="passed"?`All ${u.moduleCount} registered module(s) resolve under canonical paths.`:`${u.issues.length} registered module(s) missing canonical install paths.`});}else e.strict&&c.push({id:"module-paths",status:"passed",message:"No registry-backed modules declared in workspace projects."});return {status:a.length>0?"failed":"passed",contractPath:r,projectCount:Array.isArray(o.projects)?o.projects.length:0,checks:c,violations:a}}async function tt(e){let t=g__default.resolve(e.workspacePath),r={schemaVersion:fe,generatedAt:e.generatedAt??new Date().toISOString(),status:e.result.status,contractPath:e.result.contractPath,projectCount:e.result.projectCount,checks:e.result.checks,violations:e.result.violations};return e$1(t,ge,q(r))}
|
|
2
|
+
export{I as a,Ie as b,Ne as c,q as d,Ve as e,X as f,E as g,ge as h,R as i,fe as j,N as k,Pe as l,se as m,Qe as n,Xe as o,ie as p,et as q,pe as r,tt as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {c,e}from'./chunk-XBM2P45G.js';import {s}from'./chunk-MOSXTVPU.js';import u from'fs';import d from'path';var a="workspace-run-v1",p="workspace-run-last.json",o=`.workspai/reports/${p}`;var m=new Set(["init","test","build","start"]);function A(e){return m.has(e)}async function w(e){try{return await u.promises.access(e,u.constants.F_OK),true}catch{return false}}async function W(e){try{let r=await u.promises.readFile(e,"utf-8");return JSON.parse(r)}catch{return null}}function S(e){return !e||typeof e!="object"||Array.isArray(e)?null:e}function P(e){let r=e.stage;return typeof r!="string"||r.trim().length===0||!Array.isArray(e.projects)?false:A(r)||/^[a-z][a-z0-9_-]*$/i.test(r)}function _(e){let r=S(e);return !r||r.schemaVersion===a?false:P(r)}function h(e){let r=S(e);return r?r.schemaVersion===a&&r.stages!=null:false}function R(e){if(h(e))return e;if(_(e)){let r=e.stage;return {schemaVersion:a,generatedAt:e.generatedAt,workspacePath:e.workspacePath,latestStage:r,stages:{[r]:e},enterpriseControls:e.enterpriseControls??{jsonReady:true,evidencePath:o}}}return null}function x(e,r){let n=R(e);if(!n)return null;let t=r??n.latestStage;return n.stages[t]??null}async function L(e){let r=(await Promise.all(s(d.resolve(e),"reports",p).map(async t=>await w(t)?t:null))).find(t=>typeof t=="string");if(!r)return null;let n=await W(r);return R(n)}async function I(e$1,r){let n=d.resolve(e$1);return c(n,o,async()=>{let t=(await Promise.all(s(n,"reports",p).map(async s=>await w(s)?s:null))).find(s=>typeof s=="string"),l=t?await W(t):null,i=R(l);if(t&&!i)throw new Error(`Workspace run evidence is unreadable or invalid; refusing to overwrite: ${t}`);let g=i?{...i.stages}:{};g[r.stage]=r;let k={schemaVersion:a,generatedAt:r.generatedAt,workspacePath:r.workspacePath,latestStage:r.stage,stages:g,enterpriseControls:{jsonReady:true,evidencePath:o}};return await e(n,o,k),k})}export{p as a,o as b,x as c,L as d,I as e};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b}from'./chunk-
|
|
1
|
+
import {b}from'./chunk-AHLMIL2T.js';var i=b.explain,g=["project","release-blocked","blocker","trace"];function s(t){let r=t.trim();if(!r)return null;if(r==="release-blocked")return {kind:"release-blocked"};if(r.startsWith("project:")){let e=r.slice(8).trim();return e?{kind:"project",project:e}:null}if(r.startsWith("blocker:")){let e=r.slice(8).trim();return e?{kind:"blocker",blockerId:e}:null}if(r.startsWith("trace:")){let e=r.slice(6).trim();return e?{kind:"trace",diffRef:e}:null}return {kind:"project",project:r}}function u(t){let r=t.trim();if(!r)return null;if(r.startsWith("trace:")){let n=s(r);return n?.kind==="trace"?n:null}let e=r.replace(/\\/g,"/").trim().toLowerCase();return e.endsWith(".json")||e.includes("workspace-model-diff")||e.startsWith(".rapidkit/")||e.includes("/.rapidkit/")?{kind:"trace",diffRef:r}:null}function A(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let r=t;return r.schemaVersion===i&&typeof r.generatedAt=="string"&&typeof r.summary=="string"&&Array.isArray(r.sections)&&r.target!=null&&typeof r.target=="object"&&!Array.isArray(r.target)&&typeof r.target.kind=="string"}export{i as a,g as b,s as c,u as d,A as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a as a$5}from'./chunk-HTYMXMQM.js';import {i,o}from'./chunk-WJVB6SSD.js';import {a as a$3}from'./chunk-2D4UOYOJ.js';import {a as a$1}from'./chunk-Y5YAP4F3.js';import {d as d$1,c as c$1}from'./chunk-EWZZUQBR.js';import {a as a$2,p,d,g,f as f$3,e as e$1}from'./chunk-BBGNDMRU.js';import {c,b as b$2,i as i$1,w,f as f$2}from'./chunk-TROHVI2V.js';import {j as j$1,i as i$2,h}from'./chunk-L2E2Z4OE.js';import {f as f$1,d as d$2,a as a$4,e}from'./chunk-XBM2P45G.js';import {b as b$1,a}from'./chunk-AHLMIL2T.js';import {t,s}from'./chunk-MOSXTVPU.js';import f from'path';import E from'fs-extra';import Mt from'crypto';import {createRequire}from'module';var Et=new Set(["backend","desktop","extension","service","frontend","worker","library","infra","docs","test-suite","unknown"]);async function Ze(e){try{if(!await E.pathExists(e))return null;let t=await E.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function Wt(e){for(let t of e){let r=await Ze(t);if(r)return r}return null}function Qe(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return Et.has(t)?t==="service"?"backend":t:null}function et(e){switch(e){case "backend":case "service":case "worker":return "backend";case "frontend":case "desktop":case "extension":case "library":return e;case "infra":return "infrastructure";case "docs":return "documentation";case "test-suite":return "quality";default:return "unknown"}}async function tt(e,t$1){let r=t$1??await Wt(t(e,"project.json")),o=Qe(r?.kind)??Qe(r?.type);if(o)return o;let s=typeof r?.kit_name=="string"?r.kit_name:r?.kit,n=typeof r?.framework=="string"?r.framework:null,i=typeof r?.runtime=="string"?r.runtime:null,a=`${typeof s=="string"?s:""} ${n??""} ${i??""}`.trim().toLowerCase();if(/\b(tauri|electron|wails|desktop)\b/.test(a))return "desktop";if(/\b(vscode-extension|visual studio code extension|jetbrains-plugin|browser-extension)\b/.test(a))return "extension";if(/\b(frontend|nextjs|next\.js|react|vue|svelte|vite|angular|astro|remix|nuxt)\b/.test(a))return "frontend";if(/\b(fastapi|nestjs|springboot|spring boot|gofiber|gogin|dotnet|webapi|django|flask|express|fastify|python|node|java|go|rust|php|ruby|elixir)\b/.test(a))return "backend";let c=await Ze(f.join(e,"package.json"));if(c){let d={...c.dependencies??{},...c.devDependencies??{}},u=c.scripts??{},p=Object.values(u).filter(v=>typeof v=="string").join(" ").toLowerCase(),l=c.engines??{},m=Array.isArray(c.categories)?c.categories.filter(v=>typeof v=="string"):[];if(d["@tauri-apps/api"]||d["@tauri-apps/cli"]||await E.pathExists(f.join(e,"src-tauri","tauri.conf.json"))||await E.pathExists(f.join(e,"src-tauri","tauri.conf.json5"))||d.electron||d["@electron-forge/cli"]||p.includes("electron-forge")||p.includes("electron "))return "desktop";if(typeof l.vscode=="string"||m.some(v=>v.toLowerCase()==="extension packs")||c.publisher&&(c.activationEvents||c.contributes))return "extension";if(d.next||d.react||d.vue||d.svelte||d.vite||d["@angular/core"]||p.includes("next ")||p.includes("vite "))return "frontend";if(c.private===true&&!d.express&&!d["@nestjs/core"])return "library"}return await E.pathExists(f.join(e,"Dockerfile"))||await E.pathExists(f.join(e,"docker-compose.yml"))||await E.pathExists(f.join(e,"terraform.tf"))?"infra":"backend"}var xt=new Set(c().map(e=>e.id)),Rt=[...i().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,status:"available",canExecuteCreate:true,versionPolicy:e.versionPolicy,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true,...e.minNodeVersion?{runtimeRequirements:{node:`>=${e.minNodeVersion}`}}:e.minNodeMajor?{runtimeRequirements:{node:`>=${e.minNodeMajor}`}}:{}})),...o().map(e=>({id:e.kitId,aliases:[...e.aliases],ecosystem:e.framework,status:"available",canExecuteCreate:true,versionPolicy:e.versionPolicy,officialCommands:[e.commandDisplay("<name>",{skipGit:false,skipInstall:false})],adoptAfterCreate:true,...e.nodeSupport?{runtimeRequirements:{node:e.nodeSupport.requirement}}:{}})),{id:"wordpress-site",aliases:["wordpress","wordpress-site","wp","wp-site"],ecosystem:"wordpress",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["wp core download","wp config create","wp db create","wp core install"],adoptAfterCreate:true},{id:"wordpress-block",aliases:["wordpress-block","wp-block","gutenberg-block"],ecosystem:"wordpress",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["npx @wordpress/create-block@latest <slug>"],adoptAfterCreate:true},{id:"symfony",aliases:["symfony","php-symfony"],ecosystem:"php",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["composer create-project symfony/skeleton <name>"],adoptAfterCreate:true},{id:"rails",aliases:["rails","ruby-on-rails","ruby-rails"],ecosystem:"ruby",status:"planned",canExecuteCreate:false,versionPolicy:"planned",officialCommands:["rails new <name>"],adoptAfterCreate:true}],B=new Map;for(let e of Rt){B.set(e.id,e);for(let t of e.aliases)B.set(t,e);}var At=new Set(["php","ruby","rust","elixir","clojure","scala","kotlin","unknown"]);function T(e){return e?.trim().toLowerCase()||void 0}function rt(e){let t=T(e.kitId)??T(e.framework)??T(e.runtime)??"unknown";if(e.projectExists)return {lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"Existing projects enter Workspace Intelligence through adopt/import."};let r=e.kitId?b$2(e.kitId):void 0;if(r&&xt.has(r))return {lane:"native",status:"available",canExecuteCreate:true,requested:t,resolved:r,reason:"Workspai owns the create contract, project marker, registry, doctor, and workspace model path."};let o=B.get(t)??B.get(T(e.framework)??"")??B.get(T(e.runtime)??"");if(o)return {lane:"official",status:o.status,canExecuteCreate:o.canExecuteCreate,requested:t,resolved:o.id,officialCommands:o.officialCommands,fallbackLane:o.canExecuteCreate?void 0:"existing",reason:o.status==="available"?"Workspai runs the official ecosystem generator, then registers the project in Workspace Intelligence.":"Official generator support is planned but not enabled; use adopt/import until Workspai owns the post-create contract."};let s=T(e.runtime);return s&&At.has(s)?{lane:"existing",status:"available",canExecuteCreate:false,requested:t,resolved:s,reason:"Runtime can be governed through Workspace Intelligence, but native create is not supported."}:{lane:"existing",status:"available",canExecuteCreate:false,requested:t,reason:"No native create contract is available; use adopt/import to enter Workspace Intelligence."}}function Fr(e){return !e.canExecuteCreate&&(e.lane==="official"||e.lane==="existing"&&e.resolved!==void 0)}var _r="rapidkit-freshness-metadata-v1";function ge(e){if(Array.isArray(e))return e.map(t=>ge(t));if(e&&typeof e=="object"){let t={};for(let r of Object.keys(e).sort())t[r]=ge(e[r]);return t}return e}function It(e){return JSON.stringify(ge(e))}function N(e){return Mt.createHash("sha256").update(It(e)).digest("hex")}var nt=".workspai/workspace-graph.overrides.json",Ft=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Dt=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","out","target","coverage","htmlcov",".next",".turbo",".cache"]),st=600,at=5,Ot=256*1024,ot={inferred:1,contract:2,manual:3};function Gt(e){return e.split(f.sep).join("/")}function te(e,t){return Gt(f.relative(e,t)||".")}function it(e){let t=new Map;for(let r of e.projects)t.has(r.name)||t.set(r.name,{id:r.name,path:r.path,...r.runtime?{runtime:r.runtime}:{},...r.framework?{framework:r.framework}:{},...r.kind?{kind:r.kind}:{}});return [...t.values()].sort((r,o)=>r.id.localeCompare(o.id))}function ct(e,t){let r=new Map,o=new Map;for(let n of t.projects){if(r.has(n.name))continue;let i=n.absolutePath?f.resolve(n.absolutePath):f.resolve(e,n.path);r.set(n.name,i),o.has(i)||o.set(i,n.name);}let s=[...o.entries()].map(([n,i])=>({dir:n,id:i})).sort((n,i)=>i.dir.length-n.dir.length||n.dir.localeCompare(i.dir));return {idToDir:r,dirToId:o,sortedDirs:s}}function re(e,t){let r=f.resolve(t);for(let{dir:o,id:s}of e.sortedDirs)if(r===o||r.startsWith(`${o}${f.sep}`))return s;return null}async function ye(e){try{if(!await E.pathExists(e))return null;let t=await E.readJSON(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function ve(e){try{return await E.pathExists(e)?await E.readFile(e,"utf8"):null}catch{return null}}async function dt(e,t){let r=[],o=new Map;for(let[s,n]of t.idToDir.entries()){let i=await ye(f.join(n,"package.json")),a=typeof i?.name=="string"?i.name.trim():"";a&&!o.has(a)&&o.set(a,s);}for(let[s,n]of t.idToDir.entries()){let i=await ye(f.join(n,"package.json"));if(i){let a=["dependencies","devDependencies","peerDependencies","optionalDependencies"],c=new Set;for(let d of a){let u=i[d];if(!(!u||typeof u!="object"||Array.isArray(u)))for(let p of Object.keys(u)){let l=o.get(p);!l||l===s||c.has(l)||(c.add(l),r.push({from:s,to:l,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:te(e,f.join(n,"package.json")),detail:`declares dependency ${p}`}]}));}}}r.push(...await _t(e,t,s,n)),r.push(...await Tt(e,t,s,n));}return r}async function _t(e,t,r,o){let s=await ve(f.join(o,"pyproject.toml"));if(!s)return [];let n=[],i=new Set,a=/path\s*=\s*["']([^"']+)["']/g,c;for(;(c=a.exec(s))!==null;){let d=re(t,f.resolve(o,c[1]));!d||d===r||i.has(d)||(i.add(d),n.push({from:r,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:te(e,f.join(o,"pyproject.toml")),detail:`path dependency ${c[1]}`}]}));}return n}async function Tt(e,t,r,o){let s=await ve(f.join(o,"go.mod"));if(!s)return [];let n=[],i=new Set,a=/replace\s+\S+\s+=>\s+(\.[^\s]+)/g,c;for(;(c=a.exec(s))!==null;){let d=re(t,f.resolve(o,c[1]));!d||d===r||i.has(d)||(i.add(d),n.push({from:r,to:d,kind:"package-dep",source:"inferred",confidence:"high",evidence:[{file:te(e,f.join(o,"go.mod")),detail:`go.mod replace ${c[1]}`}]}));}return n}async function Nt(e,t){let r=[],o=[e];for(;o.length>0&&r.length<t;){let s=o.shift();if(!s)continue;let n=[];try{n=await E.readdir(s,{withFileTypes:true});}catch{continue}let i=[],a=[];for(let c of n)if(c.isDirectory()){if(Dt.has(c.name)||c.name.startsWith("."))continue;i.push(f.join(s,c.name));}else c.isFile()&&Ft.has(f.extname(c.name))&&a.push(f.join(s,c.name));a.sort((c,d)=>c.localeCompare(d)),i.sort((c,d)=>c.localeCompare(d));for(let c of a){if(r.length>=t)break;r.push(c);}o.push(...i);}return r}var $t=[/\bfrom\s+["']([^"']+)["']/g,/\bimport\s+["']([^"']+)["']/g,/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g,/\brequire\s*\(\s*["']([^"']+)["']\s*\)/g];function Vt(e){let t=new Set;for(let r of $t){r.lastIndex=0;let o;for(;(o=r.exec(e))!==null;){let s=o[1];s.startsWith(".")&&t.add(s);}}return [...t]}async function we(e,t,r,o){let s=new Map;for(let[n,i]of t.idToDir.entries()){if(o&&!o.has(n))continue;let a=await Nt(i,r);for(let c of a){let d=await E.stat(c).catch(()=>null);if(!d||d.size>Ot)continue;let u=await ve(c);if(u)for(let p of Vt(u)){let l=f.resolve(f.dirname(c),p),m=re(t,l);if(!m||m===n)continue;let v=`${n}\0${m}`,h=s.get(v);h||(h={from:n,to:m,evidence:[]},s.set(v,h)),h.evidence.length<at&&h.evidence.push({file:te(e,c),detail:`imports ${p}`});}}}return [...s.values()].map(n=>({from:n.from,to:n.to,kind:"code-import",source:"inferred",confidence:"medium",evidence:n.evidence}))}function Ht(e,t,r){let o=new Map;for(let s of r.projects){let n=Kt(e,t,s);n&&o.set(s.slug,n);}return o}function Kt(e,t,r){let o=[r.relativePath,r.externalPath].filter(s=>typeof s=="string"&&s.length>0);for(let s of o){let n=f.resolve(e,s),i=t.dirToId.get(n)??re(t,n);if(i)return i}return t.idToDir.has(r.slug)?r.slug:null}function pt(e,t,r){let o=[],s=Ht(e,t,r),n=g,i=new Map,a=new Map;for(let c of r.projects){let d=s.get(c.slug);if(!d)continue;let u=c.contracts??{publishes:[],consumes:[],dependsOn:[]};for(let p of u.dependsOn??[]){let l=s.get(p);!l||l===d||o.push({from:d,to:l,kind:"service-dependsOn",source:"contract",confidence:"high",evidence:[{file:n,detail:`dependsOn ${p}`}]});}for(let p of u.publishes??[])i.has(p)||i.set(p,new Set),i.get(p)?.add(d);for(let p of u.consumes??[])a.has(p)||a.set(p,new Set),a.get(p)?.add(d);}for(let[c,d]of i.entries()){let u=a.get(c);if(u)for(let p of u)for(let l of d)p!==l&&o.push({from:p,to:l,kind:"event-pub-sub",source:"contract",confidence:"high",evidence:[{file:n,detail:`consumes event ${c}`}]});}return o.push(...Bt(r,s)),o}function he(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}function Bt(e,t){let r=[],o=e.projects.map(s=>({project:s,id:t.get(s.slug)})).filter(s=>!!s.id).filter(s=>he(s.project.slug).length>=3);for(let s of e.projects){let n=t.get(s.slug);if(!n)continue;let i=s.contracts?.env??[];if(i.length===0)continue;let a=new Set;for(let c of i){let d=he(c);for(let u of o)u.id===n||a.has(u.id)||!(d.includes(he(u.project.slug))&&(u.project.ports?.length??0)>0)||(a.add(u.id),r.push({from:n,to:u.id,kind:"shared-resource",source:"inferred",confidence:"low",evidence:[{file:g,detail:`env ${c} references ${u.project.slug}`}]}));}}return r}async function lt(e,t){let r=await ye(f.join(e,nt)),o=Array.isArray(r?.edges)?r?.edges:[],s=[],n=new Set(f$3);for(let i of o){if(!i||typeof i!="object"||Array.isArray(i))continue;let a=i,c=typeof a.from=="string"?a.from:"",d=typeof a.to=="string"?a.to:"",u=typeof a.kind=="string"?a.kind:"";if(!t.has(c)||!t.has(d)||c===d||!n.has(u))continue;let p=Array.isArray(a.evidence)?a.evidence.map(l=>l&&typeof l=="object"&&typeof l.file=="string"?{file:l.file,...typeof l.detail=="string"?{detail:l.detail}:{}}:null).filter(l=>!!l):[];s.push({from:c,to:d,kind:u,source:"manual",confidence:"high",evidence:p.length>0?p:[{file:nt,detail:"manual edge"}]});}return s}function Lt(e){return `${e.from}\0${e.to}\0${e.kind}`}function zt(e){let t=new Set,r=[];for(let o of e){let s=`${o.file}\0${o.detail??""}`;t.has(s)||(t.add(s),r.push(o));}return r.sort((o,s)=>o.file.localeCompare(s.file)||(o.detail??"").localeCompare(s.detail??"")).slice(0,at)}function qt(e){let t=new Map;for(let r of e){let o=Lt(r),s=t.get(o);if(!s){t.set(o,{...r,evidence:[...r.evidence]});continue}let n=ot[s.source],i=ot[r.source];i>n?t.set(o,{...r,evidence:[...r.evidence,...s.evidence]}):i===n&&s.evidence.push(...r.evidence);}return [...t.values()].map(r=>({from:r.from,to:r.to,kind:r.kind,source:r.source,confidence:r.confidence,evidence:zt(r.evidence)})).sort((r,o)=>r.from.localeCompare(o.from)||r.to.localeCompare(o.to)||r.kind.localeCompare(o.kind)||r.source.localeCompare(o.source))}function ke(e){return Math.round(e*1e3)/1e3}function Ut(e){return Math.max(0,Math.min(100,Math.round(e)))}function Jt(e){return e>=75?"critical":e>=50?"high":e>=20?"medium":"low"}function Xt(e){return e==="critical"||e==="high"?"strict":e==="medium"?"elevated":"normal"}function Yt(e,t){let r=a$5({nodes:e,edges:t}),o=new Map;for(let s of e){let n=r.byId.get(s.id)??{fanIn:0,fanOut:0,reach:0,betweenness:0,isHotspot:false},i=t.filter(m=>m.from===s.id||m.to===s.id),a=i.filter(m=>m.source==="contract"||m.source==="manual").length,c=i.filter(m=>m.confidence==="low").length,d=[],u=n.reach*20+n.fanIn*14+n.fanOut*8+Math.min(20,n.betweenness*4)+a*8;n.isHotspot&&(u+=24,d.push("Critical-path hotspot in dependency graph")),n.reach>0&&d.push(`Change reaches ${n.reach} dependent project(s)`),n.fanIn>0&&d.push(`${n.fanIn} direct dependent project(s)`),n.fanOut>0&&d.push(`${n.fanOut} direct dependency project(s)`),a>0&&d.push(`${a} contract/manual edge(s)`),c>0&&d.push(`${c} low-confidence inferred edge(s) need review`),i.length===0&&d.push("No dependency evidence connected to this project yet");let p=Ut(u),l=Jt(p);o.set(s.id,{weight:l,score:p,verificationPriority:Xt(l),reasons:d.slice(0,5),centrality:{fanIn:n.fanIn,fanOut:n.fanOut,reach:n.reach,betweenness:n.betweenness,isHotspot:n.isHotspot}});}return o}function Qt(e,t){let r=Yt(e,t);return e.map(o=>({...o,operationalProfile:r.get(o.id)}))}function Zt(e,t){let r=new Set;for(let c of t)r.add(c.from),r.add(c.to);let o=e.length,s=t.length,n=e.filter(c=>r.has(c.id)).length,i=Math.max(0,o-n),a=a$5({nodes:e,edges:t});return {nodeCount:o,edgeCount:s,inferredEdges:t.filter(c=>c.source==="inferred").length,contractEdges:t.filter(c=>c.source==="contract").length,manualEdges:t.filter(c=>c.source==="manual").length,authoritativeEdges:t.filter(c=>c.source==="contract"||c.source==="manual").length,lowConfidenceEdges:t.filter(c=>c.confidence==="low").length,orphanCount:i,connectedNodeCount:n,density:ke(o>1?s/(o*(o-1)):0),edgeCoverageRatio:ke(o>0?n/o:1),evidenceCoverageRatio:ke(s>0?t.filter(c=>c.evidence.length>0).length/s:1),hotspotCount:a.hotspots.length,hasCycle:tr(e,t)}}function er(e,t,r){let o=[],s=e.filter(n=>!t.some(i=>i.from===n.id||i.to===n.id)).map(n=>n.id).sort((n,i)=>n.localeCompare(i));return r.nodeCount===0&&o.push({code:"graph.empty",severity:"info",message:"Workspace model has no projects, so dependency reasoning is unavailable.",recommendation:"Import, scaffold, or register projects before relying on graph-aware impact."}),r.nodeCount>1&&r.edgeCount===0?o.push({code:"graph.edges.missing",severity:"warning",message:"Projects were detected, but no inter-project dependency edges were found.",recommendation:"Run graph explain, add workspace contract relationships, or define manual graph overrides for operational dependencies that code imports cannot reveal.",nodeIds:s}):r.orphanCount>0&&o.push({code:"graph.orphans.detected",severity:"warning",message:`${r.orphanCount} project(s) have no dependency evidence connected to the graph.`,recommendation:"Review isolated projects and add package, contract, or manual edges when they participate in release-critical flows.",nodeIds:s.slice(0,12)}),r.lowConfidenceEdges>0&&o.push({code:"graph.low_confidence_edges",severity:"info",message:`${r.lowConfidenceEdges} inferred edge(s) are low confidence.`,recommendation:"Promote important low-confidence relationships to workspace contract or manual overrides."}),r.edgeCount>0&&r.evidenceCoverageRatio<1&&o.push({code:"graph.evidence.partial",severity:"warning",message:"Some dependency edges do not include file-level evidence.",recommendation:"Attach evidence to manual overrides so agents can audit why a relationship exists."}),r.hasCycle&&o.push({code:"graph.cycle.detected",severity:"error",message:"The dependency graph contains at least one directed cycle.",recommendation:"Break the cycle or document the relationship explicitly before using graph-aware release gates."}),o.sort((n,i)=>{let a={error:0,warning:1,info:2};return a[n.severity]-a[i.severity]||n.code.localeCompare(i.code)})}function tr(e,t){let r=new Map;for(let c of e)r.set(c.id,[]);for(let c of t)r.has(c.from)||r.set(c.from,[]),r.get(c.from)?.push(c.to);let o=0,s=1,n=2,i=new Map;for(let c of r.keys())i.set(c,o);let a=c=>{let d=[{id:c,index:0}];for(i.set(c,s);d.length>0;){let u=d[d.length-1],p=r.get(u.id)??[];if(u.index>=p.length){i.set(u.id,n),d.pop();continue}let l=p[u.index];u.index+=1;let m=i.get(l)??o;if(m===s)return true;m===o&&(i.set(l,s),d.push({id:l,index:0}));}return false};for(let c of [...r.keys()].sort())if(i.get(c)===o&&a(c))return true;return false}function ut(e,t,r,o){let s=qt(r.filter(c=>t.has(c.from)&&t.has(c.to))),n=Qt(e,s),i=Zt(e,s),a=er(e,s,i);return {schemaVersion:e$1,generatedAt:(o??new Date).toISOString(),nodes:n,edges:s,stats:i,...a.length>0?{diagnostics:a}:{}}}async function ft(e){let t=f.resolve(e.workspacePath),r=e.maxImportFilesPerProject??st,o=it(e.model),s=new Set(o.map(a=>a.id)),n=ct(t,e.model),i=[];return i.push(...await dt(t,n)),i.push(...await we(t,n,r)),e.contract&&i.push(...pt(t,n,e.contract)),i.push(...await lt(t,s)),ut(o,s,i,e.now)}async function mt(e){let t=f.resolve(e.workspacePath),r=e.maxImportFilesPerProject??st,o=it(e.model),s=new Set(o.map(a=>a.id)),n=ct(t,e.model),i=[];if(i.push(...await dt(t,n)),e.structuralChange)i.push(...await we(t,n,r));else {i.push(...await we(t,n,r,e.changedProjectIds));for(let a of e.previousGraph.edges)a.kind==="code-import"&&a.source==="inferred"&&!e.changedProjectIds.has(a.from)&&s.has(a.from)&&s.has(a.to)&&i.push({from:a.from,to:a.to,kind:"code-import",source:"inferred",confidence:a.confidence,evidence:a.evidence});}return e.contract&&i.push(...pt(t,n,e.contract)),i.push(...await lt(t,s)),ut(o,s,i,e.now)}var je="workspace-model-cache.v1",be=".workspai/cache/workspace-model.v1.json",gt=["package.json","pyproject.toml","requirements.txt","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","workspai.project.json",".workspai/project.json",".workspai/context.json","rapidkit.project.json",".rapidkit/project.json",".rapidkit/context.json"],ht=[".workspai/workspace.contract.json",".workspai/workspace.json","workspai.workspace.json",".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/workspace.contract.json",".rapidkit/workspace.json","rapidkit.workspace.json",".rapidkit/policies.yml",".rapidkit/policies.yaml"],or=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),sr=new Set([".git",".workspai",".rapidkit","node_modules","dist","build","out","target","coverage",".next",".turbo",".cache",".venv"]),ar=1500,L=null;function Pe(){if(L)return L;try{L=createRequire(import.meta.url)("../package.json")?.version??"0.0.0";}catch{L="0.0.0";}return L}async function ne(e){try{let t=await E.readFile(e);return Mt.createHash("sha256").update(t).digest("hex")}catch{return null}}async function ir(e){let t={};for(let s of gt){let n=await ne(f.join(e,s));n&&(t[s]=n);}let r=[],o=[e];for(;o.length>0&&r.length<ar;){let s=o.shift();if(!s)continue;let n=[];try{n=await E.readdir(s,{withFileTypes:true});}catch{continue}let i=[];for(let a of n)if(a.isDirectory()){if(sr.has(a.name)||a.name.startsWith("."))continue;i.push(f.join(s,a.name));}else if(a.isFile()&&or.has(f.extname(a.name))){let c=f.join(s,a.name),d=await E.stat(c).catch(()=>null);if(d){let u=f.relative(e,c).split(f.sep).join("/");r.push(`${u}:${d.size}:${Math.round(d.mtimeMs)}`);}}i.sort((a,c)=>a.localeCompare(c)),o.push(...i);}return r.sort((s,n)=>s.localeCompare(n)),N({manifests:t,source:r})}async function oe(e,t){let r=f.resolve(e),o={},s=[...new Set(t.map(n=>f.relative(r,f.resolve(n)).split(f.sep).join("/")))].sort((n,i)=>n.localeCompare(i));for(let n of s)o[n]=await ir(f.join(r,n));return o}async function se(e){let t=f.resolve(e),r={};for(let o of ht){let s=await ne(f.join(t,o));s&&(r[o]=s);}return r}async function ae(e){let t=f.resolve(e.workspacePath),r=[...new Set(e.projectPaths.map(n=>f.relative(t,f.resolve(n)).split(f.sep).join("/")))].sort((n,i)=>n.localeCompare(i)),o=[];for(let n of r){let i={};for(let a of gt){let c=await ne(f.join(t,n,a));c&&(i[a]=c);}o.push({project:n,manifests:i});}let s={};for(let n of ht){let i=await ne(f.join(t,n));i&&(s[n]=i);}return N({cacheSchema:je,cliVersion:e.cliVersion,flags:e.flags,workspaceJson:e.workspaceJson??null,marker:e.marker??null,projects:o,workspaceFiles:s})}async function Ce(e){let t=await d$2(e,be)??a$4(e,be);try{if(!await E.pathExists(t))return null;let r=await E.readJson(t);return !r||r.schemaVersion!==je||typeof r.inputsHash!="string"||typeof r.cliVersion!="string"||!r.model?null:r}catch{return null}}async function ie(e$1,t){let r={schemaVersion:je,...t};return e(e$1,be,r)}var kt="rapidkit-fact-freshness-v1",q={durable:720*60*60,derived:10080*60,evidenceBacked:1440*60,live:300,verifyBeforeUse:1440*60};function cr(e){switch(e){case "durable":return q.durable;case "derived":return q.derived;case "evidence-backed":return q.evidenceBacked;case "live":return q.live;case "verify-before-use":return q.verifyBeforeUse}}function dr(e){if(e.status)return e.status;if(e.ttlSeconds===null)return "unknown";let t=Date.parse(e.generatedAt);if(!Number.isFinite(t))return "unknown";let r=t+e.ttlSeconds*1e3;return e.now.getTime()>r?"stale":"fresh"}function pr(e){let t=e.now??new Date,r=e.generatedAt??t.toISOString(),o=Date.parse(r),s=Number.isFinite(o),n=s?r:t.toISOString(),i=e.ttlSeconds===void 0?cr(e.kind):e.ttlSeconds,a=dr({generatedAt:n,ttlSeconds:i,status:e.status??(s?void 0:"unknown"),now:t}),c=Date.parse(n),d=i===null||!Number.isFinite(c)?void 0:new Date(c+i*1e3),u=e.verifyBeforeUse??(e.kind==="live"||e.kind==="verify-before-use"||e.category!=="structure"||a!=="fresh");return {schemaVersion:kt,kind:e.kind,category:e.category,generatedAt:n,ttlSeconds:i,...d?{expiresAt:d.toISOString()}:{},status:a,verifyBeforeUse:u,...e.sourceArtifact?{sourceArtifact:e.sourceArtifact}:{},...e.sourcePath?{sourcePath:e.sourcePath}:{},inputsHash:e.inputsHash??N(e.value??null),reason:e.reason}}function b(e){return {id:e.id,label:e.label,scope:e.scope,value:e.value,...e.project?{project:e.project}:{},freshness:pr({...e.freshness,value:e.value})}}function yt(e){let t=e.generatedAt??(e.now??new Date).toISOString(),r={durable:0,derived:0,"evidence-backed":0,live:0,"verify-before-use":0},o={structure:0,verification:0,state:0},s=0,n=0,i=0,a=0;for(let c of e.facts)r[c.freshness.kind]+=1,o[c.freshness.category]+=1,c.freshness.status==="stale"&&(s+=1),c.freshness.status==="unknown"&&(n+=1),c.freshness.kind==="live"&&(i+=1),c.freshness.verifyBeforeUse&&(a+=1);return {schemaVersion:kt,generatedAt:t,status:s>0?"stale":n>0?"unknown":"fresh",totalFacts:e.facts.length,staleFacts:s,unknownFacts:n,liveFacts:i,verifyBeforeUseFacts:a,byKind:r,byCategory:o}}var lr=b$1.model,ce=a.model;function Se(e){return e.projectTopology??e.graph}function vt(e){return !!(e.projectTopology&&e.graph&&c$1(e.projectTopology)===c$1(e.graph))}function En(e){let t=e.engineStatus==="hit"||e.engineStatus==="unchanged"?"reused":e.engineStatus==="incremental"?"partially-reused":"rebuilt";return {schemaVersion:"workspace-model-build.v1",mode:e.mode,outcome:t,engineStatus:e.engineStatus}}var ur=["package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","deno.jsonc","bun.lock","bun.lockb","deps.edn","project.clj","build.sbt","docker-compose.yml","docker-compose.yaml","terraform.tf"],fr=new Set([".git",".hg",".svn",".workspai",".rapidkit",".venv","node_modules","dist","build","target","coverage","htmlcov",".next",".turbo"]);function bt(e,t){return (f.relative(e,t)||".").split(f.sep).join("/")}async function jt(e){try{if(!await E.pathExists(e))return null;let t=await E.readJSON(e);return t&&typeof t=="object"?t:null}catch{return null}}async function mr(e,t){for(let r of t)if(await E.pathExists(f.join(e,r)))return true;return false}function Ee(e){let t=Number.parseInt(process.env.RAPIDKIT_WORKSPACE_MODEL_SCAN_DEPTH??"",10),r=typeof e=="number"&&Number.isFinite(e)?e:Number.isFinite(t)?t:4;return Math.min(12,Math.max(1,Math.trunc(r)))}async function We(e,t){let r=f.resolve(e),o=[{dirPath:r,depth:0}],s=new Set,n=new Set;for(;o.length>0;){let i=o.shift();if(!i)continue;let a=f.resolve(i.dirPath);if(n.has(a))continue;if(n.add(a),a!==r&&await mr(a,ur)){s.add(a);continue}if(i.depth>=t)continue;let c=[];try{c=await E.readdir(a,{withFileTypes:true});}catch{continue}for(let d of c)!d.isDirectory()||fr.has(d.name)||d.name.startsWith(".")&&d.name!==".config"||o.push({dirPath:f.join(a,d.name),depth:i.depth+1});}return Array.from(s).sort((i,a)=>i.localeCompare(a))}function xe(e){let t=new Set,r=[];for(let o of e){let s=f.resolve(o);t.has(s)||(t.add(s),r.push(s));}return r.sort((o,s)=>o.localeCompare(s))}function wt(e,t){let r=e?.[t];return typeof r=="string"&&r.trim()?r.trim():void 0}function gr(e,t){return e?.[t]===true}function hr(e,t,r){let o=e?.frontend&&typeof e.frontend=="object"&&!Array.isArray(e.frontend)?e.frontend:void 0,s=wt(o,"generator"),n=wt(o,"command_display"),i=typeof t=="string"&&t.startsWith("frontend.");if(!(!s&&!i))return {...s?{id:s}:{},...t?{kit:t}:{},displayName:r,source:gr(o,"official_generator")?"official-generator":"metadata",...n?{commandDisplay:n}:{}}}async function kr(e){let t=[".workspai/project.json",".workspai/context.json",".rapidkit/project.json",".rapidkit/context.json","package.json","pyproject.toml","requirements.txt","go.mod","pom.xml","build.gradle","build.gradle.kts","Cargo.toml","composer.json","Gemfile","mix.exs","deno.json","Dockerfile","docker-compose.yml","README.md"],r=[];for(let o of t)await E.pathExists(f.join(e,o))&&r.push(o);return r}async function S(e,t,r,o=t){let s=await d$2(e,t),n=s!==null,i={path:o.split(f.sep).join("/"),exists:n};if(s&&r){let a=await jt(s);typeof a?.generatedAt=="string"&&(i.generatedAt=a.generatedAt);let c=a?.status??a?.result??a?.verdict;typeof c=="string"&&(i.status=c);}return i}async function yr(e,t,r){let o=bt(e,t),s=".workspai/reports",n=c=>S(t,`${s}/${c}`,r,`${o}/${s}/${c}`),i=await n("doctor-project-last-run.json");return {doctor:i?.exists===true?i:await n("doctor-last-run.json"),remediationPlan:await n("doctor-remediation-plan-last-run.json"),fixResult:await n("doctor-fix-result-last-run.json"),analyze:await n("analyze-last-run.json"),readiness:await n("release-readiness-last-run.json")}}async function wr(e,t,r){let o=i$1(t),s=j$1(t,o),n=w(t),i=f$2(s.runtime),a=await tt(t,o),c=r.contractProject?.slug?r.contractProject.slug:typeof o?.name=="string"&&o.name.trim()?o.name.trim():f.basename(t),d=typeof o?.kit_name=="string"?o.kit_name:typeof o?.kit=="string"?o.kit:r.contractProject?.kit,u=typeof o?.engine=="string"?o.engine:n.engine!=="unknown"?n.engine:void 0,p=hr(o,d,s.displayName),l=rt({kitId:d,framework:s.key,runtime:s.runtime}),m=f.relative(e,t),h$1=m===".."||m.startsWith(`..${f.sep}`)?i$2(t):h(t),W=[s.runtime,...h$1.filter(x=>x!==s.runtime)];return {name:c,path:bt(e,t),...r.includeAbsolutePaths?{absolutePath:t}:{},kind:a,category:et(a),runtime:s.runtime,runtimeCandidates:W,framework:s.key,frameworkDisplayName:s.displayName,confidence:s.confidence,detectionSource:s.source,supportTier:s.supportTier,runtimeSupportTier:i.tier,runtimeDoctorSupport:i.doctorSupport,moduleSupport:n.moduleSupport,...d?{kit:d}:{},...u?{engine:u}:{},...p?{generator:p}:{},createCapability:l,commands:{supported:n.supportedCommands,unsupported:n.unsupportedCommands,global:n.globalCommands,fleetStages:n.fleetStages,localOnly:n.localOnlyCommands,map:n.commandMap},importantFiles:await kr(t),evidence:await yr(e,t,r.includeEvidence),provenance:{path:r.contractProject?"workspace contract declaration reconciled with filesystem discovery":"filesystem discovery",runtime:s.source,framework:s.source,commands:"project command capability matrix",createCapability:"create planner capability contract",evidence:"project .workspai/reports"}}}async function Re(e){for(let t of s(e,"workspace.json")){let r=await jt(t);if(r)return r}return null}function vr(e){if(e.length===0)return "empty-workspace";let t=new Set(e.map(r=>r.category));return t.size>1?"polyglot-product-workspace":t.has("frontend")&&e.length>1?"full-stack-workspace":t.has("frontend")?"frontend-workspace":t.has("desktop")?"desktop-application-workspace":t.has("extension")?"extension-workspace":t.has("library")?"library-workspace":e.length>1?"backend-platform":"backend-workspace"}function br(e){let t=new Set;for(let r of e){let o=`${r.name} ${r.path}`.toLowerCase();for(let s of ["auth","billing","payment","notification","order","admin","report","search","analytics"])o.includes(s)&&t.add(s);}return Array.from(t).sort()}function P(e,t,r,o){return {severity:e,code:t,message:r,target:o}}function Pt(e){let t=[];e.workspace.name.trim()||t.push(P("error","workspace.name.missing","Workspace name could not be resolved.","workspace")),e.workspace.type==="observed-workspace"&&t.push(P("warning","workspace.marker.missing","Workspace marker is missing; model is based on filesystem observation.","workspace.marker")),e.summary.projectCount===0&&t.push(P("warning","workspace.projects.empty","No project roots were detected in this workspace.","projects")),e.contracts.exists||t.push(P("warning","workspace.contract.missing","Workspace contract is missing; dependency and API edges may be incomplete.",e.contracts.workspaceContractPath));let r=new Map;for(let n of e.projects){let i=n.name.toLowerCase(),a=r.get(i)??[];a.push(n),r.set(i,a),n.importantFiles.length||t.push(P("warning","project.markers.missing",`Project ${n.name} has no important manifest files recorded.`,n.path));let c=f.isAbsolute(n.path)?n.path:f.resolve(e.workspace.root,n.path);E.existsSync(c)||t.push(P("warning","project.path.missing",`Registered project ${n.name} is not available at its declared path.`,n.path)),n.runtime==="unknown"&&t.push(P("warning","project.runtime.unknown",`Project ${n.name} runtime could not be confidently detected.`,n.path));let d=["test","build"];for(let l of d)n.commands.supported.includes(l)&&n.commands.unsupported.includes(l)&&t.push(P("error","project.commands.conflict",`Project ${n.name} marks ${l} as both supported and unsupported.`,n.path));let u=new Set(n.commands.fleetStages),p=new Set(n.commands.localOnly);for(let l of n.commands.fleetStages){p.has(l)&&t.push(P("error","project.commands.scope-conflict",`Project ${n.name} marks ${l} as both fleet and local-only.`,n.path));let m=n.commands.map[l];(!m||m.status!=="supported"||m.fleetEligible!==true||m.executionScope!=="fleet")&&t.push(P("error","project.commands.fleet-stage-invalid",`Project ${n.name} advertises ${l} as a fleet stage without a supported fleet capability.`,n.path));}for(let l of n.commands.localOnly){let m=n.commands.map[l];(!m||m.status!=="supported"||m.executionScope!=="local-only"||m.fleetEligible===true)&&t.push(P("error","project.commands.local-only-invalid",`Project ${n.name} advertises ${l} as local-only without a matching local-only capability.`,n.path));}for(let l of Object.values(n.commands.map))l.status==="supported"&&(l.fleetEligible===true&&!u.has(l.command)&&t.push(P("error","project.commands.fleet-stage-missing",`Project ${n.name} capability ${l.command} is fleet-eligible but missing from fleetStages.`,n.path)),l.executionScope==="local-only"&&l.fleetEligible!==true&&!p.has(l.command)&&t.push(P("error","project.commands.local-only-missing",`Project ${n.name} capability ${l.command} is local-only but missing from localOnly commands.`,n.path)));}for(let[n,i]of r.entries())i.length>1&&t.push(P("error","project.name.duplicate",`Project name "${n}" is ambiguous across ${i.length} project roots.`,i.map(a=>a.path).join(", ")));e.projectTopology&&e.graph&&c$1({...e.projectTopology,generatedAt:"<ignored>"})!==c$1({...e.graph,generatedAt:"<ignored>"})&&t.push(P("error","workspace.project-topology.alias-mismatch","Deprecated model.graph must remain structurally identical to canonical model.projectTopology during the v1 migration window.","projectTopology"));let o=t.filter(n=>n.severity==="error").length,s=t.filter(n=>n.severity==="warning").length;return {status:o>0?"failed":s>0?"warning":"passed",errors:o,warnings:s,issues:t}}function Wn(e){return Pt(e)}function j(e){return e.join(".")}function jr(e,t){let r=ce,o=e.generatedAt,s=[b({id:"workspace.name",label:"Workspace name",scope:"workspace",value:e.workspace.name,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["workspace","name"]),reason:"Workspace identity is structural metadata and changes through workspace setup."}}),b({id:"workspace.type",label:"Workspace type",scope:"workspace",value:e.identity.workspaceType,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["identity","workspaceType"]),reason:"Workspace type is derived from the current project inventory."}}),b({id:"workspace.projectCount",label:"Project count",scope:"workspace",value:e.summary.projectCount,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["summary","projectCount"]),reason:"Project count is derived from workspace discovery and should be refreshed after structural changes."}}),b({id:"workspace.runtimeFamilies",label:"Runtime families",scope:"workspace",value:e.identity.runtimeFamilies,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["identity","runtimeFamilies"]),reason:"Runtime coverage is inferred from project surfaces."}}),b({id:"workspace.policyMode",label:"Workspace policy mode",scope:"policy",value:e.policies.mode,freshness:{kind:"durable",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["policies","mode"]),reason:"Policy mode is configuration, not runtime state."}}),b({id:"workspace.contract.exists",label:"Workspace contract presence",scope:"contract",value:e.contracts.exists,freshness:{kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,sourcePath:j(["contracts","exists"]),reason:"Contract presence is derived from workspace files and should be refreshed before release gating."}})],n=Se(e);n&&s.push(b({id:"graph.edgeCount",label:"Dependency graph edge count",scope:"graph",value:n.stats.edgeCount,freshness:{kind:"derived",category:"structure",generatedAt:n.generatedAt??o,now:t,sourceArtifact:r,sourcePath:j(["projectTopology","stats","edgeCount"]),reason:"Graph topology is derived from manifests, imports, and workspace contracts."}}),b({id:"graph.evidenceCoverageRatio",label:"Dependency graph evidence coverage",scope:"graph",value:n.stats.evidenceCoverageRatio,freshness:{kind:"derived",category:"structure",generatedAt:n.generatedAt??o,now:t,sourceArtifact:r,sourcePath:j(["projectTopology","stats","evidenceCoverageRatio"]),reason:"Graph evidence coverage changes when dependency evidence or contract edges change."}}));for(let[i,a]of e.projects.entries()){let c=`projects[${i}]`,d={kind:"derived",category:"structure",generatedAt:o,now:t,sourceArtifact:r,reason:"Project facts are derived from workspace discovery, project metadata, and framework probes."};s.push(b({id:`project.${a.name}.kind`,label:`${a.name} kind`,scope:"project",project:a.name,value:a.kind,freshness:{...d,sourcePath:j([c,"kind"])}}),b({id:`project.${a.name}.category`,label:`${a.name} category`,scope:"project",project:a.name,value:a.category,freshness:{...d,sourcePath:j([c,"category"])}}),b({id:`project.${a.name}.runtime`,label:`${a.name} runtime`,scope:"project",project:a.name,value:a.runtime,freshness:{...d,sourcePath:j([c,"runtime"])}}),b({id:`project.${a.name}.framework`,label:`${a.name} framework`,scope:"project",project:a.name,value:a.frameworkDisplayName,freshness:{...d,sourcePath:j([c,"frameworkDisplayName"])}}),b({id:`project.${a.name}.supportTier`,label:`${a.name} support tier`,scope:"project",project:a.name,value:a.supportTier,freshness:{...d,sourcePath:j([c,"supportTier"])}}),b({id:`project.${a.name}.safeFleetStages`,label:`${a.name} safe fleet stages`,scope:"command",project:a.name,value:a.commands.fleetStages,freshness:{...d,sourcePath:j([c,"commands","fleetStages"]),reason:"Safe command availability is derived from package and project command surfaces."}}));for(let[u,p]of Object.entries(a.evidence))s.push(b({id:`project.${a.name}.evidence.${u}`,label:`${a.name} ${u} evidence`,scope:"evidence",project:a.name,value:p?{path:p.path,exists:p.exists,status:p.status??null}:{exists:false},freshness:{kind:p?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:p?.generatedAt??o,now:t,status:p?.exists?void 0:"unknown",sourceArtifact:p?.path??r,sourcePath:j([c,"evidence",u]),verifyBeforeUse:true,reason:p?.exists?"Evidence reports can expire or become stale after source changes.":"Missing evidence must be generated before this fact is used for verification."}}));}for(let[i,a]of Object.entries(e.evidence))s.push(b({id:`workspace.evidence.${i}`,label:`Workspace ${i} evidence`,scope:"evidence",value:a?{path:a.path,exists:a.exists,status:a.status??null}:null,freshness:{kind:a?.exists?"evidence-backed":"verify-before-use",category:"verification",generatedAt:a?.generatedAt??o,now:t,status:a?.exists?void 0:"unknown",sourceArtifact:a?.path??r,sourcePath:j(["evidence",i]),verifyBeforeUse:true,reason:a?.exists?"Workspace evidence can expire or become stale after project, dependency, or policy changes.":"Missing workspace evidence must be generated before release or repair decisions."}}));return s}async function de(e){let t=f.resolve(e.workspacePath),r=e.includeAbsolutePaths===true,o=e.includeEvidence===true,s$1=Ee(e.observableScanDepth),n=e.now??new Date,[i,a$4,c,d,u,p]=await Promise.all([a$1(t),Re(t),Ae(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),We(t,s$1)]),l=new Map;for(let g of c?.projects??[]){let le=g.externalPath?f.resolve(g.externalPath):f.resolve(t,g.relativePath);l.set(le,g);}let m=xe([...u,...p,...l.keys(),...d.map(g=>f.isAbsolute(g.path)?g.path:f.join(t,g.path))]),v=e.reuseProjectModels,h=await Promise.all(m.map(g=>{if(v){let le=f.relative(t,f.resolve(g)).split(f.sep).join("/"),Me=v.get(le);if(Me)return Promise.resolve(Me)}return wr(t,g,{includeAbsolutePaths:r,includeEvidence:o,contractProject:l.get(f.resolve(g))})})),W=typeof a$4?.workspace_name=="string"?a$4.workspace_name:typeof a$4?.name=="string"?a$4.name:i?.name||c?.workspace.name||f.basename(t),x=typeof a$4?.profile=="string"?a$4.profile:typeof a$4?.mode=="string"?a$4.mode:c?.workspace.profile,V=Array.from(new Set(h.map(g=>g.kind))).sort(),pe=Array.from(new Set(h.map(g=>g.category))).sort(),H=Array.from(new Set(h.flatMap(g=>g.runtimeCandidates.length>0?g.runtimeCandidates:[g.runtime]))).sort(),U=Array.from(new Set(h.map(g=>g.framework))).sort(),I=[".workspai/policies.yml",".workspai/policies.yaml",".rapidkit/policies.yml",".rapidkit/policies.yaml"].find(g=>E.existsSync(f.join(t,g))),J=s(t,"workspace.contract.json").map(g=>f.relative(t,g).split(f.sep).join("/")).find(g=>E.existsSync(f.join(t,g)))??".workspai/workspace.contract.json",R=await E.pathExists(f.join(t,J)),X={schemaVersion:lr,generatedAt:n.toISOString(),workspace:{name:W,root:t,...x?{profile:x}:{},type:i?"rapidkit-workspace":"observed-workspace",...i?{marker:{createdBy:i.createdBy,version:i.version,createdAt:i.createdAt}}:{}},identity:{workspaceType:vr(h),surfaces:V,categories:pe,runtimeFamilies:H,businessCapabilities:br(h)},discovery:{observableScanDepth:s$1},projects:h,policies:{mode:typeof a$4?.policy_mode=="string"?a$4.policy_mode:typeof a$4?.policyMode=="string"?a$4.policyMode:"warn",source:I??null,exists:!!I},contracts:{workspaceContractPath:J,exists:R,status:R?"known":"missing"},evidence:{doctor:await S(t,a.doctor,o),projectDoctor:await S(t,".workspai/reports/doctor-project-last-run.json",o),doctorRemediationPlan:await S(t,".workspai/reports/doctor-remediation-plan-last-run.json",o),artifactRemediationPlan:await S(t,".workspai/reports/artifact-remediation-plan-last-run.json",o),doctorFixResult:await S(t,".workspai/reports/doctor-fix-result-last-run.json",o),analyze:await S(t,a.analyze,o),readiness:await S(t,a.readiness,o),pipeline:await S(t,".workspai/reports/pipeline-last-run.json",o)},summary:{projectCount:h.length,runtimes:H,frameworks:U,firstClassProjects:h.filter(g=>g.supportTier==="first-class").length,observedProjects:h.filter(g=>g.supportTier==="observed").length}},w=await Ct(t,X,{contractExists:R,now:n,incrementalGraph:e.incrementalGraph}),C={...X,projectTopology:w,graph:w},A=Pt(C),F=jr({...C},n),St=yt({facts:F,generatedAt:n.toISOString(),now:n});return {...C,facts:F,factFreshness:St,validation:A}}async function xn(e){if(e.cache!==true)return {model:await de(e),cache:"disabled"};let t=f.resolve(e.workspacePath),r=Ee(e.observableScanDepth),o=Pe(),[s,n,i,a,c]=await Promise.all([a$1(t),Re(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),We(t,r)]),d=xe([...a,...c,...i.map(h=>f.isAbsolute(h.path)?h.path:f.join(t,h.path))]),u=await ae({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:d,workspaceJson:n,marker:s}),p=await Ce(t);if(p&&p.cliVersion===o&&p.inputsHash===u&&vt(p.model))return {model:p.model,cache:"hit"};let l=await de({...e}),[m,v]=await Promise.all([oe(t,d),se(t)]);return await ie(t,{cliVersion:o,inputsHash:u,generatedAt:(e.now??new Date).toISOString(),model:l,projectSignatures:m,workspaceFileSignatures:v}),{model:l,cache:"miss"}}function Pr(e,t){let r=new Set,o=new Set,s=new Set;for(let[n,i]of Object.entries(t))n in e?e[n]!==i&&r.add(n):o.add(n);for(let n of Object.keys(e))n in t||s.add(n);return {changed:r,added:o,removed:s}}function Cr(e={},t={}){let r=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of r)if(e[o]!==t[o])return false;return true}async function Rn(e){let t=f.resolve(e.workspacePath),r=Ee(e.observableScanDepth),o=Pe(),s=e.now??new Date,[n,i,a,c,d]=await Promise.all([a$1(t),Re(t),a$2(t),a$3(t,{descendIntoMatchedProjects:false}),We(t,r)]),u=xe([...c,...d,...a.map(w=>f.isAbsolute(w.path)?w.path:f.join(t,w.path))]),p=await Ce(t),l=async()=>{let w=await de({...e}),C=await ae({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:u,workspaceJson:i,marker:n}),[A,F]=await Promise.all([oe(t,u),se(t)]);return await ie(t,{cliVersion:o,inputsHash:C,generatedAt:s.toISOString(),model:w,projectSignatures:A,workspaceFileSignatures:F}),{model:w,mode:"full"}},m=p?Se(p.model):void 0;if(!p||p.cliVersion!==o||!p.projectSignatures||!m||!vt(p.model))return l();let v=await se(t);if(!Cr(p.workspaceFileSignatures,v))return l();let h=await oe(t,u),{changed:W,added:x,removed:V}=Pr(p.projectSignatures,h);if(W.size===0&&x.size===0&&V.size===0)return {model:p.model,mode:"unchanged"};let pe=new Set([...W,...x]),H=new Map;for(let w of p.model.projects){let C=w.path.split(f.sep).join("/");!pe.has(C)&&!V.has(C)&&H.set(C,w);}let U=new Set,I=false;for(let w of p.model.projects){let C=w.path.split(f.sep).join("/");W.has(C)&&U.add(w.name);}let J=x.size>0||V.size>0,R=await de({...e,reuseProjectModels:H,incrementalGraph:{previousGraph:m,changedProjectIds:U,structuralChange:J||I}});for(let w of p.model.projects){let C=w.path.split(f.sep).join("/");if(!W.has(C))continue;let A=R.projects.find(F=>F.path.split(f.sep).join("/")===C);if(A&&A.name!==w.name){I=true;break}}if(I)return l();let X=await ae({workspacePath:t,cliVersion:o,flags:{includeAbsolutePaths:e.includeAbsolutePaths===true,includeEvidence:e.includeEvidence===true,observableScanDepth:r},projectPaths:u,workspaceJson:i,marker:n});return await ie(t,{cliVersion:o,inputsHash:X,generatedAt:s.toISOString(),model:R,projectSignatures:h,workspaceFileSignatures:v}),{model:R,mode:"incremental"}}async function Ae(e){try{let{contract:t}=await p({workspacePath:e});return t&&typeof t=="object"?t:null}catch{return null}}async function Ct(e,t,r){let o=r.contractExists?await Ae(e):null;try{return r.incrementalGraph?await mt({workspacePath:e,model:t,contract:o,now:r.now,previousGraph:r.incrementalGraph.previousGraph,changedProjectIds:r.incrementalGraph.changedProjectIds,structuralChange:r.incrementalGraph.structuralChange}):await ft({workspacePath:e,model:t,contract:o,now:r.now})}catch{let s=t.projects.map(n=>({id:n.name,path:n.path}));return {schemaVersion:"workspace-dependency-graph.v1",generatedAt:r.now.toISOString(),nodes:s,edges:[],stats:{nodeCount:s.length,edgeCount:0,inferredEdges:0,contractEdges:0,manualEdges:0,authoritativeEdges:0,lowConfidenceEdges:0,orphanCount:s.length,connectedNodeCount:0,density:0,edgeCoverageRatio:s.length>0?0:1,evidenceCoverageRatio:1,hotspotCount:0,hasCycle:false},diagnostics:s.length>1?[{code:"graph.inference.failed",severity:"warning",message:"Dependency graph inference failed; model contains projects but no dependency edges.",recommendation:"Run workspace model again after fixing graph inputs, or add workspace contract/manual graph overrides.",nodeIds:s.map(n=>n.id).sort((n,i)=>n.localeCompare(i))}]:void 0}}}async function An(e,t){let r=e.contracts.exists?await Ae(t):null,{buildWorkspaceKnowledgeGraph:o}=await import('./workspace-knowledge-graph-5MKEI4Z5.js'),s=d(e),n=await o({workspacePath:t,workspace:{name:e.workspace.name,...e.workspace.profile?{profile:e.workspace.profile}:{}},projects:e.projects.map(a=>({id:a.name,path:a.path,...a.absolutePath?{absolutePath:a.absolutePath}:{},runtime:a.runtime,runtimeCandidates:a.runtimeCandidates,framework:a.framework,kind:a.kind,category:a.category,...a.kit?{kit:a.kit}:{}})),projectTopology:Se(e)??await Ct(t,e,{contractExists:e.contracts.exists,now:new Date(e.generatedAt)}),contract:r,now:new Date(e.generatedAt),source:{kind:"workspace-model",artifact:ce,hashAlgorithm:"sha256",hash:d$1(s)}}),[,i]=await f$1(t,ce,[{relativePath:a.knowledgeGraph,payload:n},{relativePath:ce,payload:s}]);return i}export{et as a,tt as b,rt as c,Fr as d,_r as e,N as f,kt as g,b as h,yt as i,lr as j,ce as k,Se as l,En as m,Wn as n,jr as o,de as p,xn as q,Rn as r,An as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o="rapidkit-doctor-fix-result-v1",i="npx workspai workspace verify --from-impact .workspai/reports/workspace-impact-last-run.json --json";function n(t){return {schemaVersion:o,generatedAt:new Date().toISOString(),appliedFixes:t.appliedFixes,remainingBlockers:t.remainingBlockers,verifyRecommended:t.verifyRecommended??i}}var c="doctor-graph-diagnosis.v1";export{o as a,i as b,n as c,c as d};
|