diff --git a/package.json b/package.json index c315d09a..5a2a91b9 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "task-genius", - "version": "9.8.0-beta.0", + "version": "9.7.6", "description": "Comprehensive task management plugin for Obsidian with progress bars, task status cycling, and advanced task tracking features.", "main": "main.js", "scripts": { "dev": "node esbuild.config.mjs", "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "version": "node version-bump.mjs && git add manifest.json versions.json", + "version": "node version-bump.mjs && git add manifest.json manifest-beta.json versions.json", "e-t": "cross-env node scripts/extract-translations.cjs", "g-l": "cross-env node scripts/generate-locale-files.cjs", "test": "jest", @@ -17,11 +17,12 @@ "release:minor": "release-it minor", "release:major": "release-it major", "release:dry": "release-it --dry-run", - "release:beta": "release-it --config .release-it.beta.cjs --preRelease=beta", - "release:beta:patch": "release-it patch --config .release-it.beta.cjs --preRelease=beta", - "release:beta:minor": "release-it minor --config .release-it.beta.cjs --preRelease=beta", - "release:beta:major": "release-it major --config .release-it.beta.cjs --preRelease=beta", - "release:beta:dry": "release-it --config .release-it.beta.cjs --preRelease=beta --dry-run" + "release:beta": "node scripts/smart-beta-release.mjs", + "release:beta:continue": "node scripts/smart-beta-release.mjs continue", + "release:beta:patch": "node scripts/smart-beta-release.mjs patch", + "release:beta:minor": "node scripts/smart-beta-release.mjs minor", + "release:beta:major": "node scripts/smart-beta-release.mjs major", + "release:beta:dry": "node scripts/smart-beta-release.mjs --dry-run" }, "keywords": [ "obsidian", diff --git a/scripts/smart-beta-release.mjs b/scripts/smart-beta-release.mjs new file mode 100644 index 00000000..19206dbf --- /dev/null +++ b/scripts/smart-beta-release.mjs @@ -0,0 +1,55 @@ +#!/usr/bin/env node + +import { execSync } from 'child_process'; +import { readFileSync } from 'fs'; +import semver from 'semver'; + +// Get the current version from package.json +const packageJson = JSON.parse(readFileSync('package.json', 'utf8')); +const currentVersion = packageJson.version; + +// Parse command line arguments +const args = process.argv.slice(2); +const increment = args[0]; // 'patch', 'minor', 'major', or undefined + +// Check if we're already on a beta version +const isCurrentlyBeta = semver.prerelease(currentVersion) !== null; + +let releaseCommand = 'npx release-it --config .release-it.beta.cjs'; + +if (isCurrentlyBeta && (!increment || increment === 'continue')) { + // If already on beta and no increment specified, just bump the prerelease + console.log(`šŸ“¦ Current version: ${currentVersion} (beta)`); + console.log('šŸ”„ Continuing beta sequence...'); + releaseCommand += ' --preRelease'; +} else if (increment === 'patch' || increment === 'minor' || increment === 'major') { + // If increment is specified, create new beta.0 for that version + console.log(`šŸ“¦ Current version: ${currentVersion}`); + console.log(`šŸš€ Creating new ${increment} beta version...`); + releaseCommand += ` ${increment} --preRelease=beta`; +} else if (!isCurrentlyBeta) { + // If not on beta and no increment, default to patch + console.log(`šŸ“¦ Current version: ${currentVersion} (stable)`); + console.log('šŸš€ Creating new patch beta version...'); + releaseCommand += ' patch --preRelease=beta'; +} else { + // Default to continuing prerelease + console.log(`šŸ“¦ Current version: ${currentVersion} (beta)`); + console.log('šŸ”„ Continuing beta sequence...'); + releaseCommand += ' --preRelease'; +} + +// Add any additional arguments +const additionalArgs = args.slice(1).join(' '); +if (additionalArgs) { + releaseCommand += ' ' + additionalArgs; +} + +console.log(`\nšŸ“ Executing: ${releaseCommand}\n`); + +try { + execSync(releaseCommand, { stdio: 'inherit' }); +} catch (error) { + console.error('āŒ Release failed:', error.message); + process.exit(1); +} \ No newline at end of file diff --git a/version-bump.mjs b/version-bump.mjs index d409fa0e..e7a6b189 100644 --- a/version-bump.mjs +++ b/version-bump.mjs @@ -1,14 +1,34 @@ -import { readFileSync, writeFileSync } from "fs"; +import { readFileSync, writeFileSync, existsSync } from "fs"; +import semverPrerelease from "semver/functions/prerelease.js"; const targetVersion = process.env.npm_package_version; -// read minAppVersion from manifest.json and bump version to target version -let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); +// Check if this is a prerelease (beta) version +const isPreRelease = semverPrerelease(targetVersion) !== null; + +// Determine which manifest file to read and update +const manifestFile = isPreRelease ? "manifest-beta.json" : "manifest.json"; + +// For beta releases, read from manifest-beta.json if it exists, otherwise from manifest.json +let sourceManifestFile = manifestFile; +if (isPreRelease && !existsSync("manifest-beta.json")) { + sourceManifestFile = "manifest.json"; +} + +// read minAppVersion from the appropriate manifest and bump version +let manifest = JSON.parse(readFileSync(sourceManifestFile, "utf8")); const { minAppVersion } = manifest; manifest.version = targetVersion; -writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); -// update versions.json with target version and minAppVersion from manifest.json +// Only update the appropriate manifest file +// For beta releases: only update manifest-beta.json +// For stable releases: update manifest.json (and sync to manifest-beta.json is handled by ob-bumper) +writeFileSync(manifestFile, JSON.stringify(manifest, null, "\t")); + +// Always update versions.json with target version and minAppVersion let versions = JSON.parse(readFileSync("versions.json", "utf8")); versions[targetVersion] = minAppVersion; writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); + +console.log(`Version bumped to ${targetVersion} (${isPreRelease ? 'beta' : 'stable'} release)`); +console.log(`Updated: ${manifestFile}, versions.json`);