Commit fc3c61f
authored
fix(repo): pythinker-cli rename sweep + feat(installer): hosted Windows uninstaller (#252)
* fix(repo): update all repository URLs after rename to pythinker-cli
The GitHub repository was renamed from Pythoughts-labs/pythinker-code to
Pythoughts-labs/pythinker-cli, and the old name's redirect no longer applies.
Update every repo-slug constant and URL: install scripts (all copies), the
in-app updater, the default feedback repo, the docs-pages repository guard,
winget/homebrew/scoop workflow links, README, docs, and matching tests.
* feat(installer): add hosted Windows uninstaller one-liner
Add scripts/uninstall.ps1, served at https://pythinker.com/uninstall.ps1
mirroring the installer bootstrap (irm ... | iex). It runs the registered
Inno uninstaller silently, sweeps validated install dirs, PATH entries
(user + system, kind-preserved), Start Menu shortcuts, uninstall registry
keys (32/64-bit views), and stale installer temp dirs, then verifies the
final machine state with fail-closed semantics and a structured summary.
Safety: registry-provided paths are never deleted or executed without
validation (leaf named Pythinker plus on-disk evidence, no reparse-point
component, trusted unins<N>.exe only); processes are stopped per-PID only
when rooted in a validated install dir with StartTime/Path revalidation;
the script never self-elevates and never calls exit, so piping through
iex cannot close the host session. User data is kept unless
PYTHINKER_PURGE_DATA=1.
Ship byte-identical copies in docs/public and web/public with matching
_headers cache entries, document the one-liner in the README Windows
section and the getting-started guide, and cover sync/parsing/README
assertions in test_installation_docs.py.
* refactor(installer): harden Windows uninstaller deletion and execution policy
Replace the removal engine with a snapshot-based design
(Get-SafeTreeSnapshot + Remove-SafeSnapshotNow): complete-or-fail-closed
tree inspection, per-entry non-recursive deletes that never rely on
PS 5.1 reparse traversal, and re-inspection before reboot scheduling.
Tighten policy: recursive sweeps run only against known install dirs
(LOCALAPPDATA + ProgramFiles x2); registry-selected custom installs are
never swept or executed automatically - they get exact PATH-token removal
and a manual-action report. Inno uninstallers execute only non-elevated,
user-scope, from a known dir, as a trusted unins<N>.exe; no registry
selected binary ever runs with an elevated token.
Also: canonicalize all registry-provided paths (reject roots, UNC/device,
drive-relative, reparse components), re-read PATH under the writable
handle before SetValue, broadcast WM_SETTINGCHANGE only on actual change,
prove installer-temp ownership via AppId marker or verified SHA-256,
handle 32-bit registry views natively, dedupe warnings, and bound the
uninstaller run with a 10-minute timeout.
Uses DirectorySeparatorChar in path-prefix checks (identical to '\' on
Windows; keeps the logic testable cross-platform).
* fix(installer): replace -ine operator flagged by the typos workflow
Use [string]::Equals(..., OrdinalIgnoreCase) for the Pythinker leaf-name
check; identical semantics, and the repo has no typos config to suppress
the PowerShell -ine operator being flagged as a misspelling.
* fix(repo): address CodeRabbit review findings on the rename sweep
- issue template: make the discussions link label match its pythinker-cli target
- README: fix 'cd pythinker-code' after cloning pythinker-cli.git
- feedback: migrate saved Pythoughts-labs/pythinker-code repo values (the
pre-rename bundled default) to pythinker-cli, with a regression test
- help skill: point documentation base/llms.txt/page URLs at the canonical
pythinker-cli GitHub Pages path instead of relying on the rename redirect
- tests: report a missing pwsh as pytest.skip instead of a silent pass
* docs(skills): add language tag to llms.txt URL fence (MD040)1 parent 582a394 commit fc3c61f
53 files changed
Lines changed: 4922 additions & 161 deletions
File tree
- .github
- ISSUE_TEMPLATE
- workflows
- docs
- .vitepress
- en
- guides
- release-notes
- history
- public
- examples/feedback-worker
- packages
- homebrew-tap
- linux-installer
- pythinker-core
- src/pythinker_core/contrib/chat_provider
- tests/api_snapshot_tests
- pythinker-host
- pythinker-review
- src/pythinker_review/output
- scoop-bucket
- windows-installer
- scripts
- sdks/pythinker-sdk
- src/pythinker_code
- skills/pythinker-code-help
- ui/shell
- tests
- core
- ui_and_conv
- web/public
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
158 | 158 | | |
159 | 159 | | |
160 | 160 | | |
161 | | - | |
| 161 | + | |
162 | 162 | | |
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
129 | 129 | | |
130 | 130 | | |
131 | 131 | | |
132 | | - | |
| 132 | + | |
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
140 | | - | |
| 140 | + | |
141 | 141 | | |
142 | 142 | | |
143 | 143 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| |||
0 commit comments