refactor(cli): restructure cmd packages into subdirectories
- Move CLI commands into subdirectories matching command hierarchy: dev/, go/, php/, build/, ci/, sdk/, pkg/, vm/, docs/, setup/, doctor/, test/, ai/ - Create shared/ package for common styles and utilities - Add new `core ai` root command with claude subcommand - Update package declarations and imports across all files - Create commands.go entry points for each package - Remove GUI-related files (moved to core-gui repo) This makes the filesystem structure match the CLI command structure, improving context capture and code organization. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
@ -1,42 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: "./build/Taskfile.yml"
|
|
||||||
windows: "./build/windows/Taskfile.yml"
|
|
||||||
darwin: "./build/darwin/Taskfile.yml"
|
|
||||||
linux: "./build/linux/Taskfile.yml"
|
|
||||||
|
|
||||||
vars:
|
|
||||||
APP_NAME: "core-demo"
|
|
||||||
BIN_DIR: "./build/bin"
|
|
||||||
VITE_PORT: '{{.WAILS_VITE_PORT | default 9245}}'
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Builds the application
|
|
||||||
cmds:
|
|
||||||
- task: "{{OS}}:build"
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application
|
|
||||||
cmds:
|
|
||||||
- task: "{{OS}}:package"
|
|
||||||
|
|
||||||
run:
|
|
||||||
summary: Runs the application
|
|
||||||
cmds:
|
|
||||||
- task: "{{OS}}:run"
|
|
||||||
|
|
||||||
# This is the main dev task called by the Makefile.
|
|
||||||
# It delegates to the actual wails command below.
|
|
||||||
dev:
|
|
||||||
summary: Runs the application in development mode
|
|
||||||
cmds:
|
|
||||||
- task: dev:wails
|
|
||||||
|
|
||||||
# This task contains the real wails dev command.
|
|
||||||
# This avoids the recursive loop and provides a clear target.
|
|
||||||
dev:wails:
|
|
||||||
internal: true
|
|
||||||
cmds:
|
|
||||||
- wails3 dev -config ./build/config.yml -port {{.VITE_PORT}}
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
{
|
|
||||||
"code": "mining",
|
|
||||||
"type": "app",
|
|
||||||
"name": "Mining Module",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"namespace": "mining",
|
|
||||||
"description": "Cryptocurrency mining management",
|
|
||||||
"author": "Lethean",
|
|
||||||
"contexts": ["miner", "default"],
|
|
||||||
"menu": [
|
|
||||||
{
|
|
||||||
"id": "mining",
|
|
||||||
"label": "Mining",
|
|
||||||
"order": 200,
|
|
||||||
"contexts": ["miner"],
|
|
||||||
"children": [
|
|
||||||
{"id": "mining-dashboard", "label": "Dashboard", "route": "/mining/dashboard", "order": 1},
|
|
||||||
{"id": "mining-pools", "label": "Pools", "route": "/mining/pools", "order": 2},
|
|
||||||
{"id": "mining-sep1", "separator": true, "order": 3},
|
|
||||||
{"id": "mining-start", "label": "Start Mining", "action": "mining:start", "order": 4},
|
|
||||||
{"id": "mining-stop", "label": "Stop Mining", "action": "mining:stop", "order": 5}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"routes": [
|
|
||||||
{"path": "/mining/dashboard", "component": "mining-dashboard", "title": "Mining Dashboard", "contexts": ["miner"]},
|
|
||||||
{"path": "/mining/pools", "component": "mining-pools", "title": "Mining Pools", "contexts": ["miner"]}
|
|
||||||
],
|
|
||||||
"api": [
|
|
||||||
{"method": "GET", "path": "/status", "description": "Get mining status"},
|
|
||||||
{"method": "POST", "path": "/start", "description": "Start mining"},
|
|
||||||
{"method": "POST", "path": "/stop", "description": "Stop mining"},
|
|
||||||
{"method": "GET", "path": "/pools", "description": "List configured pools"}
|
|
||||||
],
|
|
||||||
"downloads": {
|
|
||||||
"x86_64": {
|
|
||||||
"darwin": {"url": "https://releases.example.com/mining/darwin-x86_64.tar.gz"},
|
|
||||||
"linux": {"url": "https://releases.example.com/mining/linux-x86_64.tar.gz"},
|
|
||||||
"windows": {"url": "https://releases.example.com/mining/windows-x86_64.zip"}
|
|
||||||
},
|
|
||||||
"aarch64": {
|
|
||||||
"darwin": {"url": "https://releases.example.com/mining/darwin-aarch64.tar.gz"}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"defaultPool": "",
|
|
||||||
"threads": 0,
|
|
||||||
"intensity": 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
go:mod:tidy:
|
|
||||||
summary: Runs `go mod tidy`
|
|
||||||
internal: true
|
|
||||||
cmds:
|
|
||||||
- go mod tidy
|
|
||||||
|
|
||||||
install:public:deps:
|
|
||||||
summary: Install public dependencies
|
|
||||||
dir: public
|
|
||||||
sources:
|
|
||||||
- package.json
|
|
||||||
- package-lock.json
|
|
||||||
generates:
|
|
||||||
- node_modules/*
|
|
||||||
preconditions:
|
|
||||||
- sh: npm version
|
|
||||||
msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
|
|
||||||
cmds:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
build:public:
|
|
||||||
label: build:public (PRODUCTION={{.PRODUCTION}})
|
|
||||||
summary: Build the public folder
|
|
||||||
dir: public
|
|
||||||
sources:
|
|
||||||
- "**/*"
|
|
||||||
generates:
|
|
||||||
- dist/**/*
|
|
||||||
deps:
|
|
||||||
- task: install:public:deps
|
|
||||||
- task: generate:bindings
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
cmds:
|
|
||||||
- npm run {{.BUILD_COMMAND}} -q
|
|
||||||
env:
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
vars:
|
|
||||||
BUILD_COMMAND: '{{if eq .PRODUCTION "true"}}build{{else}}build:dev{{end}}'
|
|
||||||
|
|
||||||
generate:bindings:
|
|
||||||
label: generate:bindings (BUILD_FLAGS={{.BUILD_FLAGS}})
|
|
||||||
summary: Generates bindings
|
|
||||||
deps:
|
|
||||||
- task: go:mod:tidy
|
|
||||||
sources:
|
|
||||||
- "**/*.[jt]s"
|
|
||||||
- exclude: public/**/*
|
|
||||||
- public/bindings/**/*
|
|
||||||
- "**/*.go"
|
|
||||||
- go.mod
|
|
||||||
- go.sum
|
|
||||||
generates:
|
|
||||||
- public/bindings/**/*
|
|
||||||
cmds:
|
|
||||||
- wails3 generate bindings -d public/bindings -f '{{.BUILD_FLAGS}}' -clean=true -ts
|
|
||||||
|
|
||||||
generate:icons:
|
|
||||||
summary: Generates Windows `.ico` and Mac `.icns` files from an image
|
|
||||||
dir: build
|
|
||||||
sources:
|
|
||||||
- "appicon.png"
|
|
||||||
generates:
|
|
||||||
- "darwin/icons.icns"
|
|
||||||
- "windows/icon.ico"
|
|
||||||
cmds:
|
|
||||||
- wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico
|
|
||||||
|
|
||||||
dev:public:
|
|
||||||
summary: Runs the frontend dev server for live development
|
|
||||||
dir: public
|
|
||||||
deps:
|
|
||||||
- task: install:public:deps
|
|
||||||
cmds:
|
|
||||||
- npm start -- --port {{.VITE_PORT | default "4200"}}
|
|
||||||
|
|
||||||
update:build-assets:
|
|
||||||
summary: Updates the build assets
|
|
||||||
cmds:
|
|
||||||
- wails3 update build-assets -name "{{.APP_NAME}}" -binaryname "{{.APP_NAME}}" -config config.yml -dir .
|
|
||||||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
|
@ -1,43 +0,0 @@
|
||||||
# This file contains the configuration for this project.
|
|
||||||
# When you update `info` or `fileAssociations`, run `wails3 task common:update:build-assets` to update the assets.
|
|
||||||
# Note that this will overwrite any changes you have made to the assets.
|
|
||||||
version: '3'
|
|
||||||
# This information is used to generate the build assets.
|
|
||||||
info:
|
|
||||||
companyName: "Snider"
|
|
||||||
productName: "Core.App"
|
|
||||||
productIdentifier: "com.core.app"
|
|
||||||
description: "A program that does demos the features"
|
|
||||||
copyright: "(c) EUPL-1.2, Snider"
|
|
||||||
comments: "Demo Dev Area"
|
|
||||||
version: "0.0.1"
|
|
||||||
|
|
||||||
# Dev mode configuration
|
|
||||||
dev_mode:
|
|
||||||
root_path: .
|
|
||||||
log_level: warn
|
|
||||||
debounce: 1000
|
|
||||||
ignore:
|
|
||||||
dir:
|
|
||||||
- .git
|
|
||||||
- node_modules
|
|
||||||
- public
|
|
||||||
- bin
|
|
||||||
file:
|
|
||||||
- .DS_Store
|
|
||||||
- .gitignore
|
|
||||||
- .gitkeep
|
|
||||||
watched_extension:
|
|
||||||
- "*.go"
|
|
||||||
git_ignore: true
|
|
||||||
executes:
|
|
||||||
- cmd: wails3 task common:install:public:deps
|
|
||||||
type: once
|
|
||||||
- cmd: wails3 task common:dev:public
|
|
||||||
type: background
|
|
||||||
- cmd: go mod tidy
|
|
||||||
type: blocking
|
|
||||||
- cmd: wails3 task build
|
|
||||||
type: blocking
|
|
||||||
- cmd: wails3 task run
|
|
||||||
type: primary
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>Lethean Desktop</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>desktop</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.lethean.desktop</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleGetInfoString</key>
|
|
||||||
<string>This is a comment</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string>icons</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>10.15.0</string>
|
|
||||||
<key>NSHighResolutionCapable</key>
|
|
||||||
<string>true</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>© EUPL-1.2 Lethean Community</string>
|
|
||||||
|
|
||||||
<!-- Expanded App Transport Security settings -->
|
|
||||||
<key>NSAppTransportSecurity</key>
|
|
||||||
<dict>
|
|
||||||
<key>NSAllowsLocalNetworking</key>
|
|
||||||
<true/>
|
|
||||||
<key>NSAllowsArbitraryLoads</key>
|
|
||||||
<true/>
|
|
||||||
<key>NSAllowsArbitraryLoadsInWebContent</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
|
|
||||||
<!-- File System Access Permissions -->
|
|
||||||
<key>NSDownloadsFolderUsageDescription</key>
|
|
||||||
<string>This app needs access to your Downloads folder to save and load files.</string>
|
|
||||||
<key>NSDocumentsFolderUsageDescription</key>
|
|
||||||
<string>This app needs access to your Documents folder to save and load files.</string>
|
|
||||||
<key>NSDesktopFolderUsageDescription</key>
|
|
||||||
<string>This app needs access to your Desktop folder to save and load files.</string>
|
|
||||||
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>Lethean Desktop</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>desktop</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.lethean.desktop</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleGetInfoString</key>
|
|
||||||
<string>This is a comment</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string>icons</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>10.15.0</string>
|
|
||||||
<key>NSHighResolutionCapable</key>
|
|
||||||
<string>true</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>© EUPL-1.2 Lethean Community</string>
|
|
||||||
<key>NSAppTransportSecurity</key>
|
|
||||||
<dict>
|
|
||||||
<key>NSAllowsLocalNetworking</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: ../Taskfile.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Creates a production build of the application
|
|
||||||
deps:
|
|
||||||
- task: common:go:mod:tidy
|
|
||||||
- task: common:build:public
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
PRODUCTION:
|
|
||||||
ref: .PRODUCTION
|
|
||||||
- task: common:generate:icons
|
|
||||||
cmds:
|
|
||||||
- go build {{.BUILD_FLAGS}} -o {{.OUTPUT}}
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}'
|
|
||||||
DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}'
|
|
||||||
OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}'
|
|
||||||
env:
|
|
||||||
GOOS: darwin
|
|
||||||
CGO_ENABLED: 1
|
|
||||||
GOARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
CGO_CFLAGS: "-mmacosx-version-min=26.0"
|
|
||||||
CGO_LDFLAGS: "-mmacosx-version-min=26.0"
|
|
||||||
MACOSX_DEPLOYMENT_TARGET: "26.0"
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
|
|
||||||
build:universal:
|
|
||||||
summary: Builds darwin universal binary (arm64 + amd64)
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
ARCH: amd64
|
|
||||||
OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64"
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
ARCH: arm64
|
|
||||||
OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
|
||||||
cmds:
|
|
||||||
- lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
|
||||||
- rm "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application into a `.app` bundle
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: create:app:bundle
|
|
||||||
|
|
||||||
package:universal:
|
|
||||||
summary: Packages darwin universal binary (arm64 + amd64)
|
|
||||||
deps:
|
|
||||||
- task: build:universal
|
|
||||||
cmds:
|
|
||||||
- task: create:app:bundle
|
|
||||||
|
|
||||||
|
|
||||||
create:app:bundle:
|
|
||||||
summary: Creates an `.app` bundle
|
|
||||||
cmds:
|
|
||||||
- mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources}
|
|
||||||
- cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources
|
|
||||||
- cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS
|
|
||||||
- cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents
|
|
||||||
- codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.app
|
|
||||||
|
|
||||||
run:
|
|
||||||
cmds:
|
|
||||||
- mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/{MacOS,Resources}
|
|
||||||
- cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources
|
|
||||||
- cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS
|
|
||||||
- cp build/darwin/Info.dev.plist {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Info.plist
|
|
||||||
- codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.dev.app
|
|
||||||
- '{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS/{{.APP_NAME}}'
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: "../Taskfile.yml"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Builds the application for Linux
|
|
||||||
deps:
|
|
||||||
- task: common:go:mod:tidy
|
|
||||||
- task: common:build:public
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
PRODUCTION:
|
|
||||||
ref: .PRODUCTION
|
|
||||||
- task: common:generate:icons
|
|
||||||
cmds:
|
|
||||||
- go build {{.BUILD_FLAGS}} -o bin/{{.APP_NAME}}
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}'
|
|
||||||
env:
|
|
||||||
GOOS: linux
|
|
||||||
CGO_ENABLED: 1
|
|
||||||
GOARCH: '{{.ARCH | default "amd64"}}'
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application for Linux
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: create:appimage
|
|
||||||
- task: create:deb
|
|
||||||
- task: create:rpm
|
|
||||||
|
|
||||||
create:appimage:
|
|
||||||
summary: Creates an AppImage
|
|
||||||
dir: "{{.APP_ROOT}}/build/linux/appimage"
|
|
||||||
deps:
|
|
||||||
- task: ":build"
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
- task: ":generate:dotdesktop"
|
|
||||||
cmds:
|
|
||||||
- cp "{{.APP_ROOT}}/bin/{{.APP_NAME}}" .
|
|
||||||
- cp "{{.APP_ROOT}}/build/appicon.png" "{{.APP_NAME}}.png"
|
|
||||||
- wails3 generate appimage -binary "{{.APP_NAME}}" -icon "{{.APP_NAME}}.png" -desktopfile "../{{.APP_NAME}}.desktop" -outputdir "{{.APP_ROOT}}/bin" -builddir build
|
|
||||||
|
|
||||||
create:deb:
|
|
||||||
summary: Creates a deb package
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: generate:dotdesktop
|
|
||||||
- wails3 tool package -name {{.APP_NAME}} -format deb -config build/linux/nfpm/nfpm.yaml -out bin
|
|
||||||
|
|
||||||
create:rpm:
|
|
||||||
summary: Creates a rpm package
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: generate:dotdesktop
|
|
||||||
- wails3 tool package -name {{.APP_NAME}} -format rpm -config build/linux/nfpm/nfpm.yaml -out bin
|
|
||||||
|
|
||||||
generate:dotdesktop:
|
|
||||||
summary: Generates a `.desktop` file
|
|
||||||
cmds:
|
|
||||||
- mkdir -p linux/appimage
|
|
||||||
- wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.APP_NAME}}" -icon "{{.APP_NAME}}" -outputfile "linux/{{.APP_NAME}}.desktop" -categories "Development;"
|
|
||||||
|
|
||||||
run:
|
|
||||||
dir: "{{.APP_ROOT}}"
|
|
||||||
cmds:
|
|
||||||
- "bin/{{.APP_NAME}}"
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
# Copyright (c) 2018-Present Lea Anthony
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
# Fail script on any error
|
|
||||||
set -euxo pipefail
|
|
||||||
|
|
||||||
# Define variables
|
|
||||||
APP_DIR="${APP_NAME}.AppDir"
|
|
||||||
|
|
||||||
# Create AppDir structure
|
|
||||||
mkdir -p "${APP_DIR}/usr/bin"
|
|
||||||
cp -r "${APP_BINARY}" "${APP_DIR}/usr/bin/"
|
|
||||||
cp "${ICON_PATH}" "${APP_DIR}/"
|
|
||||||
cp "${DESKTOP_FILE}" "${APP_DIR}/"
|
|
||||||
|
|
||||||
if [[ $(uname -m) == *x86_64* ]]; then
|
|
||||||
# Download linuxdeploy and make it executable
|
|
||||||
wget -q -4 -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
|
|
||||||
chmod +x linuxdeploy-x86_64.AppImage
|
|
||||||
|
|
||||||
# Run linuxdeploy to bundle the application
|
|
||||||
./linuxdeploy-x86_64.AppImage --appdir "${APP_DIR}" --output appimage
|
|
||||||
else
|
|
||||||
# Download linuxdeploy and make it executable (arm64)
|
|
||||||
wget -q -4 -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-aarch64.AppImage
|
|
||||||
chmod +x linuxdeploy-aarch64.AppImage
|
|
||||||
|
|
||||||
# Run linuxdeploy to bundle the application (arm64)
|
|
||||||
./linuxdeploy-aarch64.AppImage --appdir "${APP_DIR}" --output appimage
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Rename the generated AppImage
|
|
||||||
mv "${APP_NAME}*.AppImage" "${APP_NAME}.AppImage"
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
[Desktop Entry]
|
|
||||||
Version=1.0
|
|
||||||
Name=My Product
|
|
||||||
Comment=My Product Description
|
|
||||||
# The Exec line includes %u to pass the URL to the application
|
|
||||||
Exec=/usr/local/bin/desktop %u
|
|
||||||
Terminal=false
|
|
||||||
Type=Application
|
|
||||||
Icon=desktop
|
|
||||||
Categories=Utility;
|
|
||||||
StartupWMClass=desktop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
# Feel free to remove those if you don't want/need to use them.
|
|
||||||
# Make sure to check the documentation at https://nfpm.goreleaser.com
|
|
||||||
#
|
|
||||||
# The lines below are called `modelines`. See `:help modeline`
|
|
||||||
|
|
||||||
name: "desktop"
|
|
||||||
arch: ${GOARCH}
|
|
||||||
platform: "linux"
|
|
||||||
version: "0.1.0"
|
|
||||||
section: "default"
|
|
||||||
priority: "extra"
|
|
||||||
maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}>
|
|
||||||
description: "My Product Description"
|
|
||||||
vendor: "My Company"
|
|
||||||
homepage: "https://wails.io"
|
|
||||||
license: "MIT"
|
|
||||||
release: "1"
|
|
||||||
|
|
||||||
contents:
|
|
||||||
- src: "./bin/desktop"
|
|
||||||
dst: "/usr/local/bin/desktop"
|
|
||||||
- src: "./build/appicon.png"
|
|
||||||
dst: "/usr/share/icons/hicolor/128x128/apps/desktop.png"
|
|
||||||
- src: "./build/linux/desktop.desktop"
|
|
||||||
dst: "/usr/share/applications/desktop.desktop"
|
|
||||||
|
|
||||||
# Default dependencies for Debian 12/Ubuntu 22.04+ with WebKit 4.1
|
|
||||||
depends:
|
|
||||||
- libgtk-3-0
|
|
||||||
- libwebkit2gtk-4.1-0
|
|
||||||
|
|
||||||
# Distribution-specific overrides for different package formats and WebKit versions
|
|
||||||
overrides:
|
|
||||||
# RPM packages for RHEL/CentOS/AlmaLinux/Rocky Linux (WebKit 4.0)
|
|
||||||
rpm:
|
|
||||||
depends:
|
|
||||||
- gtk3
|
|
||||||
- webkit2gtk4.1
|
|
||||||
|
|
||||||
# Arch Linux packages (WebKit 4.1)
|
|
||||||
archlinux:
|
|
||||||
depends:
|
|
||||||
- gtk3
|
|
||||||
- webkit2gtk-4.1
|
|
||||||
|
|
||||||
# scripts section to ensure desktop database is updated after install
|
|
||||||
scripts:
|
|
||||||
postinstall: "./build/linux/nfpm/scripts/postinstall.sh"
|
|
||||||
# You can also add preremove, postremove if needed
|
|
||||||
# preremove: "./build/linux/nfpm/scripts/preremove.sh"
|
|
||||||
# postremove: "./build/linux/nfpm/scripts/postremove.sh"
|
|
||||||
|
|
||||||
# replaces:
|
|
||||||
# - foobar
|
|
||||||
# provides:
|
|
||||||
# - bar
|
|
||||||
# depends:
|
|
||||||
# - gtk3
|
|
||||||
# - libwebkit2gtk
|
|
||||||
# recommends:
|
|
||||||
# - whatever
|
|
||||||
# suggests:
|
|
||||||
# - something-else
|
|
||||||
# conflicts:
|
|
||||||
# - not-foo
|
|
||||||
# - not-bar
|
|
||||||
# changelog: "changelog.yaml"
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Update desktop database for .desktop file changes
|
|
||||||
# This makes the application appear in application menus and registers its capabilities.
|
|
||||||
if command -v update-desktop-database >/dev/null 2>&1; then
|
|
||||||
echo "Updating desktop database..."
|
|
||||||
update-desktop-database -q /usr/share/applications
|
|
||||||
else
|
|
||||||
echo "Warning: update-desktop-database command not found. Desktop file may not be immediately recognized." >&2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update MIME database for custom URL schemes (x-scheme-handler)
|
|
||||||
# This ensures the system knows how to handle your custom protocols.
|
|
||||||
if command -v update-mime-database >/dev/null 2>&1; then
|
|
||||||
echo "Updating MIME database..."
|
|
||||||
update-mime-database -n /usr/share/mime
|
|
||||||
else
|
|
||||||
echo "Warning: update-mime-database command not found. Custom URL schemes may not be immediately recognized." >&2
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: ../Taskfile.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Builds the application for Windows
|
|
||||||
deps:
|
|
||||||
- task: common:go:mod:tidy
|
|
||||||
- task: common:build:public
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
PRODUCTION:
|
|
||||||
ref: .PRODUCTION
|
|
||||||
- task: common:generate:icons
|
|
||||||
cmds:
|
|
||||||
- task: generate:syso
|
|
||||||
- go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}.exe
|
|
||||||
- cmd: powershell Remove-item *.syso
|
|
||||||
platforms: [windows]
|
|
||||||
- cmd: rm -f *.syso
|
|
||||||
platforms: [linux, darwin]
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}'
|
|
||||||
env:
|
|
||||||
GOOS: windows
|
|
||||||
CGO_ENABLED: 0
|
|
||||||
GOARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application
|
|
||||||
cmds:
|
|
||||||
- |-
|
|
||||||
if [ "{{.FORMAT | default "nsis"}}" = "msix" ]; then
|
|
||||||
task: create:msix:package
|
|
||||||
else
|
|
||||||
task: create:nsis:installer
|
|
||||||
fi
|
|
||||||
vars:
|
|
||||||
FORMAT: '{{.FORMAT | default "nsis"}}'
|
|
||||||
|
|
||||||
generate:syso:
|
|
||||||
summary: Generates Windows `.syso` file
|
|
||||||
dir: build
|
|
||||||
cmds:
|
|
||||||
- wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso
|
|
||||||
vars:
|
|
||||||
ARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
|
|
||||||
create:nsis:installer:
|
|
||||||
summary: Creates an NSIS installer
|
|
||||||
dir: build/windows/nsis
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
# Create the Microsoft WebView2 bootstrapper if it doesn't exist
|
|
||||||
- wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis"
|
|
||||||
- makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" project.nsi
|
|
||||||
vars:
|
|
||||||
ARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
|
|
||||||
|
|
||||||
create:msix:package:
|
|
||||||
summary: Creates an MSIX package
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- |-
|
|
||||||
wails3 tool msix \
|
|
||||||
--config "{{.ROOT_DIR}}/wails.json" \
|
|
||||||
--name "{{.APP_NAME}}" \
|
|
||||||
--executable "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" \
|
|
||||||
--arch "{{.ARCH}}" \
|
|
||||||
--out "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}-{{.ARCH}}.msix" \
|
|
||||||
{{if .CERT_PATH}}--cert "{{.CERT_PATH}}"{{end}} \
|
|
||||||
{{if .PUBLISHER}}--publisher "{{.PUBLISHER}}"{{end}} \
|
|
||||||
{{if .USE_MSIX_TOOL}}--use-msix-tool{{else}}--use-makeappx{{end}}
|
|
||||||
vars:
|
|
||||||
ARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
CERT_PATH: '{{.CERT_PATH | default ""}}'
|
|
||||||
PUBLISHER: '{{.PUBLISHER | default ""}}'
|
|
||||||
USE_MSIX_TOOL: '{{.USE_MSIX_TOOL | default "false"}}'
|
|
||||||
|
|
||||||
install:msix:tools:
|
|
||||||
summary: Installs tools required for MSIX packaging
|
|
||||||
cmds:
|
|
||||||
- wails3 tool msix-install-tools
|
|
||||||
|
|
||||||
run:
|
|
||||||
cmds:
|
|
||||||
- '{{.BIN_DIR}}/{{.APP_NAME}}.exe'
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB |
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"fixed": {
|
|
||||||
"file_version": "0.1.0"
|
|
||||||
},
|
|
||||||
"info": {
|
|
||||||
"0000": {
|
|
||||||
"ProductVersion": "0.1.0",
|
|
||||||
"CompanyName": "My Company",
|
|
||||||
"FileDescription": "My Product Description",
|
|
||||||
"LegalCopyright": "© now, My Company",
|
|
||||||
"ProductName": "My Product",
|
|
||||||
"Comments": "This is a comment"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Package
|
|
||||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
|
||||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
|
||||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
|
||||||
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10">
|
|
||||||
|
|
||||||
<Identity
|
|
||||||
Name="com.wails.desktop"
|
|
||||||
Publisher="CN=My Company"
|
|
||||||
Version="0.1.0.0"
|
|
||||||
ProcessorArchitecture="x64" />
|
|
||||||
|
|
||||||
<Properties>
|
|
||||||
<DisplayName>My Product</DisplayName>
|
|
||||||
<PublisherDisplayName>My Company</PublisherDisplayName>
|
|
||||||
<Description>My Product Description</Description>
|
|
||||||
<Logo>Assets\StoreLogo.png</Logo>
|
|
||||||
</Properties>
|
|
||||||
|
|
||||||
<Dependencies>
|
|
||||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
|
||||||
</Dependencies>
|
|
||||||
|
|
||||||
<Resources>
|
|
||||||
<Resource Language="en-us" />
|
|
||||||
</Resources>
|
|
||||||
|
|
||||||
<Applications>
|
|
||||||
<Application Id="com.wails.desktop" Executable="desktop" EntryPoint="Windows.FullTrustApplication">
|
|
||||||
<uap:VisualElements
|
|
||||||
DisplayName="My Product"
|
|
||||||
Description="My Product Description"
|
|
||||||
BackgroundColor="transparent"
|
|
||||||
Square150x150Logo="Assets\Square150x150Logo.png"
|
|
||||||
Square44x44Logo="Assets\Square44x44Logo.png">
|
|
||||||
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" />
|
|
||||||
<uap:SplashScreen Image="Assets\SplashScreen.png" />
|
|
||||||
</uap:VisualElements>
|
|
||||||
|
|
||||||
<Extensions>
|
|
||||||
<desktop:Extension Category="windows.fullTrustProcess" Executable="desktop" />
|
|
||||||
|
|
||||||
</Extensions>
|
|
||||||
</Application>
|
|
||||||
</Applications>
|
|
||||||
|
|
||||||
<Capabilities>
|
|
||||||
<rescap:Capability Name="runFullTrust" />
|
|
||||||
|
|
||||||
</Capabilities>
|
|
||||||
</Package>
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<MsixPackagingToolTemplate
|
|
||||||
xmlns="http://schemas.microsoft.com/msix/packaging/msixpackagingtool/template/2022">
|
|
||||||
<Settings
|
|
||||||
AllowTelemetry="false"
|
|
||||||
ApplyACLsToPackageFiles="true"
|
|
||||||
GenerateCommandLineFile="true"
|
|
||||||
AllowPromptForPassword="false">
|
|
||||||
</Settings>
|
|
||||||
<Installer
|
|
||||||
Path="desktop"
|
|
||||||
Arguments=""
|
|
||||||
InstallLocation="C:\Program Files\My Company\My Product">
|
|
||||||
</Installer>
|
|
||||||
<PackageInformation
|
|
||||||
PackageName="My Product"
|
|
||||||
PackageDisplayName="My Product"
|
|
||||||
PublisherName="CN=My Company"
|
|
||||||
PublisherDisplayName="My Company"
|
|
||||||
Version="0.1.0.0"
|
|
||||||
PackageDescription="My Product Description">
|
|
||||||
<Capabilities>
|
|
||||||
<Capability Name="runFullTrust" />
|
|
||||||
|
|
||||||
</Capabilities>
|
|
||||||
<Applications>
|
|
||||||
<Application
|
|
||||||
Id="com.wails.desktop"
|
|
||||||
Description="My Product Description"
|
|
||||||
DisplayName="My Product"
|
|
||||||
ExecutableName="desktop"
|
|
||||||
EntryPoint="Windows.FullTrustApplication">
|
|
||||||
|
|
||||||
</Application>
|
|
||||||
</Applications>
|
|
||||||
<Resources>
|
|
||||||
<Resource Language="en-us" />
|
|
||||||
</Resources>
|
|
||||||
<Dependencies>
|
|
||||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
|
||||||
</Dependencies>
|
|
||||||
<Properties>
|
|
||||||
<Framework>false</Framework>
|
|
||||||
<DisplayName>My Product</DisplayName>
|
|
||||||
<PublisherDisplayName>My Company</PublisherDisplayName>
|
|
||||||
<Description>My Product Description</Description>
|
|
||||||
<Logo>Assets\AppIcon.png</Logo>
|
|
||||||
</Properties>
|
|
||||||
</PackageInformation>
|
|
||||||
<SaveLocation PackagePath="desktop.msix" />
|
|
||||||
<PackageIntegrity>
|
|
||||||
<CertificatePath></CertificatePath>
|
|
||||||
</PackageIntegrity>
|
|
||||||
</MsixPackagingToolTemplate>
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
Unicode true
|
|
||||||
|
|
||||||
####
|
|
||||||
## Please note: Template replacements don't work in this file. They are provided with default defines like
|
|
||||||
## mentioned underneath.
|
|
||||||
## If the keyword is not defined, "wails_tools.nsh" will populate them.
|
|
||||||
## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually
|
|
||||||
## from outside of Wails for debugging and development of the installer.
|
|
||||||
##
|
|
||||||
## For development first make a wails nsis build to populate the "wails_tools.nsh":
|
|
||||||
## > wails build --target windows/amd64 --nsis
|
|
||||||
## Then you can call makensis on this file with specifying the path to your binary:
|
|
||||||
## For a AMD64 only installer:
|
|
||||||
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
|
|
||||||
## For a ARM64 only installer:
|
|
||||||
## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
|
|
||||||
## For a installer with both architectures:
|
|
||||||
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
|
|
||||||
####
|
|
||||||
## The following information is taken from the wails_tools.nsh file, but they can be overwritten here.
|
|
||||||
####
|
|
||||||
## !define INFO_PROJECTNAME "my-project" # Default "desktop"
|
|
||||||
## !define INFO_COMPANYNAME "My Company" # Default "My Company"
|
|
||||||
## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product"
|
|
||||||
## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0"
|
|
||||||
## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company"
|
|
||||||
###
|
|
||||||
## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
|
|
||||||
## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
|
|
||||||
####
|
|
||||||
## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html
|
|
||||||
####
|
|
||||||
## Include the wails tools
|
|
||||||
####
|
|
||||||
!include "wails_tools.nsh"
|
|
||||||
|
|
||||||
# The version information for this two must consist of 4 parts
|
|
||||||
VIProductVersion "${INFO_PRODUCTVERSION}.0"
|
|
||||||
VIFileVersion "${INFO_PRODUCTVERSION}.0"
|
|
||||||
|
|
||||||
VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
|
|
||||||
VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
|
|
||||||
VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
|
|
||||||
VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
|
|
||||||
VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
|
|
||||||
VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
|
|
||||||
|
|
||||||
# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
|
|
||||||
ManifestDPIAware true
|
|
||||||
|
|
||||||
!include "MUI.nsh"
|
|
||||||
|
|
||||||
!define MUI_ICON "..\icon.ico"
|
|
||||||
!define MUI_UNICON "..\icon.ico"
|
|
||||||
# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
|
|
||||||
!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
|
|
||||||
!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
|
|
||||||
# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES # Installing page.
|
|
||||||
!insertmacro MUI_PAGE_FINISH # Finished installation page.
|
|
||||||
|
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page
|
|
||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer
|
|
||||||
|
|
||||||
## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
|
|
||||||
#!uninstfinalize 'signtool --file "%1"'
|
|
||||||
#!finalize 'signtool --file "%1"'
|
|
||||||
|
|
||||||
Name "${INFO_PRODUCTNAME}"
|
|
||||||
OutFile "..\..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
|
|
||||||
InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
|
|
||||||
ShowInstDetails show # This will always show the installation details.
|
|
||||||
|
|
||||||
Function .onInit
|
|
||||||
!insertmacro wails.checkArchitecture
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Section
|
|
||||||
!insertmacro wails.setShellContext
|
|
||||||
|
|
||||||
!insertmacro wails.webview2runtime
|
|
||||||
|
|
||||||
SetOutPath $INSTDIR
|
|
||||||
|
|
||||||
!insertmacro wails.files
|
|
||||||
|
|
||||||
CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
|
||||||
CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
|
||||||
|
|
||||||
!insertmacro wails.associateFiles
|
|
||||||
!insertmacro wails.associateCustomProtocols
|
|
||||||
|
|
||||||
!insertmacro wails.writeUninstaller
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Section "uninstall"
|
|
||||||
!insertmacro wails.setShellContext
|
|
||||||
|
|
||||||
RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath
|
|
||||||
|
|
||||||
RMDir /r $INSTDIR
|
|
||||||
|
|
||||||
Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
|
|
||||||
Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
|
|
||||||
|
|
||||||
!insertmacro wails.unassociateFiles
|
|
||||||
!insertmacro wails.unassociateCustomProtocols
|
|
||||||
|
|
||||||
!insertmacro wails.deleteUninstaller
|
|
||||||
SectionEnd
|
|
||||||
|
|
@ -1,236 +0,0 @@
|
||||||
# DO NOT EDIT - Generated automatically by `wails build`
|
|
||||||
|
|
||||||
!include "x64.nsh"
|
|
||||||
!include "WinVer.nsh"
|
|
||||||
!include "FileFunc.nsh"
|
|
||||||
|
|
||||||
!ifndef INFO_PROJECTNAME
|
|
||||||
!define INFO_PROJECTNAME "desktop"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_COMPANYNAME
|
|
||||||
!define INFO_COMPANYNAME "My Company"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_PRODUCTNAME
|
|
||||||
!define INFO_PRODUCTNAME "My Product"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_PRODUCTVERSION
|
|
||||||
!define INFO_PRODUCTVERSION "0.1.0"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_COPYRIGHT
|
|
||||||
!define INFO_COPYRIGHT "© now, My Company"
|
|
||||||
!endif
|
|
||||||
!ifndef PRODUCT_EXECUTABLE
|
|
||||||
!define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
|
|
||||||
!endif
|
|
||||||
!ifndef UNINST_KEY_NAME
|
|
||||||
!define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
|
|
||||||
!endif
|
|
||||||
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
|
|
||||||
|
|
||||||
!ifndef REQUEST_EXECUTION_LEVEL
|
|
||||||
!define REQUEST_EXECUTION_LEVEL "admin"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
|
|
||||||
|
|
||||||
!ifdef ARG_WAILS_AMD64_BINARY
|
|
||||||
!define SUPPORTS_AMD64
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef ARG_WAILS_ARM64_BINARY
|
|
||||||
!define SUPPORTS_ARM64
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef SUPPORTS_AMD64
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
!define ARCH "amd64_arm64"
|
|
||||||
!else
|
|
||||||
!define ARCH "amd64"
|
|
||||||
!endif
|
|
||||||
!else
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
!define ARCH "arm64"
|
|
||||||
!else
|
|
||||||
!error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
|
|
||||||
!endif
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!macro wails.checkArchitecture
|
|
||||||
!ifndef WAILS_WIN10_REQUIRED
|
|
||||||
!define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
|
|
||||||
!define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
${If} ${AtLeastWin10}
|
|
||||||
!ifdef SUPPORTS_AMD64
|
|
||||||
${if} ${IsNativeAMD64}
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
${if} ${IsNativeARM64}
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
|
|
||||||
IfSilent silentArch notSilentArch
|
|
||||||
silentArch:
|
|
||||||
SetErrorLevel 65
|
|
||||||
Abort
|
|
||||||
notSilentArch:
|
|
||||||
MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
|
|
||||||
Quit
|
|
||||||
${else}
|
|
||||||
IfSilent silentWin notSilentWin
|
|
||||||
silentWin:
|
|
||||||
SetErrorLevel 64
|
|
||||||
Abort
|
|
||||||
notSilentWin:
|
|
||||||
MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
|
|
||||||
Quit
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
ok:
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.files
|
|
||||||
!ifdef SUPPORTS_AMD64
|
|
||||||
${if} ${IsNativeAMD64}
|
|
||||||
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
${if} ${IsNativeARM64}
|
|
||||||
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.writeUninstaller
|
|
||||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
SetRegView 64
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
|
|
||||||
|
|
||||||
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
|
|
||||||
IntFmt $0 "0x%08X" $0
|
|
||||||
WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.deleteUninstaller
|
|
||||||
Delete "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
SetRegView 64
|
|
||||||
DeleteRegKey HKLM "${UNINST_KEY}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.setShellContext
|
|
||||||
${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
|
|
||||||
SetShellVarContext all
|
|
||||||
${else}
|
|
||||||
SetShellVarContext current
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
# Install webview2 by launching the bootstrapper
|
|
||||||
# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
|
|
||||||
!macro wails.webview2runtime
|
|
||||||
!ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
|
|
||||||
!define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
SetRegView 64
|
|
||||||
# If the admin key exists and is not empty then webview2 is already installed
|
|
||||||
ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${If} $0 != ""
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
${If} ${REQUEST_EXECUTION_LEVEL} == "user"
|
|
||||||
# If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
|
|
||||||
ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${If} $0 != ""
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
SetDetailsPrint both
|
|
||||||
DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
|
|
||||||
SetDetailsPrint listonly
|
|
||||||
|
|
||||||
InitPluginsDir
|
|
||||||
CreateDirectory "$pluginsdir\webview2bootstrapper"
|
|
||||||
SetOutPath "$pluginsdir\webview2bootstrapper"
|
|
||||||
File "MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'
|
|
||||||
|
|
||||||
SetDetailsPrint both
|
|
||||||
ok:
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
|
|
||||||
!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
|
|
||||||
; Backup the previously associated file class
|
|
||||||
ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
|
|
||||||
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
|
|
||||||
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro APP_UNASSOCIATE EXT FILECLASS
|
|
||||||
; Backup the previously associated file class
|
|
||||||
ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
|
|
||||||
|
|
||||||
DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.associateFiles
|
|
||||||
; Create file associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.unassociateFiles
|
|
||||||
; Delete app associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro CUSTOM_PROTOCOL_ASSOCIATE PROTOCOL DESCRIPTION ICON COMMAND
|
|
||||||
DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "" "${DESCRIPTION}"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "URL Protocol" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\DefaultIcon" "" "${ICON}"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell" "" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open" "" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open\command" "" "${COMMAND}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro CUSTOM_PROTOCOL_UNASSOCIATE PROTOCOL
|
|
||||||
DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.associateCustomProtocols
|
|
||||||
; Create custom protocols associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.unassociateCustomProtocols
|
|
||||||
; Delete app custom protocol associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<assemblyIdentity type="win32" name="com.wails.desktop" version="0.1.0" processorArchitecture="*"/>
|
|
||||||
<dependency>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
|
|
||||||
</dependentAssembly>
|
|
||||||
</dependency>
|
|
||||||
<asmv3:application>
|
|
||||||
<asmv3:windowsSettings>
|
|
||||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
|
|
||||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported -->
|
|
||||||
</asmv3:windowsSettings>
|
|
||||||
</asmv3:application>
|
|
||||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<security>
|
|
||||||
<requestedPrivileges>
|
|
||||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
|
||||||
</requestedPrivileges>
|
|
||||||
</security>
|
|
||||||
</trustInfo>
|
|
||||||
</assembly>
|
|
||||||
|
|
@ -1,157 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
)
|
|
||||||
|
|
||||||
var wsUpgrader = websocket.Upgrader{
|
|
||||||
ReadBufferSize: 1024,
|
|
||||||
WriteBufferSize: 1024,
|
|
||||||
CheckOrigin: func(r *http.Request) bool {
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClaudeBridge forwards messages between GUI clients and the MCP core WebSocket.
|
|
||||||
type ClaudeBridge struct {
|
|
||||||
mcpConn *websocket.Conn
|
|
||||||
mcpURL string
|
|
||||||
clients map[*websocket.Conn]bool
|
|
||||||
clientsMu sync.RWMutex
|
|
||||||
broadcast chan []byte
|
|
||||||
reconnectMu sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClaudeBridge creates a new bridge to the MCP core WebSocket.
|
|
||||||
func NewClaudeBridge(mcpURL string) *ClaudeBridge {
|
|
||||||
return &ClaudeBridge{
|
|
||||||
mcpURL: mcpURL,
|
|
||||||
clients: make(map[*websocket.Conn]bool),
|
|
||||||
broadcast: make(chan []byte, 256),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start connects to the MCP WebSocket and starts the bridge.
|
|
||||||
func (cb *ClaudeBridge) Start() {
|
|
||||||
go cb.connectToMCP()
|
|
||||||
go cb.broadcastLoop()
|
|
||||||
}
|
|
||||||
|
|
||||||
// connectToMCP establishes connection to the MCP core WebSocket.
|
|
||||||
func (cb *ClaudeBridge) connectToMCP() {
|
|
||||||
for {
|
|
||||||
cb.reconnectMu.Lock()
|
|
||||||
if cb.mcpConn != nil {
|
|
||||||
cb.mcpConn.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("Claude bridge connecting to MCP at %s", cb.mcpURL)
|
|
||||||
conn, _, err := websocket.DefaultDialer.Dial(cb.mcpURL, nil)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge failed to connect to MCP: %v", err)
|
|
||||||
cb.reconnectMu.Unlock()
|
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
cb.mcpConn = conn
|
|
||||||
cb.reconnectMu.Unlock()
|
|
||||||
log.Printf("Claude bridge connected to MCP")
|
|
||||||
|
|
||||||
// Read messages from MCP and broadcast to clients
|
|
||||||
for {
|
|
||||||
_, message, err := conn.ReadMessage()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge MCP read error: %v", err)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
cb.broadcast <- message
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connection lost, retry
|
|
||||||
time.Sleep(2 * time.Second)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// broadcastLoop sends messages from MCP to all connected clients.
|
|
||||||
func (cb *ClaudeBridge) broadcastLoop() {
|
|
||||||
for message := range cb.broadcast {
|
|
||||||
cb.clientsMu.RLock()
|
|
||||||
for client := range cb.clients {
|
|
||||||
err := client.WriteMessage(websocket.TextMessage, message)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge client write error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cb.clientsMu.RUnlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleWebSocket handles WebSocket connections from GUI clients.
|
|
||||||
func (cb *ClaudeBridge) HandleWebSocket(w http.ResponseWriter, r *http.Request) {
|
|
||||||
conn, err := wsUpgrader.Upgrade(w, r, nil)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge upgrade error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
cb.clientsMu.Lock()
|
|
||||||
cb.clients[conn] = true
|
|
||||||
cb.clientsMu.Unlock()
|
|
||||||
|
|
||||||
// Send connected message
|
|
||||||
connMsg, _ := json.Marshal(map[string]any{
|
|
||||||
"type": "system",
|
|
||||||
"data": "Connected to Claude bridge",
|
|
||||||
"timestamp": time.Now(),
|
|
||||||
})
|
|
||||||
conn.WriteMessage(websocket.TextMessage, connMsg)
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
cb.clientsMu.Lock()
|
|
||||||
delete(cb.clients, conn)
|
|
||||||
cb.clientsMu.Unlock()
|
|
||||||
conn.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Read messages from client and forward to MCP
|
|
||||||
for {
|
|
||||||
_, message, err := conn.ReadMessage()
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the message to check type
|
|
||||||
var msg map[string]any
|
|
||||||
if err := json.Unmarshal(message, &msg); err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forward claude_message to MCP
|
|
||||||
if msgType, ok := msg["type"].(string); ok && msgType == "claude_message" {
|
|
||||||
cb.sendToMCP(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// sendToMCP sends a message to the MCP WebSocket.
|
|
||||||
func (cb *ClaudeBridge) sendToMCP(message []byte) {
|
|
||||||
cb.reconnectMu.Lock()
|
|
||||||
defer cb.reconnectMu.Unlock()
|
|
||||||
|
|
||||||
if cb.mcpConn == nil {
|
|
||||||
log.Printf("Claude bridge: MCP not connected")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err := cb.mcpConn.WriteMessage(websocket.TextMessage, message)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge MCP write error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
||||||
module core-gui
|
|
||||||
|
|
||||||
go 1.25.5
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/host-uk/core v0.0.0-00010101000000-000000000000
|
|
||||||
github.com/host-uk/core/pkg/display v0.0.0
|
|
||||||
github.com/host-uk/core/pkg/mcp v0.0.0-00010101000000-000000000000
|
|
||||||
github.com/host-uk/core/pkg/webview v0.0.0-00010101000000-000000000000
|
|
||||||
github.com/host-uk/core/pkg/ws v0.0.0-00010101000000-000000000000
|
|
||||||
github.com/gorilla/websocket v1.5.3
|
|
||||||
github.com/wailsapp/wails/v3 v3.0.0-alpha.41
|
|
||||||
)
|
|
||||||
|
|
||||||
replace (
|
|
||||||
github.com/host-uk/core => ../../
|
|
||||||
github.com/host-uk/core/pkg/config => ../../pkg/config
|
|
||||||
github.com/host-uk/core/pkg/core => ../../pkg/core
|
|
||||||
github.com/host-uk/core/pkg/crypt => ../../pkg/crypt
|
|
||||||
github.com/host-uk/core/pkg/display => ../../pkg/display
|
|
||||||
github.com/host-uk/core/pkg/docs => ../../pkg/docs
|
|
||||||
github.com/host-uk/core/pkg/help => ../../pkg/help
|
|
||||||
github.com/host-uk/core/pkg/i18n => ../../pkg/i18n
|
|
||||||
github.com/host-uk/core/pkg/ide => ../../pkg/ide
|
|
||||||
github.com/host-uk/core/pkg/io => ../../pkg/io
|
|
||||||
github.com/host-uk/core/pkg/mcp => ../../pkg/mcp
|
|
||||||
github.com/host-uk/core/pkg/module => ../../pkg/module
|
|
||||||
github.com/host-uk/core/pkg/plugin => ../../pkg/plugin
|
|
||||||
github.com/host-uk/core/pkg/process => ../../pkg/process
|
|
||||||
github.com/host-uk/core/pkg/runtime => ../../pkg/runtime
|
|
||||||
github.com/host-uk/core/pkg/webview => ../../pkg/webview
|
|
||||||
github.com/host-uk/core/pkg/workspace => ../../pkg/workspace
|
|
||||||
github.com/host-uk/core/pkg/ws => ../../pkg/ws
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
dario.cat/mergo v1.0.2 // indirect
|
|
||||||
git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 // indirect
|
|
||||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
|
||||||
github.com/ProtonMail/go-crypto v1.3.0 // indirect
|
|
||||||
github.com/host-uk/core/pkg/config v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/host-uk/core/pkg/core v0.0.0 // indirect
|
|
||||||
github.com/host-uk/core/pkg/docs v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/host-uk/core/pkg/help v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/host-uk/core/pkg/i18n v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/host-uk/core/pkg/ide v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/host-uk/core/pkg/module v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/host-uk/core/pkg/process v0.0.0-00010101000000-000000000000 // indirect
|
|
||||||
github.com/Snider/Enchantrix v0.0.2 // indirect
|
|
||||||
github.com/adrg/xdg v0.5.3 // indirect
|
|
||||||
github.com/bep/debounce v1.2.1 // indirect
|
|
||||||
github.com/bytedance/sonic v1.14.0 // indirect
|
|
||||||
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
|
||||||
github.com/cloudflare/circl v1.6.1 // indirect
|
|
||||||
github.com/cloudwego/base64x v0.1.6 // indirect
|
|
||||||
github.com/cyphar/filepath-securejoin v0.6.1 // indirect
|
|
||||||
github.com/ebitengine/purego v0.9.1 // indirect
|
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
|
||||||
github.com/gin-contrib/sse v1.1.0 // indirect
|
|
||||||
github.com/gin-gonic/gin v1.11.0 // indirect
|
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
|
||||||
github.com/go-git/go-billy/v5 v5.6.2 // indirect
|
|
||||||
github.com/go-git/go-git/v5 v5.16.4 // indirect
|
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
|
||||||
github.com/go-playground/locales v0.14.1 // indirect
|
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
|
||||||
github.com/go-playground/validator/v10 v10.27.0 // indirect
|
|
||||||
github.com/goccy/go-json v0.10.2 // indirect
|
|
||||||
github.com/goccy/go-yaml v1.18.0 // indirect
|
|
||||||
github.com/godbus/dbus/v5 v5.2.0 // indirect
|
|
||||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
|
||||||
github.com/google/jsonschema-go v0.3.0 // indirect
|
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
|
||||||
github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 // indirect
|
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
|
||||||
github.com/kevinburke/ssh_config v1.4.0 // indirect
|
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
|
||||||
github.com/leaanthony/go-ansi-parser v1.6.1 // indirect
|
|
||||||
github.com/leaanthony/u v1.1.1 // indirect
|
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
|
||||||
github.com/lmittmann/tint v1.1.2 // indirect
|
|
||||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
|
||||||
github.com/modelcontextprotocol/go-sdk v1.2.0 // indirect
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
|
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect
|
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
|
||||||
github.com/pjbgf/sha1cd v0.5.0 // indirect
|
|
||||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
|
||||||
github.com/quic-go/qpack v0.5.1 // indirect
|
|
||||||
github.com/quic-go/quic-go v0.54.0 // indirect
|
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
|
||||||
github.com/samber/lo v1.52.0 // indirect
|
|
||||||
github.com/sergi/go-diff v1.4.0 // indirect
|
|
||||||
github.com/skeema/knownhosts v1.3.2 // indirect
|
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
|
||||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
|
||||||
github.com/wailsapp/go-webview2 v1.0.23 // indirect
|
|
||||||
github.com/wailsapp/mimetype v1.4.1 // indirect
|
|
||||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
|
||||||
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
|
|
||||||
go.uber.org/mock v0.5.0 // indirect
|
|
||||||
golang.org/x/arch v0.20.0 // indirect
|
|
||||||
golang.org/x/crypto v0.45.0 // indirect
|
|
||||||
golang.org/x/mod v0.30.0 // indirect
|
|
||||||
golang.org/x/net v0.47.0 // indirect
|
|
||||||
golang.org/x/oauth2 v0.33.0 // indirect
|
|
||||||
golang.org/x/sync v0.19.0 // indirect
|
|
||||||
golang.org/x/sys v0.38.0 // indirect
|
|
||||||
golang.org/x/text v0.32.0 // indirect
|
|
||||||
golang.org/x/tools v0.39.0 // indirect
|
|
||||||
google.golang.org/protobuf v1.36.9 // indirect
|
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
|
||||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
||||||
)
|
|
||||||
|
|
@ -1,235 +0,0 @@
|
||||||
dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
|
|
||||||
dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
|
|
||||||
git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA=
|
|
||||||
git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc=
|
|
||||||
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
|
|
||||||
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
|
||||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
|
||||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
|
||||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
|
||||||
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
|
|
||||||
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
|
|
||||||
github.com/Snider/Enchantrix v0.0.2 h1:ExZQiBhfS/p/AHFTKhY80TOd+BXZjK95EzByAEgwvjs=
|
|
||||||
github.com/Snider/Enchantrix v0.0.2/go.mod h1:CtFcLAvnDT1KcuF1JBb/DJj0KplY8jHryO06KzQ1hsQ=
|
|
||||||
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
|
|
||||||
github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
|
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
|
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
|
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
|
||||||
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
|
|
||||||
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
|
|
||||||
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
|
|
||||||
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
|
|
||||||
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
|
|
||||||
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
|
||||||
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
|
||||||
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
|
||||||
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
|
||||||
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
|
||||||
github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE=
|
|
||||||
github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A=
|
|
||||||
github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
|
||||||
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
|
|
||||||
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
|
|
||||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
|
||||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
|
|
||||||
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
|
|
||||||
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
|
|
||||||
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
|
|
||||||
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
|
|
||||||
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
|
|
||||||
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
|
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
|
|
||||||
github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM=
|
|
||||||
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
|
|
||||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
|
|
||||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
|
|
||||||
github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y=
|
|
||||||
github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
|
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
|
||||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
|
||||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
|
||||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
|
||||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
|
||||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
|
||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
|
||||||
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
|
|
||||||
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
|
|
||||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
|
||||||
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
|
||||||
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
|
|
||||||
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
|
|
||||||
github.com/godbus/dbus/v5 v5.2.0 h1:3WexO+U+yg9T70v9FdHr9kCxYlazaAXUhx2VMkbfax8=
|
|
||||||
github.com/godbus/dbus/v5 v5.2.0/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
|
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
|
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
|
||||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
|
|
||||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
|
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
|
||||||
github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q=
|
|
||||||
github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
|
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
|
||||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
|
||||||
github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ=
|
|
||||||
github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
|
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
|
||||||
github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ=
|
|
||||||
github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M=
|
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
|
||||||
github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A=
|
|
||||||
github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=
|
|
||||||
github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M=
|
|
||||||
github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
|
|
||||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
|
||||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
|
||||||
github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w=
|
|
||||||
github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
|
|
||||||
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
|
||||||
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
|
|
||||||
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
|
||||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
|
||||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
|
||||||
github.com/modelcontextprotocol/go-sdk v1.2.0 h1:Y23co09300CEk8iZ/tMxIX1dVmKZkzoSBZOpJwUnc/s=
|
|
||||||
github.com/modelcontextprotocol/go-sdk v1.2.0/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
|
||||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ=
|
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA=
|
|
||||||
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
|
|
||||||
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
|
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
|
||||||
github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0=
|
|
||||||
github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM=
|
|
||||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
|
||||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
|
||||||
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
|
||||||
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
|
|
||||||
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
|
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
|
||||||
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
|
||||||
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
|
||||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
|
||||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
|
||||||
github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw=
|
|
||||||
github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
|
|
||||||
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
|
|
||||||
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
|
||||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
|
||||||
github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg=
|
|
||||||
github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
|
||||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
|
||||||
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
|
||||||
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
|
||||||
github.com/wailsapp/go-webview2 v1.0.23 h1:jmv8qhz1lHibCc79bMM/a/FqOnnzOGEisLav+a0b9P0=
|
|
||||||
github.com/wailsapp/go-webview2 v1.0.23/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc=
|
|
||||||
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
|
|
||||||
github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
|
|
||||||
github.com/wailsapp/wails/v3 v3.0.0-alpha.41 h1:DYcC1/vtO862sxnoyCOMfLLypbzpFWI257fR6zDYY+Y=
|
|
||||||
github.com/wailsapp/wails/v3 v3.0.0-alpha.41/go.mod h1:7i8tSuA74q97zZ5qEJlcVZdnO+IR7LT2KU8UpzYMPsw=
|
|
||||||
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
|
|
||||||
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
|
||||||
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
|
|
||||||
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
|
|
||||||
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
|
|
||||||
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
|
|
||||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
|
||||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
|
||||||
golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
|
|
||||||
golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
|
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
|
||||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
|
||||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
|
||||||
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs=
|
|
||||||
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo=
|
|
||||||
golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
|
|
||||||
golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
|
|
||||||
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
|
||||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
|
||||||
golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo=
|
|
||||||
golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
|
|
||||||
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
|
|
||||||
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
|
||||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
|
||||||
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
|
|
||||||
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
|
|
||||||
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
|
|
||||||
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
|
|
||||||
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
|
||||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
|
||||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
|
||||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"embed"
|
|
||||||
"io/fs"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
core "github.com/host-uk/core"
|
|
||||||
"github.com/wailsapp/wails/v3/pkg/application"
|
|
||||||
"github.com/wailsapp/wails/v3/pkg/services/notifications"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:embed all:frontend/dist/frontend/browser
|
|
||||||
var assets embed.FS
|
|
||||||
|
|
||||||
// Default MCP port for the embedded server
|
|
||||||
const mcpPort = 9877
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// Create the Core runtime with plugin support
|
|
||||||
rt, err := core.NewRuntime()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the notifications service for native system notifications
|
|
||||||
notifier := notifications.New()
|
|
||||||
|
|
||||||
// Wire the notifier to the display service for native notifications
|
|
||||||
rt.Display.SetNotifier(notifier)
|
|
||||||
|
|
||||||
// Create the MCP bridge for Claude Code integration
|
|
||||||
// This provides WebView access, console capture, window control, and process management
|
|
||||||
mcpBridge := NewMCPBridge(mcpPort, rt.Display)
|
|
||||||
|
|
||||||
// Collect all services including plugins
|
|
||||||
// Display service registered separately so Wails calls its Startup() for tray/window
|
|
||||||
services := []application.Service{
|
|
||||||
application.NewService(rt.Runtime),
|
|
||||||
application.NewService(rt.Display),
|
|
||||||
application.NewService(notifier), // Native notifications
|
|
||||||
application.NewService(rt.Docs),
|
|
||||||
application.NewService(rt.Config),
|
|
||||||
application.NewService(rt.I18n),
|
|
||||||
application.NewService(rt.Help),
|
|
||||||
application.NewService(rt.Crypt),
|
|
||||||
application.NewService(rt.IDE),
|
|
||||||
application.NewService(rt.Module),
|
|
||||||
application.NewService(rt.Workspace),
|
|
||||||
application.NewService(mcpBridge), // MCP Bridge for Claude Code
|
|
||||||
}
|
|
||||||
services = append(services, rt.PluginServices()...)
|
|
||||||
|
|
||||||
// Strip the embed path prefix so files are served from root
|
|
||||||
staticAssets, err := fs.Sub(assets, "frontend/dist/frontend/browser")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
app := application.New(application.Options{
|
|
||||||
Services: services,
|
|
||||||
Assets: application.AssetOptions{
|
|
||||||
Handler: application.AssetFileServerFS(staticAssets),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
log.Printf("Starting Core GUI with MCP server on port %d", mcpPort)
|
|
||||||
|
|
||||||
err = app.Run()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
console.log("Hello from app.js!");
|
|
||||||
|
Before Width: | Height: | Size: 32 KiB |
|
|
@ -1,9 +0,0 @@
|
||||||
//@ts-check
|
|
||||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
|
||||||
// This file is automatically generated. DO NOT EDIT
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
||||||
// @ts-ignore: Unused imports
|
|
||||||
import { Create as $Create } from "@wailsio/runtime";
|
|
||||||
|
|
||||||
Object.freeze($Create.Events);
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
|
||||||
// This file is automatically generated. DO NOT EDIT
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
// This is the main entry point for the frontend application.
|
|
||||||
// We can add application-specific JavaScript here in the future.
|
|
||||||
|
|
||||||
console.log("Core Framework App Loaded");
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" class="dark">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Core Framework</title>
|
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
|
||||||
<script>
|
|
||||||
tailwind.config = {
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
colors: {
|
|
||||||
'core-gray': {
|
|
||||||
'light': '#333333',
|
|
||||||
'DEFAULT': '#1a1a1a',
|
|
||||||
'dark': '#0d0d0d',
|
|
||||||
},
|
|
||||||
'core-blue': '#00aaff',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body class="bg-core-gray-dark text-gray-300 flex items-center justify-center min-h-screen font-sans">
|
|
||||||
|
|
||||||
<div class="w-full max-w-4xl mx-auto p-8 text-center">
|
|
||||||
|
|
||||||
<header class="mb-12">
|
|
||||||
<h1 class="text-5xl font-bold text-white mb-2">
|
|
||||||
<span class="text-core-blue">Core</span> Framework
|
|
||||||
</h1>
|
|
||||||
<p class="text-lg text-gray-400">A modular foundation for building robust desktop applications.</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<h2 class="text-3xl font-semibold text-white mb-8">Loaded Services</h2>
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
|
|
||||||
|
|
||||||
<!-- Config Service Card -->
|
|
||||||
<div class="bg-core-gray p-6 rounded-lg shadow-lg border border-core-gray-light transform hover:scale-105 transition-transform duration-300">
|
|
||||||
<div class="text-core-blue mb-4">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-12 w-12 mx-auto" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<h3 class="text-xl font-bold text-white mb-2">Config</h3>
|
|
||||||
<p class="text-gray-400">Manages application state and user preferences.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Display Service Card -->
|
|
||||||
<div class="bg-core-gray p-6 rounded-lg shadow-lg border border-core-gray-light transform hover:scale-105 transition-transform duration-300">
|
|
||||||
<div class="text-core-blue mb-4">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-12 w-12 mx-auto" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<h3 class="text-xl font-bold text-white mb-2">Display</h3>
|
|
||||||
<p class="text-gray-400">Controls windows, menus, and system tray interactions.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Crypt Service Card -->
|
|
||||||
<div class="bg-core-gray p-6 rounded-lg shadow-lg border border-core-gray-light transform hover:scale-105 transition-transform duration-300">
|
|
||||||
<div class="text-core-blue mb-4">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-12 w-12 mx-auto" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<h3 class="text-xl font-bold text-white mb-2">Crypt</h3>
|
|
||||||
<p class="text-gray-400">Provides cryptographic functions and security.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script type="module" src="assets/app.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" class="dark">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Core System Tray</title>
|
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
|
||||||
<script>
|
|
||||||
tailwind.config = {
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
colors: {
|
|
||||||
'core-gray': {
|
|
||||||
'light': '#333333',
|
|
||||||
'DEFAULT': '#1a1a1a',
|
|
||||||
'dark': '#0d0d0d',
|
|
||||||
},
|
|
||||||
'core-blue': '#00aaff',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
/* Ensure no scrollbars appear in the small window */
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body class="bg-core-gray-dark text-gray-300 font-sans">
|
|
||||||
|
|
||||||
<div class="w-full h-full p-4 text-center">
|
|
||||||
|
|
||||||
<header class="mb-6">
|
|
||||||
<h1 class="text-3xl font-bold text-white">
|
|
||||||
<span class="text-core-blue">Core</span> Status
|
|
||||||
</h1>
|
|
||||||
<p class="text-sm text-gray-400">Services at a glance.</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<div class="space-y-4">
|
|
||||||
|
|
||||||
<!-- Config Service Card -->
|
|
||||||
<div class="bg-core-gray p-4 rounded-lg shadow-md border border-core-gray-light flex items-center space-x-4">
|
|
||||||
<div class="text-core-blue">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="text-left">
|
|
||||||
<h3 class="text-lg font-bold text-white">Config</h3>
|
|
||||||
<p class="text-sm text-gray-400">State and preferences loaded.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Display Service Card -->
|
|
||||||
<div class="bg-core-gray p-4 rounded-lg shadow-md border border-core-gray-light flex items-center space-x-4">
|
|
||||||
<div class="text-core-blue">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="text-left">
|
|
||||||
<h3 class="text-lg font-bold text-white">Display</h3>
|
|
||||||
<p class="text-sm text-gray-400">UI manager is active.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Crypt Service Card -->
|
|
||||||
<div class="bg-core-gray p-4 rounded-lg shadow-md border border-core-gray-light flex items-center space-x-4">
|
|
||||||
<div class="text-core-blue">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="text-left">
|
|
||||||
<h3 class="text-lg font-bold text-white">Crypt</h3>
|
|
||||||
<p class="text-sm text-gray-400">Security services are running.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer class="absolute bottom-4 left-0 right-0 text-center">
|
|
||||||
<p class="text-xs text-gray-500">Core Framework Active</p>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="assets/app.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
1084
cmd/core-demo/public/package-lock.json
generated
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
"name": "core-app",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"scripts": {
|
|
||||||
"start": "vite",
|
|
||||||
"build": "vite build",
|
|
||||||
"build:dev": "vite build --mode development"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@tailwindplus/elements": "^1.0.18",
|
|
||||||
"@wailsio/runtime": "^3.0.0-alpha.72"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"tailwindcss": "^4.1.14",
|
|
||||||
"vite": "^7.1.12"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
import { defineConfig } from 'vite';
|
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
|
||||||
export default defineConfig({
|
|
||||||
// Set the root of the project to the 'html' directory.
|
|
||||||
// Vite will look for index.html in this folder.
|
|
||||||
root: 'html',
|
|
||||||
|
|
||||||
build: {
|
|
||||||
// Set the output directory for the build.
|
|
||||||
// We need to go up one level from 'html' to place the 'dist' folder
|
|
||||||
// in the correct location for Wails.
|
|
||||||
outDir: '../dist',
|
|
||||||
// Ensure the output directory is emptied before each build.
|
|
||||||
emptyOutDir: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: "./build/Taskfile.yml"
|
|
||||||
windows: "./build/windows/Taskfile.yml"
|
|
||||||
darwin: "./build/darwin/Taskfile.yml"
|
|
||||||
linux: "./build/linux/Taskfile.yml"
|
|
||||||
|
|
||||||
vars:
|
|
||||||
APP_NAME: "core-gui"
|
|
||||||
BIN_DIR: "./build/bin"
|
|
||||||
VITE_PORT: '{{.WAILS_VITE_PORT | default 9246}}'
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Builds the application
|
|
||||||
cmds:
|
|
||||||
- task: "{{OS}}:build"
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application
|
|
||||||
cmds:
|
|
||||||
- task: "{{OS}}:package"
|
|
||||||
|
|
||||||
run:
|
|
||||||
summary: Runs the application
|
|
||||||
cmds:
|
|
||||||
- task: "{{OS}}:run"
|
|
||||||
|
|
||||||
# This is the main dev task called by the Makefile.
|
|
||||||
# It delegates to the actual wails command below.
|
|
||||||
dev:
|
|
||||||
summary: Runs the application in development mode
|
|
||||||
cmds:
|
|
||||||
- task: dev:wails
|
|
||||||
|
|
||||||
# This task contains the real wails dev command.
|
|
||||||
# This avoids the recursive loop and provides a clear target.
|
|
||||||
dev:wails:
|
|
||||||
internal: true
|
|
||||||
cmds:
|
|
||||||
- wails3 dev -config ./build/config.yml -port {{.VITE_PORT}}
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
{
|
|
||||||
"code": "mining",
|
|
||||||
"type": "app",
|
|
||||||
"name": "Mining Module",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"namespace": "mining",
|
|
||||||
"description": "Cryptocurrency mining management",
|
|
||||||
"author": "Lethean",
|
|
||||||
"contexts": ["miner", "default"],
|
|
||||||
"menu": [
|
|
||||||
{
|
|
||||||
"id": "mining",
|
|
||||||
"label": "Mining",
|
|
||||||
"order": 200,
|
|
||||||
"contexts": ["miner"],
|
|
||||||
"children": [
|
|
||||||
{"id": "mining-dashboard", "label": "Dashboard", "route": "/mining/dashboard", "order": 1},
|
|
||||||
{"id": "mining-pools", "label": "Pools", "route": "/mining/pools", "order": 2},
|
|
||||||
{"id": "mining-sep1", "separator": true, "order": 3},
|
|
||||||
{"id": "mining-start", "label": "Start Mining", "action": "mining:start", "order": 4},
|
|
||||||
{"id": "mining-stop", "label": "Stop Mining", "action": "mining:stop", "order": 5}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"routes": [
|
|
||||||
{"path": "/mining/dashboard", "component": "mining-dashboard", "title": "Mining Dashboard", "contexts": ["miner"]},
|
|
||||||
{"path": "/mining/pools", "component": "mining-pools", "title": "Mining Pools", "contexts": ["miner"]}
|
|
||||||
],
|
|
||||||
"api": [
|
|
||||||
{"method": "GET", "path": "/status", "description": "Get mining status"},
|
|
||||||
{"method": "POST", "path": "/start", "description": "Start mining"},
|
|
||||||
{"method": "POST", "path": "/stop", "description": "Stop mining"},
|
|
||||||
{"method": "GET", "path": "/pools", "description": "List configured pools"}
|
|
||||||
],
|
|
||||||
"downloads": {
|
|
||||||
"x86_64": {
|
|
||||||
"darwin": {"url": "https://releases.example.com/mining/darwin-x86_64.tar.gz"},
|
|
||||||
"linux": {"url": "https://releases.example.com/mining/linux-x86_64.tar.gz"},
|
|
||||||
"windows": {"url": "https://releases.example.com/mining/windows-x86_64.zip"}
|
|
||||||
},
|
|
||||||
"aarch64": {
|
|
||||||
"darwin": {"url": "https://releases.example.com/mining/darwin-aarch64.tar.gz"}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"defaultPool": "",
|
|
||||||
"threads": 0,
|
|
||||||
"intensity": 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
go:mod:tidy:
|
|
||||||
summary: Runs `go mod tidy`
|
|
||||||
internal: true
|
|
||||||
cmds:
|
|
||||||
- go mod tidy
|
|
||||||
|
|
||||||
install:public:deps:
|
|
||||||
summary: Install public dependencies
|
|
||||||
dir: frontend
|
|
||||||
sources:
|
|
||||||
- package.json
|
|
||||||
- package-lock.json
|
|
||||||
generates:
|
|
||||||
- node_modules/*
|
|
||||||
preconditions:
|
|
||||||
- sh: npm version
|
|
||||||
msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
|
|
||||||
cmds:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
build:public:
|
|
||||||
label: build:public (PRODUCTION={{.PRODUCTION}})
|
|
||||||
summary: Build the public folder
|
|
||||||
dir: frontend
|
|
||||||
sources:
|
|
||||||
- "**/*"
|
|
||||||
generates:
|
|
||||||
- dist/**/*
|
|
||||||
deps:
|
|
||||||
- task: install:public:deps
|
|
||||||
- task: generate:bindings
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
cmds:
|
|
||||||
- npm run {{.BUILD_COMMAND}} -q
|
|
||||||
env:
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
vars:
|
|
||||||
BUILD_COMMAND: '{{if eq .PRODUCTION "true"}}build{{else}}build:dev{{end}}'
|
|
||||||
|
|
||||||
generate:bindings:
|
|
||||||
label: generate:bindings (BUILD_FLAGS={{.BUILD_FLAGS}})
|
|
||||||
summary: Generates bindings
|
|
||||||
deps:
|
|
||||||
- task: go:mod:tidy
|
|
||||||
sources:
|
|
||||||
- "**/*.[jt]s"
|
|
||||||
- exclude: frontend/**/*
|
|
||||||
- frontend/bindings/**/*
|
|
||||||
- "**/*.go"
|
|
||||||
- go.mod
|
|
||||||
- go.sum
|
|
||||||
generates:
|
|
||||||
- frontend/bindings/**/*
|
|
||||||
cmds:
|
|
||||||
- wails3 generate bindings -d frontend/bindings -f '{{.BUILD_FLAGS}}' -clean=true -ts
|
|
||||||
|
|
||||||
generate:icons:
|
|
||||||
summary: Generates Windows `.ico` and Mac `.icns` files from an image
|
|
||||||
dir: build
|
|
||||||
sources:
|
|
||||||
- "appicon.png"
|
|
||||||
generates:
|
|
||||||
- "darwin/icons.icns"
|
|
||||||
- "windows/icon.ico"
|
|
||||||
cmds:
|
|
||||||
- wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico
|
|
||||||
|
|
||||||
dev:public:
|
|
||||||
summary: Runs the frontend dev server for live development
|
|
||||||
dir: frontend
|
|
||||||
deps:
|
|
||||||
- task: install:public:deps
|
|
||||||
cmds:
|
|
||||||
- npm start -- --port {{.VITE_PORT | default "4200"}}
|
|
||||||
|
|
||||||
update:build-assets:
|
|
||||||
summary: Updates the build assets
|
|
||||||
cmds:
|
|
||||||
- wails3 update build-assets -name "{{.APP_NAME}}" -binaryname "{{.APP_NAME}}" -config config.yml -dir .
|
|
||||||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
|
@ -1,43 +0,0 @@
|
||||||
# This file contains the configuration for this project.
|
|
||||||
# When you update `info` or `fileAssociations`, run `wails3 task common:update:build-assets` to update the assets.
|
|
||||||
# Note that this will overwrite any changes you have made to the assets.
|
|
||||||
version: '3'
|
|
||||||
# This information is used to generate the build assets.
|
|
||||||
info:
|
|
||||||
companyName: "Snider"
|
|
||||||
productName: "Core.App"
|
|
||||||
productIdentifier: "com.core.app"
|
|
||||||
description: "A program that does demos the features"
|
|
||||||
copyright: "(c) EUPL-1.2, Snider"
|
|
||||||
comments: "Demo Dev Area"
|
|
||||||
version: "0.0.1"
|
|
||||||
|
|
||||||
# Dev mode configuration
|
|
||||||
dev_mode:
|
|
||||||
root_path: .
|
|
||||||
log_level: warn
|
|
||||||
debounce: 1000
|
|
||||||
ignore:
|
|
||||||
dir:
|
|
||||||
- .git
|
|
||||||
- node_modules
|
|
||||||
- public
|
|
||||||
- bin
|
|
||||||
file:
|
|
||||||
- .DS_Store
|
|
||||||
- .gitignore
|
|
||||||
- .gitkeep
|
|
||||||
watched_extension:
|
|
||||||
- "*.go"
|
|
||||||
git_ignore: true
|
|
||||||
executes:
|
|
||||||
- cmd: wails3 task common:install:public:deps
|
|
||||||
type: once
|
|
||||||
- cmd: wails3 task common:dev:public
|
|
||||||
type: background
|
|
||||||
- cmd: go mod tidy
|
|
||||||
type: blocking
|
|
||||||
- cmd: wails3 task build
|
|
||||||
type: blocking
|
|
||||||
- cmd: wails3 task run
|
|
||||||
type: primary
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>Lethean Desktop</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>desktop</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.lethean.desktop</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleGetInfoString</key>
|
|
||||||
<string>This is a comment</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string>icons</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>10.15.0</string>
|
|
||||||
<key>NSHighResolutionCapable</key>
|
|
||||||
<string>true</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>© EUPL-1.2 Lethean Community</string>
|
|
||||||
|
|
||||||
<!-- Expanded App Transport Security settings -->
|
|
||||||
<key>NSAppTransportSecurity</key>
|
|
||||||
<dict>
|
|
||||||
<key>NSAllowsLocalNetworking</key>
|
|
||||||
<true/>
|
|
||||||
<key>NSAllowsArbitraryLoads</key>
|
|
||||||
<true/>
|
|
||||||
<key>NSAllowsArbitraryLoadsInWebContent</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
|
|
||||||
<!-- File System Access Permissions -->
|
|
||||||
<key>NSDownloadsFolderUsageDescription</key>
|
|
||||||
<string>This app needs access to your Downloads folder to save and load files.</string>
|
|
||||||
<key>NSDocumentsFolderUsageDescription</key>
|
|
||||||
<string>This app needs access to your Documents folder to save and load files.</string>
|
|
||||||
<key>NSDesktopFolderUsageDescription</key>
|
|
||||||
<string>This app needs access to your Desktop folder to save and load files.</string>
|
|
||||||
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>Lethean Desktop</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>desktop</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.lethean.desktop</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleGetInfoString</key>
|
|
||||||
<string>This is a comment</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>0.1.0</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string>icons</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>10.15.0</string>
|
|
||||||
<key>NSHighResolutionCapable</key>
|
|
||||||
<string>true</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>© EUPL-1.2 Lethean Community</string>
|
|
||||||
<key>NSAppTransportSecurity</key>
|
|
||||||
<dict>
|
|
||||||
<key>NSAllowsLocalNetworking</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: ../Taskfile.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Creates a production build of the application
|
|
||||||
deps:
|
|
||||||
- task: common:go:mod:tidy
|
|
||||||
- task: common:build:public
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
PRODUCTION:
|
|
||||||
ref: .PRODUCTION
|
|
||||||
- task: common:generate:icons
|
|
||||||
cmds:
|
|
||||||
- go build {{.BUILD_FLAGS}} -o {{.OUTPUT}}
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}'
|
|
||||||
DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}'
|
|
||||||
OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}'
|
|
||||||
env:
|
|
||||||
GOOS: darwin
|
|
||||||
CGO_ENABLED: 1
|
|
||||||
GOARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
CGO_CFLAGS: "-mmacosx-version-min=26.0"
|
|
||||||
CGO_LDFLAGS: "-mmacosx-version-min=26.0"
|
|
||||||
MACOSX_DEPLOYMENT_TARGET: "26.0"
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
|
|
||||||
build:universal:
|
|
||||||
summary: Builds darwin universal binary (arm64 + amd64)
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
ARCH: amd64
|
|
||||||
OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64"
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
ARCH: arm64
|
|
||||||
OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
|
||||||
cmds:
|
|
||||||
- lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
|
||||||
- rm "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application into a `.app` bundle
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: create:app:bundle
|
|
||||||
|
|
||||||
package:universal:
|
|
||||||
summary: Packages darwin universal binary (arm64 + amd64)
|
|
||||||
deps:
|
|
||||||
- task: build:universal
|
|
||||||
cmds:
|
|
||||||
- task: create:app:bundle
|
|
||||||
|
|
||||||
|
|
||||||
create:app:bundle:
|
|
||||||
summary: Creates an `.app` bundle
|
|
||||||
cmds:
|
|
||||||
- mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources}
|
|
||||||
- cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources
|
|
||||||
- cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS
|
|
||||||
- cp build/darwin/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents
|
|
||||||
- codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.app
|
|
||||||
|
|
||||||
run:
|
|
||||||
cmds:
|
|
||||||
- mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/{MacOS,Resources}
|
|
||||||
- cp build/darwin/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources
|
|
||||||
- cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS
|
|
||||||
- cp build/darwin/Info.dev.plist {{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Info.plist
|
|
||||||
- codesign --force --deep --sign - {{.BIN_DIR}}/{{.APP_NAME}}.dev.app
|
|
||||||
- '{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS/{{.APP_NAME}}'
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: "../Taskfile.yml"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Builds the application for Linux
|
|
||||||
deps:
|
|
||||||
- task: common:go:mod:tidy
|
|
||||||
- task: common:build:public
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
PRODUCTION:
|
|
||||||
ref: .PRODUCTION
|
|
||||||
- task: common:generate:icons
|
|
||||||
cmds:
|
|
||||||
- go build {{.BUILD_FLAGS}} -o bin/{{.APP_NAME}}
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}'
|
|
||||||
env:
|
|
||||||
GOOS: linux
|
|
||||||
CGO_ENABLED: 1
|
|
||||||
GOARCH: '{{.ARCH | default "amd64"}}'
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application for Linux
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: create:appimage
|
|
||||||
- task: create:deb
|
|
||||||
- task: create:rpm
|
|
||||||
|
|
||||||
create:appimage:
|
|
||||||
summary: Creates an AppImage
|
|
||||||
dir: "{{.APP_ROOT}}/build/linux/appimage"
|
|
||||||
deps:
|
|
||||||
- task: ":build"
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
- task: ":generate:dotdesktop"
|
|
||||||
cmds:
|
|
||||||
- cp "{{.APP_ROOT}}/bin/{{.APP_NAME}}" .
|
|
||||||
- cp "{{.APP_ROOT}}/build/appicon.png" "{{.APP_NAME}}.png"
|
|
||||||
- wails3 generate appimage -binary "{{.APP_NAME}}" -icon "{{.APP_NAME}}.png" -desktopfile "../{{.APP_NAME}}.desktop" -outputdir "{{.APP_ROOT}}/bin" -builddir build
|
|
||||||
|
|
||||||
create:deb:
|
|
||||||
summary: Creates a deb package
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: generate:dotdesktop
|
|
||||||
- wails3 tool package -name {{.APP_NAME}} -format deb -config build/linux/nfpm/nfpm.yaml -out bin
|
|
||||||
|
|
||||||
create:rpm:
|
|
||||||
summary: Creates a rpm package
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- task: generate:dotdesktop
|
|
||||||
- wails3 tool package -name {{.APP_NAME}} -format rpm -config build/linux/nfpm/nfpm.yaml -out bin
|
|
||||||
|
|
||||||
generate:dotdesktop:
|
|
||||||
summary: Generates a `.desktop` file
|
|
||||||
cmds:
|
|
||||||
- mkdir -p linux/appimage
|
|
||||||
- wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.APP_NAME}}" -icon "{{.APP_NAME}}" -outputfile "linux/{{.APP_NAME}}.desktop" -categories "Development;"
|
|
||||||
|
|
||||||
run:
|
|
||||||
dir: "{{.APP_ROOT}}"
|
|
||||||
cmds:
|
|
||||||
- "bin/{{.APP_NAME}}"
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
# Copyright (c) 2018-Present Lea Anthony
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
# Fail script on any error
|
|
||||||
set -euxo pipefail
|
|
||||||
|
|
||||||
# Define variables
|
|
||||||
APP_DIR="${APP_NAME}.AppDir"
|
|
||||||
|
|
||||||
# Create AppDir structure
|
|
||||||
mkdir -p "${APP_DIR}/usr/bin"
|
|
||||||
cp -r "${APP_BINARY}" "${APP_DIR}/usr/bin/"
|
|
||||||
cp "${ICON_PATH}" "${APP_DIR}/"
|
|
||||||
cp "${DESKTOP_FILE}" "${APP_DIR}/"
|
|
||||||
|
|
||||||
if [[ $(uname -m) == *x86_64* ]]; then
|
|
||||||
# Download linuxdeploy and make it executable
|
|
||||||
wget -q -4 -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
|
|
||||||
chmod +x linuxdeploy-x86_64.AppImage
|
|
||||||
|
|
||||||
# Run linuxdeploy to bundle the application
|
|
||||||
./linuxdeploy-x86_64.AppImage --appdir "${APP_DIR}" --output appimage
|
|
||||||
else
|
|
||||||
# Download linuxdeploy and make it executable (arm64)
|
|
||||||
wget -q -4 -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-aarch64.AppImage
|
|
||||||
chmod +x linuxdeploy-aarch64.AppImage
|
|
||||||
|
|
||||||
# Run linuxdeploy to bundle the application (arm64)
|
|
||||||
./linuxdeploy-aarch64.AppImage --appdir "${APP_DIR}" --output appimage
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Rename the generated AppImage
|
|
||||||
mv "${APP_NAME}*.AppImage" "${APP_NAME}.AppImage"
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
[Desktop Entry]
|
|
||||||
Version=1.0
|
|
||||||
Name=My Product
|
|
||||||
Comment=My Product Description
|
|
||||||
# The Exec line includes %u to pass the URL to the application
|
|
||||||
Exec=/usr/local/bin/desktop %u
|
|
||||||
Terminal=false
|
|
||||||
Type=Application
|
|
||||||
Icon=desktop
|
|
||||||
Categories=Utility;
|
|
||||||
StartupWMClass=desktop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
# Feel free to remove those if you don't want/need to use them.
|
|
||||||
# Make sure to check the documentation at https://nfpm.goreleaser.com
|
|
||||||
#
|
|
||||||
# The lines below are called `modelines`. See `:help modeline`
|
|
||||||
|
|
||||||
name: "desktop"
|
|
||||||
arch: ${GOARCH}
|
|
||||||
platform: "linux"
|
|
||||||
version: "0.1.0"
|
|
||||||
section: "default"
|
|
||||||
priority: "extra"
|
|
||||||
maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}>
|
|
||||||
description: "My Product Description"
|
|
||||||
vendor: "My Company"
|
|
||||||
homepage: "https://wails.io"
|
|
||||||
license: "MIT"
|
|
||||||
release: "1"
|
|
||||||
|
|
||||||
contents:
|
|
||||||
- src: "./bin/desktop"
|
|
||||||
dst: "/usr/local/bin/desktop"
|
|
||||||
- src: "./build/appicon.png"
|
|
||||||
dst: "/usr/share/icons/hicolor/128x128/apps/desktop.png"
|
|
||||||
- src: "./build/linux/desktop.desktop"
|
|
||||||
dst: "/usr/share/applications/desktop.desktop"
|
|
||||||
|
|
||||||
# Default dependencies for Debian 12/Ubuntu 22.04+ with WebKit 4.1
|
|
||||||
depends:
|
|
||||||
- libgtk-3-0
|
|
||||||
- libwebkit2gtk-4.1-0
|
|
||||||
|
|
||||||
# Distribution-specific overrides for different package formats and WebKit versions
|
|
||||||
overrides:
|
|
||||||
# RPM packages for RHEL/CentOS/AlmaLinux/Rocky Linux (WebKit 4.0)
|
|
||||||
rpm:
|
|
||||||
depends:
|
|
||||||
- gtk3
|
|
||||||
- webkit2gtk4.1
|
|
||||||
|
|
||||||
# Arch Linux packages (WebKit 4.1)
|
|
||||||
archlinux:
|
|
||||||
depends:
|
|
||||||
- gtk3
|
|
||||||
- webkit2gtk-4.1
|
|
||||||
|
|
||||||
# scripts section to ensure desktop database is updated after install
|
|
||||||
scripts:
|
|
||||||
postinstall: "./build/linux/nfpm/scripts/postinstall.sh"
|
|
||||||
# You can also add preremove, postremove if needed
|
|
||||||
# preremove: "./build/linux/nfpm/scripts/preremove.sh"
|
|
||||||
# postremove: "./build/linux/nfpm/scripts/postremove.sh"
|
|
||||||
|
|
||||||
# replaces:
|
|
||||||
# - foobar
|
|
||||||
# provides:
|
|
||||||
# - bar
|
|
||||||
# depends:
|
|
||||||
# - gtk3
|
|
||||||
# - libwebkit2gtk
|
|
||||||
# recommends:
|
|
||||||
# - whatever
|
|
||||||
# suggests:
|
|
||||||
# - something-else
|
|
||||||
# conflicts:
|
|
||||||
# - not-foo
|
|
||||||
# - not-bar
|
|
||||||
# changelog: "changelog.yaml"
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Update desktop database for .desktop file changes
|
|
||||||
# This makes the application appear in application menus and registers its capabilities.
|
|
||||||
if command -v update-desktop-database >/dev/null 2>&1; then
|
|
||||||
echo "Updating desktop database..."
|
|
||||||
update-desktop-database -q /usr/share/applications
|
|
||||||
else
|
|
||||||
echo "Warning: update-desktop-database command not found. Desktop file may not be immediately recognized." >&2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update MIME database for custom URL schemes (x-scheme-handler)
|
|
||||||
# This ensures the system knows how to handle your custom protocols.
|
|
||||||
if command -v update-mime-database >/dev/null 2>&1; then
|
|
||||||
echo "Updating MIME database..."
|
|
||||||
update-mime-database -n /usr/share/mime
|
|
||||||
else
|
|
||||||
echo "Warning: update-mime-database command not found. Custom URL schemes may not be immediately recognized." >&2
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
version: '3'
|
|
||||||
|
|
||||||
includes:
|
|
||||||
common: ../Taskfile.yml
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
build:
|
|
||||||
summary: Builds the application for Windows
|
|
||||||
deps:
|
|
||||||
- task: common:go:mod:tidy
|
|
||||||
- task: common:build:public
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS:
|
|
||||||
ref: .BUILD_FLAGS
|
|
||||||
PRODUCTION:
|
|
||||||
ref: .PRODUCTION
|
|
||||||
- task: common:generate:icons
|
|
||||||
cmds:
|
|
||||||
- task: generate:syso
|
|
||||||
- go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}.exe
|
|
||||||
- cmd: powershell Remove-item *.syso
|
|
||||||
platforms: [windows]
|
|
||||||
- cmd: rm -f *.syso
|
|
||||||
platforms: [linux, darwin]
|
|
||||||
vars:
|
|
||||||
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui"{{else}}-buildvcs=false -gcflags=all="-l"{{end}}'
|
|
||||||
env:
|
|
||||||
GOOS: windows
|
|
||||||
CGO_ENABLED: 0
|
|
||||||
GOARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
PRODUCTION: '{{.PRODUCTION | default "false"}}'
|
|
||||||
|
|
||||||
package:
|
|
||||||
summary: Packages a production build of the application
|
|
||||||
cmds:
|
|
||||||
- |-
|
|
||||||
if [ "{{.FORMAT | default "nsis"}}" = "msix" ]; then
|
|
||||||
task: create:msix:package
|
|
||||||
else
|
|
||||||
task: create:nsis:installer
|
|
||||||
fi
|
|
||||||
vars:
|
|
||||||
FORMAT: '{{.FORMAT | default "nsis"}}'
|
|
||||||
|
|
||||||
generate:syso:
|
|
||||||
summary: Generates Windows `.syso` file
|
|
||||||
dir: build
|
|
||||||
cmds:
|
|
||||||
- wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso
|
|
||||||
vars:
|
|
||||||
ARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
|
|
||||||
create:nsis:installer:
|
|
||||||
summary: Creates an NSIS installer
|
|
||||||
dir: build/windows/nsis
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
# Create the Microsoft WebView2 bootstrapper if it doesn't exist
|
|
||||||
- wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis"
|
|
||||||
- makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" project.nsi
|
|
||||||
vars:
|
|
||||||
ARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
|
|
||||||
|
|
||||||
create:msix:package:
|
|
||||||
summary: Creates an MSIX package
|
|
||||||
deps:
|
|
||||||
- task: build
|
|
||||||
vars:
|
|
||||||
PRODUCTION: "true"
|
|
||||||
cmds:
|
|
||||||
- |-
|
|
||||||
wails3 tool msix \
|
|
||||||
--config "{{.ROOT_DIR}}/wails.json" \
|
|
||||||
--name "{{.APP_NAME}}" \
|
|
||||||
--executable "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" \
|
|
||||||
--arch "{{.ARCH}}" \
|
|
||||||
--out "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}-{{.ARCH}}.msix" \
|
|
||||||
{{if .CERT_PATH}}--cert "{{.CERT_PATH}}"{{end}} \
|
|
||||||
{{if .PUBLISHER}}--publisher "{{.PUBLISHER}}"{{end}} \
|
|
||||||
{{if .USE_MSIX_TOOL}}--use-msix-tool{{else}}--use-makeappx{{end}}
|
|
||||||
vars:
|
|
||||||
ARCH: '{{.ARCH | default ARCH}}'
|
|
||||||
CERT_PATH: '{{.CERT_PATH | default ""}}'
|
|
||||||
PUBLISHER: '{{.PUBLISHER | default ""}}'
|
|
||||||
USE_MSIX_TOOL: '{{.USE_MSIX_TOOL | default "false"}}'
|
|
||||||
|
|
||||||
install:msix:tools:
|
|
||||||
summary: Installs tools required for MSIX packaging
|
|
||||||
cmds:
|
|
||||||
- wails3 tool msix-install-tools
|
|
||||||
|
|
||||||
run:
|
|
||||||
cmds:
|
|
||||||
- '{{.BIN_DIR}}/{{.APP_NAME}}.exe'
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB |
|
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"fixed": {
|
|
||||||
"file_version": "0.1.0"
|
|
||||||
},
|
|
||||||
"info": {
|
|
||||||
"0000": {
|
|
||||||
"ProductVersion": "0.1.0",
|
|
||||||
"CompanyName": "My Company",
|
|
||||||
"FileDescription": "My Product Description",
|
|
||||||
"LegalCopyright": "© now, My Company",
|
|
||||||
"ProductName": "My Product",
|
|
||||||
"Comments": "This is a comment"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Package
|
|
||||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
|
||||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
|
||||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
|
||||||
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10">
|
|
||||||
|
|
||||||
<Identity
|
|
||||||
Name="com.wails.desktop"
|
|
||||||
Publisher="CN=My Company"
|
|
||||||
Version="0.1.0.0"
|
|
||||||
ProcessorArchitecture="x64" />
|
|
||||||
|
|
||||||
<Properties>
|
|
||||||
<DisplayName>My Product</DisplayName>
|
|
||||||
<PublisherDisplayName>My Company</PublisherDisplayName>
|
|
||||||
<Description>My Product Description</Description>
|
|
||||||
<Logo>Assets\StoreLogo.png</Logo>
|
|
||||||
</Properties>
|
|
||||||
|
|
||||||
<Dependencies>
|
|
||||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
|
||||||
</Dependencies>
|
|
||||||
|
|
||||||
<Resources>
|
|
||||||
<Resource Language="en-us" />
|
|
||||||
</Resources>
|
|
||||||
|
|
||||||
<Applications>
|
|
||||||
<Application Id="com.wails.desktop" Executable="desktop" EntryPoint="Windows.FullTrustApplication">
|
|
||||||
<uap:VisualElements
|
|
||||||
DisplayName="My Product"
|
|
||||||
Description="My Product Description"
|
|
||||||
BackgroundColor="transparent"
|
|
||||||
Square150x150Logo="Assets\Square150x150Logo.png"
|
|
||||||
Square44x44Logo="Assets\Square44x44Logo.png">
|
|
||||||
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" />
|
|
||||||
<uap:SplashScreen Image="Assets\SplashScreen.png" />
|
|
||||||
</uap:VisualElements>
|
|
||||||
|
|
||||||
<Extensions>
|
|
||||||
<desktop:Extension Category="windows.fullTrustProcess" Executable="desktop" />
|
|
||||||
|
|
||||||
</Extensions>
|
|
||||||
</Application>
|
|
||||||
</Applications>
|
|
||||||
|
|
||||||
<Capabilities>
|
|
||||||
<rescap:Capability Name="runFullTrust" />
|
|
||||||
|
|
||||||
</Capabilities>
|
|
||||||
</Package>
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<MsixPackagingToolTemplate
|
|
||||||
xmlns="http://schemas.microsoft.com/msix/packaging/msixpackagingtool/template/2022">
|
|
||||||
<Settings
|
|
||||||
AllowTelemetry="false"
|
|
||||||
ApplyACLsToPackageFiles="true"
|
|
||||||
GenerateCommandLineFile="true"
|
|
||||||
AllowPromptForPassword="false">
|
|
||||||
</Settings>
|
|
||||||
<Installer
|
|
||||||
Path="desktop"
|
|
||||||
Arguments=""
|
|
||||||
InstallLocation="C:\Program Files\My Company\My Product">
|
|
||||||
</Installer>
|
|
||||||
<PackageInformation
|
|
||||||
PackageName="My Product"
|
|
||||||
PackageDisplayName="My Product"
|
|
||||||
PublisherName="CN=My Company"
|
|
||||||
PublisherDisplayName="My Company"
|
|
||||||
Version="0.1.0.0"
|
|
||||||
PackageDescription="My Product Description">
|
|
||||||
<Capabilities>
|
|
||||||
<Capability Name="runFullTrust" />
|
|
||||||
|
|
||||||
</Capabilities>
|
|
||||||
<Applications>
|
|
||||||
<Application
|
|
||||||
Id="com.wails.desktop"
|
|
||||||
Description="My Product Description"
|
|
||||||
DisplayName="My Product"
|
|
||||||
ExecutableName="desktop"
|
|
||||||
EntryPoint="Windows.FullTrustApplication">
|
|
||||||
|
|
||||||
</Application>
|
|
||||||
</Applications>
|
|
||||||
<Resources>
|
|
||||||
<Resource Language="en-us" />
|
|
||||||
</Resources>
|
|
||||||
<Dependencies>
|
|
||||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
|
||||||
</Dependencies>
|
|
||||||
<Properties>
|
|
||||||
<Framework>false</Framework>
|
|
||||||
<DisplayName>My Product</DisplayName>
|
|
||||||
<PublisherDisplayName>My Company</PublisherDisplayName>
|
|
||||||
<Description>My Product Description</Description>
|
|
||||||
<Logo>Assets\AppIcon.png</Logo>
|
|
||||||
</Properties>
|
|
||||||
</PackageInformation>
|
|
||||||
<SaveLocation PackagePath="desktop.msix" />
|
|
||||||
<PackageIntegrity>
|
|
||||||
<CertificatePath></CertificatePath>
|
|
||||||
</PackageIntegrity>
|
|
||||||
</MsixPackagingToolTemplate>
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
Unicode true
|
|
||||||
|
|
||||||
####
|
|
||||||
## Please note: Template replacements don't work in this file. They are provided with default defines like
|
|
||||||
## mentioned underneath.
|
|
||||||
## If the keyword is not defined, "wails_tools.nsh" will populate them.
|
|
||||||
## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually
|
|
||||||
## from outside of Wails for debugging and development of the installer.
|
|
||||||
##
|
|
||||||
## For development first make a wails nsis build to populate the "wails_tools.nsh":
|
|
||||||
## > wails build --target windows/amd64 --nsis
|
|
||||||
## Then you can call makensis on this file with specifying the path to your binary:
|
|
||||||
## For a AMD64 only installer:
|
|
||||||
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
|
|
||||||
## For a ARM64 only installer:
|
|
||||||
## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
|
|
||||||
## For a installer with both architectures:
|
|
||||||
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
|
|
||||||
####
|
|
||||||
## The following information is taken from the wails_tools.nsh file, but they can be overwritten here.
|
|
||||||
####
|
|
||||||
## !define INFO_PROJECTNAME "my-project" # Default "desktop"
|
|
||||||
## !define INFO_COMPANYNAME "My Company" # Default "My Company"
|
|
||||||
## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product"
|
|
||||||
## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0"
|
|
||||||
## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company"
|
|
||||||
###
|
|
||||||
## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
|
|
||||||
## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
|
|
||||||
####
|
|
||||||
## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html
|
|
||||||
####
|
|
||||||
## Include the wails tools
|
|
||||||
####
|
|
||||||
!include "wails_tools.nsh"
|
|
||||||
|
|
||||||
# The version information for this two must consist of 4 parts
|
|
||||||
VIProductVersion "${INFO_PRODUCTVERSION}.0"
|
|
||||||
VIFileVersion "${INFO_PRODUCTVERSION}.0"
|
|
||||||
|
|
||||||
VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
|
|
||||||
VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
|
|
||||||
VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
|
|
||||||
VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
|
|
||||||
VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
|
|
||||||
VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
|
|
||||||
|
|
||||||
# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
|
|
||||||
ManifestDPIAware true
|
|
||||||
|
|
||||||
!include "MUI.nsh"
|
|
||||||
|
|
||||||
!define MUI_ICON "..\icon.ico"
|
|
||||||
!define MUI_UNICON "..\icon.ico"
|
|
||||||
# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
|
|
||||||
!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
|
|
||||||
!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
|
|
||||||
# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES # Installing page.
|
|
||||||
!insertmacro MUI_PAGE_FINISH # Finished installation page.
|
|
||||||
|
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page
|
|
||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer
|
|
||||||
|
|
||||||
## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
|
|
||||||
#!uninstfinalize 'signtool --file "%1"'
|
|
||||||
#!finalize 'signtool --file "%1"'
|
|
||||||
|
|
||||||
Name "${INFO_PRODUCTNAME}"
|
|
||||||
OutFile "..\..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
|
|
||||||
InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
|
|
||||||
ShowInstDetails show # This will always show the installation details.
|
|
||||||
|
|
||||||
Function .onInit
|
|
||||||
!insertmacro wails.checkArchitecture
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Section
|
|
||||||
!insertmacro wails.setShellContext
|
|
||||||
|
|
||||||
!insertmacro wails.webview2runtime
|
|
||||||
|
|
||||||
SetOutPath $INSTDIR
|
|
||||||
|
|
||||||
!insertmacro wails.files
|
|
||||||
|
|
||||||
CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
|
||||||
CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
|
||||||
|
|
||||||
!insertmacro wails.associateFiles
|
|
||||||
!insertmacro wails.associateCustomProtocols
|
|
||||||
|
|
||||||
!insertmacro wails.writeUninstaller
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Section "uninstall"
|
|
||||||
!insertmacro wails.setShellContext
|
|
||||||
|
|
||||||
RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath
|
|
||||||
|
|
||||||
RMDir /r $INSTDIR
|
|
||||||
|
|
||||||
Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
|
|
||||||
Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
|
|
||||||
|
|
||||||
!insertmacro wails.unassociateFiles
|
|
||||||
!insertmacro wails.unassociateCustomProtocols
|
|
||||||
|
|
||||||
!insertmacro wails.deleteUninstaller
|
|
||||||
SectionEnd
|
|
||||||
|
|
@ -1,236 +0,0 @@
|
||||||
# DO NOT EDIT - Generated automatically by `wails build`
|
|
||||||
|
|
||||||
!include "x64.nsh"
|
|
||||||
!include "WinVer.nsh"
|
|
||||||
!include "FileFunc.nsh"
|
|
||||||
|
|
||||||
!ifndef INFO_PROJECTNAME
|
|
||||||
!define INFO_PROJECTNAME "desktop"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_COMPANYNAME
|
|
||||||
!define INFO_COMPANYNAME "My Company"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_PRODUCTNAME
|
|
||||||
!define INFO_PRODUCTNAME "My Product"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_PRODUCTVERSION
|
|
||||||
!define INFO_PRODUCTVERSION "0.1.0"
|
|
||||||
!endif
|
|
||||||
!ifndef INFO_COPYRIGHT
|
|
||||||
!define INFO_COPYRIGHT "© now, My Company"
|
|
||||||
!endif
|
|
||||||
!ifndef PRODUCT_EXECUTABLE
|
|
||||||
!define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
|
|
||||||
!endif
|
|
||||||
!ifndef UNINST_KEY_NAME
|
|
||||||
!define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
|
|
||||||
!endif
|
|
||||||
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
|
|
||||||
|
|
||||||
!ifndef REQUEST_EXECUTION_LEVEL
|
|
||||||
!define REQUEST_EXECUTION_LEVEL "admin"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
|
|
||||||
|
|
||||||
!ifdef ARG_WAILS_AMD64_BINARY
|
|
||||||
!define SUPPORTS_AMD64
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef ARG_WAILS_ARM64_BINARY
|
|
||||||
!define SUPPORTS_ARM64
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef SUPPORTS_AMD64
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
!define ARCH "amd64_arm64"
|
|
||||||
!else
|
|
||||||
!define ARCH "amd64"
|
|
||||||
!endif
|
|
||||||
!else
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
!define ARCH "arm64"
|
|
||||||
!else
|
|
||||||
!error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
|
|
||||||
!endif
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!macro wails.checkArchitecture
|
|
||||||
!ifndef WAILS_WIN10_REQUIRED
|
|
||||||
!define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
|
|
||||||
!define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
${If} ${AtLeastWin10}
|
|
||||||
!ifdef SUPPORTS_AMD64
|
|
||||||
${if} ${IsNativeAMD64}
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
${if} ${IsNativeARM64}
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
|
|
||||||
IfSilent silentArch notSilentArch
|
|
||||||
silentArch:
|
|
||||||
SetErrorLevel 65
|
|
||||||
Abort
|
|
||||||
notSilentArch:
|
|
||||||
MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
|
|
||||||
Quit
|
|
||||||
${else}
|
|
||||||
IfSilent silentWin notSilentWin
|
|
||||||
silentWin:
|
|
||||||
SetErrorLevel 64
|
|
||||||
Abort
|
|
||||||
notSilentWin:
|
|
||||||
MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
|
|
||||||
Quit
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
ok:
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.files
|
|
||||||
!ifdef SUPPORTS_AMD64
|
|
||||||
${if} ${IsNativeAMD64}
|
|
||||||
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!ifdef SUPPORTS_ARM64
|
|
||||||
${if} ${IsNativeARM64}
|
|
||||||
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
|
|
||||||
${EndIf}
|
|
||||||
!endif
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.writeUninstaller
|
|
||||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
SetRegView 64
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
|
|
||||||
WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
|
|
||||||
|
|
||||||
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
|
|
||||||
IntFmt $0 "0x%08X" $0
|
|
||||||
WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.deleteUninstaller
|
|
||||||
Delete "$INSTDIR\uninstall.exe"
|
|
||||||
|
|
||||||
SetRegView 64
|
|
||||||
DeleteRegKey HKLM "${UNINST_KEY}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.setShellContext
|
|
||||||
${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
|
|
||||||
SetShellVarContext all
|
|
||||||
${else}
|
|
||||||
SetShellVarContext current
|
|
||||||
${EndIf}
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
# Install webview2 by launching the bootstrapper
|
|
||||||
# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
|
|
||||||
!macro wails.webview2runtime
|
|
||||||
!ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
|
|
||||||
!define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
|
|
||||||
!endif
|
|
||||||
|
|
||||||
SetRegView 64
|
|
||||||
# If the admin key exists and is not empty then webview2 is already installed
|
|
||||||
ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${If} $0 != ""
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
${If} ${REQUEST_EXECUTION_LEVEL} == "user"
|
|
||||||
# If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
|
|
||||||
ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
|
||||||
${If} $0 != ""
|
|
||||||
Goto ok
|
|
||||||
${EndIf}
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
SetDetailsPrint both
|
|
||||||
DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
|
|
||||||
SetDetailsPrint listonly
|
|
||||||
|
|
||||||
InitPluginsDir
|
|
||||||
CreateDirectory "$pluginsdir\webview2bootstrapper"
|
|
||||||
SetOutPath "$pluginsdir\webview2bootstrapper"
|
|
||||||
File "MicrosoftEdgeWebview2Setup.exe"
|
|
||||||
ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'
|
|
||||||
|
|
||||||
SetDetailsPrint both
|
|
||||||
ok:
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
|
|
||||||
!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
|
|
||||||
; Backup the previously associated file class
|
|
||||||
ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
|
|
||||||
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
|
|
||||||
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro APP_UNASSOCIATE EXT FILECLASS
|
|
||||||
; Backup the previously associated file class
|
|
||||||
ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
|
|
||||||
|
|
||||||
DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.associateFiles
|
|
||||||
; Create file associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.unassociateFiles
|
|
||||||
; Delete app associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro CUSTOM_PROTOCOL_ASSOCIATE PROTOCOL DESCRIPTION ICON COMMAND
|
|
||||||
DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "" "${DESCRIPTION}"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "URL Protocol" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\DefaultIcon" "" "${ICON}"
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell" "" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open" "" ""
|
|
||||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open\command" "" "${COMMAND}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro CUSTOM_PROTOCOL_UNASSOCIATE PROTOCOL
|
|
||||||
DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.associateCustomProtocols
|
|
||||||
; Create custom protocols associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
||||||
!macro wails.unassociateCustomProtocols
|
|
||||||
; Delete app custom protocol associations
|
|
||||||
|
|
||||||
!macroend
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<assemblyIdentity type="win32" name="com.wails.desktop" version="0.1.0" processorArchitecture="*"/>
|
|
||||||
<dependency>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
|
|
||||||
</dependentAssembly>
|
|
||||||
</dependency>
|
|
||||||
<asmv3:application>
|
|
||||||
<asmv3:windowsSettings>
|
|
||||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
|
|
||||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported -->
|
|
||||||
</asmv3:windowsSettings>
|
|
||||||
</asmv3:application>
|
|
||||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<security>
|
|
||||||
<requestedPrivileges>
|
|
||||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
|
||||||
</requestedPrivileges>
|
|
||||||
</security>
|
|
||||||
</trustInfo>
|
|
||||||
</assembly>
|
|
||||||
|
|
@ -1,157 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
)
|
|
||||||
|
|
||||||
var wsUpgrader = websocket.Upgrader{
|
|
||||||
ReadBufferSize: 1024,
|
|
||||||
WriteBufferSize: 1024,
|
|
||||||
CheckOrigin: func(r *http.Request) bool {
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClaudeBridge forwards messages between GUI clients and the MCP core WebSocket.
|
|
||||||
type ClaudeBridge struct {
|
|
||||||
mcpConn *websocket.Conn
|
|
||||||
mcpURL string
|
|
||||||
clients map[*websocket.Conn]bool
|
|
||||||
clientsMu sync.RWMutex
|
|
||||||
broadcast chan []byte
|
|
||||||
reconnectMu sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClaudeBridge creates a new bridge to the MCP core WebSocket.
|
|
||||||
func NewClaudeBridge(mcpURL string) *ClaudeBridge {
|
|
||||||
return &ClaudeBridge{
|
|
||||||
mcpURL: mcpURL,
|
|
||||||
clients: make(map[*websocket.Conn]bool),
|
|
||||||
broadcast: make(chan []byte, 256),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start connects to the MCP WebSocket and starts the bridge.
|
|
||||||
func (cb *ClaudeBridge) Start() {
|
|
||||||
go cb.connectToMCP()
|
|
||||||
go cb.broadcastLoop()
|
|
||||||
}
|
|
||||||
|
|
||||||
// connectToMCP establishes connection to the MCP core WebSocket.
|
|
||||||
func (cb *ClaudeBridge) connectToMCP() {
|
|
||||||
for {
|
|
||||||
cb.reconnectMu.Lock()
|
|
||||||
if cb.mcpConn != nil {
|
|
||||||
cb.mcpConn.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("Claude bridge connecting to MCP at %s", cb.mcpURL)
|
|
||||||
conn, _, err := websocket.DefaultDialer.Dial(cb.mcpURL, nil)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge failed to connect to MCP: %v", err)
|
|
||||||
cb.reconnectMu.Unlock()
|
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
cb.mcpConn = conn
|
|
||||||
cb.reconnectMu.Unlock()
|
|
||||||
log.Printf("Claude bridge connected to MCP")
|
|
||||||
|
|
||||||
// Read messages from MCP and broadcast to clients
|
|
||||||
for {
|
|
||||||
_, message, err := conn.ReadMessage()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge MCP read error: %v", err)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
cb.broadcast <- message
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connection lost, retry
|
|
||||||
time.Sleep(2 * time.Second)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// broadcastLoop sends messages from MCP to all connected clients.
|
|
||||||
func (cb *ClaudeBridge) broadcastLoop() {
|
|
||||||
for message := range cb.broadcast {
|
|
||||||
cb.clientsMu.RLock()
|
|
||||||
for client := range cb.clients {
|
|
||||||
err := client.WriteMessage(websocket.TextMessage, message)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge client write error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cb.clientsMu.RUnlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleWebSocket handles WebSocket connections from GUI clients.
|
|
||||||
func (cb *ClaudeBridge) HandleWebSocket(w http.ResponseWriter, r *http.Request) {
|
|
||||||
conn, err := wsUpgrader.Upgrade(w, r, nil)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge upgrade error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
cb.clientsMu.Lock()
|
|
||||||
cb.clients[conn] = true
|
|
||||||
cb.clientsMu.Unlock()
|
|
||||||
|
|
||||||
// Send connected message
|
|
||||||
connMsg, _ := json.Marshal(map[string]any{
|
|
||||||
"type": "system",
|
|
||||||
"data": "Connected to Claude bridge",
|
|
||||||
"timestamp": time.Now(),
|
|
||||||
})
|
|
||||||
conn.WriteMessage(websocket.TextMessage, connMsg)
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
cb.clientsMu.Lock()
|
|
||||||
delete(cb.clients, conn)
|
|
||||||
cb.clientsMu.Unlock()
|
|
||||||
conn.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Read messages from client and forward to MCP
|
|
||||||
for {
|
|
||||||
_, message, err := conn.ReadMessage()
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the message to check type
|
|
||||||
var msg map[string]any
|
|
||||||
if err := json.Unmarshal(message, &msg); err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forward claude_message to MCP
|
|
||||||
if msgType, ok := msg["type"].(string); ok && msgType == "claude_message" {
|
|
||||||
cb.sendToMCP(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// sendToMCP sends a message to the MCP WebSocket.
|
|
||||||
func (cb *ClaudeBridge) sendToMCP(message []byte) {
|
|
||||||
cb.reconnectMu.Lock()
|
|
||||||
defer cb.reconnectMu.Unlock()
|
|
||||||
|
|
||||||
if cb.mcpConn == nil {
|
|
||||||
log.Printf("Claude bridge: MCP not connected")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err := cb.mcpConn.WriteMessage(websocket.TextMessage, message)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Claude bridge MCP write error: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
node_modules
|
|
||||||
npm-debug.log
|
|
||||||
Dockerfile
|
|
||||||
.dockerignore
|
|
||||||
.env
|
|
||||||
.git
|
|
||||||
.gitignore
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
# Editor configuration, see https://editorconfig.org
|
|
||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
charset = utf-8
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
insert_final_newline = true
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[*.ts]
|
|
||||||
quote_type = single
|
|
||||||
ij_typescript_use_double_quotes = false
|
|
||||||
|
|
||||||
[*.md]
|
|
||||||
max_line_length = off
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
42
cmd/core-gui/frontend.old/.gitignore
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
|
|
||||||
.npmrc
|
|
||||||
# Compiled output
|
|
||||||
/dist
|
|
||||||
/tmp
|
|
||||||
/out-tsc
|
|
||||||
/bazel-out
|
|
||||||
|
|
||||||
# Node
|
|
||||||
/node_modules
|
|
||||||
npm-debug.log
|
|
||||||
yarn-error.log
|
|
||||||
|
|
||||||
# IDEs and editors
|
|
||||||
.idea/
|
|
||||||
.project
|
|
||||||
.classpath
|
|
||||||
.c9/
|
|
||||||
*.launch
|
|
||||||
.settings/
|
|
||||||
*.sublime-workspace
|
|
||||||
|
|
||||||
# Visual Studio Code
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
.history/*
|
|
||||||
|
|
||||||
# Miscellaneous
|
|
||||||
/.angular/cache
|
|
||||||
.sass-cache/
|
|
||||||
/connect.lock
|
|
||||||
/coverage
|
|
||||||
/libpeerconnection.log
|
|
||||||
testem.log
|
|
||||||
/typings
|
|
||||||
|
|
||||||
# System files
|
|
||||||
.DS_Store
|
|
||||||
Thumbs.db
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
### Installation
|
|
||||||
- `npm install` (install dependencies)
|
|
||||||
- `npm outdated` (verify dependency status)
|
|
||||||
|
|
||||||
### Development
|
|
||||||
- `npm run start`
|
|
||||||
- Visit http://localhost:4200
|
|
||||||
|
|
||||||
## Lint
|
|
||||||
- `npm run lint`
|
|
||||||
|
|
||||||
## Tests (headless-ready, no Chrome required)
|
|
||||||
- Unit/integration: `npm run test` (opens browser), or:
|
|
||||||
- Headless (uses Puppeteer Chromium): `npm run test:headless`
|
|
||||||
- Coverage report (HTML + text-summary): `npm run coverage`
|
|
||||||
- Coverage thresholds are enforced in Karma (≈80% statements/lines/functions, 70% branches for global). Adjust in `karma.conf.js` if needed.
|
|
||||||
|
|
||||||
### TDD workflow and test naming (Good/Bad/Ugly)
|
|
||||||
- Follow strict TDD:
|
|
||||||
1) Write failing tests from user stories + acceptance criteria
|
|
||||||
2) Implement minimal code to pass
|
|
||||||
3) Refactor
|
|
||||||
- Test case naming convention: each logical test should have three variants to clarify intent and data quality.
|
|
||||||
- Example helpers in `src/testing/gbu.ts`:
|
|
||||||
```ts
|
|
||||||
import { itGood, itBad, itUgly, trio } from 'src/testing/gbu';
|
|
||||||
|
|
||||||
itGood('saves profile', () => {/* valid data */});
|
|
||||||
itBad('saves profile', () => {/* incorrect data (edge) */});
|
|
||||||
itUgly('saves profile', () => {/* invalid data/conditions */});
|
|
||||||
|
|
||||||
// Or use trio
|
|
||||||
trio('process order', {
|
|
||||||
good: () => {/* ... */},
|
|
||||||
bad: () => {/* ... */},
|
|
||||||
ugly: () => {/* ... */},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
- Do not modify router-outlet containers in tests/components.
|
|
||||||
|
|
||||||
### Standalone Angular 20+ patterns (migration notes)
|
|
||||||
- This app is moving to Angular standalone APIs. Prefer:
|
|
||||||
- Standalone components (`standalone: true`, add `imports: []` per component)
|
|
||||||
- `provideRouter(...)`, `provideHttpClient(...)`, `provideServiceWorker(...)` in `app.config.ts`
|
|
||||||
- Translation is configured via `app.config.ts` using `TranslateModule.forRoot(...)` and an HTTP loader.
|
|
||||||
- Legacy NgModules should be converted progressively. If an `NgModule` remains but is unrouted/unreferenced, keep it harmlessly until deletion is approved. Do not alter the main router-outlet page context panel.
|
|
||||||
|
|
||||||
### Web Awesome + Font Awesome (Pro)
|
|
||||||
- Both Font Awesome and Web Awesome are integrated. Do not remove. Web Awesome assets are copied via `angular.json` assets, and its base path is set at runtime in `app.ts`:
|
|
||||||
```ts
|
|
||||||
import('@awesome.me/webawesome').then(m => m.setBasePath('/assets/web-awesome'));
|
|
||||||
```
|
|
||||||
- CSS includes are defined in `angular.json` and `src/styles.css`.
|
|
||||||
|
|
||||||
### SSR and production
|
|
||||||
- Build (browser + server): `npm run build`
|
|
||||||
- Serve SSR bundle: `npm run serve` → http://localhost:4000
|
|
||||||
|
|
||||||
### Notes for other LLMs / contributors
|
|
||||||
- Respect the constraints:
|
|
||||||
- Do NOT edit the router-outlet main panel; pages/services are the focus
|
|
||||||
- Preserve existing functionality; do not remove Web Awesome/Font Awesome
|
|
||||||
- Use strict TDD and Good/Bad/Ugly naming for tests
|
|
||||||
- Keep or improve code coverage ≥ configured thresholds for changed files
|
|
||||||
- Use Angular 20+ standalone patterns; update `app.config.ts` for global providers.
|
|
||||||
- For tests, prefer headless runs via Puppeteer (no local Chrome needed).
|
|
||||||
|
|
||||||
### Author
|
|
||||||
- Author: danny
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
|
||||||
"version": 1,
|
|
||||||
"newProjectRoot": "projects",
|
|
||||||
"projects": {
|
|
||||||
"lthn.io": {
|
|
||||||
"projectType": "application",
|
|
||||||
"schematics": {},
|
|
||||||
"root": "",
|
|
||||||
"sourceRoot": "src",
|
|
||||||
"prefix": "app",
|
|
||||||
"architect": {
|
|
||||||
"build": {
|
|
||||||
"builder": "@angular/build:application",
|
|
||||||
"options": {
|
|
||||||
"browser": "src/main.ts",
|
|
||||||
"polyfills": [
|
|
||||||
"zone.js"
|
|
||||||
],
|
|
||||||
"tsConfig": "tsconfig.app.json",
|
|
||||||
"assets": [
|
|
||||||
{
|
|
||||||
"glob": "**/*",
|
|
||||||
"input": "public"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"glob": "@awesome.me/webawesome/**/*.*",
|
|
||||||
"input": "node_modules/",
|
|
||||||
"output": "/"
|
|
||||||
},
|
|
||||||
"src/sitemap.xml",
|
|
||||||
"src/robots.txt"
|
|
||||||
],
|
|
||||||
"styles": [
|
|
||||||
"node_modules/@fortawesome/fontawesome-free/css/all.min.css",
|
|
||||||
"src/styles.css"
|
|
||||||
],
|
|
||||||
"scripts": [],
|
|
||||||
"define": {
|
|
||||||
"import.meta.vitest": "undefined"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"configurations": {
|
|
||||||
"production": {
|
|
||||||
"budgets": [
|
|
||||||
{
|
|
||||||
"type": "initial",
|
|
||||||
"maximumWarning": "1MB",
|
|
||||||
"maximumError": "1MB"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "anyComponentStyle",
|
|
||||||
"maximumWarning": "4kB",
|
|
||||||
"maximumError": "8kB"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputHashing": "all",
|
|
||||||
"serviceWorker": "ngsw-config.json",
|
|
||||||
"server": "src/main.server.ts",
|
|
||||||
"outputMode": "server",
|
|
||||||
"ssr": {
|
|
||||||
"entry": "src/server.ts"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"development": {
|
|
||||||
"optimization": false,
|
|
||||||
"extractLicenses": false,
|
|
||||||
"sourceMap": true,
|
|
||||||
"fileReplacements": [
|
|
||||||
{
|
|
||||||
"replace": "src/environments/environment.ts",
|
|
||||||
"with": "src/environments/environment.development.ts"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"defaultConfiguration": "development"
|
|
||||||
},
|
|
||||||
"serve": {
|
|
||||||
"builder": "@angular/build:dev-server",
|
|
||||||
"configurations": {
|
|
||||||
"production": {
|
|
||||||
"buildTarget": "lthn.io:build:production"
|
|
||||||
},
|
|
||||||
"development": {
|
|
||||||
"buildTarget": "lthn.io:build:development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"defaultConfiguration": "development"
|
|
||||||
},
|
|
||||||
"extract-i18n": {
|
|
||||||
"builder": "@angular/build:extract-i18n"
|
|
||||||
},
|
|
||||||
"test": {
|
|
||||||
"builder": "@angular/build:karma",
|
|
||||||
"options": {
|
|
||||||
"polyfills": [
|
|
||||||
"zone.js",
|
|
||||||
"zone.js/testing",
|
|
||||||
"src/test.ts"
|
|
||||||
],
|
|
||||||
"tsConfig": "tsconfig.spec.json",
|
|
||||||
"assets": [
|
|
||||||
{
|
|
||||||
"glob": "**/*",
|
|
||||||
"input": "public"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"styles": [
|
|
||||||
"src/styles.css"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lint": {
|
|
||||||
"builder": "@angular-eslint/builder:lint",
|
|
||||||
"options": {
|
|
||||||
"lintFilePatterns": [
|
|
||||||
"src/**/*.ts",
|
|
||||||
"src/**/*.html"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"cli": {
|
|
||||||
"schematicCollections": [
|
|
||||||
"angular-eslint"
|
|
||||||
],
|
|
||||||
"analytics": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
// @ts-check
|
|
||||||
const eslint = require("@eslint/js");
|
|
||||||
const tseslint = require("typescript-eslint");
|
|
||||||
const angular = require("angular-eslint");
|
|
||||||
|
|
||||||
module.exports = tseslint.config(
|
|
||||||
{
|
|
||||||
files: ["**/*.ts"],
|
|
||||||
extends: [
|
|
||||||
eslint.configs.recommended,
|
|
||||||
...tseslint.configs.recommended,
|
|
||||||
...tseslint.configs.stylistic,
|
|
||||||
...angular.configs.tsRecommended,
|
|
||||||
],
|
|
||||||
processor: angular.processInlineTemplates,
|
|
||||||
rules: {
|
|
||||||
"@angular-eslint/directive-selector": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
type: "attribute",
|
|
||||||
prefix: "app",
|
|
||||||
style: "camelCase",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"@angular-eslint/component-selector": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
type: "element",
|
|
||||||
prefix: "app",
|
|
||||||
style: "kebab-case",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"@angular-eslint/component-class-suffix": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
suffixes: ["", "Component"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"@angular-eslint/prefer-inject": "off",
|
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
|
||||||
"@typescript-eslint/no-unused-vars": [
|
|
||||||
"error",
|
|
||||||
{ "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }
|
|
||||||
],
|
|
||||||
"no-undefined": "off",
|
|
||||||
"no-var": "error",
|
|
||||||
"prefer-const": "error",
|
|
||||||
"func-names": "error",
|
|
||||||
"id-length": "error",
|
|
||||||
"newline-before-return": "error",
|
|
||||||
"space-before-blocks": "error",
|
|
||||||
"no-alert": "error"
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ["**/*.html"],
|
|
||||||
extends: [
|
|
||||||
...angular.configs.templateRecommended,
|
|
||||||
...angular.configs.templateAccessibility,
|
|
||||||
],
|
|
||||||
rules: {},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
process.env.CHROME_BIN = process.env.CHROME_BIN || (function() {
|
|
||||||
try { return require('puppeteer').executablePath(); } catch { return undefined; }
|
|
||||||
})();
|
|
||||||
|
|
||||||
module.exports = function (config) {
|
|
||||||
config.set({
|
|
||||||
basePath: '',
|
|
||||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
|
||||||
plugins: [
|
|
||||||
require('karma-jasmine'),
|
|
||||||
require('karma-chrome-launcher'),
|
|
||||||
require('karma-jasmine-html-reporter'),
|
|
||||||
require('karma-coverage'),
|
|
||||||
require('@angular-devkit/build-angular/plugins/karma')
|
|
||||||
],
|
|
||||||
client: {
|
|
||||||
jasmine: {
|
|
||||||
// you can add configuration options for Jasmine here
|
|
||||||
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
|
||||||
// for example, you can disable the random execution order
|
|
||||||
random: true
|
|
||||||
},
|
|
||||||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
|
||||||
},
|
|
||||||
jasmineHtmlReporter: {
|
|
||||||
suppressAll: true // removes the duplicated traces
|
|
||||||
},
|
|
||||||
coverageReporter: {
|
|
||||||
dir: require('path').join(__dirname, './coverage/angular-starter'),
|
|
||||||
subdir: '.',
|
|
||||||
reporters: [
|
|
||||||
{ type: 'html' },
|
|
||||||
{ type: 'text-summary' }
|
|
||||||
],
|
|
||||||
check: {
|
|
||||||
global: {
|
|
||||||
statements: 80,
|
|
||||||
branches: 70,
|
|
||||||
functions: 80,
|
|
||||||
lines: 80
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
reporters: ['progress', 'kjhtml'],
|
|
||||||
browsers: ['Chrome'],
|
|
||||||
customLaunchers: {
|
|
||||||
ChromeHeadless: {
|
|
||||||
base: 'Chrome',
|
|
||||||
flags: [
|
|
||||||
'--headless',
|
|
||||||
'--disable-gpu',
|
|
||||||
'--no-sandbox',
|
|
||||||
'--disable-dev-shm-usage',
|
|
||||||
'--disable-web-security',
|
|
||||||
'--remote-debugging-port=9222'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
restartOnFileChange: true
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
|
|
||||||
"index": "/index.html",
|
|
||||||
"assetGroups": [
|
|
||||||
{
|
|
||||||
"name": "app",
|
|
||||||
"installMode": "prefetch",
|
|
||||||
"resources": {
|
|
||||||
"files": [
|
|
||||||
"/favicon.ico",
|
|
||||||
"/index.csr.html",
|
|
||||||
"/index.html",
|
|
||||||
"/manifest.webmanifest",
|
|
||||||
"/*.css",
|
|
||||||
"/*.js"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "assets",
|
|
||||||
"installMode": "lazy",
|
|
||||||
"updateMode": "prefetch",
|
|
||||||
"resources": {
|
|
||||||
"files": [
|
|
||||||
"/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
12685
cmd/core-gui/frontend.old/package-lock.json
generated
|
|
@ -1,60 +0,0 @@
|
||||||
{
|
|
||||||
"name": "lthn.io",
|
|
||||||
"version": "20.3.2",
|
|
||||||
"scripts": {
|
|
||||||
"ng": "ng",
|
|
||||||
"dev": "ng serve --port 4200",
|
|
||||||
"start": "ng serve --port 4200",
|
|
||||||
"build": "ng build",
|
|
||||||
"watch": "ng build --watch --configuration development",
|
|
||||||
"preview": "http-server ./dist/lthn-dns-web/browser -o",
|
|
||||||
"puppeteer:install": "npx puppeteer browsers install chrome || true",
|
|
||||||
"test": "ng test",
|
|
||||||
"test:headless": "(export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\"; ng test --no-watch --code-coverage=false --browsers=ChromeHeadless) || (npm run puppeteer:install && export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\" && ng test --no-watch --code-coverage=false --browsers=ChromeHeadless)",
|
|
||||||
"coverage": "(export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\"; ng test --no-watch --code-coverage --browsers=ChromeHeadless) || (npm run puppeteer:install && export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\" && ng test --no-watch --code-coverage --browsers=ChromeHeadless)",
|
|
||||||
"lint": "ng lint",
|
|
||||||
"serve": "node dist/angular-starter/server/server.mjs"
|
|
||||||
},
|
|
||||||
"private": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@angular/common": "^20.3.2",
|
|
||||||
"@angular/compiler": "^20.3.2",
|
|
||||||
"@angular/core": "^20.3.2",
|
|
||||||
"@angular/forms": "^20.3.2",
|
|
||||||
"@angular/platform-browser": "^20.3.2",
|
|
||||||
"@angular/platform-server": "^20.3.2",
|
|
||||||
"@angular/router": "^20.3.2",
|
|
||||||
"@angular/service-worker": "^20.3.2",
|
|
||||||
"@angular/ssr": "^20.3.3",
|
|
||||||
"@awesome.me/kit-2e7e02d1b1": "^1.0.6",
|
|
||||||
"@awesome.me/webawesome": "file:~/Code/lib/webawesome",
|
|
||||||
"@fortawesome/fontawesome-free": "^7.0.1",
|
|
||||||
"@ngx-translate/core": "^17.0.0",
|
|
||||||
"@ngx-translate/http-loader": "^17.0.0",
|
|
||||||
"bootstrap": "^5.3.8",
|
|
||||||
"express": "^5.1.0",
|
|
||||||
"rxjs": "^7.8.2",
|
|
||||||
"tslib": "^2.8.1",
|
|
||||||
"uuid": "^13.0.0",
|
|
||||||
"zone.js": "^0.15.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@angular/build": "^20.3.3",
|
|
||||||
"@angular/cli": "^20.3.3",
|
|
||||||
"@angular/compiler-cli": "^20.3.2",
|
|
||||||
"@types/express": "^5.0.3",
|
|
||||||
"@types/jasmine": "^5.1.9",
|
|
||||||
"@types/node": "^24.6.0",
|
|
||||||
"angular-eslint": "^20.3.0",
|
|
||||||
"eslint": "^9.36.0",
|
|
||||||
"jasmine-core": "^5.11.0",
|
|
||||||
"karma": "^6.4.4",
|
|
||||||
"karma-chrome-launcher": "^3.2.0",
|
|
||||||
"karma-coverage": "^2.2.1",
|
|
||||||
"karma-jasmine": "^5.1.0",
|
|
||||||
"karma-jasmine-html-reporter": "^2.1.0",
|
|
||||||
"puppeteer": "^23.7.0",
|
|
||||||
"typescript": "~5.8.3",
|
|
||||||
"typescript-eslint": "^8.45.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 15 KiB |
|
|
@ -1,331 +0,0 @@
|
||||||
{ "app": {
|
|
||||||
"title": "Bob Wallet"
|
|
||||||
},
|
|
||||||
"sidebar": {
|
|
||||||
"wallet": "Wallet",
|
|
||||||
"topLevelDomains": "Top Level Domains",
|
|
||||||
"miscellaneous": "Miscellaneous",
|
|
||||||
"portfolio": "Portfolio",
|
|
||||||
"send": "Send",
|
|
||||||
"receive": "Receive",
|
|
||||||
"domainManager": "Domain Manager",
|
|
||||||
"browseDomains": "Browse Domains",
|
|
||||||
"yourBids": "Your Bids",
|
|
||||||
"watching": "Watching",
|
|
||||||
"exchange": "Exchange",
|
|
||||||
"claimAirdrop": "Claim Airdrop",
|
|
||||||
"signMessage": "Sign Message",
|
|
||||||
"verifyMessage": "Verify Message",
|
|
||||||
"currentHeight": "Current Height",
|
|
||||||
"currentHash": "Current Hash"
|
|
||||||
},
|
|
||||||
"topbar": {
|
|
||||||
"searchPlaceholder": "Search TLD",
|
|
||||||
"synced": "Synced",
|
|
||||||
"walletID": "Wallet ID",
|
|
||||||
"spendableBalance": "Spendable Balance",
|
|
||||||
"network": "Network",
|
|
||||||
"settings": "Settings",
|
|
||||||
"logout": "Logout"
|
|
||||||
},
|
|
||||||
"home": {
|
|
||||||
"spendable": "Spendable",
|
|
||||||
"locked": "Locked",
|
|
||||||
"revealable": "Revealable",
|
|
||||||
"redeemable": "Redeemable",
|
|
||||||
"registerable": "Registerable",
|
|
||||||
"renewable": "Renewable",
|
|
||||||
"transferring": "Transferring",
|
|
||||||
"finalizable": "Finalizable",
|
|
||||||
"inBids": "In bids",
|
|
||||||
"bid": "bid",
|
|
||||||
"bids": "bids",
|
|
||||||
"revealAll": "Reveal All",
|
|
||||||
"redeemAll": "Redeem All",
|
|
||||||
"registerAll": "Register All",
|
|
||||||
"renewAll": "Renew All",
|
|
||||||
"finalizeAll": "Finalize All",
|
|
||||||
"bidsReadyToReveal": "{{count}} bids ready to reveal",
|
|
||||||
"bidsReadyToRedeem": "{{count}} bids ready to redeem",
|
|
||||||
"namesReadyToRegister": "{{count}} names ready to register",
|
|
||||||
"domainsExpiringSoon": "{{count}} domains expiring soon",
|
|
||||||
"domainsInTransfer": "{{count}} domains in transfer",
|
|
||||||
"transfersReadyToFinalize": "{{count}} transfers ready to finalize",
|
|
||||||
"transactionHistory": "Transaction History",
|
|
||||||
"noTransactions": "No transactions yet. Transaction history will appear here once you start using the wallet."
|
|
||||||
},
|
|
||||||
"domainManager": {
|
|
||||||
"searchPlaceholder": "Search domains...",
|
|
||||||
"export": "Export",
|
|
||||||
"bulkTransfer": "Bulk Transfer",
|
|
||||||
"claimNamePayment": "Claim Name for Payment",
|
|
||||||
"emptyState": "You do not own any names yet.",
|
|
||||||
"browseDomainsLink": "Browse domains",
|
|
||||||
"toGetStarted": "to get started.",
|
|
||||||
"name": "Name",
|
|
||||||
"expires": "Expires",
|
|
||||||
"highestBid": "Highest Bid",
|
|
||||||
"showingDomains": "Showing {{count}} domains"
|
|
||||||
},
|
|
||||||
"exchange": {
|
|
||||||
"listings": "Listings",
|
|
||||||
"fills": "Fills",
|
|
||||||
"auctions": "Auctions",
|
|
||||||
"yourListings": "Your Listings",
|
|
||||||
"yourFills": "Your Fills",
|
|
||||||
"marketplaceAuctions": "Marketplace Auctions",
|
|
||||||
"createListing": "Create Listing",
|
|
||||||
"refresh": "Refresh",
|
|
||||||
"noActiveListings": "You have no active listings.",
|
|
||||||
"noFilledOrders": "You have no filled orders.",
|
|
||||||
"noActiveAuctions": "No active auctions found.",
|
|
||||||
"listDomainsInfo": "List your domains for sale to other Handshake users via the Shakedex protocol.",
|
|
||||||
"completedPurchasesInfo": "Completed purchases will appear here.",
|
|
||||||
"browseAuctionsInfo": "Browse available domain auctions from other users."
|
|
||||||
},
|
|
||||||
"searchTld": {
|
|
||||||
"searchPlaceholder": "Search for a name...",
|
|
||||||
"search": "Search",
|
|
||||||
"searching": "Searching...",
|
|
||||||
"enterNamePrompt": "Enter a name to search for availability and auction status.",
|
|
||||||
"available": "Available",
|
|
||||||
"inAuction": "In Auction",
|
|
||||||
"status": "Status",
|
|
||||||
"currentBid": "Current Bid",
|
|
||||||
"blocksUntilReveal": "Blocks until reveal",
|
|
||||||
"availableForBidding": "Available for bidding",
|
|
||||||
"auctionInProgress": "Auction in progress",
|
|
||||||
"placeBid": "Place Bid",
|
|
||||||
"watch": "Watch"
|
|
||||||
},
|
|
||||||
"onboarding": {
|
|
||||||
"welcome": "Welcome to Bob Wallet",
|
|
||||||
"setupPrompt": "Set up your wallet to start managing Handshake names",
|
|
||||||
"createNewWallet": "Create New Wallet",
|
|
||||||
"importSeed": "Import Seed",
|
|
||||||
"connectLedger": "Connect Ledger",
|
|
||||||
"important": "Important:",
|
|
||||||
"seedPhraseWarning": "Write down your seed phrase and store it in a secure location. You will need it to recover your wallet.",
|
|
||||||
"copySeedPhrase": "Copy Seed Phrase",
|
|
||||||
"savedSeed": "I've Saved My Seed",
|
|
||||||
"importSeedPrompt": "Enter your 12 or 24 word seed phrase to restore an existing wallet.",
|
|
||||||
"seedPhrase": "Seed Phrase",
|
|
||||||
"seedPhrasePlaceholder": "Enter your seed phrase",
|
|
||||||
"importWallet": "Import Wallet",
|
|
||||||
"ledgerPrompt": "Connect your Ledger hardware wallet to manage your Handshake names securely.",
|
|
||||||
"instructions": "Instructions:",
|
|
||||||
"ledgerStep1": "Connect your Ledger device via USB",
|
|
||||||
"ledgerStep2": "Enter your PIN on the device",
|
|
||||||
"ledgerStep3": "Open the Handshake app on your Ledger",
|
|
||||||
"ledgerStep4": "Click \"Connect\" below",
|
|
||||||
"connectLedgerButton": "Connect Ledger"
|
|
||||||
},
|
|
||||||
"settings": {
|
|
||||||
"general": "General",
|
|
||||||
"wallet": "Wallet",
|
|
||||||
"connection": "Connection",
|
|
||||||
"advanced": "Advanced",
|
|
||||||
"language": "Language",
|
|
||||||
"blockExplorer": "Block Explorer",
|
|
||||||
"theme": "Theme",
|
|
||||||
"light": "Light",
|
|
||||||
"dark": "Dark",
|
|
||||||
"system": "System",
|
|
||||||
"walletDirectory": "Wallet Directory",
|
|
||||||
"walletDirectoryInfo": "Location where wallet data is stored",
|
|
||||||
"changeDirectory": "Change Directory",
|
|
||||||
"backup": "Backup",
|
|
||||||
"backupInfo": "Export wallet seed phrase and settings",
|
|
||||||
"exportBackup": "Export Backup",
|
|
||||||
"rescanBlockchain": "Rescan Blockchain",
|
|
||||||
"rescanInfo": "Re-scan the blockchain for transactions",
|
|
||||||
"rescan": "Rescan",
|
|
||||||
"connectionType": "Connection Type",
|
|
||||||
"fullNode": "Full Node",
|
|
||||||
"spv": "SPV (Light)",
|
|
||||||
"customRPC": "Custom RPC",
|
|
||||||
"network": "Network",
|
|
||||||
"mainnet": "Mainnet",
|
|
||||||
"testnet": "Testnet",
|
|
||||||
"regtest": "Regtest",
|
|
||||||
"simnet": "Simnet",
|
|
||||||
"apiKey": "API Key",
|
|
||||||
"apiKeyInfo": "Node API authentication key",
|
|
||||||
"analytics": "Analytics",
|
|
||||||
"analyticsInfo": "Share anonymous usage data to improve Bob",
|
|
||||||
"developerOptions": "Developer Options",
|
|
||||||
"openDebugConsole": "Open Debug Console"
|
|
||||||
},
|
|
||||||
"common": {
|
|
||||||
"hns": "HNS",
|
|
||||||
"usd": "USD",
|
|
||||||
"loading": "Loading...",
|
|
||||||
"save": "Save",
|
|
||||||
"cancel": "Cancel",
|
|
||||||
"close": "Close",
|
|
||||||
"confirm": "Confirm",
|
|
||||||
"continue": "Continue",
|
|
||||||
"back": "Back",
|
|
||||||
"next": "Next",
|
|
||||||
"done": "Done",
|
|
||||||
"error": "Error",
|
|
||||||
"success": "Success",
|
|
||||||
"warning": "Warning",
|
|
||||||
"info": "Info"
|
|
||||||
},
|
|
||||||
"app.boot.download-check": "Checking for Updates",
|
|
||||||
"app.boot.folder-check": "Setup Check",
|
|
||||||
"app.boot.loaded-runtime": "Application Loaded",
|
|
||||||
"app.boot.server-check": "Checking Server",
|
|
||||||
"app.boot.start-runtime": "Starting Desktop",
|
|
||||||
"app.core.ui.search": "Search",
|
|
||||||
"app.lthn.chain.daemons.lethean-blockchain-export": "Blockchain Export",
|
|
||||||
"app.lthn.chain.daemons.lethean-blockchain-import": "Blockchain Import",
|
|
||||||
"app.lthn.chain.daemons.lethean-wallet-cli": "Wallet CLI",
|
|
||||||
"app.lthn.chain.daemons.lethean-wallet-rpc": "Wallet RPC",
|
|
||||||
"app.lthn.chain.daemons.lethean-wallet-vpn-rpc": "Exit Node Wallet",
|
|
||||||
"app.lthn.chain.daemons.letheand": "Blockchain Service",
|
|
||||||
"app.lthn.chain.desc.no_transactions": "There were no transactions included in this block",
|
|
||||||
"app.lthn.chain.description": "Lethean (LTHN) Blockchain Stats",
|
|
||||||
"app.lthn.chain.heading": "Lethean Blockchain Stats",
|
|
||||||
"app.lthn.chain.menu.blocks": "Blocks",
|
|
||||||
"app.lthn.chain.menu.configuration": "Configuration",
|
|
||||||
"app.lthn.chain.menu.raw_data": "Raw Block Data",
|
|
||||||
"app.lthn.chain.menu.stats": "Stats",
|
|
||||||
"app.lthn.chain.table.age": "Age",
|
|
||||||
"app.lthn.chain.table.depth": "Depth",
|
|
||||||
"app.lthn.chain.table.difficulty": "Difficulty",
|
|
||||||
"app.lthn.chain.table.height": "Height",
|
|
||||||
"app.lthn.chain.table.reward": "Reward",
|
|
||||||
"app.lthn.chain.table.time": "Time",
|
|
||||||
"app.lthn.chain.table.title.chain-status": "Blockchain Status",
|
|
||||||
"app.lthn.chain.table.title.recent-blocks": "Recently Created Blocks",
|
|
||||||
"app.lthn.chain.title": "Blockchain Explorer",
|
|
||||||
"app.lthn.chain.words.alt_blocks_count": "Alt Blocks",
|
|
||||||
"app.lthn.chain.words.block_size": "Block Size",
|
|
||||||
"app.lthn.chain.words.block_size_limit": "Block Size Limit",
|
|
||||||
"app.lthn.chain.words.chain_stat": "Chain Stats",
|
|
||||||
"app.lthn.chain.words.chain_stat_value": "Node Reported Value",
|
|
||||||
"app.lthn.chain.words.cumulative_difficulty": "Cumulative Difficulty",
|
|
||||||
"app.lthn.chain.words.depth": "Depth from Top Block",
|
|
||||||
"app.lthn.chain.words.difficulty": "Difficulty",
|
|
||||||
"app.lthn.chain.words.grey_peerlist_size": "P2P Grey Peers",
|
|
||||||
"app.lthn.chain.words.hash": "Hash",
|
|
||||||
"app.lthn.chain.words.height": "Height",
|
|
||||||
"app.lthn.chain.words.incoming_connections_count": "P2P Incoming",
|
|
||||||
"app.lthn.chain.words.install-blockchain": "Install Blockchain",
|
|
||||||
"app.lthn.chain.words.last_block_time": "Synchronised to Block:",
|
|
||||||
"app.lthn.chain.words.loading-data": "Loading Blockchain Data",
|
|
||||||
"app.lthn.chain.words.major_version": "Major Version",
|
|
||||||
"app.lthn.chain.words.miner_transaction": "Miner Transaction",
|
|
||||||
"app.lthn.chain.words.miner_tx": "POW Miner Transaction",
|
|
||||||
"app.lthn.chain.words.minor_version": "Minor Version",
|
|
||||||
"app.lthn.chain.words.nonce": "Block Solution",
|
|
||||||
"app.lthn.chain.words.orphan_status": "Valid Block",
|
|
||||||
"app.lthn.chain.words.outgoing_connections_count": "P2P Out",
|
|
||||||
"app.lthn.chain.words.reward": "Reward",
|
|
||||||
"app.lthn.chain.words.start_time": "Start Time",
|
|
||||||
"app.lthn.chain.words.status": "Status",
|
|
||||||
"app.lthn.chain.words.target": "Target",
|
|
||||||
"app.lthn.chain.words.target_height": "Target Height",
|
|
||||||
"app.lthn.chain.words.testnet": "Testnet",
|
|
||||||
"app.lthn.chain.words.timestamp": "Timestamp",
|
|
||||||
"app.lthn.chain.words.top_height": "Newest Block",
|
|
||||||
"app.lthn.chain.words.tx_count": "Total Transactions",
|
|
||||||
"app.lthn.chain.words.tx_pool_size": "Pending Transactions",
|
|
||||||
"app.lthn.chain.words.unlock_time": "Unlock Block",
|
|
||||||
"app.lthn.chain.words.valid": "Valid Block",
|
|
||||||
"app.lthn.chain.words.version": "Block Structure Version",
|
|
||||||
"app.lthn.chain.words.white_peerlist_size": "P2P Whitelist",
|
|
||||||
"app.lthn.console.title": "Console",
|
|
||||||
"app.lthn.wallet.button.create-wallet": "Create Wallet",
|
|
||||||
"app.lthn.wallet.button.restore-wallet": "Restore Wallet",
|
|
||||||
"app.lthn.wallet.button.unlock-wallet": "Unlock",
|
|
||||||
"app.lthn.wallet.label.address": "Address",
|
|
||||||
"app.lthn.wallet.label.autosave": "Save Open Wallet",
|
|
||||||
"app.lthn.wallet.label.filename": "Filename",
|
|
||||||
"app.lthn.wallet.label.restore-height": "Restore Height",
|
|
||||||
"app.lthn.wallet.label.spend-key": "Spend Key",
|
|
||||||
"app.lthn.wallet.label.view-key": "View Key",
|
|
||||||
"app.lthn.wallet.label.wallet-password": "Wallet Password",
|
|
||||||
"app.lthn.wallet.label.wallet-password-confirm": "Confirm Password",
|
|
||||||
"app.lthn.wallet.titles.new-wallet": "Make New Wallet",
|
|
||||||
"app.lthn.wallet.titles.restore-keys": "Restore From Keys",
|
|
||||||
"app.lthn.wallet.titles.restore-seed": "Restore From Seed",
|
|
||||||
"app.lthn.wallet.titles.unlock-wallet": "Unlock Wallet",
|
|
||||||
"app.lthn.wallet.titles.wallet-transactions": "Wallet Transactions",
|
|
||||||
"app.market.apps": "App Marketplace",
|
|
||||||
"app.market.dashboard": "Dashboard",
|
|
||||||
"app.market.installed": "Installed Apps",
|
|
||||||
"app.market.no-apps-installed": "You have no apps installed.",
|
|
||||||
"app.market.view-installable-apps": "View Installable Apps",
|
|
||||||
"app.title": "Lethean Desktop",
|
|
||||||
"charts.network-hashrate.subtitle": "Data Provided by",
|
|
||||||
"charts.network-hashrate.title": "Network Hash Rate",
|
|
||||||
"lang.de": "German",
|
|
||||||
"lang.en": "English",
|
|
||||||
"lang.es": "Spanish",
|
|
||||||
"lang.fr": "French",
|
|
||||||
"lang.ru": "Russian",
|
|
||||||
"lang.uk": "Ukrainian (Ukraine)",
|
|
||||||
"lang.zh": "Chinese",
|
|
||||||
"menu.about": "About",
|
|
||||||
"menu.activity": "Activity",
|
|
||||||
"menu.api": "api",
|
|
||||||
"menu.blockchain": "Blockchain",
|
|
||||||
"menu.build": "Build",
|
|
||||||
"menu.dashboard": "Dashboard",
|
|
||||||
"menu.docs": "Documentation",
|
|
||||||
"menu.documentation": "Documentation",
|
|
||||||
"menu.explorer": "Explorer",
|
|
||||||
"menu.help": "Help",
|
|
||||||
"menu.hub-admin": "Admin Hub",
|
|
||||||
"menu.hub-client": "Client Hub",
|
|
||||||
"menu.hub-developer": "Developer",
|
|
||||||
"menu.hub-gateway": "Gateway",
|
|
||||||
"menu.hub-server": "Server Hub",
|
|
||||||
"menu.info": "info",
|
|
||||||
"menu.logout": "Sign Out",
|
|
||||||
"menu.mining": "Mining",
|
|
||||||
"menu.settings": "Settings",
|
|
||||||
"menu.vpn": "VPN",
|
|
||||||
"menu.wallet": "Wallet",
|
|
||||||
"menu.your-profile": "Your Profile",
|
|
||||||
"view.dashboard.description": "Lethean (LTHN) Web app",
|
|
||||||
"view.dashboard.heading": "Lethean Dashboard",
|
|
||||||
"view.dashboard.title": "Lethean (LTHN)",
|
|
||||||
"view.wallets.description": "Crypto Wallet Manager",
|
|
||||||
"view.wallets.heading": "Wallet Manager",
|
|
||||||
"view.wallets.title": "Wallets",
|
|
||||||
"words.actions.add": "Add",
|
|
||||||
"words.actions.clone": "Clone",
|
|
||||||
"words.actions.edit": "Edit",
|
|
||||||
"words.actions.install": "Install",
|
|
||||||
"words.actions.new": "New",
|
|
||||||
"words.actions.remove": "Remove",
|
|
||||||
"words.actions.report": "Report",
|
|
||||||
"words.actions.save": "Save",
|
|
||||||
"words.states.installing": "Installing",
|
|
||||||
"words.states.installing_desc": "We are downloading the blockchain executables from GitHub to your Lethean user directory.",
|
|
||||||
"words.states.loading": "Loading",
|
|
||||||
"words.states.not_installed": "Not Installed",
|
|
||||||
"words.states.not_installed_desc": "Click Install Blockchain to download the latest Lethean Blockchain CLI",
|
|
||||||
"words.things.button": "Button",
|
|
||||||
"words.things.documentation": "Documentation",
|
|
||||||
"words.things.menu": "Menu",
|
|
||||||
"words.things.mining-pool": "Mining Pool",
|
|
||||||
"words.things.page": "Page",
|
|
||||||
"words.things.problem": "Problem",
|
|
||||||
"words.things.type": "Type",
|
|
||||||
"words.time.past.day": "a day ago",
|
|
||||||
"words.time.past.days": "days ago",
|
|
||||||
"words.time.past.hour": "an hour ago",
|
|
||||||
"words.time.past.hours": "hours ago",
|
|
||||||
"words.time.past.minute": "a minute ago",
|
|
||||||
"words.time.past.minutes": "minutes ago",
|
|
||||||
"words.time.past.month": "a month ago",
|
|
||||||
"words.time.past.months": " months ago",
|
|
||||||
"words.time.past.seconds": "a few seconds ago",
|
|
||||||
"words.time.past.year": "a year ago",
|
|
||||||
"words.time.past.years": "years ago"
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
|
@ -1,57 +0,0 @@
|
||||||
{
|
|
||||||
"name": "Core Framework",
|
|
||||||
"short_name": "Core",
|
|
||||||
"display": "standalone",
|
|
||||||
"scope": "./",
|
|
||||||
"start_url": "./",
|
|
||||||
"icons": [
|
|
||||||
{
|
|
||||||
"src": "icons/icon-72x72.png",
|
|
||||||
"sizes": "72x72",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-96x96.png",
|
|
||||||
"sizes": "96x96",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-128x128.png",
|
|
||||||
"sizes": "128x128",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-144x144.png",
|
|
||||||
"sizes": "144x144",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-152x152.png",
|
|
||||||
"sizes": "152x152",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-192x192.png",
|
|
||||||
"sizes": "192x192",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-384x384.png",
|
|
||||||
"sizes": "384x384",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "icons/icon-512x512.png",
|
|
||||||
"sizes": "512x512",
|
|
||||||
"type": "image/png",
|
|
||||||
"purpose": "maskable any"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
User-agent: *
|
|
||||||
Disallow:
|
|
||||||
Sitemap: /sitemap.xml
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset
|
|
||||||
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
|
|
||||||
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
|
|
||||||
<!-- created with Free Online Sitemap Generator www.xml-sitemaps.com -->
|
|
||||||
|
|
||||||
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>1.00</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/about</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/contact</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/bootstrap</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/services</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/components</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/httpclient</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/forms</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/about/experience</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.64</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/about/skill</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.64</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/contact/mailing</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.64</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/contact/mapping</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.64</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://angular.ganatan.com/contact/website</loc>
|
|
||||||
<lastmod>2023-12-08T12:51:22+00:00</lastmod>
|
|
||||||
<priority>0.64</priority>
|
|
||||||
</url>
|
|
||||||
|
|
||||||
</urlset>
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
|
|
||||||
import { provideServerRendering, withRoutes } from '@angular/ssr';
|
|
||||||
import { appConfig } from './app.config';
|
|
||||||
import { serverRoutes } from './app.routes.server';
|
|
||||||
import { TranslateLoader } from '@ngx-translate/core';
|
|
||||||
import { TranslateServerLoader } from './translate-server.loader';
|
|
||||||
|
|
||||||
const serverConfig: ApplicationConfig = {
|
|
||||||
providers: [
|
|
||||||
provideServerRendering(withRoutes(serverRoutes)),
|
|
||||||
{ provide: TranslateLoader, useClass: TranslateServerLoader }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
export const config = mergeApplicationConfig(appConfig, serverConfig);
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection, isDevMode, importProvidersFrom } from '@angular/core';
|
|
||||||
import { provideRouter } from '@angular/router';
|
|
||||||
import { HttpClient, provideHttpClient, withFetch } from '@angular/common/http';
|
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
|
||||||
import { provideTranslateHttpLoader } from '@ngx-translate/http-loader';
|
|
||||||
|
|
||||||
import { routes } from './app.routes';
|
|
||||||
import { withInMemoryScrolling } from '@angular/router';
|
|
||||||
import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
|
|
||||||
import { provideServiceWorker } from '@angular/service-worker';
|
|
||||||
|
|
||||||
export const appConfig: ApplicationConfig = {
|
|
||||||
providers: [
|
|
||||||
provideHttpClient(
|
|
||||||
withFetch(),
|
|
||||||
),
|
|
||||||
provideBrowserGlobalErrorListeners(),
|
|
||||||
provideZoneChangeDetection({ eventCoalescing: true }),
|
|
||||||
provideRouter(routes,
|
|
||||||
withInMemoryScrolling({
|
|
||||||
scrollPositionRestoration: 'enabled',
|
|
||||||
anchorScrolling: 'enabled',
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
provideClientHydration(withEventReplay()),
|
|
||||||
provideServiceWorker('ngsw-worker.js', {
|
|
||||||
enabled: !isDevMode(),
|
|
||||||
registrationStrategy: 'registerWhenStable:30000'
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Add ngx-translate providers
|
|
||||||
importProvidersFrom(
|
|
||||||
TranslateModule.forRoot({
|
|
||||||
fallbackLang: 'en'
|
|
||||||
})
|
|
||||||
),
|
|
||||||
provideTranslateHttpLoader({
|
|
||||||
prefix: './i18n/',
|
|
||||||
suffix: '.json'
|
|
||||||
})
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
||||||
<wa-page mobile-breakpoint="960">
|
|
||||||
|
|
||||||
<!-- Shell: left nav + content -->
|
|
||||||
<div class="app-shell"
|
|
||||||
style="display: grid; grid-template-columns: 280px 1fr; min-height: calc(100vh - 56px - 56px);">
|
|
||||||
<!-- Left navigation drawer (collapsible) -->
|
|
||||||
<wa-drawer>
|
|
||||||
<nav slot="navigation">
|
|
||||||
<a routerLink="/" class="sidebar-link">Home</a>
|
|
||||||
<a routerLink="/domain-manager" class="sidebar-link">Send</a>
|
|
||||||
<a routerLink="/settings" class="sidebar-link">Settings</a>
|
|
||||||
<a routerLink="/" class="icon-item active" aria-label="Dashboard">
|
|
||||||
<i class="fas fa-home"></i>
|
|
||||||
</a>
|
|
||||||
<a routerLink="/team" class="icon-item" aria-label="Team">
|
|
||||||
<i class="fas fa-users"></i>
|
|
||||||
</a>
|
|
||||||
<a routerLink="/projects" class="icon-item" aria-label="Projects">
|
|
||||||
<i class="fas fa-briefcase"></i>
|
|
||||||
</a>
|
|
||||||
<a routerLink="/calendar" class="icon-item" aria-label="Calendar">
|
|
||||||
<i class="fas fa-calendar-alt"></i>
|
|
||||||
</a>
|
|
||||||
<a routerLink="/documents" class="icon-item" aria-label="Documents">
|
|
||||||
<i class="fas fa-file-alt"></i>
|
|
||||||
</a>
|
|
||||||
<a routerLink="/reports" class="icon-item" aria-label="Reports">
|
|
||||||
<i class="fas fa-chart-pie"></i>
|
|
||||||
</a>
|
|
||||||
<!-- Add more nav items as needed -->
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
|
|
||||||
</wa-drawer>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<router-outlet></router-outlet>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Footer -->
|
|
||||||
<app-footer slot="footer"></app-footer>
|
|
||||||
</wa-page>
|
|
||||||
|
|
||||||
|
|
||||||
<!--<!– Top-level wrapper using Web Awesome (no Tailwind) –>-->
|
|
||||||
<!--<div class="app-frame">-->
|
|
||||||
<!-- <!– Mobile sidebar via Drawer –>-->
|
|
||||||
<!-- <wa-drawer #mobileSidebar class="mobile-sidebar" placement="start" style="--size: 20rem;">-->
|
|
||||||
<!-- <div class="sidebar-inner">-->
|
|
||||||
<!-- <div class="brand-row">-->
|
|
||||||
<!-- <img src="https://tailwindcss.com/plus-assets/img/logos/mark.svg?color=indigo&shade=500" alt="Your Company" class="brand-logo" />-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <nav class="nav-list">-->
|
|
||||||
<!-- <a routerLink="/" class="nav-item active">-->
|
|
||||||
<!-- <i class="fas fa-home"></i>-->
|
|
||||||
<!-- <span>Dashboard</span>-->
|
|
||||||
<!-- </a>-->
|
|
||||||
<!-- <a routerLink="/team" class="nav-item">-->
|
|
||||||
<!-- <i class="fas fa-users"></i>-->
|
|
||||||
<!-- <span>Team</span>-->
|
|
||||||
<!-- </a>-->
|
|
||||||
<!-- <a routerLink="/projects" class="nav-item">-->
|
|
||||||
<!-- <i class="fas fa-briefcase"></i>-->
|
|
||||||
<!-- <span>Projects</span>-->
|
|
||||||
<!-- </a>-->
|
|
||||||
<!-- <a routerLink="/calendar" class="nav-item">-->
|
|
||||||
<!-- <i class="fas fa-calendar-alt"></i>-->
|
|
||||||
<!-- <span>Calendar</span>-->
|
|
||||||
<!-- </a>-->
|
|
||||||
<!-- <a routerLink="/documents" class="nav-item">-->
|
|
||||||
<!-- <i class="fas fa-file-alt"></i>-->
|
|
||||||
<!-- <span>Documents</span>-->
|
|
||||||
<!-- </a>-->
|
|
||||||
<!-- <a routerLink="/reports" class="nav-item">-->
|
|
||||||
<!-- <i class="fas fa-chart-pie"></i>-->
|
|
||||||
<!-- <span>Reports</span>-->
|
|
||||||
<!-- </a>-->
|
|
||||||
<!-- </nav>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </wa-drawer>-->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- <!– Main column (left padding on lg for the fixed sidebar) –>-->
|
|
||||||
<!-- <div class="main-col">-->
|
|
||||||
<!-- <!– Topbar –>-->
|
|
||||||
<!-- <header class="topbar">-->
|
|
||||||
<!-- <wa-button variant="text" size="small" class="lg-hidden" (click)="onToggleSidebar()" aria-label="Open sidebar">-->
|
|
||||||
<!-- <i class="fas fa-bars"></i>-->
|
|
||||||
<!-- </wa-button>-->
|
|
||||||
|
|
||||||
<!-- <div class="topbar-sep lg-hidden" aria-hidden="true"></div>-->
|
|
||||||
|
|
||||||
<!-- <div class="topbar-flex">-->
|
|
||||||
<!-- <form class="search-form" role="search">-->
|
|
||||||
<!-- <wa-input placeholder="Search" size="small" pill>-->
|
|
||||||
<!-- <i slot="prefix" class="fas fa-search"></i>-->
|
|
||||||
<!-- </wa-input>-->
|
|
||||||
<!-- </form>-->
|
|
||||||
|
|
||||||
<!-- <div class="topbar-actions">-->
|
|
||||||
<!-- <wa-button variant="text" size="small" aria-label="View notifications">-->
|
|
||||||
<!-- <i class="fas fa-bell"></i>-->
|
|
||||||
<!-- </wa-button>-->
|
|
||||||
|
|
||||||
<!-- <div class="lg-sep" aria-hidden="true"></div>-->
|
|
||||||
|
|
||||||
<!-- <!– Profile dropdown –>-->
|
|
||||||
<!-- <wa-dropdown>-->
|
|
||||||
<!-- <wa-button slot="trigger" size="small" pill>-->
|
|
||||||
<!-- <img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?auto=format&fit=facearea&facepad=2&w=48&h=48&q=80"-->
|
|
||||||
<!-- alt="" class="avatar" />-->
|
|
||||||
<!-- <span class="user-name lg-only">Tom Cook</span>-->
|
|
||||||
<!-- <i class="fas fa-chevron-down lg-only"></i>-->
|
|
||||||
<!-- </wa-button>-->
|
|
||||||
<!-- <wa-menu>-->
|
|
||||||
<!-- <wa-menu-item>Your profile</wa-menu-item>-->
|
|
||||||
<!-- <wa-menu-item>Sign out</wa-menu-item>-->
|
|
||||||
<!-- </wa-menu>-->
|
|
||||||
<!-- </wa-dropdown>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </header>-->
|
|
||||||
|
|
||||||
<!-- <!– Primary content area (single Angular outlet) –>-->
|
|
||||||
<!-- <main class="content">-->
|
|
||||||
<!-- <router-outlet></router-outlet>-->
|
|
||||||
<!-- </main>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
|
|
||||||
<!-- <!– Optional secondary aside on xl+ screens –>-->
|
|
||||||
<!-- <aside class="secondary-aside">-->
|
|
||||||
<!-- <!– Secondary column content (hidden on smaller screens) –>-->
|
|
||||||
<!-- </aside>-->
|
|
||||||
|
|
||||||
<!-- <!– Footer (existing component) –>-->
|
|
||||||
<!-- <app-footer></app-footer>-->
|
|
||||||
<!--</div>-->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
import { RenderMode, ServerRoute } from '@angular/ssr';
|
|
||||||
|
|
||||||
export const serverRoutes: ServerRoute[] = [
|
|
||||||
{
|
|
||||||
path: '**',
|
|
||||||
renderMode: RenderMode.Prerender
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
import { Routes } from '@angular/router';
|
|
||||||
import { HomePage } from './pages/home/home.page';
|
|
||||||
import { SearchTldPage } from './pages/search-tld/search-tld.page';
|
|
||||||
import { OnboardingPage } from './pages/onboarding/onboarding.page';
|
|
||||||
import { SettingsPage } from './pages/settings/settings.page';
|
|
||||||
import { DomainManagerPage } from './pages/domain-manager/domain-manager.page';
|
|
||||||
import { ExchangePage } from './pages/exchange/exchange.page';
|
|
||||||
|
|
||||||
export const routes: Routes = [
|
|
||||||
{ path: '', redirectTo: '/account', pathMatch: 'full' },
|
|
||||||
{ path: 'account', component: HomePage, title: 'Portfolio • Bob Wallet' },
|
|
||||||
{ path: 'send', component: HomePage, title: 'Send • Bob Wallet' },
|
|
||||||
{ path: 'receive', component: HomePage, title: 'Receive • Bob Wallet' },
|
|
||||||
{ path: 'domain-manager', component: DomainManagerPage, title: 'Domain Manager • Bob Wallet' },
|
|
||||||
{ path: 'domains', component: SearchTldPage, title: 'Browse Domains • Bob Wallet' },
|
|
||||||
{ path: 'bids', component: HomePage, title: 'Your Bids • Bob Wallet' },
|
|
||||||
{ path: 'watching', component: HomePage, title: 'Watching • Bob Wallet' },
|
|
||||||
{ path: 'exchange', component: ExchangePage, title: 'Exchange • Bob Wallet' },
|
|
||||||
{ path: 'get-coins', component: HomePage, title: 'Claim Airdrop • Bob Wallet' },
|
|
||||||
{ path: 'sign-message', component: HomePage, title: 'Sign Message • Bob Wallet' },
|
|
||||||
{ path: 'verify-message', component: HomePage, title: 'Verify Message • Bob Wallet' },
|
|
||||||
{ path: 'settings', component: SettingsPage, title: 'Settings • Bob Wallet' },
|
|
||||||
{ path: 'onboarding', component: OnboardingPage, title: 'Onboarding • Bob Wallet' },
|
|
||||||
{ path: '**', redirectTo: '/account' }
|
|
||||||
];
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
import { TestBed } from '@angular/core/testing';
|
|
||||||
import { App } from './app';
|
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
describe('App', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
imports: [App],
|
|
||||||
providers: [
|
|
||||||
{
|
|
||||||
provide: ActivatedRoute,
|
|
||||||
useValue: {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}).compileComponents();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create the app', () => {
|
|
||||||
const fixture = TestBed.createComponent(App);
|
|
||||||
const app = fixture.componentInstance;
|
|
||||||
expect(app).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
import { Component, OnInit, Inject, PLATFORM_ID, CUSTOM_ELEMENTS_SCHEMA, ViewChild, ElementRef } from '@angular/core';
|
|
||||||
import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
||||||
import {RouterLink, RouterOutlet} from '@angular/router';
|
|
||||||
import { FooterComponent } from './shared/components/footer/footer.component';
|
|
||||||
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
||||||
import {Subscription} from 'rxjs';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-root',
|
|
||||||
imports: [
|
|
||||||
CommonModule,
|
|
||||||
RouterOutlet,
|
|
||||||
FooterComponent,
|
|
||||||
TranslateModule,
|
|
||||||
RouterLink
|
|
||||||
],
|
|
||||||
templateUrl: './app.html',
|
|
||||||
styleUrl: './app.css',
|
|
||||||
standalone: true,
|
|
||||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
||||||
})
|
|
||||||
export class App {
|
|
||||||
@ViewChild('sidebar', { read: ElementRef, static: false }) sidebar?: ElementRef<HTMLElement>;
|
|
||||||
|
|
||||||
sidebarOpen = false;
|
|
||||||
userMenuOpen = false;
|
|
||||||
currentRole = 'Developer';
|
|
||||||
|
|
||||||
time: string = '';
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
@Inject(DOCUMENT) private document: Document,
|
|
||||||
@Inject(PLATFORM_ID) private platformId: object,
|
|
||||||
private translateService: TranslateService
|
|
||||||
) {
|
|
||||||
// Set default language
|
|
||||||
this.translateService.use('en');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
import { TestBed } from '@angular/core/testing';
|
|
||||||
import { Meta, Title } from '@angular/platform-browser';
|
|
||||||
import { SeoService } from './seo.service';
|
|
||||||
import { itGood, itBad, itUgly, trio } from 'src/testing/gbu';
|
|
||||||
|
|
||||||
describe('SeoService', () => {
|
|
||||||
let service: SeoService;
|
|
||||||
let metaSpy: jasmine.SpyObj<Meta>;
|
|
||||||
let titleSpy: jasmine.SpyObj<Title>;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
metaSpy = jasmine.createSpyObj('Meta', ['updateTag']);
|
|
||||||
titleSpy = jasmine.createSpyObj('Title', ['setTitle']);
|
|
||||||
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
providers: [
|
|
||||||
SeoService,
|
|
||||||
{ provide: Meta, useValue: metaSpy },
|
|
||||||
{ provide: Title, useValue: titleSpy }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
service = TestBed.inject(SeoService);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should be created', () => {
|
|
||||||
expect(service).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('setMetaTitle', () => {
|
|
||||||
trio('sets document title', {
|
|
||||||
good: () => {
|
|
||||||
service.setMetaTitle('Hello');
|
|
||||||
expect(titleSpy.setTitle).toHaveBeenCalledOnceWith('Hello');
|
|
||||||
},
|
|
||||||
bad: () => {
|
|
||||||
service.setMetaTitle('');
|
|
||||||
expect(titleSpy.setTitle).toHaveBeenCalledWith('');
|
|
||||||
},
|
|
||||||
ugly: () => {
|
|
||||||
// Force invalid via any cast; ensure we do not throw
|
|
||||||
expect(() => service.setMetaTitle(null as any)).not.toThrow();
|
|
||||||
expect(titleSpy.setTitle).toHaveBeenCalledWith(null as any);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('setMetaDescription', () => {
|
|
||||||
itGood('updates description meta tag', () => {
|
|
||||||
service.setMetaDescription('desc');
|
|
||||||
expect(metaSpy.updateTag).toHaveBeenCalledWith({ name: 'description', content: 'desc' });
|
|
||||||
});
|
|
||||||
|
|
||||||
itBad('handles empty description', () => {
|
|
||||||
service.setMetaDescription('');
|
|
||||||
expect(metaSpy.updateTag).toHaveBeenCalledWith({ name: 'description', content: '' });
|
|
||||||
});
|
|
||||||
|
|
||||||
itUgly('does not throw on invalid description', () => {
|
|
||||||
expect(() => service.setMetaDescription(null as any)).not.toThrow();
|
|
||||||
expect(metaSpy.updateTag).toHaveBeenCalledWith({ name: 'description', content: null as any });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||