Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
312 commits
Select commit Hold shift + click to select a range
ac05f33
Show SSH output as sent, whatever a read cuts
JE-Chen Sep 22, 2026
e577cbc
Decode a long output line across its pieces
JE-Chen Sep 22, 2026
d1811d2
Close every tab inside a deleted folder first
JE-Chen Sep 22, 2026
ef7973a
Install packages with pip as a module, not through cmd.exe
JE-Chen Sep 22, 2026
8e4412f
Record the tool defects found in review
JE-Chen Sep 22, 2026
273e739
Keep a request's method and URL out of generated code
JE-Chen Sep 22, 2026
97b3c70
Write JSON bodies and every string as Python in generated scripts
JE-Chen Sep 23, 2026
f46d246
Count the diff summary from the diff's own opcodes
JE-Chen Sep 23, 2026
c3c825e
Report five tool inputs that used to raise out of the tab
JE-Chen Sep 23, 2026
7f61479
Keep a timestamp's milliseconds and round it down
JE-Chen Sep 23, 2026
98e127f
Take literal form fields literally, read HAR with a BOM, ignore a non…
JE-Chen Sep 23, 2026
34f4251
Correct two line counts in architecture_explore.md
JE-Chen Sep 23, 2026
83f37f1
Keep every value of a repeated query parameter
JE-Chen Sep 23, 2026
a78721d
Correct curl_parser.py's line count
JE-Chen Sep 23, 2026
5cae1a8
Understand bash $'...' quoting in pasted curl commands
JE-Chen Sep 23, 2026
2047de7
Handle query null, repeated response headers and a bad port
JE-Chen Sep 23, 2026
0dff180
Refuse IPv6 site-local addresses in the SSRF check
JE-Chen Sep 23, 2026
f996be7
Carry the AI review totals on from the saved file
JE-Chen Sep 23, 2026
3d383af
Describe how the Install menu runs pip now, and its prthinker entry
JE-Chen Sep 23, 2026
ef23463
Record the defects found in the second review
JE-Chen Sep 23, 2026
09801bd
Make a diagram load all or nothing
JE-Chen Sep 23, 2026
5efb8c8
Keep a prthinker setting that is not text at its default
JE-Chen Sep 23, 2026
9bb2d38
Fix Create Project, YAML choice and unchecked run configs in the menus
JE-Chen Sep 23, 2026
f9151b5
Let a file be renamed to another case of its name
JE-Chen Sep 23, 2026
a8d6122
Fix right-click, stacking, undo order, sizes and wheel in the diagram…
JE-Chen Sep 23, 2026
4fcaf94
Keep Mermaid label text out of statement splitting and accept more he…
JE-Chen Sep 23, 2026
04e935e
Keep diagram editor shortcuts to the editor when it is docked
JE-Chen Sep 23, 2026
2fe6fd9
Keep the prompt editor from saving its missing-file note or dropping …
JE-Chen Sep 23, 2026
518da99
Keep URLs out of AI panel logs and survive damaged or shared panel files
JE-Chen Sep 23, 2026
2298e70
Open the CoT code review panel from the AI menus and check its URL of…
JE-Chen Sep 23, 2026
9d7f2cc
Report a failed save before Run with instead of raising from the menu
JE-Chen Sep 23, 2026
3677ba7
Stop AutoControl recording from any tab and insert it as runnable JSON
JE-Chen Sep 23, 2026
0986658
Create the TestPioneer template in the working directory and ask befo…
JE-Chen Sep 23, 2026
b91bb20
Save the current file before prthinker reviews it
JE-Chen Sep 23, 2026
df09377
Close only the tabs whose files a file tree Delete removed
JE-Chen Sep 23, 2026
8e2c57a
Keep closing the IDE when one tab, dock or run window raises on close
JE-Chen Sep 23, 2026
bc579b1
Parent the prthinker folder dialog and keep only prthinker's source
JE-Chen Sep 23, 2026
97c9c22
Bring Send back however a review request ends, and vote only on an an…
JE-Chen Sep 23, 2026
2495838
Parent the run-folder dialog, report an empty folder, and keep utils …
JE-Chen Sep 23, 2026
89446f2
Close an SFTP session that comes up after Disconnect or tab close
JE-Chen Sep 23, 2026
58360ed
Let go of a run window closed mid-run once its run ends
JE-Chen Sep 23, 2026
3e740e2
Show why JupyterLab did not start, and do not log a closed tab as a f…
JE-Chen Sep 23, 2026
03c8cb6
Close the SSH session when the shell ends on the server
JE-Chen Sep 23, 2026
7a2482b
Ask about an unknown SSH host key once per Connect and keep every acc…
JE-Chen Sep 23, 2026
e52b924
Record the jupyter_server version floor as a decision
JE-Chen Sep 23, 2026
c7a5d32
Take turns on the SFTP session and replace a downloaded file only whe…
JE-Chen Sep 23, 2026
4c3e41e
Convert epoch values and JWT claims before 1970 on Windows
JE-Chen Sep 23, 2026
2ab8a0f
Show a diff when only a final newline or a line ending differs
JE-Chen Sep 23, 2026
4320c7b
Tell the user when a tool's Save to file fails
JE-Chen Sep 23, 2026
4ffd282
Open a diagram whose font size is not a finite number
JE-Chen Sep 23, 2026
b1d4574
Import curl -I, --oauth2-bearer, fragments and repeated -F as curl se…
JE-Chen Sep 23, 2026
5589df2
Read tool input as entered instead of Qt's display text
JE-Chen Sep 23, 2026
8cc3970
Make text typed on the diagram canvas one undo step and keep added im…
JE-Chen Sep 23, 2026
0578419
Refuse a URL whose host the SSRF check and the HTTP client would read…
JE-Chen Sep 23, 2026
e244ffd
Report a run that cannot start in its window and give Python runs no …
JE-Chen Sep 23, 2026
407dde6
End a run without joining its output readers on the UI thread
JE-Chen Sep 23, 2026
d09fdc6
Mail only the report a run wrote, and say in its window whether the m…
JE-Chen Sep 23, 2026
3649cbd
Connect requests to user URLs only to the address checked as they con…
JE-Chen Sep 23, 2026
4a11c4a
Create automation projects in the open folder and ask before replacin…
JE-Chen Sep 23, 2026
9888fc8
Describe a failed AI request without showing its URL
JE-Chen Sep 23, 2026
ae0347a
Keep an edited Skills prompt across a template switch and refuse to s…
JE-Chen Sep 23, 2026
f07bae4
Read prompts without creating the data folder, and fall back when the…
JE-Chen Sep 23, 2026
d896746
Match plugin suffixes as file suffixes and give each plugin one run e…
JE-Chen Sep 23, 2026
e92984d
Record the undeclared requests and urllib3 dependencies in progress
JE-Chen Sep 23, 2026
cc4354c
Report deeply nested JSON in the URL and query tools and build URLs f…
JE-Chen Sep 23, 2026
43a83f9
Save prthinker settings in one step for their owner only, read them w…
JE-Chen Sep 23, 2026
e1bd8c4
Refactor the prompt and diagram saves onto the shared replace_text
JE-Chen Sep 23, 2026
be8609a
Format and minify JSON without changing its numbers or characters, an…
JE-Chen Sep 23, 2026
001e260
Read quoted max-age, folded header lines, header names in any case an…
JE-Chen Sep 23, 2026
addfb4b
Move docked editors and the tab's watch and language state with a ren…
JE-Chen Sep 23, 2026
ad2283a
Refuse prthinker extra arguments with an open quote when the settings…
JE-Chen Sep 23, 2026
7dc61cd
Record the release pipeline's stored token and tag-pinned actions in …
JE-Chen Sep 23, 2026
318164b
Drop the stale test module count from README and say AI requests conn…
JE-Chen Sep 23, 2026
6a23a06
Copy and save tool output as generated, and report regex patterns and…
JE-Chen Sep 23, 2026
6fa42f4
Send imported forms as multipart without a copied Content-Type, and r…
JE-Chen Sep 23, 2026
87f77ea
Read curl @file bodies as bytes the way curl sends them and stop send…
JE-Chen Sep 23, 2026
ed1e621
Compare texts once and off the UI thread in the Diff tab
JE-Chen Sep 23, 2026
3030cb9
List every worker QThread in the architecture map's threading model
JE-Chen Sep 23, 2026
c0d26e1
Keep an imported query that would not survive re-encoding as it was w…
JE-Chen Sep 23, 2026
dd79512
Rebuild a URL's query unchanged in the URL Builder when decoding it w…
JE-Chen Sep 23, 2026
18f756d
Show run output in a QPlainTextEdit so lines past the cap stay cheap
JE-Chen Sep 23, 2026
0aff2af
Bound the queue between a run's readers and its window
JE-Chen Sep 23, 2026
37b92b3
Strip terminal escape codes and control characters from run output
JE-Chen Sep 23, 2026
9de68ee
Run JupyterLab in the chosen interpreter, detect it without pip, and …
JE-Chen Sep 23, 2026
e41a30f
Create the data folder for the log with the owner-only mode
JE-Chen Sep 23, 2026
233f47f
Collect cyclic garbage on the GUI thread so a worker never destroys a…
JE-Chen Sep 23, 2026
1761f01
Highlight TestPioneer scripts saved as .yaml as well as .yml
JE-Chen Sep 23, 2026
e8a0443
Answer No for an SSH host key nobody could be asked about instead of …
JE-Chen Sep 23, 2026
0f16d91
Keep SFTP tree paths right after a folder rename, refresh the folder …
JE-Chen Sep 23, 2026
966894a
Send a whole SSH command however long and strip the escapes and contr…
JE-Chen Sep 23, 2026
505b4af
Open the SSH shell's channel on the connect thread instead of the UI …
JE-Chen Sep 23, 2026
a99bd12
Run the SFTP menu's requests off the UI thread and ask before an uplo…
JE-Chen Sep 23, 2026
64e837a
Refactor: move the SFTP session and its threads out of the file tree'…
JE-Chen Sep 23, 2026
5240c04
Keep a Connect click from cutting an SFTP transfer short
JE-Chen Sep 23, 2026
d2ed791
Correct the file tree module's line count in the architecture map
JE-Chen Sep 23, 2026
8841775
Refactor: drop the executor's exception handlers that nothing could r…
JE-Chen Sep 23, 2026
2c3ef9a
Say in README that SFTP requests run in the background and uploads as…
JE-Chen Sep 23, 2026
a11e977
Let a diagram image be resized by its corner handles
JE-Chen Sep 23, 2026
7eb490d
Skip diagram items a file places nowhere and leave nodes alone when a…
JE-Chen Sep 23, 2026
4c0161b
Keep diagram images and nodes stacked as they were across save, load …
JE-Chen Sep 23, 2026
0812eb4
Read capitalised keywords, class suffixes, open-link chains, percent …
JE-Chen Sep 23, 2026
6cf1061
Export diagrams through a file beside the target so a failed export l…
JE-Chen Sep 23, 2026
3dd4a24
Read ISO-8601 the same on every Python, epoch micro- and nanoseconds,…
JE-Chen Sep 23, 2026
042ecb5
Say in README that TestPioneer highlighting covers .yaml too
JE-Chen Sep 23, 2026
8628a08
Decode a JWT pasted with Bearer, quotes or line breaks around it, and…
JE-Chen Sep 23, 2026
7c814e4
Read the final response of curl -i output and a one-line body as a bo…
JE-Chen Sep 23, 2026
6f4f6e4
Show AI review answers as text, cut long error pages, save totals in …
JE-Chen Sep 23, 2026
64c6528
Decode an AI answer by the charset its Content-Type names, UTF-8 othe…
JE-Chen Sep 23, 2026
86f5a55
Give an AI answer five minutes in all and the CoT chain a 30 s read t…
JE-Chen Sep 23, 2026
722402c
Try every checked address of a host in turn and check international n…
JE-Chen Sep 23, 2026
418b6d1
Run regex patterns in a plain worker script, stop it when the tab clo…
JE-Chen Sep 23, 2026
c7e4926
Keep numbers as written in the query and URL tools and handle lone su…
JE-Chen Sep 23, 2026
7481ed4
Record the query, URL and JSON tools' verbatim numbers in the archite…
JE-Chen Sep 23, 2026
728ee74
Read an indented header block line by line in the header analyzer
JE-Chen Sep 23, 2026
137e896
Save tool output by replacing the chosen file in one step and say pas…
JE-Chen Sep 23, 2026
98a6a5c
Store an accepted SSH host key by replacing known_hosts in one step
JE-Chen Sep 23, 2026
db76d15
Free the report mail's notice on the GUI thread, not on the mail thread
JE-Chen Sep 23, 2026
bf0c23f
Show run output as it arrives and let a carriage return redraw the li…
JE-Chen Sep 23, 2026
55ef5b9
Delete folders with read-only files whole, links as links, and keep n…
JE-Chen Sep 23, 2026
ff7d87b
Keep an edited tab's unsaved mark when the file tree renames its file
JE-Chen Sep 23, 2026
1d64553
Delete a closed JupyterLab tab and its web view
JE-Chen Sep 23, 2026
d6a56f4
Record the prthinker key fields and unlisted saved choices as a decis…
JE-Chen Sep 23, 2026
6064706
Keep one malformed plugin from stopping the IDE's start
JE-Chen Sep 23, 2026
d6d00ea
Build compile-then-run binaries in a folder of their own and make Sto…
JE-Chen Sep 23, 2026
9a19e77
Let a plugin run config name the encoding its program writes
JE-Chen Sep 23, 2026
d722bd0
Run a folder's files one after another so each run has its own report…
JE-Chen Sep 23, 2026
80ded25
Stop a run's whole process tree, not only its direct child
JE-Chen Sep 23, 2026
aaee67f
Bring two tests in line with the compile folder and the JupyterLab ta…
JE-Chen Sep 23, 2026
6e0b379
Show server and file text in message boxes and labels as text, never …
JE-Chen Sep 23, 2026
07fc8a8
Escape U+2028, U+2029 and U+0085 in generated scripts so a pasted cur…
JE-Chen Sep 23, 2026
ad70987
Suggest only the last Windows-safe part of a server's file name when …
JE-Chen Sep 23, 2026
bc686d8
Refuse to open a HAR export or diagram over 100 MB and report read er…
JE-Chen Sep 23, 2026
48606b6
Keep the diagram property panel in step with the canvas and merge ste…
JE-Chen Sep 23, 2026
d800ec3
Keep the diagram's Fit within the zoom range and let zoom always step…
JE-Chen Sep 23, 2026
c60ccb9
Hand the Response Inspector's analysed headers to the header analyzer
JE-Chen Sep 23, 2026
9461a12
Ask before the prompt editor's Create replaces typed text and empty t…
JE-Chen Sep 23, 2026
7d130b1
Ask before closing a prompt or diagram with unsaved changes, from its…
JE-Chen Sep 23, 2026
3c54162
Record the docked editors' close without asking in progress
JE-Chen Sep 23, 2026
79b7cb5
Ask before a docked prompt or diagram editor closes from its dock's o…
JE-Chen Sep 23, 2026
dd6ba91
Restore the main window's tool-tab close check name
JE-Chen Sep 23, 2026
7d8d3e4
Restore blank lines lost in recent edits
JE-Chen Sep 23, 2026
3bbb75b
Remove a leftover fragment of a finished item from progress
JE-Chen Sep 23, 2026
b00bdb4
Refuse a curl command that has no URL
JE-Chen Sep 23, 2026
3238ce0
Remove an unused upload helper and type the output actions' name argu…
JE-Chen Sep 23, 2026
bf74b68
Remove fourteen error messages nothing raises
JE-Chen Sep 23, 2026
a956626
Keep a query's order in the URL Builder and refuse a port written in …
JE-Chen Sep 23, 2026
c7d3bd5
Name every line ending the diff tool compares, and a changed line tha…
JE-Chen Sep 23, 2026
55c00a6
Remove a partial save on any failure, and report a prthinker setting …
JE-Chen Sep 23, 2026
963446b
Report a mail settings file that cannot be read, and always tell the …
JE-Chen Sep 23, 2026
0c7ced0
Translate the diagram export failure, and check every language key th…
JE-Chen Sep 23, 2026
7fd2c99
Check that every header finding and level has a message
JE-Chen Sep 23, 2026
9f213ee
Write JSON a tool shows so that its text box gives it back as it was
JE-Chen Sep 23, 2026
30bd996
Lay out the Response Inspector's body and a JWT's segments as JSON Fo…
JE-Chen Sep 23, 2026
62ada9d
End a pasted JWT where it ends, and find one whose header is not writ…
JE-Chen Sep 23, 2026
4d3a38b
Show a response's status when its code is not a registered one
JE-Chen Sep 23, 2026
214c60b
Refuse a query byte that is not UTF-8 and a JSON key given twice inst…
JE-Chen Sep 23, 2026
de41ec5
Free a run window once the main window lets go of it
JE-Chen Sep 23, 2026
bbf7885
Delete a tool tab once it is closed
JE-Chen Sep 23, 2026
147753a
Move the terminal escape handling out of the SSH widget into utils
JE-Chen Sep 23, 2026
8a866e9
Strip escape sequences a read cuts in two, and every two-byte escape,…
JE-Chen Sep 23, 2026
50c80aa
Show a plugin's About text as text, in a box that belongs to the main…
JE-Chen Sep 23, 2026
dbc78eb
Record that JSON and YAML keyword highlighting waits on JEditor
JE-Chen Sep 23, 2026
60d3765
Delete message boxes and the prthinker settings dialog once they are …
JE-Chen Sep 23, 2026
fde8c38
Let the TestPioneer menu's stand-in message box take the delete-on-cl…
JE-Chen Sep 23, 2026
44ee94d
Free the CoT review, Skill send, Diff and SSH panels once they are cl…
JE-Chen Sep 23, 2026
edc31bb
Cut a trickling AI answer off at its deadline, not only between chunks
JE-Chen Sep 23, 2026
6bf93e9
Bound a whole AI request, its status line and headers included
JE-Chen Sep 23, 2026
5411538
Bound a whole diagram image download, and a body cut short by the dea…
JE-Chen Sep 23, 2026
f5bd543
Wrap the three code lines past 120 characters
JE-Chen Sep 23, 2026
63d95f6
Show file names, paths, hosts and errors in message boxes as text, an…
JE-Chen Sep 23, 2026
1a6329d
Drop a half-made connection when the diagram is rebuilt
JE-Chen Sep 23, 2026
b71a06a
Free the diagram editor after it has fetched an image from a URL
JE-Chen Sep 23, 2026
48665c5
Free the SFTP tree after its listings and menu requests
JE-Chen Sep 23, 2026
e90b395
Free the Regex tab and the SFTP tree after a match or a transfer
JE-Chen Sep 23, 2026
58cbe7a
Check that every tool tab opened and closed is freed
JE-Chen Sep 23, 2026
47adfc4
Continue the September update log in 2026-09-b.md
JE-Chen Sep 23, 2026
babf3be
Bring the architecture map, README and CLAUDE.md back in line with th…
JE-Chen Sep 23, 2026
3d456cc
Run a script too long for a Windows command line from a file
JE-Chen Sep 23, 2026
a258380
Note the JupyterLab front-end advisories in the dependency question
JE-Chen Sep 23, 2026
a3177fd
Keep every recorded call, cookie and entry when importing a HAR file
JE-Chen Sep 23, 2026
17c3a33
Move exact_text beside plain_text in pybreeze_ui
JE-Chen Sep 23, 2026
d0f6adb
Save a prompt file with the characters it was opened with
JE-Chen Sep 23, 2026
9c0d927
Round a decimal epoch toward the past and refuse an offset past 59 mi…
JE-Chen Sep 24, 2026
fbfa216
Keep the prthinker extra arguments after a #
JE-Chen Sep 24, 2026
094efa9
Skip a diagram image entry that is not an object instead of failing Open
JE-Chen Sep 24, 2026
1d1d6e0
Keep a quoted Mermaid edge label that holds a bar
JE-Chen Sep 24, 2026
d274d84
Keep an empty host empty when the URL Builder rebuilds a URL
JE-Chen Sep 24, 2026
0557239
Read an HTTP/2 status pseudo-header only when it is ASCII digits
JE-Chen Sep 24, 2026
eeca6f9
Show one changed line in a long repetitive text as one line
JE-Chen Sep 24, 2026
47fb192
Share one refuse_constant between the JSON tools
JE-Chen Sep 24, 2026
36751ec
Send a JSON body raw when the object would not send it back as it was
JE-Chen Sep 24, 2026
0a3f42f
Send curl's data pieces in command-line order when one is a file
JE-Chen Sep 24, 2026
50f1500
Say when an SSH key's passphrase is missing or wrong
JE-Chen Sep 24, 2026
4ee0ccf
Skip a bad known_hosts line instead of failing the SSH connect
JE-Chen Sep 24, 2026
1901c1b
Keep a carriage return split from what follows it in the run window a…
JE-Chen Sep 24, 2026
bdd09d4
Let a backspace take back what an earlier read showed
JE-Chen Sep 24, 2026
226d9da
Keep the HAR tab's output the script of the file and target shown
JE-Chen Sep 24, 2026
c03b3f5
Show a plugin's suffixes in the Run with box as text
JE-Chen Sep 24, 2026
aeeb6f0
Percent-encode what a text box would change when the URL Builder buil…
JE-Chen Sep 24, 2026
85ec836
Hand -b cookies to the header analyzer as the Cookie header curl sends
JE-Chen Sep 24, 2026
ec789c3
Draw the canvas where it is when the diagram is exported
JE-Chen Sep 24, 2026
2334bd6
Scale a diagram image from the image as loaded, so resizing does not …
JE-Chen Sep 24, 2026
9d2f5f1
Leave a redirect's body and Location unread in the AI panels and the …
JE-Chen Sep 24, 2026
c1792fb
Give pip the prthinker source folder as a path, not a name
JE-Chen Sep 24, 2026
2d4b5d1
Run with the IDE's own interpreter when no venv is found
JE-Chen Sep 24, 2026
86f67d1
Fix a doubled backslash in the update log
JE-Chen Sep 24, 2026
af15fb4
Ask whether to require the TestPioneer that reads YAML as UTF-8
JE-Chen Sep 24, 2026
8960f95
Keep difflib's junk heuristic on after trimming, so a repetitive diff…
JE-Chen Sep 24, 2026
eb61bd0
Generate the HAR script again when going back from a target that coul…
JE-Chen Sep 24, 2026
62b604b
Call an encrypted SSH key of a type paramiko cannot load unsupported
JE-Chen Sep 24, 2026
74fd1d3
Round a long decimal epoch down inside the decimal arithmetic too
JE-Chen Sep 24, 2026
536f486
Never write a known_hosts file over when it cannot be read, and keep …
JE-Chen Sep 24, 2026
f1c460a
Skip a HAR entry holding half a character instead of failing the whol…
JE-Chen Sep 24, 2026
a4f805d
Apply backspaces in one pass, so a long rub-out does not hold the UI
JE-Chen Sep 24, 2026
53b08a4
Correct a measured time in the update log
JE-Chen Sep 24, 2026
db37d9e
Translate the SFTP tree's menu and headers, and mark its placeholder …
JE-Chen Sep 24, 2026
5588ed0
Show the SSH connect line in the IDE language, and the status as Conn…
JE-Chen Sep 24, 2026
2c8abe6
Give the reason JupyterLab did not start in the IDE language
JE-Chen Sep 24, 2026
2c3ecc8
Add a Save As button to the diagram editor
JE-Chen Sep 24, 2026
50ea101
Remove translations no code reads
JE-Chen Sep 24, 2026
8add463
Translate the CoT review panel's remaining English
JE-Chen Sep 24, 2026
cece5e6
Write the multi-script menu entries in Chinese, each word once
JE-Chen Sep 24, 2026
6ab26a8
Follow symbolic links in SFTP listings, so a link to a folder opens
JE-Chen Sep 24, 2026
8adfc9c
Remove an event filter the SFTP tree never installs
JE-Chen Sep 24, 2026
1b1d511
Refactor: keep each SFTP tree item's kind in item data
JE-Chen Sep 24, 2026
4992182
Show the SFTP tree's Type column in the IDE language
JE-Chen Sep 24, 2026
6ebd28a
Start an SFTP rename from the current name, and send nothing when it …
JE-Chen Sep 24, 2026
7a63ac7
Say that SFTP deletes only an empty folder when a folder delete is re…
JE-Chen Sep 24, 2026
0f5b0dd
Correct a line count in the architecture map
JE-Chen Sep 24, 2026
85c0e45
Let Enter connect in the SSH login form, and browse for the key file
JE-Chen Sep 24, 2026
924c895
Run the regex pattern on Enter
JE-Chen Sep 24, 2026
3ce0a91
Show a revealed file selected in Explorer and Finder, and a failed st…
JE-Chen Sep 24, 2026
ff5c5f0
Refactor: fill the AI review method box from SUPPORTED_METHODS
JE-Chen Sep 24, 2026
68fff5e
Show why a tool refused its input in the IDE language
JE-Chen Sep 24, 2026
e0c17c3
Take a plugin run config's string args as one argument
JE-Chen Sep 24, 2026
7f1a157
Show why a HAR file did not load in the IDE language
JE-Chen Sep 24, 2026
1515915
Remove an error hook TaskProcessManager never called
JE-Chen Sep 24, 2026
4bc2a37
Refactor: raise the network, image, host-key and Skills messages from…
JE-Chen Sep 24, 2026
910cfdb
Show network, image, host-key and Skills reasons in the IDE language
JE-Chen Sep 24, 2026
be9bd3b
Open the SFTP menu with exec instead of the deprecated exec_
JE-Chen Sep 24, 2026
dd2a55b
Add a Stop button to the run window
JE-Chen Sep 24, 2026
226da1b
Refactor: dispatch the SFTP context menu from a table
JE-Chen Sep 24, 2026
1665720
Let an SFTP transfer be cancelled from the tree's menu
JE-Chen Sep 24, 2026
5b13ced
Keep the diff that changes fewer lines, trimmed or plain
JE-Chen Sep 24, 2026
71a668e
Say a declined host key in the IDE language in the SFTP tree too
JE-Chen Sep 24, 2026
2c96ddf
Test that no tool tab shows a reason as it was raised
JE-Chen Sep 24, 2026
0ab684c
Refactor: raise the diagram file checks from exception_tags
JE-Chen Sep 24, 2026
573253f
Say why a diagram file or a CoT URL was refused in the IDE language
JE-Chen Sep 24, 2026
f04dfbf
Adopt je_editor 1.0.27 docked-editor contract
JE-Chen Sep 24, 2026
07b76b2
Report a deeply nested regex instead of crashing on CPython 3.10
JE-Chen Sep 24, 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
3 changes: 3 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ updates:
directory: "/" # Location of package manifests
schedule:
interval: "daily"
# Development work, dependency bumps included, goes to dev; main takes
# releases only, and every push to main publishes to PyPI.
target-branch: "dev"
6 changes: 6 additions & 0 deletions .github/workflows/dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ jobs:
run: python -m pip install -r dev_requirements.txt
- name: Install test tooling
run: python -m pip install pytest pytest-cov hypothesis
- name: Install prthinker for the command-line contract test
# prthinker is not on PyPI and needs Python 3.12+. One leg is enough to
# check that the arguments and environment PyBreeze builds are still the
# ones prthinker accepts (test/test_utils/test_prthinker_contract.py).
if: matrix.python-version == '3.12'
run: python -m pip install "prthinker[runner] @ https://github.com/JE-Chen/Code-Review-Framework-Combining-Large-Language-Models-and-Chain-of-Thought-Reasoning/archive/refs/heads/main.zip"
- name: Run unit tests (pytest)
run: python -m pytest test/test_utils/ -v --tb=short --cov=pybreeze --cov-branch --cov-report=xml
- name: Upload coverage for analysis
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/stable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ jobs:
run: python -m pip install -r requirements.txt
- name: Install test tooling
run: python -m pip install pytest pytest-cov hypothesis
- name: Install prthinker for the command-line contract test
# prthinker is not on PyPI and needs Python 3.12+. One leg is enough to
# check that the arguments and environment PyBreeze builds are still the
# ones prthinker accepts (test/test_utils/test_prthinker_contract.py).
if: matrix.python-version == '3.12'
run: python -m pip install "prthinker[runner] @ https://github.com/JE-Chen/Code-Review-Framework-Combining-Large-Language-Models-and-Chain-of-Thought-Reasoning/archive/refs/heads/main.zip"
- name: Run unit tests (pytest)
run: python -m pytest test/test_utils/ -v --tb=short --cov=pybreeze --cov-branch --cov-report=xml
- name: Upload coverage for analysis
Expand Down
57 changes: 41 additions & 16 deletions CLAUDE.md

Large diffs are not rendered by default.

323 changes: 20 additions & 303 deletions PLUGIN_GUIDE.md
Original file line number Diff line number Diff line change
@@ -1,314 +1,31 @@
# PyBreeze Plugin Guide / 插件開發指南

PyBreeze (jeditor) supports external plugins for adding **syntax highlighting** and **UI translations**.
PyBreeze is built on JEditor and uses its plugin system unchanged: the `je_editor.plugins` API
(`register_programming_language`, `register_natural_language`, `PLUGIN_RUN_CONFIG`), the
`jeditor_plugins/` directory and the *Plugins → Plugin Browser* menu. There is therefore one guide
for both editors, kept in the JEditor repository:

PyBreeze (jeditor) 支援外部插件,可用於新增**語法高亮**和 **UI 翻譯**。
**→ [JEditor `PLUGIN_GUIDE.md`](https://github.com/Integration-Automation/JEDITOR/blob/main/PLUGIN_GUIDE.md)**

---

## Quick Start / 快速開始

1. Create a `.py` file in the `jeditor_plugins/` directory (under your working directory).
2. Define a `register()` function.
3. Optionally define `PLUGIN_NAME`, `PLUGIN_AUTHOR`, `PLUGIN_VERSION` for the Plugins menu.

<!-- -->

1. 在工作目錄下的 `jeditor_plugins/` 建立一個 `.py` 檔案。
2. 定義一個 `register()` 函式。
3. 可選:定義 `PLUGIN_NAME`、`PLUGIN_AUTHOR`、`PLUGIN_VERSION`,會顯示在插件選單中。

---

## Plugin Metadata / 插件元資料

```python
PLUGIN_NAME = "My Plugin" # Display name in the Plugins menu / 插件選單顯示名稱
PLUGIN_AUTHOR = "Your Name" # Author / 作者
PLUGIN_VERSION = "1.0.0" # Version / 版本號
```

All three are optional. If omitted, the filename is used as the plugin name.
Ready-made plugins (C, C++, Go, Java and Rust highlighting with run support, a French UI
translation) live in [IDE_Plugins](https://github.com/Jeffrey-Plugin-Repos/IDE_Plugins).

三者皆為可選。若未定義,則以檔名作為插件名稱。
PyBreeze reads one run-config key JEditor does not: `"encoding"`, the encoding the program writes
its output in (`"cp950"`, `"utf-8"`, or `"locale"` for the machine's own). Without it the output is
read in the IDE's encoding, UTF-8 by default. Java and localized compilers write the console's code
page, so a Java run config on a non-English Windows wants `"encoding": "locale"`.

---

## Syntax Highlighting Plugin / 語法高亮插件

Use `register_programming_language()` to add syntax highlighting for file types.

使用 `register_programming_language()` 為檔案類型新增語法高亮。

### API

```python
from je_editor.plugins import register_programming_language

register_programming_language(
suffix=".ext", # File extension / 副檔名
syntax_words={...}, # Keyword groups / 關鍵字群組
syntax_rules={...}, # Regex rules (optional) / 正則規則(可選)
)
```

### syntax_words format / syntax_words 格式

```python
from PySide6.QtGui import QColor

syntax_words = {
"group_name": {
"words": ("keyword1", "keyword2", ...), # Tuple or set of keywords / 關鍵字元組或集合
"color": QColor(r, g, b), # Highlight color / 高亮顏色
},
# More groups...
}
```

### syntax_rules format / syntax_rules 格式

```python
syntax_rules = {
"rule_name": {
"rules": (r"regex_pattern", ...), # Tuple of regex patterns / 正則表達式元組
"color": QColor(r, g, b), # Highlight color / 高亮顏色
},
}
```

### Full Example / 完整範例

```python
"""Go syntax highlighting plugin."""
from PySide6.QtGui import QColor
from je_editor.plugins import register_programming_language

PLUGIN_NAME = "Go Syntax Highlighting"
PLUGIN_AUTHOR = "Your Name"
PLUGIN_VERSION = "1.0.0"

go_syntax_words = {
"keywords": {
"words": (
"break", "case", "chan", "const", "continue",
"default", "defer", "else", "fallthrough", "for",
"func", "go", "goto", "if", "import",
"interface", "map", "package", "range", "return",
"select", "struct", "switch", "type", "var",
),
"color": QColor(86, 156, 214),
},
"types": {
"words": (
"bool", "byte", "complex64", "complex128",
"float32", "float64", "int", "int8", "int16",
"int32", "int64", "rune", "string", "uint",
"uint8", "uint16", "uint32", "uint64", "uintptr",
"error", "nil", "true", "false", "iota",
),
"color": QColor(78, 201, 176),
},
}

go_syntax_rules = {
"single_line_comment": {
"rules": (r"//[^\n]*",),
"color": QColor(106, 153, 85),
},
}


def register() -> None:
register_programming_language(
suffix=".go",
syntax_words=go_syntax_words,
syntax_rules=go_syntax_rules,
)
```

### Multiple Suffixes / 多個副檔名

If a language uses multiple file extensions, register each suffix with the same `syntax_words`:

若一個語言使用多個副檔名,用相同的 `syntax_words` 分別註冊每個副檔名:

```python
def register() -> None:
for suffix in (".cpp", ".cxx", ".cc", ".h", ".hpp", ".hxx"):
register_programming_language(
suffix=suffix,
syntax_words=cpp_syntax_words,
syntax_rules=cpp_syntax_rules,
)
```

They will be grouped under one submenu in the Plugins menu.

它們會在插件選單中合併顯示在同一個子選單下。

---

## Translation Plugin / 翻譯插件

Use `register_natural_language()` to add a new UI language.

使用 `register_natural_language()` 新增 UI 語言。

### API

```python
from je_editor.plugins import register_natural_language

register_natural_language(
language_key="French", # Internal key / 內部鍵值
display_name="Francais", # Shown in Language menu / 語言選單顯示名稱
word_dict={...}, # Translation dictionary / 翻譯字典
)
```

### word_dict keys / word_dict 鍵值

The `word_dict` should contain the same keys as jeditor's built-in `english_word_dict`.
Common keys include:

`word_dict` 應包含與 jeditor 內建 `english_word_dict` 相同的鍵值。
常用鍵值包括:

| Key | Description / 說明 |
|---|---|
| `application_name` | Window title / 視窗標題 |
| `file_menu_label` | File menu / 檔案選單 |
| `run_menu_label` | Run menu / 執行選單 |
| `tab_name_editor` | Editor tab / 編輯器分頁 |
| `language_menu_label` | Language menu / 語言選單 |
| `help_menu_label` | Help menu / 幫助選單 |

For a complete list, refer to `je_editor.utils.multi_language.english.english_word_dict`
or see the example plugin `exe/jeditor_plugins/french.py`.

完整鍵值列表請參考 `je_editor.utils.multi_language.english.english_word_dict`,
或參考範例插件 `exe/jeditor_plugins/french.py`。

### Full Example / 完整範例

```python
"""Japanese translation plugin."""
from je_editor.plugins import register_natural_language

PLUGIN_NAME = "Japanese Translation"
PLUGIN_AUTHOR = "Your Name"
PLUGIN_VERSION = "1.0.0"

japanese_word_dict = {
"application_name": "JEditor",
"file_menu_label": "ファイル",
"run_menu_label": "実行",
"tab_name_editor": "エディタ",
"language_menu_label": "言語",
"language_menu_bar_english": "英語",
"language_menu_bar_traditional_chinese": "繁体字中国語",
"language_menu_bar_please_restart_messagebox": "アプリケーションを再起動してください",
# ... more keys
}


def register() -> None:
register_natural_language(
language_key="Japanese",
display_name="日本語",
word_dict=japanese_word_dict,
)
```

---

## Run Config (Execute Files) / 執行設定

Plugins can register a `PLUGIN_RUN_CONFIG` to enable running files from the **Run with...** menu.

插件可定義 `PLUGIN_RUN_CONFIG`,讓使用者可以從 **以...執行** 選單執行檔案。

### Interpreted Languages / 直譯式語言

For languages that run directly (Go, Java 11+, Python):

直接執行的語言(Go、Java 11+、Python):

```python
PLUGIN_RUN_CONFIG = {
"name": "Go", # Display name in menu / 選單顯示名稱
"suffixes": (".go",), # Supported file types / 支援的副檔名
"compiler": "go", # Executable / 執行檔
"args": ("run",), # Args before file path / 檔案路徑前的參數
}
# Runs: go run file.go
```

### Compiled Languages / 編譯式語言

For languages that need compile-then-run (C, C++, Rust):

需要先編譯再執行的語言(C、C++、Rust):

```python
PLUGIN_RUN_CONFIG = {
"name": "C (GCC)",
"suffixes": (".c",),
"compiler": "gcc",
"args": (),
"compile_then_run": True, # Compile first, then run output / 先編譯再執行
"output_flag": "-o", # Flag for output binary / 輸出檔案的旗標
}
# Compiles: gcc file.c -o file
# Then runs: ./file (Linux/Mac) or file.exe (Windows)
```

### Config Keys / 設定鍵值

| Key | Required | Description |
|---|---|---|
| `name` | Yes | Display name / 顯示名稱 |
| `suffixes` | Yes | Tuple of file extensions / 副檔名元組 |
| `compiler` | Yes | Compiler/interpreter executable / 編譯器或直譯器 |
| `args` | No | Extra args before file path / 檔案路徑前的額外參數 |
| `compile_then_run` | No | If `True`, compile first / 若為 `True` 則先編譯 |
| `output_flag` | No | Output file flag (default `"-o"`) / 輸出旗標 |

---

## Directory Structure / 目錄結構

```
working_directory/
jeditor_plugins/
my_syntax.py # Single-file plugin / 單檔插件
my_language.py
my_package/ # Package plugin / 套件插件
__init__.py
```

- Plugins are auto-discovered from `jeditor_plugins/` under the current working directory.
- Files starting with `_` or `.` are ignored.
- Each plugin must have a `register()` function.

<!-- -->

- 插件會從工作目錄下的 `jeditor_plugins/` 自動載入。
- 以 `_` 或 `.` 開頭的檔案會被忽略。
- 每個插件必須有 `register()` 函式。

---
PyBreeze 建立在 JEditor 之上,原封不動地使用它的插件系統:`je_editor.plugins` API
(`register_programming_language`、`register_natural_language`、`PLUGIN_RUN_CONFIG`)、
`jeditor_plugins/` 目錄,以及 *插件 → Plugin Browser* 選單。所以兩個編輯器共用一份指南,放在 JEditor repo:

## Existing Plugins / 現有插件
**→ [JEditor `PLUGIN_GUIDE.md`](https://github.com/Integration-Automation/JEDITOR/blob/main/PLUGIN_GUIDE.md)**

| Plugin | File | Type | Run Support |
|---|---|---|---|
| C Syntax Highlighting | `c_syntax.py` | Syntax (`.c`) | GCC compile & run |
| C++ Syntax Highlighting | `cpp_syntax.py` | Syntax (`.cpp`, `.cxx`, `.cc`, `.h`, `.hpp`, `.hxx`) | G++ compile & run |
| Go Syntax Highlighting | `go_syntax.py` | Syntax (`.go`) | `go run` |
| Java Syntax Highlighting | `java_syntax.py` | Syntax (`.java`) | `java` |
| Rust Syntax Highlighting | `rust_syntax.py` | Syntax (`.rs`) | rustc compile & run |
| French Translation | `french.py` | Language | - |
現成的插件(C、C++、Go、Java、Rust 語法高亮與執行設定,以及法文介面翻譯)放在
[IDE_Plugins](https://github.com/Jeffrey-Plugin-Repos/IDE_Plugins)。

All plugins are located in `exe/jeditor_plugins/`.
PyBreeze 多讀一個 JEditor 不讀的執行設定欄位:`"encoding"`,程式輸出用的編碼(`"cp950"`、`"utf-8"`,
或 `"locale"` 表示這台電腦自己的)。沒寫就用 IDE 的編碼讀,預設 UTF-8。Java 與中文化的編譯器輸出的是
主控台的字碼頁,所以在非英文 Windows 上,Java 的執行設定要寫 `"encoding": "locale"`。
Loading
Loading