Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
9a4564b
新增 backend 單元測試覆蓋掃描與鈎子邏輯
guan4tou2 Mar 8, 2026
9921882
新增 CTk 遷移設計文件
guan4tou2 Mar 9, 2026
88316cb
新增 CTk 遷移實作計劃
guan4tou2 Mar 9, 2026
25abd33
chore: 將 .worktrees/ 加入 .gitignore
guan4tou2 Mar 9, 2026
42b5463
refactor(theme): 移除 ttkbootstrap bridge,統一用 CTk token
guan4tou2 Mar 9, 2026
8c7ec03
feat(ui): 新增 WebsiteCopierCtk 骨架與 smoke 測試
guan4tou2 Mar 9, 2026
0735eec
fix(ui): 修正 log_message state、test 順序、補齊 ui_theme imports
guan4tou2 Mar 9, 2026
ec68adb
feat(ui): 實作 header 列(URL、狀態、掃描按鈕)
guan4tou2 Mar 9, 2026
67a9eb5
fix(ui): _on_global_url_paste 加入 hasattr 前置防護
guan4tou2 Mar 9, 2026
c207989
feat(ui): 實作檔案類型篩選列(CTkScrollableFrame + CTkCheckBox)
guan4tou2 Mar 9, 2026
e14401e
feat(ui): 實作下載控制列
guan4tou2 Mar 9, 2026
009742a
feat(ui): 實作 Treeview(搜尋欄、排序、勾選、互動)
guan4tou2 Mar 9, 2026
bf12f18
fix(ui): sort_tree 修正 #0 欄取值方式與遞迴排序子節點
guan4tou2 Mar 9, 2026
7d6f4f1
feat(ui): 實作進度條與 CTkTabview(Downloads + Logs)
guan4tou2 Mar 9, 2026
4d26575
feat(ui): 移植 Queue 輪詢與 scan buffer throttle
guan4tou2 Mar 9, 2026
585c764
fix(ui): 移除 _flush_scan_buffer 中不必要的 lock 包裝
guan4tou2 Mar 9, 2026
4e63670
feat(ui): 移植 backend 橋接方法(掃描、下載、搜尋)
guan4tou2 Mar 9, 2026
e5f880e
fix(ui): 修正 _restore_full_tree folders 重建、download_selected lock 範圍、t…
guan4tou2 Mar 9, 2026
001edf7
feat: 更新入口,預設啟動 CTk 版 UI (WebsiteCopierCtk)
guan4tou2 Mar 9, 2026
6f3cada
fix: 補充 _configure_tk_libraries() 確保 uv Python 可找到 Tcl/Tk 路徑
guan4tou2 Mar 9, 2026
e78fa14
fix: 移除 stash pop 帶回的 apply_bootstrap_theme 殘留
guan4tou2 Mar 9, 2026
468ac39
fix: 移除 index_ripper.py 殘留的 apply_bootstrap_theme import 與呼叫
guan4tou2 Mar 9, 2026
5e89fd8
docs: add FileTree redesign design doc (CTkScrollableFrame + emoji ic…
guan4tou2 Mar 10, 2026
c0b6127
docs: add FileTree redesign implementation plan (9 tasks)
guan4tou2 Mar 10, 2026
6489ef9
feat: add TreeNode dataclass and data model state
guan4tou2 Mar 10, 2026
4d417b1
fix: move dataclasses import to stdlib block, type children list[str]
guan4tou2 Mar 10, 2026
b6c385b
feat: add RowWidget class with emoji icons and hover/checked styling
guan4tou2 Mar 10, 2026
67fd9a0
fix: skip chevron in _bind_all to prevent double-trigger on click
guan4tou2 Mar 10, 2026
fa58617
feat: replace _build_treeview with _build_filetree (CTkScrollableFrame)
guan4tou2 Mar 10, 2026
b78dfa1
fix: explicitly set tree_nodes/tree_roots/_node_counter in smoke init
guan4tou2 Mar 10, 2026
88ee497
feat: implement _rebuild_visible, _sync_rows, click handlers
guan4tou2 Mar 10, 2026
1c7cd08
feat: rewrite add_folder and add_file to use TreeNode data model
guan4tou2 Mar 10, 2026
c0959fc
fix: atomic check-create-register in add_folder to prevent TOCTOU race
guan4tou2 Mar 10, 2026
81e3081
feat: rewrite toggle_check, select_all, deselect_all; remove Treeview…
guan4tou2 Mar 10, 2026
b789ff4
feat: rewrite expand_all, collapse_all, sort_tree, type filter using …
guan4tou2 Mar 10, 2026
fd5e508
feat: rewrite _backup_full_tree, _restore_full_tree, _filter_tree_by_…
guan4tou2 Mar 10, 2026
5af108b
feat: complete FileTree migration - remove all ttk.Treeview references
guan4tou2 Mar 10, 2026
200e52b
fix: restore _drain_queues method and wire _on_type_filter_changed to…
guan4tou2 Mar 10, 2026
c5291c7
feat: UI 重構 — 新增掃描 hook、版面重排、字體調整與滾輪支援
guan4tou2 Mar 10, 2026
4c14559
docs: 更新 README 反映 CustomTkinter 架構;修正 on_scan_progress hook 呼叫
guan4tou2 Mar 10, 2026
76dc28d
ci: 重構 CI — 加入測試步驟、改用 uv sync、修正 PyInstaller 旗標;修正 ui_theme 重複函數
guan4tou2 Mar 10, 2026
2ec609c
docs: 新增 UI/UX 重新設計方案文件
guan4tou2 Mar 10, 2026
9de1259
docs: 新增 UI/UX 重新設計實作計畫
guan4tou2 Mar 10, 2026
cae2461
feat: RowWidget — accent border, chevron right, remove type badge
guan4tou2 Mar 10, 2026
e967a72
fix: RowWidget — separate hover/click bindings, fix pady in _sync_rows
guan4tou2 Mar 10, 2026
c83ca77
feat: toolbar — status dot, pause btn hidden by default, remove clear…
guan4tou2 Mar 10, 2026
409ffaa
fix: toolbar — wrap on_scan_started in after(), add smoke stubs, fix …
guan4tou2 Mar 10, 2026
d7026e5
fix: align CTk tree smoke test and harden download/executor handling
guan4tou2 Mar 13, 2026
de95211
docs: add implementation plan for code review fixes
guan4tou2 Mar 18, 2026
97f40cf
fix: executor shutdown deadlock and missing ui_ctk entry point
guan4tou2 Mar 18, 2026
8ec37b0
fix: cleanup outside open handle, rebuild executor, preserve download…
guan4tou2 Mar 18, 2026
cc27079
fix: type filter retention, directory heuristic, test name, Tcl/Tk de…
guan4tou2 Mar 18, 2026
9efedc6
refactor: extract shared utilities, eliminate duplication
guan4tou2 Mar 18, 2026
64d78d4
refactor: restructure Python project into src/index_ripper package
guan4tou2 Mar 22, 2026
3b8ee00
feat: add Electron rewrite with React, TypeScript, and modern UI
guan4tou2 Mar 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 26 additions & 45 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Build Executables (uv + PyInstaller)
name: CI

on:
push:
Expand All @@ -12,8 +12,24 @@ permissions:
contents: write

jobs:
test:
name: Test (ubuntu-latest)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v3

- name: Install dependencies
run: uv sync --extra dev

- name: Run unit tests
run: uv run python -m pytest tests/ -v

build:
name: Build (${{ matrix.os }})
needs: test
strategy:
fail-fast: false
matrix:
Expand All @@ -35,66 +51,37 @@ jobs:
steps:
- uses: actions/checkout@v4

- name: Set up Python (Windows)
if: matrix.os == 'windows-latest'
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@v3

- name: Setup conda (macOS & Linux)
if: matrix.os != 'windows-latest'
uses: conda-incubator/setup-miniconda@v3
with:
auto-update-conda: true
python-version: "3.12"
channels: conda-forge

- name: Install tk (macOS & Linux)
if: matrix.os != 'windows-latest'
shell: bash -l {0}
run: |
conda install -y tk
- name: Install dependencies
run: uv sync

- name: Install dependencies (Windows)
if: matrix.os == 'windows-latest'
run: |
uv pip install --system -r requirements.txt pyinstaller pillow

- name: Install dependencies (macOS & Linux)
if: matrix.os != 'windows-latest'
shell: bash -l {0}
run: |
uv pip install --system -r requirements.txt pyinstaller pillow
- name: Install PyInstaller
run: uv pip install pyinstaller

- name: Build (Windows)
if: matrix.os == 'windows-latest'
run: |
pyinstaller --onefile --windowed --icon=app.png --name=IndexRipper --hidden-import tkinter --hidden-import tkinter.ttk index_ripper.py
uv run pyinstaller --onefile --windowed --icon=app.png --name=IndexRipper --collect-all customtkinter --paths src src/index_ripper/__main__.py

- name: Build (macOS)
if: startsWith(matrix.os, 'macos-')
shell: bash -l {0}
run: |
pyinstaller -F --windowed --name=IndexRipper \
--hidden-import tkinter --hidden-import tkinter.ttk --icon=app.png index_ripper.py
uv run pyinstaller -F --windowed --name=IndexRipper \
--collect-all customtkinter --icon=app.png --paths src src/index_ripper/__main__.py
[ -f dist/IndexRipper ] && rm -f dist/IndexRipper || true

- name: Sign app (ad-hoc)
if: startsWith(matrix.os, 'macos-')
shell: bash -l {0}
run: |
# 依你提供的方法,於建置後進行 ad-hoc 簽章
codesign --force --deep --sign - "dist/IndexRipper.app"

- name: Build (Linux)
if: matrix.os == 'ubuntu-latest'
shell: bash -l {0}
run: |
pyinstaller --onefile --windowed --name=IndexRipper \
--hidden-import tkinter --hidden-import tkinter.ttk --icon=app.png index_ripper.py
uv run pyinstaller --onefile --windowed --name=IndexRipper \
--collect-all customtkinter --icon=app.png --paths src src/index_ripper/__main__.py

- name: Verify artifact exists
shell: bash
Expand Down Expand Up @@ -142,14 +129,10 @@ jobs:
zip_name="${dir}.app.zip"
app_src=""
if [ -d "$dir/IndexRipper.app" ]; then
# 常見情況:artifact 內已有 .app 目錄
app_src="$dir/IndexRipper.app"
elif [ -d "$dir/dist/IndexRipper.app" ]; then
# 另一種情況:保留了 dist 前綴
app_src="$dir/dist/IndexRipper.app"
elif [ -d "$dir/Contents" ]; then
# 展平情況:artifact 只包含 .app 內容,重建包裹
# 先清理可能存在的 _pkg,再逐一搬移,並忽略 _pkg 本身,避免遞迴移動
rm -rf "$dir/_pkg"
mkdir -p "$dir/_pkg/IndexRipper.app"
shopt -s dotglob nullglob
Expand Down Expand Up @@ -184,8 +167,6 @@ jobs:
mv artifacts/IndexRipper-Windows/IndexRipper.exe artifacts/IndexRipper-Windows.exe
fi
if [ -f artifacts/IndexRipper-Linux/IndexRipper ]; then
# 目的地若與資料夾同名會造成 mv 視為移動到同一資料夾,導致「same file」錯誤
# 因此改以 .bin 作為檔名,避免與資料夾名稱衝突
mv artifacts/IndexRipper-Linux/IndexRipper artifacts/IndexRipper-Linux.bin
fi

Expand Down
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,11 @@ __pycache__/
*.egg-info/

.sisyphus/
.worktrees/

electron-app/node_modules/
electron-app/dist/
electron-app/out/
electron-app/*.tsbuildinfo

.superpowers/
136 changes: 0 additions & 136 deletions POC_MATRIX.md

This file was deleted.

Loading
Loading