abstract_ide
Project description
Abstract IDE
A modular, multi-console PyQt6 desktop IDE toolkit built around explicit wiring, schema-first design, and composable tab-based consoles. Each console is a self-contained tool that shares a common SharedStateBus for synchronized filter state across tabs.
Overview
abstract_ide is a collection of developer-facing GUI consoles built on PyQt6. Rather than a monolithic application, it is a registry of independently launchable consoles — each solving a specific workflow — unified under a single ideConsole shell when needed.
Included Consoles
| Console | Description |
|---|---|
| Finder Console | Multi-tab file search, directory mapping, diff patching, scaffolding, and import extraction |
| React Runner | Build runner, TypeScript/JS function inspector, React project analyzer |
| API Console | API interaction tooling |
| Database Viewer | Tabular database inspection |
| ClipIt | File content clipboard manager with Python parsing |
| Web Pardner | Browser/web tooling |
| Window Manager | Desktop window management utilities |
| App Runner | General application launcher |
| Image Tab | Image viewer and management |
| DB Image Viewer | Database-backed image viewer |
| Log Console | Unified live log viewer |
Architecture
Design Principles
This codebase is built around four explicit commitments:
- Queues over callbacks — workers emit to signals; UI never blocks
- Registries over globals —
FileRegistry,SharedStateBus, andinitFuncspatterns replace module-level state - Schemas over ad-hoc objects —
@dataclasstypes (FileEntry,Config,Hunk,ApplyReport,SearchParams) define all data contracts - Explicit environment wiring — no "smart defaults" that hide dependencies; every connection is named
SharedStateBus
All tabs within a console share a SharedStateBus — a QObject-based signal broker that synchronizes filter state (directory, extensions, patterns, flags) across linked tabs. Tabs can opt out by toggling "Independent" mode.
class SharedStateBus(QObject):
stateBroadcast = pyqtSignal(object, dict) # (sender, state_dict)
initFuncs Pattern
Each tab/console uses a loader that binds free functions as instance methods at construction time, keeping class definitions thin and functions independently testable:
def initFuncs(self):
for f in (start_search, populate_results, append_log, open_one):
setattr(self, f.__name__, f)
return self
ConsoleBase
All top-level consoles inherit from ConsoleBase (from abstract_gui), which provides a QMainWindow-compatible shell with a shared bus and layout entry point.
Finder Console
The primary file operations console. Launched via startFinderConsole() or embedded as a tab.
Tabs
Find Content
Full-text file search with string matching, line extraction, and result list. Runs in a QThread worker. Double-click results to open in editor.
Filters available:
- Directory path (with SFTP/GVFS resolution)
- Search strings (comma-separated)
- Allowed/excluded extensions, types, directories, patterns
- Recursive toggle, spec line, parse lines, get lines
Directory Map
Generates a visual directory tree as a list. Supports copy-to-clipboard, save-to-file, and context menu operations.
Diff (Repo)
Paste a unified diff, match hunks against files in the configured directory, preview the patched result, and apply to single or multiple files with optional backup.
Key behaviors:
- Tolerant unified diff parser (works with or without
@@headers) - Per-file apply/overwrite checkboxes in results tree
save_all_checked()applies diff to all checked files with.bakbackup option
Scaffolder
Paste tree-style directory structure text, parse it into TreeNode schemas, create the file/folder structure on disk, and edit file contents inline.
Uses:
TreeParser— converts tree text toTreeNodedataclass graphScaffoldBuilder— queue-based disk writerFileRegistry— central in-memory registry with dirty-tracking and listeners
Extract Python Imports
Scans Python files, extracts all imports, displays as filterable "chips". Clicking an import filters the file list to files containing that import.
React Runner
TypeScript/JavaScript project tooling. Three tabs:
react Runner Tab
- Runs
yarn/pnpm/npm buildviaQProcess(non-blocking) - Streams output live to log view
- Parses build errors/warnings into grouped tree views (by file, with line/col)
- Embedded code editor with highlight-on-click, save, and revert
- Alt-extension resolution (
.ts→.tsxetc.)
Functions Tab
- Scans a base path for exported TypeScript/JS functions
- Three modes: Packages (dist/index introspection), Functions folder (static scan), React project (configurable subdir)
- Uses
@babel/parser+@babel/traversefor static analysis; falls back to regex - Displays function chips with filter; clicking shows export/import locations
- Tracks both functions and variables with separate filter groups
Test Runner Tab (reactTab)
- Browse packages under a configurable root
- Select and call exported functions interactively with typed argument inputs
- Executes via
tsxthrough NVM-resolved Node.js - Raw JSON args override available
Installation
Requirements
- Python 3.10+
- PyQt6
- Node.js (for React Runner — resolved via NVM automatically)
pip install abstract-ide
Or from source:
git clone https://github.com/AbstractEndeavors/abstract-ide
cd abstract-ide
pip install -e .
Dependencies
PyQt6
abstract_gui
abstract_utilities
abstract_react
abstract_apis
abstract_paths
Usage
Launch the full IDE shell
from abstract_ide.consoles import ideConsole
ideConsole.start()
Launch individual consoles
from abstract_ide.consoles.finderConsole import finderConsole
finderConsole.start()
from abstract_ide.consoles.reactRunner import reactRunner
reactRunner.start()
Embed a console as a tab
from abstract_ide.consoles.finderConsole.src.tabs.main import finderConsole
from abstract_ide.consoles.reactRunner.src.main import reactRunner
inner = QTabWidget()
inner.addTab(finderConsole(), "Finder")
inner.addTab(reactRunner(), "React")
Use individual finder tabs directly
from abstract_ide.consoles.finderConsole.src.tabs.finderTab import finderTab
from abstract_ide.consoles.finderConsole.src.imports.share_utils.shared.inputs import SharedStateBus
bus = SharedStateBus()
tab = finderTab(bus)
Directory Structure
abstract_ide/
├── src/
│ └── abstract_ide/
│ └── consoles/
│ ├── src/
│ │ ├── main.py # ideConsole — top-level shell
│ │ ├── finderConsole/
│ │ │ ├── src/
│ │ │ │ ├── tabs/
│ │ │ │ │ ├── main.py # finderConsole tab container
│ │ │ │ │ ├── finderTab/ # full-text search
│ │ │ │ │ ├── directoryMapTab/
│ │ │ │ │ ├── diffParserTab/
│ │ │ │ │ ├── scaffolder/
│ │ │ │ │ ├── collectFilesTab/
│ │ │ │ │ └── extractImportsTab/
│ │ │ │ └── imports/
│ │ │ │ └── share_utils/
│ │ │ │ └── shared/
│ │ │ │ ├── inputs.py # install_common_inputs, SharedStateBus
│ │ │ │ ├── states/ # read_state / write_state
│ │ │ │ ├── results/ # make_params, browse_dir
│ │ │ │ └── visibility/ # visibilityMgr (collapsible sections)
│ │ └── reactRunner/
│ │ └── src/
│ │ ├── main.py # reactRunner tab container
│ │ ├── runnerTab/ # build runner + error tree + editor
│ │ ├── functionsTab/ # JS/TS function inspector
│ │ │ ├── flowLayout/ # wrapping chip layout
│ │ │ └── functionsTab/
│ │ │ └── functions/ # scan, filter, render, log utils
│ │ ├── reactTab/ # interactive function caller
│ │ └── imports/
│ │ ├── constants.py
│ │ ├── imports.py
│ │ └── ext_funcs/
│ │ ├── node_resolver.py # NVM-aware Node/tsx finder
│ │ └── path_inputs.py # validated QLineEdit helpers
├── setup.py
├── setup.cfg
├── pyproject.toml
└── README.md
Key Modules
SharedStateBus
Signal broker for synchronized filter state across tabs. Tabs push state on change; linked tabs receive and apply it silently (via QSignalBlocker).
install_common_inputs
Single-call function that wires a full filter form (directory, strings, 8 filter fields, flags, spec_line) into any QWidget host and connects it to a SharedStateBus.
visibilityMgr
Collapsible section manager using QPropertyAnimation on maximumHeight. Persists open/closed state via QSettings. No adjustSize() calls — flicker-free.
runSubProcess / node_resolver
NVM-aware subprocess runner. Resolves node, npm, npx, tsx across PATH, common dirs, NVM installations, and login shell fallback. Injects correct PATH and NODE_PATH into subprocess environment.
parse_unified_diff
Tolerant unified diff parser. Works with or without @@ headers. Returns List[Hunk] where each hunk carries subs (lines to match) and adds (lines to insert).
getPaths
Finds exact contiguous string matches across a list of files. Returns (unique_files, found_paths) with line-level metadata for each match.
TreeParser / ScaffoldBuilder / FileRegistry
Scaffolding pipeline. TreeParser converts tree-style text to TreeNode graphs. ScaffoldBuilder uses a deque queue for ordered disk creation. FileRegistry tracks all created files with dirty state and listener callbacks.
Development
Running from source
git clone https://github.com/AbstractEndeavors/abstract-ide
cd abstract-ide
pip install -e ".[dev]"
python -m abstract_ide
Building for PyPI
python -m build
twine upload dist/*
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-console) - Follow existing patterns:
initFuncs,@dataclassschemas,QThreadworkers - Submit a pull request
License
MIT License. See LICENSE for details.
Contact
Abstract Endeavors
partners@abstractendeavors.com
https://github.com/AbstractEndeavors
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file abstract_ide-0.0.0.376.tar.gz.
File metadata
- Download URL: abstract_ide-0.0.0.376.tar.gz
- Upload date:
- Size: 147.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7db737baa9fdcd9314f8fc24d1bc28018b0b9c29cb834dd240eeaa10aada9253
|
|
| MD5 |
4c4603f7429e2c11eec4a6432fd76d7c
|
|
| BLAKE2b-256 |
48bfabf520b798df2854612a8458ed2c8818d562397ca706d0437697df2de9ff
|
File details
Details for the file abstract_ide-0.0.0.376-py3-none-any.whl.
File metadata
- Download URL: abstract_ide-0.0.0.376-py3-none-any.whl
- Upload date:
- Size: 221.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36ec456ab1b8cbee9beb1a5bf5db93546fc7e0ee083e198676a4fbfec11ef7c5
|
|
| MD5 |
a3cef8d5480320f34705e1c1854e2e9f
|
|
| BLAKE2b-256 |
f9201f53e23802603a75b45690506316311ea8ac4721fa9d09d0c8a68175005b
|