Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
47e5b71
chore(deps): bump codecov/codecov-action from 5 to 7
dependabot[bot] Jul 30, 2026
6899c2a
chore(deps): bump astral-sh/setup-uv from 5 to 7
dependabot[bot] Jul 30, 2026
f767528
chore(deps): bump actions/checkout from 4 to 7
dependabot[bot] Jul 30, 2026
6d8ff20
chore(deps): bump actions/upload-artifact from 4 to 7
dependabot[bot] Jul 30, 2026
e1a5555
chore(deps): bump actions/setup-python from 3 to 7
dependabot[bot] Jul 30, 2026
859f07b
chore(deps): bump gitpython from 3.1.52 to 3.1.57
dependabot[bot] Jul 30, 2026
aeee8da
chore(deps): bump gitpython in the uv group across 1 directory
dependabot[bot] Jul 30, 2026
508f9c2
chore(deps): bump the uv group across 1 directory with 6 updates
dependabot[bot] Oct 12, 2026
872827a
chore(deps): bump google-genai from 2.12.1 to 2.29.0
dependabot[bot] Oct 13, 2026
1fd6155
chore(deps): bump the npm_and_yarn group across 1 directory with 2 up…
dependabot[bot] Oct 12, 2026
36b3e4d
chore(deps): bump anthropic from 0.117.0 to 0.117.1
dependabot[bot] Oct 14, 2026
198fdfc
fix(editor): enable breakpoints only when debugger is available (#368)
tomlin7 Oct 14, 2026
f2261c9
fix(debugger): clear configurations when workspace has no launch.toml…
tomlin7 Oct 14, 2026
25bfb78
feat(git): add git stash operations and commands (#416)
tomlin7 Oct 14, 2026
128a689
chore(deps-dev): bump mkdocstrings-python from 2.0.5 to 2.0.9
dependabot[bot] Oct 18, 2026
9ab9716
chore(deps): bump mistune from 3.3.3 to 3.3.4
dependabot[bot] Oct 18, 2026
c85b93c
fix(build): restrict tkextrafont requirement to win32 (#164)
tomlin7 Oct 14, 2026
11890c3
feat(statusbar): add font size zoom button and actionset (#141)
tomlin7 Oct 14, 2026
2141942
docs: add usage and installation instructions for Fedora (#440) (#674)
tomlin7 Oct 18, 2026
48ba3fe
feat(editor): implement cursor history navigation in breadcrumbs (#39…
tomlin7 Oct 18, 2026
4d852f9
chore(deps): bump the npm_and_yarn group across 1 directory with 2 up…
dependabot[bot] Oct 18, 2026
0a5488e
feat(terminal): support custom user shells and make codecov non-fatal…
tomlin7 Oct 18, 2026
c44dd35
feat(debugger): file watcher for workspace launch.toml config (#415) …
tomlin7 Oct 18, 2026
d4a03c0
docs(install): clarify Tkinter prerequisite and add legacy-cgi for Py…
tomlin7 Oct 18, 2026
39ee7d4
fix(settings): safely load iconfont and prevent launch crash from tke…
tomlin7 Oct 18, 2026
f21c58f
feat(api): add settings endpoint for Extension API (#133) (#744)
tomlin7 Oct 18, 2026
fbb55dd
feat(menubar): add keyboard mnemonics and Alt-key accelerators (#73) …
tomlin7 Oct 18, 2026
0d2551d
fix(dialogs): set parent and dialog color options for clear text cont…
tomlin7 Oct 18, 2026
be4fff5
feat(explorer): add file extension icons and directory icon to tree (…
tomlin7 Oct 18, 2026
293ff13
fix(hover): safe content-based hover sizing to resolve shrink propert…
tomlin7 Oct 18, 2026
2aee9ce
feat(editors): implement scrollable and reorderable editor tabs bar (…
tomlin7 Oct 18, 2026
b726c1b
feat(extensions): show recommended extensions by default (#334) (#750)
tomlin7 Oct 18, 2026
fb58cf3
feat: Tree-sitter bracket pair colorization and matching (#752)
tomlin7 Oct 18, 2026
c356d80
feat: Debug Adapter Protocol (DAP) client and debugger (#753)
tomlin7 Oct 18, 2026
117ee84
feat(panel): add Git commit graph panel view (#754)
tomlin7 Oct 18, 2026
32deb74
feat(extensions): extension version control and update support (#755)
tomlin7 Oct 18, 2026
95a9473
feat(ai): Ollama local provider integration (#679) (#756)
tomlin7 Oct 18, 2026
545530f
feat(ai): Cancellation and abort support during agent streaming (#680…
tomlin7 Oct 18, 2026
163c6a2
feat(ai): Multi-file diff review before applying agent edits (#681) (…
tomlin7 Oct 18, 2026
0d9d2e5
feat(ai): Custom system prompts and project context in settings (#682…
tomlin7 Oct 18, 2026
39d79e4
feat(ai): Token usage budget and cost tracking in statusbar (#683) (#…
tomlin7 Oct 18, 2026
f0606f2
feat(ai): Web documentation search tool for Agent (#720) (#761)
tomlin7 Oct 18, 2026
fcdeb73
feat(ai): Semantic code indexing and local embeddings cache (#721) (#…
tomlin7 Oct 18, 2026
5882167
feat(ai): Inline code completion / fill-in-the-middle shortcut (#722)…
tomlin7 Oct 18, 2026
36f0700
fix(ai): Exponential backoff and auto-retry on 429 rate limit respons…
tomlin7 Oct 18, 2026
579d010
feat(editor): Multi-cursor editing support in Text widget (#684) (#766)
tomlin7 Oct 18, 2026
2be8e68
feat(editor): Find within selection in floating Find/Replace widget (…
tomlin7 Oct 18, 2026
4f80a61
fix(editor): Smooth yview scrolling synchronization in Minimap (#686)…
tomlin7 Oct 18, 2026
09b3bf6
feat(editor): Open HTML preview in external default browser (#687) (#…
tomlin7 Oct 18, 2026
29d61a5
feat(editor): Breadcrumb symbol hierarchy navigation with LSP (#690) …
tomlin7 Oct 18, 2026
a5a2a25
feat(editor): Code folding for brackets and indentation levels (#725)…
tomlin7 Oct 18, 2026
cee0711
feat(editor): Sticky scroll header for enclosing classes and function…
tomlin7 Oct 18, 2026
ac4d1ed
feat(editor): Column / box selection mode (Alt+Shift+Drag) (#728) (#776)
tomlin7 Oct 18, 2026
9723778
feat(editor): Render whitespace characters (spaces, tabs, newlines) (…
tomlin7 Oct 18, 2026
c54c735
feat(lsp): Support DocumentSymbol hierarchy in outline view (#691) (#…
tomlin7 Oct 18, 2026
d3de660
perf(lsp): Incremental text synchronization for LSP didChange notific…
tomlin7 Oct 18, 2026
0087531
feat(lsp): Configurable language server initialization options and ti…
tomlin7 Oct 18, 2026
24b69c8
feat(autocomplete): Documentation popup panel for completion items (#…
tomlin7 Oct 18, 2026
714162a
feat(lsp): Signature help popup on parameter typing (#710) (#783)
tomlin7 Oct 18, 2026
75a3eb1
feat(lsp): Code action support (Quick Fixes and Refactorings) (#711) …
tomlin7 Oct 18, 2026
c0a455b
feat(lsp): Document formatting and format-on-save support (#712) (#785)
tomlin7 Oct 18, 2026
ee91179
feat(lsp): Symbol rename refactoring across workspace (#713) (#786)
tomlin7 Oct 18, 2026
6c635f5
feat(lsp): Semantic token highlighting via Tree-Sitter & LSP tokens (…
tomlin7 Oct 18, 2026
363eecb
feat(git): Display commit timestamps in branch switcher palette (#695…
tomlin7 Oct 18, 2026
dd05de0
feat(git): Initialize Git repository button in Source Control placeho…
tomlin7 Oct 18, 2026
837955a
feat(git): Load comments and reviews for GitHub PR view (#697) (#790)
tomlin7 Oct 18, 2026
a737fa8
feat(git): Load comments and discussion for GitHub Issue view (#698) …
tomlin7 Oct 18, 2026
3e84247
feat(git): Inline Git blame annotation on active line (#730) (#792)
tomlin7 Oct 18, 2026
1fa144d
feat(git): Gutter status indicators for added, modified, and deleted …
tomlin7 Oct 18, 2026
d82a619
feat(git): Interactive squash and rebase dialog in Source Control (#7…
tomlin7 Oct 18, 2026
31d8fde
feat(git): Manage multiple git remotes (add, remove, fetch all) (#733…
tomlin7 Oct 18, 2026
d028dfc
feat(git): Git tag creation and checkout from Command Palette (#734) …
tomlin7 Oct 18, 2026
986d4ed
feat(search): Configurable folder and extension exclude patterns in S…
tomlin7 Oct 18, 2026
d0a882c
feat(search): Refresh open editors and tree results after replace-all…
tomlin7 Oct 18, 2026
6081fd5
feat(explorer): Preview tab mode for single-click file opening (#701)…
tomlin7 Oct 18, 2026
140d61b
feat(palette): Secondary description text and shortcut badges in Comm…
tomlin7 Oct 18, 2026
f2a5147
feat(explorer): Drag and drop file moving and copying in Directory Tr…
tomlin7 Oct 18, 2026
75192da
feat(explorer): Support multi-root workspaces (Add Folder to Workspac…
tomlin7 Oct 18, 2026
567ebf9
feat(explorer): Configurable file nesting patterns in Explorer tree (…
tomlin7 Oct 18, 2026
489b4b0
chore(deps): bump pygments from 2.20.0 to 2.21.0 (#804)
dependabot[bot] Oct 18, 2026
b176756
feat(extensions): Separate tab for Installed extensions vs Marketplac…
tomlin7 Oct 18, 2026
1a5a58d
feat(extensions): Filter extensions by category and tag (#704) (#806)
tomlin7 Oct 18, 2026
87f044c
feat(extensions): Display extension version in CLI extensions listing…
tomlin7 Oct 18, 2026
75db698
feat(settings): Interactive search filter in Settings Editor (#706) (…
tomlin7 Oct 18, 2026
30e7447
feat(settings): Dynamic list item widget with add/remove entry contro…
tomlin7 Oct 18, 2026
f661b69
feat(terminal): Command queue for rapid programmatic execution (#708)…
tomlin7 Oct 18, 2026
b24ec90
feat(debugger): Conditional breakpoints and hit count conditions (#71…
tomlin7 Oct 18, 2026
7c8b3c0
feat(debugger): Watch expressions pane in debug sidebar (#716) (#812)
tomlin7 Oct 18, 2026
9a6e528
feat(debugger): Toggle exception breakpoints (all vs uncaught) (#717)…
tomlin7 Oct 18, 2026
3be49c9
feat(debugger): Interactive evaluation console in debug panel (#718) …
tomlin7 Oct 18, 2026
ec53bcf
feat(debugger): Multi-threaded process call stack inspector (#719) (#…
tomlin7 Oct 18, 2026
0bafd2a
feat(theme): Custom font family and fallback fonts in settings editor…
tomlin7 Oct 18, 2026
180a4a8
feat(theme): High-contrast dark and light accessibility themes (#739)…
tomlin7 Oct 18, 2026
103d6d4
feat(theming): implement runtime theme switching and theme extension …
tomlin7 Oct 18, 2026
e1de114
feat(ai): Generic OpenAI-compatible custom endpoint support (#723) (#…
tomlin7 Oct 18, 2026
960ee7e
feat(editor): Horizontal tab scroll navigation buttons (#688) (#770)
tomlin7 Oct 18, 2026
470ea60
fix(editor): Delayed hover tooltip dismissal with mouse-over protecti…
tomlin7 Oct 18, 2026
4ba8e2f
feat(editor): Word wrap toggle button in statusbar and settings (#726…
tomlin7 Oct 18, 2026
07f317a
chore(deps): bump tree-sitter-language-pack from 1.12.5 to 1.22.1 (#782)
dependabot[bot] Oct 18, 2026
1c3a276
fix(editor): support both tabs and active_pane in TabScroll scroll me…
tomlin7 Oct 18, 2026
03473be
ci: enhance GitHub Actions CI/CD workflows and automated release pipe…
tomlin7 Oct 18, 2026
654feb1
feat: integrate debug-adapter-client backend and DAP extension support
tomlin7 Oct 18, 2026
f73a2d3
Fix extensions CLI handling, notification thread-safety, and UI tag l…
tomlin7 Oct 18, 2026
ea2af1c
fix(debugger): resolve DAP adapter initialization lifecycle, thread s…
tomlin7 Oct 18, 2026
613150c
test(dap): mark end-to-end debugpy test as integration and register m…
tomlin7 Oct 18, 2026
c97fc48
fix(extensions): fix CLI install/uninstall thread-safety and DAP test…
tomlin7 Oct 18, 2026
380ef31
fix(compat): support Python 3.10 StrEnum fallback and ptyprocess on m…
tomlin7 Oct 18, 2026
b75d825
Fix sys.path cleanup when loading queued extensions in ExtensionManager
tomlin7 Oct 18, 2026
31dcd15
feat(extensions): implement isolated dependency management and tool v…
tomlin7 Oct 18, 2026
15f20be
chore(deps): bump click from 8.4.2 to 8.5.0 (#818)
dependabot[bot] Oct 19, 2026
2018f5f
chore(deps): bump aiohttp (#824)
dependabot[bot] Oct 20, 2026
e6b77be
feat(ai): default MiniMax to M3.1 Flash and preserve reasoning history
octo-patch Oct 20, 2026
f44992b
refactor(ai): keep MiniMax history handling within quality limits
octo-patch Oct 20, 2026
32d0f7d
refactor(ai): mark MiniMax response parser static
octo-patch Oct 20, 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
47 changes: 47 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"area: editor":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/editor/**", "src/biscuit/layout/**"]

"area: lsp":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/common/lsp/**"]

"area: git":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/common/git/**", "src/biscuit/views/git/**"]

"area: ai":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/common/ai/**", "src/biscuit/views/ai/**"]

"area: debugger":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/common/debugger/**", "src/biscuit/views/debugger/**"]

"area: terminal":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/common/terminal/**", "src/biscuit/views/terminal/**"]

"area: extensions":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/extensions/**", "src/biscuit/views/extensions/**"]

"area: ui":
- changed-files:
- any-glob-to-any-file: ["src/biscuit/common/ui/**", "src/biscuit/views/**", "src/biscuit/layout/**"]

"area: docs":
- changed-files:
- any-glob-to-any-file: ["docs/**", "*.md"]

"area: tests":
- changed-files:
- any-glob-to-any-file: ["tests/**"]

"area: cicd":
- changed-files:
- any-glob-to-any-file: [".github/**"]

"area: dependencies":
- changed-files:
- any-glob-to-any-file: ["pyproject.toml", "poetry.lock", "uv.lock", "requirements.txt"]
85 changes: 69 additions & 16 deletions .github/workflows/codequality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,44 +5,97 @@ on:
branches: ["main"]
pull_request:
branches: ["main"]
workflow_dispatch:

permissions:
contents: read

jobs:
build:
runs-on: windows-latest
lint:
name: Lint & Code Quality
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Set up Python 3.12
uses: actions/setup-python@v5
- name: Set up Python
uses: actions/setup-python@v7
with:
python-version: '3.12'
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@v5
uses: astral-sh/setup-uv@v7
with:
enable-cache: true

- name: Install dependencies
- name: Install lint tools
run: |
uv pip install --system flake8 ruff

- name: Ruff Check
run: |
ruff check src tests scripts --select=E9,F63,F7,F82

- name: Flake8 Critical Errors
run: |
flake8 src tests scripts --count --select=E9,F63,F7,F82 --show-source --statistics

- name: Flake8 Style & Complexity Warnings
run: |
flake8 src tests scripts --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics

test:
name: Test (${{ matrix.os }}, py${{ matrix.python-version }})
needs: [lint]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ["3.10", "3.11", "3.12", "3.13"]
include:
- os: macos-latest
python-version: "3.12"

steps:
- uses: actions/checkout@v7

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}

- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true

- name: Install Linux Prerequisites
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y python3-tk xvfb libfontconfig1-dev build-essential

- name: Install Dependencies
run: |
uv venv
uv pip install scikit-build
uv pip install -e .
uv pip install pytest pytest-dotenv pytest-cov flake8
uv pip install pytest pytest-dotenv pytest-cov pytest-asyncio

- name: Lint with flake8
- name: Test with pytest (Linux with xvfb)
if: runner.os == 'Linux'
run: |
uv run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
uv run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
xvfb-run -a uv run pytest -m "not integration" --cov=biscuit --cov-report=xml --cov-report=term

- name: Test with pytest
run: uv run pytest -m "not integration" --cov=biscuit --cov-report=xml --cov-report=term
- name: Test with pytest (Windows / macOS)
if: runner.os != 'Linux'
run: |
uv run pytest -m "not integration" --cov=biscuit --cov-report=xml --cov-report=term

- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
if: matrix.python-version == '3.12' && matrix.os == 'windows-latest'
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage.xml
fail_ci_if_error: true
fail_ci_if_error: false
29 changes: 29 additions & 0 deletions .github/workflows/dependabot-auto-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Dependabot Auto-Merge

on:
pull_request:
branches: ["main"]

permissions:
contents: write
pull-requests: write

jobs:
dependabot:
runs-on: ubuntu-latest
if: github.actor == 'dependabot[bot]'
steps:
- name: Fetch Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"

- name: Approve and Enable auto-merge for Dependabot PR
if: steps.metadata.outputs.update-type != 'version-update:semver-major'
run: |
gh pr review --approve "$PR_URL"
gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44 changes: 44 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Documentation Verification

on:
push:
branches: ["main"]
paths:
- "docs/**"
- "tests/test_docs.py"
- ".github/workflows/docs.yml"
pull_request:
branches: ["main"]
paths:
- "docs/**"
- "tests/test_docs.py"
- ".github/workflows/docs.yml"
workflow_dispatch:

permissions:
contents: read

jobs:
validate-docs:
name: Validate Mintlify Docs & Assets
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- name: Set up Python
uses: actions/setup-python@v7
with:
python-version: "3.12"

- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true

- name: Install test runner
run: |
uv pip install --system pytest

- name: Run Docs Integrity Tests
run: |
pytest tests/test_docs.py -v
12 changes: 6 additions & 6 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ jobs:
runs-on: ubuntu-latest
if: contains(github.event.head_commit.message, 'nightly')
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Set up Python 3.10
uses: actions/setup-python@v3
uses: actions/setup-python@v7
with:
python-version: "3.10"

Expand All @@ -32,7 +32,7 @@ jobs:
run: uv run pyinstaller scripts/linux.spec

- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: "biscuit-nightly-anylinux"
path: "dist/"
Expand All @@ -41,10 +41,10 @@ jobs:
runs-on: windows-latest
if: contains(github.event.head_commit.message, 'nightly')
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7

- name: Set up Python 3.10
uses: actions/setup-python@v3
uses: actions/setup-python@v7
with:
python-version: "3.10"

Expand All @@ -58,7 +58,7 @@ jobs:
run: uv run pyinstaller scripts/windows.spec

- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: "biscuit-nightly-windows"
path: "dist/"
6 changes: 3 additions & 3 deletions .github/workflows/nuitka.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ jobs:
if: contains(github.event.head_commit.message, 'nuitka')
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v7

- name: Set up Python 3.10
uses: actions/setup-python@v4
uses: actions/setup-python@v7
with:
python-version: "3.10"

Expand All @@ -31,7 +31,7 @@ jobs:
run: echo Yes| uv run python -m nuitka --include-data-dir=biscuit\\res=res --include-package-data=tkextrafont --include-package-data=sv_ttk --include-package-data=pygments --include-package-data=tkinterweb --include-package-data=mistune --follow-import-to=pygments --follow-import-to=tkextrafont --follow-import-to=mistune --follow-import-to=tkinterweb --include-package=tkextrafont --include-package=pygments --include-package=mistune --include-package=tkinterweb --include-module=pygments --include-module=mistune --include-module=tkinterweb --include-module=tkextrafont --follow-imports --standalone --enable-plugin=tk-inter biscuit

- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: "biscuit-nuitka"
path: "biscuit.dist"
19 changes: 19 additions & 0 deletions .github/workflows/pr-labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Pull Request Labeler

on:
pull_request_target:
types: [opened, synchronize, reopened]

permissions:
contents: read
pull-requests: write

jobs:
labeler:
name: Auto-label PR
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
sync-labels: true
Loading
Loading