tiesta 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tiesta-0.1.0/MANIFEST.in +5 -0
- tiesta-0.1.0/PKG-INFO +116 -0
- tiesta-0.1.0/README.md +83 -0
- tiesta-0.1.0/pyproject.toml +59 -0
- tiesta-0.1.0/setup.cfg +4 -0
- tiesta-0.1.0/tiesta/__init__.py +0 -0
- tiesta-0.1.0/tiesta/core/__init__.py +2 -0
- tiesta-0.1.0/tiesta/core/config.py +55 -0
- tiesta-0.1.0/tiesta/core/llm_client.py +664 -0
- tiesta-0.1.0/tiesta/core/lsp_client.py +113 -0
- tiesta-0.1.0/tiesta/core/orchestrator.py +802 -0
- tiesta-0.1.0/tiesta/core/permissions.py +50 -0
- tiesta-0.1.0/tiesta/core/skill_loader.py +73 -0
- tiesta-0.1.0/tiesta/main.py +574 -0
- tiesta-0.1.0/tiesta/skills_template/web_scraper.py +131 -0
- tiesta-0.1.0/tiesta/skills_template/web_search.py +105 -0
- tiesta-0.1.0/tiesta/tools/__init__.py +2 -0
- tiesta-0.1.0/tiesta/tools/architecture_ops.py +126 -0
- tiesta-0.1.0/tiesta/tools/base.py +178 -0
- tiesta-0.1.0/tiesta/tools/bash_executor.py +347 -0
- tiesta-0.1.0/tiesta/tools/explorer.py +155 -0
- tiesta-0.1.0/tiesta/tools/file_ops.py +847 -0
- tiesta-0.1.0/tiesta/tools/git_ops.py +180 -0
- tiesta-0.1.0/tiesta/tools/hardware_ops.py +130 -0
- tiesta-0.1.0/tiesta/tools/lsp_tools.py +124 -0
- tiesta-0.1.0/tiesta/tools/semantic_search.py +297 -0
- tiesta-0.1.0/tiesta/ui/__init__.py +1 -0
- tiesta-0.1.0/tiesta/ui/console.py +482 -0
- tiesta-0.1.0/tiesta/ui/wizard.py +106 -0
- tiesta-0.1.0/tiesta.egg-info/PKG-INFO +116 -0
- tiesta-0.1.0/tiesta.egg-info/SOURCES.txt +33 -0
- tiesta-0.1.0/tiesta.egg-info/dependency_links.txt +1 -0
- tiesta-0.1.0/tiesta.egg-info/entry_points.txt +2 -0
- tiesta-0.1.0/tiesta.egg-info/requires.txt +10 -0
- tiesta-0.1.0/tiesta.egg-info/top_level.txt +1 -0
tiesta-0.1.0/MANIFEST.in
ADDED
tiesta-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tiesta
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Tiesta — Local AI Coding Assistant powered by Ollama
|
|
5
|
+
Author-email: Yakup Karatas <yakup.karatas.developer@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/yakup-karatass/tiesta
|
|
8
|
+
Project-URL: Repository, https://github.com/yakup-karatass/tiesta
|
|
9
|
+
Project-URL: Issues, https://github.com/yakup-karatass/tiesta/issues
|
|
10
|
+
Keywords: ai,coding-assistant,cli,ollama,local-llm
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
Requires-Dist: openai>=1.0.0
|
|
25
|
+
Requires-Dist: rich>=13.0.0
|
|
26
|
+
Requires-Dist: chromadb>=0.4.0
|
|
27
|
+
Requires-Dist: duckduckgo-search>=6.0.0
|
|
28
|
+
Requires-Dist: jedi>=0.19.0
|
|
29
|
+
Requires-Dist: pyserial>=3.5
|
|
30
|
+
Provides-Extra: dev
|
|
31
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
32
|
+
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
|
|
33
|
+
|
|
34
|
+
<div align="center">
|
|
35
|
+
<h1>Tiesta: Your AI Engineering Companion</h1>
|
|
36
|
+
<p><strong>A fully autonomous, 100% local, VRAM-efficient AI agent powered by Ollama.</strong></p>
|
|
37
|
+
|
|
38
|
+
[](https://pypi.org/project/tiesta/)
|
|
39
|
+
[](https://pypi.org/project/tiesta/)
|
|
40
|
+
[](https://opensource.org/licenses/MIT)
|
|
41
|
+
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
Tiesta is not just an agent; it's your second engineer. It goes beyond simple autocomplete or conversational chatbots. Tiesta is a true companion who actively explores your codebase, autonomously executes terminal commands, resolves compilation errors, and, when finished, politely asks: *"I've finished my part, what's next?"*
|
|
47
|
+
|
|
48
|
+
Designed from the ground up to run entirely locally, Tiesta empowers developers to build, refactor, and debug complex applications with zero data privacy concerns and absolute flexibility.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 🌟 Features
|
|
53
|
+
|
|
54
|
+
* **100% Local & Private:** No external API calls. Your code never leaves your machine. Powered natively by Ollama.
|
|
55
|
+
* **Bring Your Own Model (BYOM):** During onboarding, dynamically discover and select any Ollama model installed on your system. Highly optimized for `qwen2.5-coder:3b` for ultra-fast, low-VRAM execution.
|
|
56
|
+
* **Hardware-in-the-Loop:** A killer feature for embedded systems. Tiesta can autonomously scan active serial ports and read hardware logs (ESP32, ROS 2, Arduino) to instantly debug your hardware and patch the corresponding Python/C++ code.
|
|
57
|
+
* **Unified Permission Control Plane:** An elegant `Rich`-powered UI intercepts and gates destructive terminal commands (`rm`, massive code deletions), ensuring absolute human oversight before modifying your system.
|
|
58
|
+
* **Polyglot Linter:** Validates syntax proactively. If Tiesta makes a syntax error in Python, JavaScript, C++, Rust, or Dart, it will instantly catch the traceback and self-correct without bothering you.
|
|
59
|
+
* **Dynamic Architecture Maps:** Automatically generates and updates Mermaid.js visual maps (`TIESTA_ARCHITECTURE.md`), allowing the agent to *see* your project structurally while providing human-readable documentation.
|
|
60
|
+
* **Zero-Dependency Semantic RAG:** Instead of relying on heavy `tree-sitter` C-bindings, Tiesta uses a highly efficient, regex-powered semantic chunking system to precisely locate symbols, classes, and variables.
|
|
61
|
+
* **LSP Integration:** Built on `jedi`, it understands your code context natively (go to definition, find usages) without spinning up a heavy background language server.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 🚀 Getting Started
|
|
66
|
+
|
|
67
|
+
### Prerequisites
|
|
68
|
+
|
|
69
|
+
1. Install [Ollama](https://ollama.com/) and ensure the daemon is running.
|
|
70
|
+
2. Pull the recommended default model (or any model of your choice):
|
|
71
|
+
```bash
|
|
72
|
+
ollama pull qwen2.5-coder:3b
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Installation
|
|
76
|
+
|
|
77
|
+
Install Tiesta globally via PyPI:
|
|
78
|
+
```bash
|
|
79
|
+
pip install tiesta
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Quickstart
|
|
83
|
+
|
|
84
|
+
Run Tiesta interactively in your current project directory:
|
|
85
|
+
```bash
|
|
86
|
+
tiesta
|
|
87
|
+
```
|
|
88
|
+
On the very first run, Tiesta's **Onboarding Wizard** will automatically launch to detect your installed Ollama models and set up your preferred environment.
|
|
89
|
+
|
|
90
|
+
You can also run one-shot tasks directly from the terminal:
|
|
91
|
+
```bash
|
|
92
|
+
tiesta "Refactor the user authentication logic in core/auth.py"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 🧠 How it Works
|
|
98
|
+
|
|
99
|
+
Tiesta employs a sophisticated "Precision Coding Protocol" via a customized Agentic Execution Loop (The **Orchestrator**):
|
|
100
|
+
|
|
101
|
+
1. **Context Loading:** Tiesta silently loads a lightweight Zero-Shot workspace awareness map (directory trees, git statuses, architecture graphs).
|
|
102
|
+
2. **Decomposition:** It forces the underlying LLM to think step-by-step and enumerate a checklist of sub-tasks.
|
|
103
|
+
3. **Execution & Self-Correction:** Tiesta executes tools natively in a sandboxed environment. If a compilation error or git conflict occurs, the Orchestrator autonomously feeds the traceback back to the LLM to self-correct up to 3 times before asking for human help.
|
|
104
|
+
4. **Result Verification:** Before rendering the final response to the user, the agent cross-verifies its output against its internal checklist to guarantee completeness.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 🔗 Links
|
|
109
|
+
- **Repository:** [Click here to view the repo](https://github.com/yakup-karatass/tiesta)
|
|
110
|
+
- **Issue Tracker:** [Report bugs/issues here](https://github.com/yakup-karatass/tiesta/issues)
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
<div align="center">
|
|
115
|
+
<i>"Speed is secondary to correctness. Measure Twice, Cut Once."</i>
|
|
116
|
+
</div>
|
tiesta-0.1.0/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>Tiesta: Your AI Engineering Companion</h1>
|
|
3
|
+
<p><strong>A fully autonomous, 100% local, VRAM-efficient AI agent powered by Ollama.</strong></p>
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/tiesta/)
|
|
6
|
+
[](https://pypi.org/project/tiesta/)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
Tiesta is not just an agent; it's your second engineer. It goes beyond simple autocomplete or conversational chatbots. Tiesta is a true companion who actively explores your codebase, autonomously executes terminal commands, resolves compilation errors, and, when finished, politely asks: *"I've finished my part, what's next?"*
|
|
14
|
+
|
|
15
|
+
Designed from the ground up to run entirely locally, Tiesta empowers developers to build, refactor, and debug complex applications with zero data privacy concerns and absolute flexibility.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🌟 Features
|
|
20
|
+
|
|
21
|
+
* **100% Local & Private:** No external API calls. Your code never leaves your machine. Powered natively by Ollama.
|
|
22
|
+
* **Bring Your Own Model (BYOM):** During onboarding, dynamically discover and select any Ollama model installed on your system. Highly optimized for `qwen2.5-coder:3b` for ultra-fast, low-VRAM execution.
|
|
23
|
+
* **Hardware-in-the-Loop:** A killer feature for embedded systems. Tiesta can autonomously scan active serial ports and read hardware logs (ESP32, ROS 2, Arduino) to instantly debug your hardware and patch the corresponding Python/C++ code.
|
|
24
|
+
* **Unified Permission Control Plane:** An elegant `Rich`-powered UI intercepts and gates destructive terminal commands (`rm`, massive code deletions), ensuring absolute human oversight before modifying your system.
|
|
25
|
+
* **Polyglot Linter:** Validates syntax proactively. If Tiesta makes a syntax error in Python, JavaScript, C++, Rust, or Dart, it will instantly catch the traceback and self-correct without bothering you.
|
|
26
|
+
* **Dynamic Architecture Maps:** Automatically generates and updates Mermaid.js visual maps (`TIESTA_ARCHITECTURE.md`), allowing the agent to *see* your project structurally while providing human-readable documentation.
|
|
27
|
+
* **Zero-Dependency Semantic RAG:** Instead of relying on heavy `tree-sitter` C-bindings, Tiesta uses a highly efficient, regex-powered semantic chunking system to precisely locate symbols, classes, and variables.
|
|
28
|
+
* **LSP Integration:** Built on `jedi`, it understands your code context natively (go to definition, find usages) without spinning up a heavy background language server.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 🚀 Getting Started
|
|
33
|
+
|
|
34
|
+
### Prerequisites
|
|
35
|
+
|
|
36
|
+
1. Install [Ollama](https://ollama.com/) and ensure the daemon is running.
|
|
37
|
+
2. Pull the recommended default model (or any model of your choice):
|
|
38
|
+
```bash
|
|
39
|
+
ollama pull qwen2.5-coder:3b
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Installation
|
|
43
|
+
|
|
44
|
+
Install Tiesta globally via PyPI:
|
|
45
|
+
```bash
|
|
46
|
+
pip install tiesta
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Quickstart
|
|
50
|
+
|
|
51
|
+
Run Tiesta interactively in your current project directory:
|
|
52
|
+
```bash
|
|
53
|
+
tiesta
|
|
54
|
+
```
|
|
55
|
+
On the very first run, Tiesta's **Onboarding Wizard** will automatically launch to detect your installed Ollama models and set up your preferred environment.
|
|
56
|
+
|
|
57
|
+
You can also run one-shot tasks directly from the terminal:
|
|
58
|
+
```bash
|
|
59
|
+
tiesta "Refactor the user authentication logic in core/auth.py"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 🧠 How it Works
|
|
65
|
+
|
|
66
|
+
Tiesta employs a sophisticated "Precision Coding Protocol" via a customized Agentic Execution Loop (The **Orchestrator**):
|
|
67
|
+
|
|
68
|
+
1. **Context Loading:** Tiesta silently loads a lightweight Zero-Shot workspace awareness map (directory trees, git statuses, architecture graphs).
|
|
69
|
+
2. **Decomposition:** It forces the underlying LLM to think step-by-step and enumerate a checklist of sub-tasks.
|
|
70
|
+
3. **Execution & Self-Correction:** Tiesta executes tools natively in a sandboxed environment. If a compilation error or git conflict occurs, the Orchestrator autonomously feeds the traceback back to the LLM to self-correct up to 3 times before asking for human help.
|
|
71
|
+
4. **Result Verification:** Before rendering the final response to the user, the agent cross-verifies its output against its internal checklist to guarantee completeness.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 🔗 Links
|
|
76
|
+
- **Repository:** [Click here to view the repo](https://github.com/yakup-karatass/tiesta)
|
|
77
|
+
- **Issue Tracker:** [Report bugs/issues here](https://github.com/yakup-karatass/tiesta/issues)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
<div align="center">
|
|
82
|
+
<i>"Speed is secondary to correctness. Measure Twice, Cut Once."</i>
|
|
83
|
+
</div>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "tiesta"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Tiesta — Local AI Coding Assistant powered by Ollama"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Yakup Karatas", email = "yakup.karatas.developer@gmail.com"},
|
|
14
|
+
]
|
|
15
|
+
keywords = ["ai", "coding-assistant", "cli", "ollama", "local-llm"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3.10",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: 3.12",
|
|
25
|
+
"Programming Language :: Python :: 3.13",
|
|
26
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
27
|
+
"Topic :: Software Development :: Code Generators",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"openai>=1.0.0",
|
|
31
|
+
"rich>=13.0.0",
|
|
32
|
+
"chromadb>=0.4.0",
|
|
33
|
+
"duckduckgo-search>=6.0.0",
|
|
34
|
+
"jedi>=0.19.0",
|
|
35
|
+
"pyserial>=3.5",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.scripts]
|
|
39
|
+
tiesta = "tiesta.main:cli_entry"
|
|
40
|
+
|
|
41
|
+
[project.urls]
|
|
42
|
+
Homepage = "https://github.com/yakup-karatass/tiesta"
|
|
43
|
+
Repository = "https://github.com/yakup-karatass/tiesta"
|
|
44
|
+
Issues = "https://github.com/yakup-karatass/tiesta/issues"
|
|
45
|
+
|
|
46
|
+
# ── Package discovery ──────────────────────────────────────────────
|
|
47
|
+
# We use a standard layout: tiesta/ is the top-level package.
|
|
48
|
+
|
|
49
|
+
[tool.setuptools.packages.find]
|
|
50
|
+
where = ["."]
|
|
51
|
+
include = ["tiesta*"]
|
|
52
|
+
|
|
53
|
+
# ── Optional dev dependencies ──────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
[project.optional-dependencies]
|
|
56
|
+
dev = [
|
|
57
|
+
"pytest>=7.0",
|
|
58
|
+
"pytest-asyncio>=0.21",
|
|
59
|
+
]
|
tiesta-0.1.0/setup.cfg
ADDED
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
tiesta/core/config.py
|
|
3
|
+
─────────────────────
|
|
4
|
+
Global configuration manager for Tiesta.
|
|
5
|
+
|
|
6
|
+
Manages user preferences stored in `~/.tiesta/config.json`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
from dataclasses import asdict, dataclass, field
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import List
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class Config:
|
|
20
|
+
default_model: str = "qwen2.5-coder:3b"
|
|
21
|
+
enabled_skills: List[str] = field(default_factory=list)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ConfigManager:
|
|
25
|
+
"""Handles reading and writing the global Tiesta config."""
|
|
26
|
+
|
|
27
|
+
def __init__(self) -> None:
|
|
28
|
+
self.config_dir = Path.home() / ".tiesta"
|
|
29
|
+
self.config_path = self.config_dir / "config.json"
|
|
30
|
+
|
|
31
|
+
def exists(self) -> bool:
|
|
32
|
+
"""Check if the global config file exists (indicates completed onboarding)."""
|
|
33
|
+
return self.config_path.exists()
|
|
34
|
+
|
|
35
|
+
def load(self) -> Config:
|
|
36
|
+
"""Load the global config, returning default if not found."""
|
|
37
|
+
if not self.exists():
|
|
38
|
+
return Config()
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
with open(self.config_path, "r", encoding="utf-8") as f:
|
|
42
|
+
data = json.load(f)
|
|
43
|
+
return Config(**data)
|
|
44
|
+
except Exception as exc:
|
|
45
|
+
logger.error("Failed to load config from %s: %s", self.config_path, exc)
|
|
46
|
+
return Config()
|
|
47
|
+
|
|
48
|
+
def save(self, config: Config) -> None:
|
|
49
|
+
"""Save the config to disk."""
|
|
50
|
+
self.config_dir.mkdir(parents=True, exist_ok=True)
|
|
51
|
+
try:
|
|
52
|
+
with open(self.config_path, "w", encoding="utf-8") as f:
|
|
53
|
+
json.dump(asdict(config), f, indent=4)
|
|
54
|
+
except Exception as exc:
|
|
55
|
+
logger.error("Failed to save config to %s: %s", self.config_path, exc)
|