Release ForgeFlow 0.8.1

Add advanced Git and deployment workflows, secure backups and auditing, live Gitea integration, desktop notifications, connection validation, and the premium responsive UX refresh.
This commit is contained in:
NuklearRabbit
2026-07-26 00:42:17 +02:00
parent 971896a1d5
commit 4ad698c4eb
47 changed files with 9114 additions and 1648 deletions
+22 -1
View File
@@ -34,6 +34,10 @@ contextBridge.exposeInMainWorld('forgeflow', Object.freeze({
setWorkspaceRoots: (roots) => invoke('settings:set-roots', { roots }),
setAppearance: (appearance) => invoke('settings:set-appearance', { appearance }),
setPreferences: (preferences) => invoke('settings:set-preferences', { preferences }),
exportConfigurationBackup: (passphrase) => invoke('settings:export-backup', { passphrase }),
importConfigurationBackup: (passphrase) => invoke('settings:import-backup', { passphrase }),
listAuditEvents: (limit = 250) => invoke('audit:list', { limit }),
exportAuditLog: (format = 'json') => invoke('audit:export', { format }),
setUpdatePreferences: (updates) => invoke('updates:preferences', { updates }),
checkForUpdates: () => invoke('updates:check'),
downloadUpdate: () => invoke('updates:download'),
@@ -42,6 +46,7 @@ contextBridge.exposeInMainWorld('forgeflow', Object.freeze({
deleteServer: (serverId) => invoke('server:delete', { serverId }),
testServer: (serverId) => invoke('server:test', { serverId }),
inspectServerProject: (repository, profileId) => invoke('server:inspect-project', { repository, profileId }),
discoverExistingDeployment: (repository, serverId, remoteFolder) => invoke('server:discover-existing', { repository, serverId, remoteFolder }),
refreshRepositories: () => invoke('repositories:refresh'),
discoverRepositories: (roots) => invoke('repositories:discover', { roots }),
favoriteRepository: (fullName, favorite) => invoke('repository:favorite', { fullName, favorite }),
@@ -49,14 +54,25 @@ contextBridge.exposeInMainWorld('forgeflow', Object.freeze({
unlinkRepository: (fullName) => invoke('repository:unlink', { fullName }),
repositoryStatus: (localPath) => invoke('repository:status', { localPath }),
repositoryDiff: (localPath, filePath, staged = false) => invoke('repository:diff', { localPath, filePath, staged }),
repositoryDiffHunks: (localPath, filePath) => invoke('repository:diff-hunks', { localPath, filePath }),
stageHunks: (localPath, filePath, hunkIndexes) => invoke('repository:stage-hunks', { localPath, filePath, hunkIndexes }),
conflictState: (localPath) => invoke('repository:conflicts', { localPath }),
resolveConflict: (localPath, filePath, resolution) => invoke('repository:resolve-conflict', { localPath, filePath, resolution }),
continueGitOperation: (localPath) => invoke('repository:continue-operation', { localPath }),
abortGitOperation: (localPath) => invoke('repository:abort-operation', { localPath }),
stageFiles: (localPath, files) => invoke('repository:stage', { localPath, files }),
unstageFiles: (localPath, files) => invoke('repository:unstage', { localPath, files }),
commit: (localPath, message, files) => invoke('repository:commit', { localPath, message, files }),
commitStaged: (localPath, message) => invoke('repository:commit-staged', { localPath, message }),
commitStagedAndPush: (localPath, message) => invoke('repository:commit-staged-push', { localPath, message }),
commitAndPush: (localPath, message, files) => invoke('repository:commit-push', { localPath, message, files }),
push: (localPath) => invoke('repository:push', { localPath }),
fetch: (localPath) => invoke('repository:fetch', { localPath }),
pull: (localPath) => invoke('repository:pull', { localPath }),
history: (localPath, limit = 20) => invoke('repository:history', { localPath, limit }),
branchProtection: (fullName, branch) => invoke('repository:branch-protection', { fullName, branch }),
pullRequests: (fullName, state = 'open') => invoke('repository:pull-requests', { fullName, state }),
createPullRequest: (fullName, title, body, base) => invoke('repository:create-pull-request', { fullName, title, body, base }),
branches: (localPath) => invoke('repository:branches', { localPath }),
checkoutBranch: (localPath, branch) => invoke('repository:checkout-branch', { localPath, branch }),
createBranch: (localPath, branch) => invoke('repository:create-branch', { localPath, branch }),
@@ -73,11 +89,13 @@ contextBridge.exposeInMainWorld('forgeflow', Object.freeze({
normalizeOrigins: () => invoke('repositories:normalize-origins'),
cloneRepository: (fullName, mode = 'default') => invoke('repository:clone', { fullName, mode }),
openPath: (localPath) => invoke('repository:open-path', { localPath }),
openEditor: (localPath, filePath = '', line = 1) => invoke('repository:open-editor', { localPath, filePath, line }),
openTerminal: (localPath) => invoke('repository:open-terminal', { localPath }),
openExternal: (url) => invoke('external:open', { url }),
saveDeploymentProfile: (fullName, profile) => invoke('deployment:save-profile', { fullName, profile }),
deploymentPreflight: (repository, profileId) => invoke('deployment:preflight', { repository, profileId }),
deleteDeploymentProfile: (fullName, profileId) => invoke('deployment:delete-profile', { fullName, profileId }),
deploy: (repository, profileId, sha) => invoke('deployment:dispatch', { repository, profileId, sha }),
deploy: (repository, profileId, sha, options = {}) => invoke('deployment:dispatch', { repository, profileId, sha, note: options.note || '', override: options.override === true, overrideReason: options.overrideReason || '' }),
rollback: (repository, profileId, targetSha) => invoke('deployment:rollback', { repository, profileId, targetSha }),
healthcheck: (url) => invoke('deployment:health', { url }),
refreshProfileState: (fullName, profileId) => invoke('deployment:profile-state', { fullName, profileId }),
@@ -85,6 +103,9 @@ contextBridge.exposeInMainWorld('forgeflow', Object.freeze({
reconcileDeployment: (fullName, profileId) => invoke('deployment:reconcile', { fullName, profileId }),
refreshOperations: (operationId = null) => invoke('operations:refresh', { operationId }),
getOperation: (operationId) => invoke('operations:get', { operationId }),
troubleshooterScan: (fullName = null) => invoke('troubleshooter:scan', { fullName }),
troubleshooterRepair: (issue) => invoke('troubleshooter:repair', { issue }),
troubleshooterAutoRepair: (issues) => invoke('troubleshooter:auto-repair', { issues }),
diagnosticsStatus: () => invoke('diagnostics:status'),
clearDiagnostics: () => invoke('diagnostics:clear'),
openDiagnosticsFolder: () => invoke('diagnostics:open-folder'),