Part of #11
As a developer, I want packages downloaded to a consistent vendor directory so I can commit them or inspect them locally.
project/ ├── qbits.lock # Lockfile (project root) └── vendor/ └── qbits/ ├── @qrun/ │ ├── auth-sso/ │ │ ├── 2.0.1/ │ │ │ ├── manifest.yaml │ │ │ ├── src/ │ │ │ └── ... │ │ └── .current -> 2.0.1 # Symlink to active version │ └── reports/ │ └── 1.3.0/ │ └── ... └── .integrity # SHA-512 checksums
@qrun/
.current
.integrity
download(pkg, version, url)
remove(pkg)
exists(pkg, version)
clean()
qctl-qbit/src/main/java/io/qrun/qctl/qbit/vendor/VendorLayout.java
qctl-qbit/src/main/java/io/qrun/qctl/qbit/vendor/PackageDownloader.java
vendor/qbits/@scope/name/version/
VendorLayout
getPackagePath(name, version)
getCurrentPath(name)
PackageDownloader
@scope/name
No dependencies set.
The note is not visible to the blocked user.
Part of #11
User Story
As a developer, I want packages downloaded to a consistent vendor directory so I can commit them or inspect them locally.
Design
Directory Structure
Key Design Decisions
@qrun/).currentsymlink.integrityfileVendor Operations
download(pkg, version, url)remove(pkg)exists(pkg, version)clean()Files to Create
qctl-qbit/src/main/java/io/qrun/qctl/qbit/vendor/VendorLayout.javaqctl-qbit/src/main/java/io/qrun/qctl/qbit/vendor/PackageDownloader.javaDownload Flow
vendor/qbits/@scope/name/version/.currentsymlink.integrityfileImplementation Tasks
VendorLayoutclass for path calculationsgetPackagePath(name, version)methodgetCurrentPath(name)for symlink resolutionPackageDownloaderfor HTTP downloads.currentsymlink management.integrityfile updatesclean()method to remove orphaned packagesAcceptance Criteria
@scope/namestructure.currentsymlink points to active version.integrityfile contains all checksums