diff --git a/docs/development/frontend/storage.mdx b/docs/development/frontend/storage.mdx index af4a662..8123518 100644 --- a/docs/development/frontend/storage.mdx +++ b/docs/development/frontend/storage.mdx @@ -178,6 +178,11 @@ All storage keys should: - `form_draft` - `wizard_state` +6. **User Onboarding**: `{feature}_completed` or `{feature}_cancelled` + - `walkthrough_completed` + - `tutorial_completed` + - `onboarding_skipped` + ## Adding New Storage Values ### Step 1: Define Your Storage Key diff --git a/docs/development/gateway/device-management.mdx b/docs/development/gateway/device-management.mdx new file mode 100644 index 0000000..6e75ec9 --- /dev/null +++ b/docs/development/gateway/device-management.mdx @@ -0,0 +1,178 @@ +--- +title: Device Management Architecture +description: Technical implementation of device detection, caching, and management in the DeployStack Gateway CLI +sidebar: Device Management +--- + +# Gateway Device Management Architecture + +The DeployStack Gateway implements a sophisticated device management system that balances security, performance, and user experience. This document explains the technical architecture, design decisions, and implementation details from a developer perspective. + +## Architecture Overview + +The Gateway's device management system consists of three core components: + +**Device Detection System** +- Hardware fingerprinting for unique device identification +- System information collection for compatibility and analytics +- Lightweight signature generation for cache validation + +**Device Information Cache** +- High-performance caching to eliminate redundant device detection +- Secure storage using OS keychain with encrypted fallback +- Integrity validation and automatic cache invalidation + +**OAuth2 Integration** +- Device registration during authentication flow +- Device information included in token exchange +- No separate device management endpoints required + +## The Performance Problem We Solved + +### Original Challenge + +Before implementing device caching, every Gateway command suffered from a significant performance bottleneck: + +- **Device fingerprinting took 3+ seconds** on every command execution +- Commands like `deploystack refresh` and `deploystack mcp` felt sluggish +- Users experienced poor CLI responsiveness +- System resources were wasted on redundant hardware detection + +### Root Cause Analysis + +Device fingerprinting is inherently expensive because it requires: +- Network interface enumeration to collect MAC addresses +- System information queries across multiple OS APIs +- Cryptographic hashing of collected hardware data +- File system operations to gather system details + +This expensive operation was happening on **every single command** because device information is required for: +- Backend API authentication and device tracking +- Security validation and audit logging +- Configuration management and team analytics + +## Device Caching Architecture + +### Design Principles + +**Performance First** +- Cache-first architecture with graceful fallback +- 30x performance improvement (3s → 0.1s) +- Persistent cache across logout/login sessions + +**Security Without Compromise** +- Hardware signature validation for cache integrity +- Automatic invalidation on hardware changes +- Encrypted storage with integrity checksums + +**Developer Experience** +- Completely transparent to end users +- No manual cache management required +- Automatic background operation + +### Cache Storage Strategy + +We implemented a dual-storage approach for maximum reliability: + +**Primary: OS Keychain Storage** +- macOS: Keychain Services +- Windows: Credential Manager +- Linux: Secret Service API +- Benefits: Native OS security, encrypted at rest, user-scoped access + +**Fallback: Encrypted File Storage** +- AES-256-GCM encryption with derived keys +- Stored in `~/.deploystack/device-cache.enc` +- File permissions restricted to user only (0o600) +- Used when keychain access fails or is unavailable + +### Cache Validation System + +**Hardware Signature Validation** +- Lightweight hardware signature (not full fingerprint) +- Detects major hardware changes without expensive operations +- Automatically invalidates cache when hardware changes detected + +**Integrity Protection** +- SHA256 checksums with random salts prevent tampering +- Cache version tracking for schema evolution +- Automatic cleanup of corrupted or invalid cache entries + +**Time-Based Expiration** +- 30-day cache lifetime for security +- Automatic renewal during normal usage +- Configurable expiration for different deployment scenarios + +## Device Detection Implementation + +### Hardware Fingerprinting Process + +**Network Interface Collection** +- Enumerate all network interfaces +- Extract MAC addresses from physical interfaces +- Filter out virtual and temporary interfaces +- Handle cross-platform interface naming differences + +**System Information Gathering** +- Operating system type and version +- System architecture (x64, arm64, etc.) +- Hostname and system identifiers +- Node.js runtime version for compatibility + +**Fingerprint Generation** +- Combine hardware identifiers in deterministic order +- Apply cryptographic hashing (SHA256) +- Generate stable, unique device identifier +- Ensure consistency across reboots and minor system changes + +### Lightweight Hardware Signatures + +For cache validation, we use a much faster "hardware signature" instead of full fingerprinting: + +**Why Separate Signatures?** +- Full fingerprinting: 3+ seconds, comprehensive hardware analysis +- Hardware signature: \<100ms, basic system identifiers +- Signature detects major changes (new hardware, different machine) +- Signature allows minor changes (software updates, network changes) + +**Signature Components** +- Primary MAC address of main network interface +- System hostname and basic OS identifiers +- Minimal set of stable hardware characteristics +- Fast to compute, sufficient for cache validation + +## Security Architecture + +### Threat Model Considerations + +**Cache Tampering Protection** +- SHA256 checksums with random salts +- Integrity validation on every cache access +- Automatic invalidation of corrupted cache +- Secure key derivation for encryption + +**Hardware Change Detection** +- Automatic cache invalidation when hardware changes +- Prevents cache reuse on different machines +- Detects both major and minor hardware modifications +- Balances security with usability + +**Storage Security** +- OS keychain provides encrypted storage +- Fallback encryption uses industry-standard AES-256-GCM +- File permissions restrict access to user only +- No plaintext device information stored + +### Privacy Considerations + +**Minimal Data Collection** +- Only collect device information necessary for functionality +- No tracking or analytics data in device cache +- User control over device naming and identification +- Clear data retention and cleanup policies + +**Data Isolation** +- Device cache is user-scoped and isolated +- No cross-user cache sharing or access +- Secure cleanup when users are removed +- Audit trail separate from cached data diff --git a/package-lock.json b/package-lock.json index a2d5963..f2eb507 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,20 +12,20 @@ "@types/mdx": "^2.0.13", "fumadocs-core": "^15.6.9", "fumadocs-mdx": "^11.8.0", - "fumadocs-ui": "^15.6.12", + "fumadocs-ui": "^15.7.7", "lucide-react": "^0.525.0", "mdx": "^0.3.1", - "next": "^15.5.0", + "next": "^15.5.2", "node-fetch": "^3.3.2", "react": "^19.1.1", "react-dom": "^19.1.1", "schema-dts": "^1.1.5" }, "devDependencies": { - "@semantic-release/github": "^11.0.4", + "@semantic-release/github": "^11.0.5", "@tailwindcss/postcss": "^4.1.12", "@types/node": "24.3.0", - "@types/react": "^19.1.11", + "@types/react": "^19.1.12", "@types/react-dom": "^19.1.8", "autoprefixer": "^10.4.21", "markdownlint-cli": "^0.45.0", @@ -1193,15 +1193,15 @@ } }, "node_modules/@next/env": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.0.tgz", - "integrity": "sha512-sDaprBAfzCQiOgo2pO+LhnV0Wt2wBgartjrr+dpcTORYVnnXD0gwhHhiiyIih9hQbq+JnbqH4odgcFWhqCGidw==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", + "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.0.tgz", - "integrity": "sha512-v7Jj9iqC6enxIRBIScD/o0lH7QKvSxq2LM8UTyqJi+S2w2QzhMYjven4vgu/RzgsdtdbpkyCxBTzHl/gN5rTRg==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", + "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", "cpu": [ "arm64" ], @@ -1215,9 +1215,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.0.tgz", - "integrity": "sha512-s2Nk6ec+pmYmAb/utawuURy7uvyYKDk+TRE5aqLRsdnj3AhwC9IKUBmhfnLmY/+P+DnwqpeXEFIKe9tlG0p6CA==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", + "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", "cpu": [ "x64" ], @@ -1231,9 +1231,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.0.tgz", - "integrity": "sha512-mGlPJMZReU4yP5fSHjOxiTYvZmwPSWn/eF/dcg21pwfmiUCKS1amFvf1F1RkLHPIMPfocxLViNWFvkvDB14Isg==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", + "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", "cpu": [ "arm64" ], @@ -1247,9 +1247,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.0.tgz", - "integrity": "sha512-biWqIOE17OW/6S34t1X8K/3vb1+svp5ji5QQT/IKR+VfM3B7GvlCwmz5XtlEan2ukOUf9tj2vJJBffaGH4fGRw==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", + "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", "cpu": [ "arm64" ], @@ -1263,9 +1263,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.0.tgz", - "integrity": "sha512-zPisT+obYypM/l6EZ0yRkK3LEuoZqHaSoYKj+5jiD9ESHwdr6QhnabnNxYkdy34uCigNlWIaCbjFmQ8FY5AlxA==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", + "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", "cpu": [ "x64" ], @@ -1279,9 +1279,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.0.tgz", - "integrity": "sha512-+t3+7GoU9IYmk+N+FHKBNFdahaReoAktdOpXHFIPOU1ixxtdge26NgQEEkJkCw2dHT9UwwK5zw4mAsURw4E8jA==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", + "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", "cpu": [ "x64" ], @@ -1295,9 +1295,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.0.tgz", - "integrity": "sha512-d8MrXKh0A+c9DLiy1BUFwtg3Hu90Lucj3k6iKTUdPOv42Ve2UiIG8HYi3UAb8kFVluXxEfdpCoPPCSODk5fDcw==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", + "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", "cpu": [ "arm64" ], @@ -1311,9 +1311,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.0.tgz", - "integrity": "sha512-Fe1tGHxOWEyQjmygWkkXSwhFcTJuimrNu52JEuwItrKJVV4iRjbWp9I7zZjwqtiNnQmxoEvoisn8wueFLrNpvQ==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", + "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", "cpu": [ "x64" ], @@ -1521,9 +1521,9 @@ } }, "node_modules/@orama/orama": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.11.tgz", - "integrity": "sha512-Szki0cgFiXE5F9RLx2lUyEtJllnuCSQ4B8RLDwIjXkVit6qZjoDAxH+xhJs29MjKLDz0tbPLdKFa6QrQ/qoGGA==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.12.tgz", + "integrity": "sha512-U7PY8FwXHuJ6bNBpbsqe0KLzb91IcJuORDggqHHkFy1waokY5SpWLN9tzB3AOW776awp6s1bjwts9I9Davy3lw==", "license": "Apache-2.0", "engines": { "node": ">= 20.0.0" @@ -2360,9 +2360,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.4.tgz", - "integrity": "sha512-fU/nLSjkp9DmB0h7FVO5imhhWJMvq2LjD4+3lz3ZAzpDLY9+KYwC+trJ+g7LbZeJv9y3L9fSFSg2DduUpiT6bw==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.5.tgz", + "integrity": "sha512-wJamzHteXwBdopvkTD6BJjPz1UHLm20twlVCSMA9zpd3B5KrOQX137jfTbNJT6ZVz3pXtg0S1DroQl4wifJ4WQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2460,84 +2460,84 @@ } }, "node_modules/@shikijs/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.9.2.tgz", - "integrity": "sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.12.1.tgz", + "integrity": "sha512-j9+UDQ6M50xvaSR/e9lg212H0Fqxy3lYd39Q6YITYQxfrb5VYNUKPLZp4PN9f+YmRcdpyNAm3obn/tIZ2WkUWg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.9.2", + "@shikijs/types": "3.12.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "node_modules/@shikijs/engine-javascript": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.9.2.tgz", - "integrity": "sha512-kUTRVKPsB/28H5Ko6qEsyudBiWEDLst+Sfi+hwr59E0GLHV0h8RfgbQU7fdN5Lt9A8R1ulRiZyTvAizkROjwDA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.12.1.tgz", + "integrity": "sha512-mwif5T3rEBSMn/1m9dNi4WmB4dxH4VfYqreQMLpbFYov8MM3Gus98I549amFMjtEmYDAkTKGP7bmsv1n9t9I+A==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.9.2", + "@shikijs/types": "3.12.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.9.2.tgz", - "integrity": "sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.12.1.tgz", + "integrity": "sha512-hbYq+XOc55CU7Irkhsgwh8WgQbx2W5IVzHV4l+wZ874olMLSNg5o3F73vo9m4SAhimFyqq/86xnx9h+T30HhhQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.9.2", + "@shikijs/types": "3.12.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.9.2.tgz", - "integrity": "sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.12.1.tgz", + "integrity": "sha512-Y1MbMfVO5baRz7Boo7EoD36TmzfUx/I5n8e+wZumx6SlUA81Zj1ZwNJL871iIuSHrdsheV4AxJtHQ9mlooklmg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.9.2" + "@shikijs/types": "3.12.1" } }, "node_modules/@shikijs/rehype": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.9.2.tgz", - "integrity": "sha512-obHyTWAUp5cpgpr4v7T9sjEHkLUMvBHvcpYAtdB1yuWU4/IeJ8boDMpnGUvvnxVpDwARlkvBA4Hr+BISo3zwjg==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.12.1.tgz", + "integrity": "sha512-MEWt7qNyvlzVsQAf6WWTX+EN5IxRW3VUfzxrmQQHOUXjGePjQcVpHuaapW/BxgUX5hNhXKUtBVR7KMwY3ASLjA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.9.2", + "@shikijs/types": "3.12.1", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", - "shiki": "3.9.2", + "shiki": "3.12.1", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "node_modules/@shikijs/themes": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.9.2.tgz", - "integrity": "sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.12.1.tgz", + "integrity": "sha512-9JrAm9cA5hqM/YXymA3oAAZdnCgQf1zyrNDtsnM105nNEoEpux4dyzdoOjc2KawEKj1iUs/WH2ota6Atp7GYkQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.9.2" + "@shikijs/types": "3.12.1" } }, "node_modules/@shikijs/transformers": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.9.2.tgz", - "integrity": "sha512-MW5hT4TyUp6bNAgTExRYLk1NNasVQMTCw1kgbxHcEC0O5cbepPWaB+1k+JzW9r3SP2/R8kiens8/3E6hGKfgsA==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.12.1.tgz", + "integrity": "sha512-crGh3cSZf6mwg3K2W8i79Ja+q4tVClRHdHLnUGi5arS58+cqdzsbkrEZBDMyevf9ehmjFUWDTEwCMEyp9I3z0g==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.9.2", - "@shikijs/types": "3.9.2" + "@shikijs/core": "3.12.1", + "@shikijs/types": "3.12.1" } }, "node_modules/@shikijs/types": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.9.2.tgz", - "integrity": "sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.12.1.tgz", + "integrity": "sha512-Is/p+1vTss22LIsGCJTmGrxu7ZC1iBL9doJFYLaZ4aI8d0VDXb7Mn0kBzhkc7pdsRpmUbQLQ5HXwNpa3H6F8og==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -3008,9 +3008,9 @@ "peer": true }, "node_modules/@types/react": { - "version": "19.1.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", - "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4983,15 +4983,15 @@ } }, "node_modules/fumadocs-core": { - "version": "15.6.12", - "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.6.12.tgz", - "integrity": "sha512-QlnDcBNk+CbnX8jxa9EdWMWy6CJPNxAyLGhA2Zk+ia35kQEbATI9xaTp2oDObuqb2qH7VRD0Ild/e56dSlcxTQ==", + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.7.7.tgz", + "integrity": "sha512-4mo8y1L2VV9TcrQ1gses3c5zzCaPwDPYjfrPET4Qf+m7GPOqZ7wiUeXMTYb98T+N5wS0G/fsr/xFPZkgwD44gQ==", "license": "MIT", "dependencies": { "@formatjs/intl-localematcher": "^0.6.1", - "@orama/orama": "^3.1.11", - "@shikijs/rehype": "^3.9.2", - "@shikijs/transformers": "^3.9.2", + "@orama/orama": "^3.1.12", + "@shikijs/rehype": "^3.12.0", + "@shikijs/transformers": "^3.12.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", @@ -5003,7 +5003,7 @@ "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", - "shiki": "^3.9.2", + "shiki": "^3.12.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { @@ -5097,9 +5097,9 @@ } }, "node_modules/fumadocs-ui": { - "version": "15.6.12", - "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.6.12.tgz", - "integrity": "sha512-1DGH5dwtA8XLDP8d3Y2L+/zPqASV7XlD+zj/OfXsF/0OvJT1gIAe1TL8CRlmKeUkTnOjGbvOMg/805iwDvXMFg==", + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.7.7.tgz", + "integrity": "sha512-nXeEnFI0h+JAbwWsKWcc6aBuR++jWlxhMpXQnPv4zbrrbds436lilrOu/xh5KxPiEe2M9HspKMN+Oee73jHQFw==", "license": "MIT", "dependencies": { "@radix-ui/react-accordion": "^1.2.12", @@ -5113,7 +5113,7 @@ "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.13", "class-variance-authority": "^0.7.1", - "fumadocs-core": "15.6.12", + "fumadocs-core": "15.7.7", "lodash.merge": "^4.6.2", "next-themes": "^0.4.6", "postcss-selector-parser": "^7.1.0", @@ -7994,12 +7994,12 @@ "peer": true }, "node_modules/next": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.0.tgz", - "integrity": "sha512-N1lp9Hatw3a9XLt0307lGB4uTKsXDhyOKQo7uYMzX4i0nF/c27grcGXkLdb7VcT8QPYLBa8ouIyEoUQJ2OyeNQ==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz", + "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==", "license": "MIT", "dependencies": { - "@next/env": "15.5.0", + "@next/env": "15.5.2", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -8012,14 +8012,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.0", - "@next/swc-darwin-x64": "15.5.0", - "@next/swc-linux-arm64-gnu": "15.5.0", - "@next/swc-linux-arm64-musl": "15.5.0", - "@next/swc-linux-x64-gnu": "15.5.0", - "@next/swc-linux-x64-musl": "15.5.0", - "@next/swc-win32-arm64-msvc": "15.5.0", - "@next/swc-win32-x64-msvc": "15.5.0", + "@next/swc-darwin-arm64": "15.5.2", + "@next/swc-darwin-x64": "15.5.2", + "@next/swc-linux-arm64-gnu": "15.5.2", + "@next/swc-linux-arm64-musl": "15.5.2", + "@next/swc-linux-x64-gnu": "15.5.2", + "@next/swc-linux-x64-musl": "15.5.2", + "@next/swc-win32-arm64-msvc": "15.5.2", + "@next/swc-win32-x64-msvc": "15.5.2", "sharp": "^0.34.3" }, "peerDependencies": { @@ -12419,17 +12419,17 @@ } }, "node_modules/shiki": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.9.2.tgz", - "integrity": "sha512-t6NKl5e/zGTvw/IyftLcumolgOczhuroqwXngDeMqJ3h3EQiTY/7wmfgPlsmloD8oYfqkEDqxiaH37Pjm1zUhQ==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.12.1.tgz", + "integrity": "sha512-eMlxVaXyuNQAQCaMtDKQjKv0eVm+kA6fsZtv9UqKgspP+7lWCVi7SoN+cJq1dawvIDQY7TI3SixamztotM6R6Q==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.9.2", - "@shikijs/engine-javascript": "3.9.2", - "@shikijs/engine-oniguruma": "3.9.2", - "@shikijs/langs": "3.9.2", - "@shikijs/themes": "3.9.2", - "@shikijs/types": "3.9.2", + "@shikijs/core": "3.12.1", + "@shikijs/engine-javascript": "3.12.1", + "@shikijs/engine-oniguruma": "3.12.1", + "@shikijs/langs": "3.12.1", + "@shikijs/themes": "3.12.1", + "@shikijs/types": "3.12.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } diff --git a/package.json b/package.json index 2825c6d..1258975 100644 --- a/package.json +++ b/package.json @@ -17,20 +17,20 @@ "@types/mdx": "^2.0.13", "fumadocs-core": "^15.6.9", "fumadocs-mdx": "^11.8.0", - "fumadocs-ui": "^15.6.12", + "fumadocs-ui": "^15.7.7", "lucide-react": "^0.525.0", "mdx": "^0.3.1", - "next": "^15.5.0", + "next": "^15.5.2", "node-fetch": "^3.3.2", "react": "^19.1.1", "react-dom": "^19.1.1", "schema-dts": "^1.1.5" }, "devDependencies": { - "@semantic-release/github": "^11.0.4", + "@semantic-release/github": "^11.0.5", "@tailwindcss/postcss": "^4.1.12", "@types/node": "24.3.0", - "@types/react": "^19.1.11", + "@types/react": "^19.1.12", "@types/react-dom": "^19.1.8", "autoprefixer": "^10.4.21", "markdownlint-cli": "^0.45.0",