Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
145 lines (136 loc) · 4.88 KB
/
Copy pathpyproject.toml
File metadata and controls
145 lines (136 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
[project]
name = "owncoder"
version = "0.1.0"
description = "Local-first coding agent with a real sandbox — runs against your own llama.cpp/vLLM/Ollama or any OpenAI-compatible API."
readme = "README.md"
requires-python = ">=3.11"
authors = [{ name = "adderek" }]
keywords = ["llm", "coding-agent", "cli", "local-first", "openai-compatible"]
classifiers = [
"Development Status :: 4 - Beta",
"Environment :: Console",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Code Generators",
# The sandbox is bubblewrap/seccomp and the lock/limit code is fcntl +
# resource. Windows runs it under WSL2, not natively — see install.ps1.
"Operating System :: POSIX :: Linux",
"Operating System :: MacOS :: MacOS X",
]
dependencies = [
"tree-sitter>=0.21",
"tree-sitter-python",
"tree-sitter-c",
"tree-sitter-cpp",
"tree-sitter-bash",
"sqlite-vec>=0.1",
"openai>=1.0",
"textual>=0.50",
"tiktoken>=0.6",
"rich>=13.0",
"pathspec>=0.12",
"watchdog>=3.0",
"pyyaml>=6.0",
"numpy>=2.4.6",
]
[project.optional-dependencies]
dev = [
"pytest>=8.0",
"pyserial>=3.5",
"pytest-asyncio>=0.23",
"pytest-watch>=4.2",
"httpx>=0.27",
# vault/notify/credpool tests; Argon2id needs >=44.
"cryptography>=44",
]
# Extra grammars for projects that are not Python/C/C++/bash. The chunker falls
# back to line-based splitting when a grammar is missing, so these are optional.
lang = [
"tree-sitter-javascript",
"tree-sitter-typescript",
"tree-sitter-rust",
"tree-sitter-go",
"tree-sitter-java",
"tree-sitter-kotlin",
]
graph = [
"graphifyy>=0.1.14",
]
notify = [
"websockets>=12",
"cryptography>=42",
]
vault = [
# Argon2id landed in cryptography 44 and needs OpenSSL 3.2+ underneath.
"cryptography>=44",
]
serial = [
"pyserial>=3.5",
]
speech = [
"faster-whisper>=1.0",
"soundfile>=0.12",
"numpy>=1.24",
]
[project.urls]
Homepage = "https://github.com/adderek/owncoder"
Source = "https://github.com/adderek/owncoder"
Issues = "https://github.com/adderek/owncoder/issues"
[project.scripts]
# Two names for one entry point: `owncoder` is unambiguous on a shared PATH,
# `agent` is what the docs and muscle memory use.
owncoder = "agent.main:main"
agent = "agent.main:main"
[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
# ".." makes `agent.*` importable from a source checkout; "../kb/src" is the
# sibling kb package, which is src-layout and therefore invisible from ".."
# alone. Without it the whole integration suite skipped itself as "kb package
# not installed" and had never once run.
pythonpath = ["..", "../kb/src"]
markers = [
"integration: tests against the kb fixture corpus (no LLM, no network)",
]
# Concurrent pytest sessions (e.g. parallel agent workers) share
# /tmp/pytest-of-<user>/; the default retention (3) lets one session prune
# another LIVE session's tmp roots mid-run, randomly breaking disk-backed
# tests (seen in test_prompt_compiler A/B index round-trips).
tmp_path_retention_count = 50
# Delete a passing test's tmp_path right away, and the whole session base dir
# when every test passed; only failures leave files behind to debug. A full
# unit run leaves ~7.7k files otherwise, and inside the agent sandbox /tmp is
# the project scratch (.agent/tmp), so 50 retained runs pushed the sandbox's
# per-command file scan past its cap. Keep everything for one run with:
# pytest -o tmp_path_retention_policy=all
tmp_path_retention_policy = "failed"
[tool.setuptools]
# pyproject-configured setuptools defaults this to true, which sweeps every
# git-tracked file under a package dir into the wheel as "package data" — that
# is how agent/tests/*.py kept shipping despite the `exclude` below (setuptools
# only warns: "Package 'agent.tests' is absent from the packages configuration").
# Everything the runtime needs is declared explicitly in package-data.
include-package-data = false
# packages / package-dir are computed in setup.py: the import name "agent" maps
# to this directory, and a static `where = [".."]` only resolved when the
# checkout was named "agent" (it is not, when uv/pip clone the repo).
[tool.setuptools.package-data]
"agent.ui" = ["static/*.css", "static/*.js"]
# prompts/ and themes/ are plain data directories (no __init__.py), read at
# runtime via Path(__file__).parent — see core/prompts.py and skills.py. Without
# these globs the wheel installs an agent that cannot build a system prompt.
"agent" = [
"prompts/*.txt",
"prompts/guidelines/*.txt",
"prompts/inline/*.txt",
"prompts/overlays/*.txt",
"prompts/skills/*.md",
"themes/*.toml",
"agent.toml.example",
"data/*.json",
]