auto-git:
[add] scripts/ [add] src-tauri/ [add] tauriBridge.js [change] .gitignore [change] README.md [change] index.html [change] package.json [change] renderer.js [change] settings.html [unlink] editor-reword.js [unlink] main.js [unlink] preload.js [unlink] rebase-sequence-windows.js
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,5 +1,8 @@
|
|||||||
node_modules
|
node_modules
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
dist-tauri
|
||||||
|
src-tauri/target
|
||||||
|
src-tauri/gen
|
||||||
dist.DS_Store
|
dist.DS_Store
|
||||||
.git
|
.git
|
||||||
.gitignore
|
.gitignore
|
||||||
@@ -7,6 +10,7 @@ dist.DS_Store
|
|||||||
*.iml
|
*.iml
|
||||||
yarn.lock
|
yarn.lock
|
||||||
*.lock
|
*.lock
|
||||||
|
!src-tauri/Cargo.lock
|
||||||
Makefile
|
Makefile
|
||||||
*.exe
|
*.exe
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
|
|||||||
31
README.md
31
README.md
@@ -99,38 +99,23 @@ Download the latest release for your platform:
|
|||||||
If you want to build Auto-Git yourself, follow these steps:
|
If you want to build Auto-Git yourself, follow these steps:
|
||||||
|
|
||||||
1. Clone or download the repository to your local machine.
|
1. Clone or download the repository to your local machine.
|
||||||
2. Install Node.js (version 16+ recommended) and npm.
|
2. Install Node.js, npm, Rust, and the Tauri prerequisites for your operating system.
|
||||||
3. Open a terminal, navigate into the project folder, and run:
|
3. Open a terminal, navigate into the project folder, and run:
|
||||||
```bash
|
```bash
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
4. Optional: If you need to adjust architectures or targets, modify `package.json` under the `"build"` section.
|
4. Run the app in development mode:
|
||||||
- Example for Windows x64 only:
|
```bash
|
||||||
```json
|
npm start
|
||||||
"build": {
|
```
|
||||||
"win": {
|
5. Build the Tauri distributables:
|
||||||
"icon": "win/icon.ico",
|
|
||||||
"target": [
|
|
||||||
{
|
|
||||||
"target": "nsis",
|
|
||||||
"arch": ["x64"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
5. Build the distributables:
|
|
||||||
```bash
|
```bash
|
||||||
npm run dist
|
npm run dist
|
||||||
```
|
```
|
||||||
- On an ARM64 machine, to produce an x64 Windows installer, first ensure `"arch": ["x64"]` is under `"win.target"`, then:
|
6. The output installers/packages will be located under `src-tauri/target/release/bundle/`.
|
||||||
```bash
|
|
||||||
npm run dist
|
|
||||||
```
|
|
||||||
6. The output installers/packages will be located in the `dist/` directory.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the MIT License. See [LICENSE](LICENSE) for details.
|
This project is licensed under the MIT License. See [LICENSE](LICENSE) for details.
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
// editor-reword.js
|
|
||||||
const fs = require('fs');
|
|
||||||
const map = JSON.parse(process.env.REBASE_COMMIT_MAP);
|
|
||||||
const msgFile = process.argv[2];
|
|
||||||
const origMsg = fs.readFileSync(msgFile, 'utf-8');
|
|
||||||
|
|
||||||
// Hash suchen
|
|
||||||
const hashMatch = origMsg.match(/commit\\s+([a-f0-9]{7,40})/i);
|
|
||||||
const hash = hashMatch ? hashMatch[1] : null;
|
|
||||||
if (hash && map[hash]) {
|
|
||||||
fs.writeFileSync(msgFile, map[hash] + '\n');
|
|
||||||
}
|
|
||||||
process.exit(0);
|
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<title>auto-git</title>
|
<title>auto-git</title>
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<script src="tauriBridge.js"></script>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
/* Default-Modus: Weißes Panel mit Rosa-Akzenten */
|
/* Default-Modus: Weißes Panel mit Rosa-Akzenten */
|
||||||
|
|||||||
53
package.json
53
package.json
@@ -4,52 +4,15 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Auto-Git: Git-Überwachung mit automatischer LLM-Commit-Message und README-Erstellung",
|
"description": "Auto-Git: Git-Überwachung mit automatischer LLM-Commit-Message und README-Erstellung",
|
||||||
"author": "Victor Giers",
|
"author": "Victor Giers",
|
||||||
"main": "main.js",
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "electron .",
|
"prepare:tauri-frontend": "node scripts/prepare-tauri-frontend.mjs",
|
||||||
"dist": "electron-builder --publish never"
|
"start": "npm run prepare:tauri-frontend && tauri dev",
|
||||||
},
|
"tauri:dev": "npm run prepare:tauri-frontend && tauri dev",
|
||||||
"dependencies": {
|
"dist": "npm run prepare:tauri-frontend && tauri build"
|
||||||
"chokidar": "^4.0.3",
|
|
||||||
"electron-store": "^8.2.0",
|
|
||||||
"ignore": "^7.0.4",
|
|
||||||
"micromatch": "^4.0.8",
|
|
||||||
"node-fetch": "^3.3.2",
|
|
||||||
"simple-git": "^3.20.0",
|
|
||||||
"suncalc": "^1.9.0"
|
|
||||||
},
|
},
|
||||||
|
"dependencies": {},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^10.4.21",
|
"@tauri-apps/api": "^2.11.0",
|
||||||
"electron": "^25.0.0",
|
"@tauri-apps/cli": "^2.11.0"
|
||||||
"electron-builder": "^26.0.12",
|
|
||||||
"postcss": "^8.5.3",
|
|
||||||
"tailwindcss": "^4.1.7"
|
|
||||||
},
|
|
||||||
"build": {
|
|
||||||
"appId": "com.victorgiers.auto-git",
|
|
||||||
"productName": "Auto-Git",
|
|
||||||
"files": [
|
|
||||||
"main.js",
|
|
||||||
"preload.js",
|
|
||||||
"renderer.js",
|
|
||||||
"index.html",
|
|
||||||
"settings.html",
|
|
||||||
"animeCat.js",
|
|
||||||
"rewrite-commit-msg.js.template",
|
|
||||||
"assets/**/*",
|
|
||||||
"node_modules/**/*"
|
|
||||||
],
|
|
||||||
"directories": {
|
|
||||||
"buildResources": "assets/icon"
|
|
||||||
},
|
|
||||||
"mac": {
|
|
||||||
"icon": "mac/icon.icns"
|
|
||||||
},
|
|
||||||
"win": {
|
|
||||||
"icon": "win/icon.ico"
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"icon": "linux/icon.png"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
88
preload.js
88
preload.js
@@ -1,88 +0,0 @@
|
|||||||
const { contextBridge, ipcRenderer } = require('electron');
|
|
||||||
|
|
||||||
contextBridge.exposeInMainWorld('settingsAPI', {
|
|
||||||
getTheme: () => ipcRenderer.invoke('get-theme'),
|
|
||||||
setTheme: val => ipcRenderer.invoke('set-theme', val),
|
|
||||||
// Legacy helpers: keep compatibility with old sky mode calls
|
|
||||||
getSkyMode: () => ipcRenderer.invoke('get-theme').then(t => t === 'sky'),
|
|
||||||
setSkyMode: val => ipcRenderer.invoke('set-theme', val ? 'sky' : 'default'),
|
|
||||||
getSkipPrompt: () => ipcRenderer.invoke('get-skip-git-prompt'),
|
|
||||||
setSkipPrompt: val => ipcRenderer.invoke('set-skip-git-prompt', val),
|
|
||||||
getIntelligentCommitThreshold: () => ipcRenderer.invoke('get-intelligent-commit-threshold'),
|
|
||||||
setIntelligentCommitThreshold: value => ipcRenderer.invoke('set-intelligent-commit-threshold', value),
|
|
||||||
getMinutesCommitThreshold: () => ipcRenderer.invoke('get-minutes-commit-threshold'),
|
|
||||||
setMinutesCommitThreshold: value => ipcRenderer.invoke('set-minutes-commit-threshold', value),
|
|
||||||
getCommitModel: () => ipcRenderer.invoke('get-commit-model'),
|
|
||||||
setCommitModel: (model) => ipcRenderer.invoke('set-commit-model', model),
|
|
||||||
getReadmeModel: () => ipcRenderer.invoke('get-readme-model'),
|
|
||||||
setReadmeModel: (model) => ipcRenderer.invoke('set-readme-model', model),
|
|
||||||
close: () => ipcRenderer.send('close-settings'),
|
|
||||||
getAutostart: () => ipcRenderer.invoke('get-autostart'),
|
|
||||||
setAutostart: val => ipcRenderer.invoke('set-autostart', val),
|
|
||||||
getCloseToTray: () => ipcRenderer.invoke('get-close-to-tray'),
|
|
||||||
setCloseToTray: val => ipcRenderer.invoke('set-close-to-tray', val),
|
|
||||||
getGiteaToken: () => ipcRenderer.invoke('get-gitea-token'),
|
|
||||||
setGiteaToken: (token) => ipcRenderer.invoke('set-gitea-token', token),
|
|
||||||
});
|
|
||||||
|
|
||||||
contextBridge.exposeInMainWorld('electronAPI', {
|
|
||||||
getFolders: () => ipcRenderer.invoke('get-folders'),
|
|
||||||
addFolder: () => ipcRenderer.invoke('add-folder'),
|
|
||||||
removeFolder: folderObj=> ipcRenderer.invoke('remove-folder', folderObj),
|
|
||||||
getSelected: () => ipcRenderer.invoke('get-selected'),
|
|
||||||
setSelected: folderObj=> ipcRenderer.invoke('set-selected', folderObj),
|
|
||||||
getCommits: (folderObj, page, pageSize) => ipcRenderer.invoke('get-commits', folderObj, page, pageSize),
|
|
||||||
getAllCommitHashes: (folderObj) => ipcRenderer.invoke('get-all-commit-hashes', folderObj),
|
|
||||||
diffCommit: (folderObj, hash) => ipcRenderer.invoke('diff-commit', folderObj, hash),
|
|
||||||
revertCommit: (folderObj, hash) => ipcRenderer.invoke('revert-commit', folderObj, hash),
|
|
||||||
snapshotCommit: (folderObj, hash) => ipcRenderer.invoke('snapshot-commit', folderObj, hash),
|
|
||||||
checkoutCommit: (folderObj, hash) => ipcRenderer.invoke('checkout-commit', folderObj, hash),
|
|
||||||
getCommitCount: folderObj=> ipcRenderer.invoke('get-commit-count', folderObj),
|
|
||||||
hasDiffs: folderObj=> ipcRenderer.invoke('has-diffs', folderObj),
|
|
||||||
removeGitFolder:folderObj=> ipcRenderer.invoke('remove-git-folder', folderObj),
|
|
||||||
commitCurrentFolder: (folderObj, message) => ipcRenderer.invoke('commit-current-folder', folderObj, message),
|
|
||||||
showFolderContextMenu: folderPath => ipcRenderer.send('show-folder-context-menu', folderPath),
|
|
||||||
setMonitoring: (folderObj, monitoring) => ipcRenderer.invoke('set-monitoring', folderObj.path, monitoring),
|
|
||||||
getFolderTree: (folderPath) => ipcRenderer.invoke('get-folder-tree', folderPath),
|
|
||||||
showTreeContextMenu: (info) => ipcRenderer.send('show-tree-context-menu', info),
|
|
||||||
getSelectedSync: () => ipcRenderer.sendSync('get-selected-sync'),
|
|
||||||
getIntelligentCommitThreshold: () => ipcRenderer.invoke('get-intelligent-commit-threshold'),
|
|
||||||
setIntelligentCommitThreshold: value => ipcRenderer.invoke('set-minutes-commit-threshold', value),
|
|
||||||
getMinutesCommitThreshold: () => ipcRenderer.invoke('get-minutes-commit-threshold'),
|
|
||||||
setMinutesCommitThreshold: value => ipcRenderer.invoke('set-intelligent-commit-threshold', value),
|
|
||||||
ollamaList: () => ipcRenderer.invoke('ollama-list'),
|
|
||||||
ollamaPull: (model) => ipcRenderer.invoke('ollama-pull', model),
|
|
||||||
onTrayToggleMonitoring: (callback) => ipcRenderer.on('tray-toggle-monitoring', callback),
|
|
||||||
onTrayRemoveFolder: (callback) => ipcRenderer.on('tray-remove-folder', callback),
|
|
||||||
onTrayAddFolder: (callback) => ipcRenderer.on('tray-add-folder', callback),
|
|
||||||
onFoldersLocationUpdated: (callback) => ipcRenderer.on('folders-location-updated', (e, folderObj) => callback(folderObj)),
|
|
||||||
isGitRepo: (path) => ipcRenderer.invoke('is-git-repo', path),
|
|
||||||
relocateFolder: (oldPath, newPath) => ipcRenderer.invoke('relocate-folder', oldPath, newPath),
|
|
||||||
pickFolder: () => ipcRenderer.invoke('pick-folder'),
|
|
||||||
repoHasCommit: (repoPath, commitHash) => ipcRenderer.invoke('repo-has-commit', repoPath, commitHash),
|
|
||||||
addFolderByPath: (folderPath) => ipcRenderer.invoke('add-folder-by-path', folderPath),
|
|
||||||
onCatBegin: (cb) => ipcRenderer.on('cat-begin', cb),
|
|
||||||
onCatChunk: (cb) => ipcRenderer.on('cat-chunk', cb),
|
|
||||||
onCatEnd: (cb) => ipcRenderer.on('cat-end', cb),
|
|
||||||
getDailyCommitStats: () => ipcRenderer.invoke('get-daily-commit-stats'),
|
|
||||||
hasReadme: (folderPath) => ipcRenderer.invoke('has-readme', folderPath),
|
|
||||||
generateReadme: (folderPath) => ipcRenderer.invoke('generate-readme', folderPath),
|
|
||||||
squashCommits: (folderPath) => ipcRenderer.invoke('squash-commits', folderPath),
|
|
||||||
pushToGitea: (folderPath) => ipcRenderer.invoke('push-to-gitea', folderPath),
|
|
||||||
initRepo: (folderPath) => ipcRenderer.invoke('init-repo', folderPath),
|
|
||||||
triggerRewriteNow: (folderPath) => ipcRenderer.invoke('trigger-rewrite-now', folderPath),
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcRenderer.on('repo-updated', (_e, folder) => {
|
|
||||||
window.dispatchEvent(new CustomEvent('repo-updated', { detail: folder }));
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcRenderer.on('theme-changed', (_e, theme) => {
|
|
||||||
window.dispatchEvent(new CustomEvent('theme-changed', { detail: theme }));
|
|
||||||
window.dispatchEvent(new CustomEvent('skymode-changed', { detail: theme === 'sky' }));
|
|
||||||
});
|
|
||||||
ipcRenderer.on('skymode-changed', (_e, val) => {
|
|
||||||
const theme = val ? 'sky' : 'default';
|
|
||||||
window.dispatchEvent(new CustomEvent('theme-changed', { detail: theme }));
|
|
||||||
window.dispatchEvent(new CustomEvent('skymode-changed', { detail: val }));
|
|
||||||
});
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
// ─────────────────────────────────────────────────
|
|
||||||
// rebase-sequence-windows.js
|
|
||||||
// Dieses Skript wird von Git (als GIT_SEQUENCE_EDITOR) aufgerufen.
|
|
||||||
// Git übergibt die "todo"-Datei als erstes Argument (process.argv[2]).
|
|
||||||
// Wir ersetzen dort "pick ..." in der ersten Zeile durch "reword ...".
|
|
||||||
// ─────────────────────────────────────────────────
|
|
||||||
|
|
||||||
const fs = require('fs');
|
|
||||||
|
|
||||||
// Git ruft den Editor so auf:
|
|
||||||
// node rebase-sequence-windows.js <pfad-zur-todo-Datei>
|
|
||||||
// In process.argv ist:
|
|
||||||
// [0] = Pfad zur Node‐Executable
|
|
||||||
// [1] = Pfad zu diesem Skript
|
|
||||||
// [2] = Pfad zur temporären Todo-Datei
|
|
||||||
const todoFile = process.argv[2];
|
|
||||||
if (!todoFile) {
|
|
||||||
console.error('Usage: rebase-sequence-windows.js <todoFile>');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const content = fs.readFileSync(todoFile, 'utf8').split(/\r?\n/);
|
|
||||||
if (content.length > 0 && content[0].startsWith('pick ')) {
|
|
||||||
content[0] = content[0].replace(/^pick /, 'reword ');
|
|
||||||
}
|
|
||||||
fs.writeFileSync(todoFile, content.join('\n'), 'utf8');
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Fehler beim Bearbeiten der Rebase-TODO-Datei:', err);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
process.exit(0);
|
|
||||||
12
renderer.js
12
renderer.js
@@ -148,6 +148,17 @@ window.addEventListener('DOMContentLoaded', async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
window.addEventListener('tauri-folder-drop', async e => {
|
||||||
|
const paths = Array.isArray(e.detail) ? e.detail : [];
|
||||||
|
for (const folderPath of paths) {
|
||||||
|
await window.electronAPI.addFolderByPath(folderPath);
|
||||||
|
}
|
||||||
|
if (paths.length) {
|
||||||
|
await renderSidebar();
|
||||||
|
const sel = await window.electronAPI.getSelected();
|
||||||
|
if (sel) await renderContent(sel);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Theme Setup (Sky = dynamic, Default/Grey = static)
|
// Theme Setup (Sky = dynamic, Default/Grey = static)
|
||||||
const DAY_COLOR = [173, 216, 230];
|
const DAY_COLOR = [173, 216, 230];
|
||||||
@@ -530,6 +541,7 @@ window.addEventListener('DOMContentLoaded', async () => {
|
|||||||
|
|
||||||
async function renderContent(folderObj, page) {
|
async function renderContent(folderObj, page) {
|
||||||
closeDropdown();
|
closeDropdown();
|
||||||
|
window.currentSelectedFolderObj = folderObj;
|
||||||
const folder = folderObj.path;
|
const folder = folderObj.path;
|
||||||
await updateInteractionBar(folderObj);
|
await updateInteractionBar(folderObj);
|
||||||
titleEl.textContent = folder;
|
titleEl.textContent = folder;
|
||||||
|
|||||||
14
scripts/prepare-tauri-frontend.mjs
Normal file
14
scripts/prepare-tauri-frontend.mjs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { cp, mkdir, rm } from 'node:fs/promises';
|
||||||
|
import path from 'node:path';
|
||||||
|
|
||||||
|
const root = process.cwd();
|
||||||
|
const out = path.join(root, 'dist-tauri');
|
||||||
|
|
||||||
|
await rm(out, { recursive: true, force: true });
|
||||||
|
await mkdir(out, { recursive: true });
|
||||||
|
|
||||||
|
for (const file of ['index.html', 'settings.html', 'renderer.js', 'animeCat.js', 'tauriBridge.js']) {
|
||||||
|
await cp(path.join(root, file), path.join(out, file));
|
||||||
|
}
|
||||||
|
|
||||||
|
await cp(path.join(root, 'assets'), path.join(out, 'assets'), { recursive: true });
|
||||||
@@ -161,6 +161,7 @@
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<script src="tauriBridge.js"></script>
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener('DOMContentLoaded', async () => {
|
window.addEventListener('DOMContentLoaded', async () => {
|
||||||
const applyThemeClass = (theme) => {
|
const applyThemeClass = (theme) => {
|
||||||
|
|||||||
6016
src-tauri/Cargo.lock
generated
Normal file
6016
src-tauri/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
31
src-tauri/Cargo.toml
Normal file
31
src-tauri/Cargo.toml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
[package]
|
||||||
|
name = "auto-git"
|
||||||
|
version = "1.0.0"
|
||||||
|
description = "Auto-Git: Git monitoring with automatic LLM commit messages and README generation"
|
||||||
|
authors = ["Victor Giers"]
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
tauri-build = { version = "2.6.0", features = [] }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
arboard = "3.6.1"
|
||||||
|
base64 = "0.22.1"
|
||||||
|
dirs = "6.0.0"
|
||||||
|
globset = "0.4.18"
|
||||||
|
ignore = "0.4.25"
|
||||||
|
notify = "8.2.0"
|
||||||
|
open = "5.3.3"
|
||||||
|
rfd = "0.15.4"
|
||||||
|
serde = { version = "1.0.228", features = ["derive"] }
|
||||||
|
serde_json = "1.0.145"
|
||||||
|
tempfile = "3.23.0"
|
||||||
|
tauri = { version = "2.11.0", features = ["tray-icon", "image-png", "image-ico"] }
|
||||||
|
thiserror = "2.0.17"
|
||||||
|
reqwest = { version = "0.12.24", default-features = false, features = ["blocking", "json", "rustls-tls"] }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
|
auto-launch = "0.5.0"
|
||||||
|
|
||||||
|
[target.'cfg(not(target_os = "macos"))'.dependencies]
|
||||||
|
auto-launch = "0.5.0"
|
||||||
3
src-tauri/build.rs
Normal file
3
src-tauri/build.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
tauri_build::build()
|
||||||
|
}
|
||||||
13
src-tauri/capabilities/default.json
Normal file
13
src-tauri/capabilities/default.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../gen/schemas/desktop-schema.json",
|
||||||
|
"identifier": "default",
|
||||||
|
"description": "Default desktop capability for Auto-Git",
|
||||||
|
"windows": ["main", "settings"],
|
||||||
|
"permissions": [
|
||||||
|
"core:default",
|
||||||
|
"core:event:default",
|
||||||
|
"core:window:default",
|
||||||
|
"core:menu:default",
|
||||||
|
"core:tray:default"
|
||||||
|
]
|
||||||
|
}
|
||||||
3506
src-tauri/src/main.rs
Normal file
3506
src-tauri/src/main.rs
Normal file
File diff suppressed because it is too large
Load Diff
37
src-tauri/tauri.conf.json
Normal file
37
src-tauri/tauri.conf.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
|
"productName": "Auto-Git",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"identifier": "com.victorgiers.auto-git",
|
||||||
|
"build": {
|
||||||
|
"frontendDist": "../dist-tauri"
|
||||||
|
},
|
||||||
|
"app": {
|
||||||
|
"withGlobalTauri": true,
|
||||||
|
"windows": [
|
||||||
|
{
|
||||||
|
"label": "main",
|
||||||
|
"title": "Auto-Git",
|
||||||
|
"width": 900,
|
||||||
|
"height": 600,
|
||||||
|
"minWidth": 800,
|
||||||
|
"minHeight": 500
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"security": {
|
||||||
|
"csp": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bundle": {
|
||||||
|
"active": true,
|
||||||
|
"targets": "all",
|
||||||
|
"icon": [
|
||||||
|
"../assets/icon/linux/icon.png",
|
||||||
|
"../assets/icon/mac/icon.icns",
|
||||||
|
"../assets/icon/win/icon.ico"
|
||||||
|
],
|
||||||
|
"resources": [
|
||||||
|
"../assets/**/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
128
tauriBridge.js
Normal file
128
tauriBridge.js
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
(function () {
|
||||||
|
const tauri = window.__TAURI__;
|
||||||
|
if (!tauri || window.electronAPI || window.settingsAPI) return;
|
||||||
|
|
||||||
|
const invoke = (command, args = {}) => tauri.core.invoke(command, args);
|
||||||
|
const listen = (event, handler) => tauri.event.listen(event, handler);
|
||||||
|
|
||||||
|
let selectedCache = null;
|
||||||
|
const eventUnsubscribers = [];
|
||||||
|
|
||||||
|
function onTauriEvent(eventName, callback, legacyEventArg = true) {
|
||||||
|
const promise = listen(eventName, event => {
|
||||||
|
if (legacyEventArg) callback({}, event.payload);
|
||||||
|
else callback(event.payload);
|
||||||
|
});
|
||||||
|
eventUnsubscribers.push(promise);
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function refreshSelectedCache() {
|
||||||
|
selectedCache = await invoke('get_selected');
|
||||||
|
return selectedCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
listen('repo-updated', event => {
|
||||||
|
window.dispatchEvent(new CustomEvent('repo-updated', { detail: event.payload }));
|
||||||
|
});
|
||||||
|
|
||||||
|
listen('theme-changed', event => {
|
||||||
|
const theme = event.payload;
|
||||||
|
window.dispatchEvent(new CustomEvent('theme-changed', { detail: theme }));
|
||||||
|
window.dispatchEvent(new CustomEvent('skymode-changed', { detail: theme === 'sky' }));
|
||||||
|
});
|
||||||
|
|
||||||
|
listen('skymode-changed', event => {
|
||||||
|
const val = !!event.payload;
|
||||||
|
window.dispatchEvent(new CustomEvent('theme-changed', { detail: val ? 'sky' : 'default' }));
|
||||||
|
window.dispatchEvent(new CustomEvent('skymode-changed', { detail: val }));
|
||||||
|
});
|
||||||
|
|
||||||
|
listen('tauri://drag-drop', event => {
|
||||||
|
const paths = event.payload?.paths || [];
|
||||||
|
if (paths.length) {
|
||||||
|
window.dispatchEvent(new CustomEvent('tauri-folder-drop', { detail: paths }));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.settingsAPI = {
|
||||||
|
getTheme: () => invoke('get_theme'),
|
||||||
|
setTheme: val => invoke('set_theme', { val }),
|
||||||
|
getSkyMode: () => invoke('get_theme').then(theme => theme === 'sky'),
|
||||||
|
setSkyMode: val => invoke('set_theme', { val: val ? 'sky' : 'default' }),
|
||||||
|
getSkipPrompt: () => invoke('get_skip_git_prompt'),
|
||||||
|
setSkipPrompt: val => invoke('set_skip_git_prompt', { val }),
|
||||||
|
getIntelligentCommitThreshold: () => invoke('get_intelligent_commit_threshold'),
|
||||||
|
setIntelligentCommitThreshold: value => invoke('set_intelligent_commit_threshold', { value }),
|
||||||
|
getMinutesCommitThreshold: () => invoke('get_minutes_commit_threshold'),
|
||||||
|
setMinutesCommitThreshold: value => invoke('set_minutes_commit_threshold', { value }),
|
||||||
|
getCommitModel: () => invoke('get_commit_model'),
|
||||||
|
setCommitModel: model => invoke('set_commit_model', { val: model }),
|
||||||
|
getReadmeModel: () => invoke('get_readme_model'),
|
||||||
|
setReadmeModel: model => invoke('set_readme_model', { val: model }),
|
||||||
|
close: () => invoke('close_settings'),
|
||||||
|
getAutostart: () => invoke('get_autostart'),
|
||||||
|
setAutostart: val => invoke('set_autostart', { enabled: val }),
|
||||||
|
getCloseToTray: () => invoke('get_close_to_tray'),
|
||||||
|
setCloseToTray: val => invoke('set_close_to_tray', { val }),
|
||||||
|
getGiteaToken: () => invoke('get_gitea_token'),
|
||||||
|
setGiteaToken: token => invoke('set_gitea_token', { token })
|
||||||
|
};
|
||||||
|
|
||||||
|
window.electronAPI = {
|
||||||
|
getFolders: () => invoke('get_folders'),
|
||||||
|
addFolder: () => invoke('add_folder'),
|
||||||
|
removeFolder: folderObj => invoke('remove_folder', { folderObj }),
|
||||||
|
getSelected: refreshSelectedCache,
|
||||||
|
setSelected: async folderObj => {
|
||||||
|
selectedCache = await invoke('set_selected', { folderObjOrPath: folderObj });
|
||||||
|
return selectedCache;
|
||||||
|
},
|
||||||
|
getCommits: (folderObj, page, pageSize) => invoke('get_commits', { folderObj, page, pageSize }),
|
||||||
|
getAllCommitHashes: folderObj => invoke('get_all_commit_hashes', { folderObj }),
|
||||||
|
diffCommit: (folderObj, hash) => invoke('diff_commit', { folderObj, hash }),
|
||||||
|
revertCommit: (folderObj, hash) => invoke('revert_commit', { folderObj, hash }),
|
||||||
|
snapshotCommit: (folderObj, hash) => invoke('snapshot_commit', { folderObj, hash }),
|
||||||
|
checkoutCommit: (folderObj, hash) => invoke('checkout_commit', { folderObj, hash }),
|
||||||
|
getCommitCount: folderObj => invoke('get_commit_count', { folderObj }),
|
||||||
|
hasDiffs: folderObj => invoke('has_diffs', { folderObj }),
|
||||||
|
removeGitFolder: folderObj => invoke('remove_git_folder', { folderObj }),
|
||||||
|
commitCurrentFolder: (folderObj, message) => invoke('commit_current_folder', { folderObj, message }),
|
||||||
|
showFolderContextMenu: folderPath => invoke('show_folder_context_menu', { folderPath }),
|
||||||
|
setMonitoring: (folderObj, monitoring) => invoke('set_monitoring', { folderPath: folderObj.path, monitoring }),
|
||||||
|
getFolderTree: folderPath => invoke('get_folder_tree', { folderPath }),
|
||||||
|
showTreeContextMenu: info => invoke('show_tree_context_menu', { info }),
|
||||||
|
getSelectedSync: () => selectedCache || window.currentSelectedFolderObj || null,
|
||||||
|
getIntelligentCommitThreshold: () => invoke('get_intelligent_commit_threshold'),
|
||||||
|
setIntelligentCommitThreshold: value => invoke('set_intelligent_commit_threshold', { value }),
|
||||||
|
getMinutesCommitThreshold: () => invoke('get_minutes_commit_threshold'),
|
||||||
|
setMinutesCommitThreshold: value => invoke('set_minutes_commit_threshold', { value }),
|
||||||
|
ollamaList: () => invoke('ollama_list'),
|
||||||
|
ollamaPull: model => invoke('ollama_pull', { model }),
|
||||||
|
onTrayToggleMonitoring: callback => onTauriEvent('tray-toggle-monitoring', callback),
|
||||||
|
onTrayRemoveFolder: callback => onTauriEvent('tray-remove-folder', callback),
|
||||||
|
onTrayAddFolder: callback => onTauriEvent('tray-add-folder', callback),
|
||||||
|
onFoldersLocationUpdated: callback => onTauriEvent('folders-location-updated', callback, false),
|
||||||
|
isGitRepo: path => invoke('is_git_repo', { folderPath: path }),
|
||||||
|
relocateFolder: (oldPath, newPath) => invoke('relocate_folder', { oldPath, newPath }),
|
||||||
|
pickFolder: () => invoke('pick_folder'),
|
||||||
|
repoHasCommit: (repoPath, commitHash) => invoke('repo_has_commit', { repoPath, commitHash }),
|
||||||
|
addFolderByPath: folderPath => invoke('add_folder_by_path', { folderPath }),
|
||||||
|
onCatBegin: callback => onTauriEvent('cat-begin', callback),
|
||||||
|
onCatChunk: callback => onTauriEvent('cat-chunk', callback),
|
||||||
|
onCatEnd: callback => onTauriEvent('cat-end', callback),
|
||||||
|
getDailyCommitStats: () => invoke('get_daily_commit_stats'),
|
||||||
|
hasReadme: folderPath => invoke('has_readme', { folderPath }),
|
||||||
|
generateReadme: folderPath => invoke('generate_readme', { folderPath }),
|
||||||
|
squashCommits: folderPath => invoke('squash_commits', { folderPath }),
|
||||||
|
pushToGitea: folderPath => invoke('push_to_gitea', { folderPath }),
|
||||||
|
initRepo: folderPath => invoke('init_repo', { folderPath }),
|
||||||
|
triggerRewriteNow: folderPath => invoke('trigger_rewrite_now', { folderPath })
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('beforeunload', () => {
|
||||||
|
for (const pending of eventUnsubscribers) {
|
||||||
|
pending.then(unlisten => unlisten()).catch(() => {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
||||||
Reference in New Issue
Block a user