From 24c6f379e0546dc4a0d7eb0184bd3a779e82b8a5 Mon Sep 17 00:00:00 2001 From: HighImKevin Date: Thu, 5 Feb 2026 19:21:27 -0500 Subject: [PATCH] Update kefinTweaks-plugin to support loading from Experimental branch --- kefinTweaks-plugin.js | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/kefinTweaks-plugin.js b/kefinTweaks-plugin.js index 6b77f64..23efc59 100644 --- a/kefinTweaks-plugin.js +++ b/kefinTweaks-plugin.js @@ -222,8 +222,11 @@ window.KefinTweaksConfig = ${JSON.stringify(config, null, 2)};`; const LATEST_RELEASE_NAME = 'Latest'; const DEVELOPMENT_NAME = 'Development'; + const EXPERIMENTAL_NAME = 'Experimental'; const SELF_HOSTED_NAME = 'Self Hosted'; + let experimentalShaCache = null; + // Parse source URL to determine source type and version function parseKefinTweaksSource(url) { if (!url || url === '') { @@ -241,11 +244,18 @@ window.KefinTweaksConfig = ${JSON.stringify(config, null, 2)};`; return { sourceType: 'github', version: LATEST_RELEASE_NAME }; } else if (version === 'main' || version === 'master') { return { sourceType: 'github', version: DEVELOPMENT_NAME }; + } else if (version === 'experimental') { + return { sourceType: 'github', version: EXPERIMENTAL_NAME }; + } else if (version && version.length === 40 && /^[0-9a-f]+$/.test(version)) { + // Commit hash URL (e.g. from a previous Experimental selection) + return { sourceType: 'github', version: EXPERIMENTAL_NAME }; } else { return { sourceType: 'github', version: version.replace(/^v/, '') }; } } + const GITHUB_API_COMMITS = `https://api.github.com/repos/${GITHUB_REPO}/commits`; + // Fetch available versions from GitHub async function fetchVersions() { if (versionsCache) { @@ -253,21 +263,33 @@ window.KefinTweaksConfig = ${JSON.stringify(config, null, 2)};`; } try { - const response = await fetch(GITHUB_API_RELEASES); - if (!response.ok) { + const [releasesResponse, experimentalResponse] = await Promise.all([ + fetch(GITHUB_API_RELEASES), + fetch(`${GITHUB_API_COMMITS}?sha=experimental&per_page=1`) + ]); + + if (!releasesResponse.ok) { throw new Error('Failed to fetch releases'); } - const releases = await response.json(); + const releases = await releasesResponse.json(); const versions = releases .map(release => release.tag_name.replace(/^v/, '')) .filter(tag => tag.match(/^\d+\.\d+\.\d+/)); // Only semantic versions - versionsCache = [LATEST_RELEASE_NAME, DEVELOPMENT_NAME, ...versions]; + if (experimentalResponse.ok) { + const experimentalCommits = await experimentalResponse.json(); + if (Array.isArray(experimentalCommits) && experimentalCommits.length > 0 && experimentalCommits[0].sha) { + experimentalShaCache = experimentalCommits[0].sha; + } + } + + versionsCache = [LATEST_RELEASE_NAME, DEVELOPMENT_NAME, EXPERIMENTAL_NAME, ...versions]; return versionsCache; } catch (error) { console.warn('[KefinTweaks Installer] Error fetching versions:', error); - return [LATEST_RELEASE_NAME, DEVELOPMENT_NAME]; + experimentalShaCache = null; + return [LATEST_RELEASE_NAME, DEVELOPMENT_NAME, EXPERIMENTAL_NAME]; } } @@ -282,6 +304,8 @@ window.KefinTweaksConfig = ${JSON.stringify(config, null, 2)};`; let versionTag = 'latest'; if (source === DEVELOPMENT_NAME) { versionTag = 'main'; + } else if (source === EXPERIMENTAL_NAME) { + versionTag = experimentalShaCache || 'experimental'; } else if (source !== LATEST_RELEASE_NAME) { versionTag = source.startsWith('v') ? source : 'v' + source; }