loopsmith-cli 0.3.0__tar.gz → 1.0.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.
- loopsmith_cli-1.0.0/PKG-INFO +135 -0
- loopsmith_cli-1.0.0/README.md +113 -0
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/pyproject.toml +1 -1
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/src/loopsmith_cli/__init__.py +20 -2
- loopsmith_cli-1.0.0/src/loopsmith_cli.egg-info/PKG-INFO +135 -0
- loopsmith_cli-0.3.0/PKG-INFO +0 -283
- loopsmith_cli-0.3.0/README.md +0 -261
- loopsmith_cli-0.3.0/src/loopsmith_cli.egg-info/PKG-INFO +0 -283
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/setup.cfg +0 -0
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/src/loopsmith_cli/__main__.py +0 -0
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/src/loopsmith_cli.egg-info/SOURCES.txt +0 -0
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/src/loopsmith_cli.egg-info/dependency_links.txt +0 -0
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/src/loopsmith_cli.egg-info/entry_points.txt +0 -0
- {loopsmith_cli-0.3.0 → loopsmith_cli-1.0.0}/src/loopsmith_cli.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: loopsmith-cli
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Self-evolving agent loops behind a deterministic verification gate. Installs the prebuilt Rust binary as `loopsmith`.
|
|
5
|
+
Author-email: Vaibhav Agarwal <bitphill@duck.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/bitphill/loopsmith
|
|
8
|
+
Project-URL: Repository, https://github.com/bitphill/loopsmith
|
|
9
|
+
Project-URL: Changelog, https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md
|
|
10
|
+
Project-URL: Issues, https://github.com/bitphill/loopsmith/issues
|
|
11
|
+
Keywords: agent,loop,llm,orchestration,cli,rust
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
+
Classifier: Programming Language :: Rust
|
|
19
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
20
|
+
Requires-Python: >=3.8
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
<div align="center">
|
|
24
|
+
<img src="https://raw.githubusercontent.com/bitphill/loopsmith/main/assets/loopsmith-logo-256.png" alt="loopsmith" width="180" />
|
|
25
|
+
<h1>loopsmith</h1>
|
|
26
|
+
<p><em>Hand a repeating job to an AI. A checker you wrote — not the AI — decides when it is done.</em></p>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
[](https://pypi.org/project/loopsmith-cli/)
|
|
30
|
+
[](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
|
|
31
|
+

|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pipx install loopsmith-cli # or: pip install loopsmith-cli
|
|
36
|
+
loopsmith doctor
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> **The distribution is `loopsmith-cli`; the command is `loopsmith`.** The
|
|
40
|
+
> shorter name was taken on PyPI. This package is a Rust binary with a thin
|
|
41
|
+
> Python launcher — there is nothing to `import`. The binary for your platform
|
|
42
|
+
> is downloaded on first run, so there is no Rust toolchain involved.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## What it is
|
|
47
|
+
|
|
48
|
+
You have a job you redo every week and are fussy about — a competitor roundup,
|
|
49
|
+
a lead list, a landing page, a research brief. You describe it once. loopsmith
|
|
50
|
+
runs it over and over on its own, and stops when a check **you** wrote says it
|
|
51
|
+
is done, or a limit **you** set says enough.
|
|
52
|
+
|
|
53
|
+
The part that makes it worth running unattended: whether a goal is done is
|
|
54
|
+
decided by compiled Rust, never by a model. The model does the work; a gate
|
|
55
|
+
that cannot be argued with decides whether the work counts. That gate can also
|
|
56
|
+
take "done" back — delete a required file and a satisfied goal flips straight
|
|
57
|
+
back to unsatisfied.
|
|
58
|
+
|
|
59
|
+
## Sixty seconds
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
loopsmith doctor # what this machine can and cannot do
|
|
63
|
+
loopsmith --web # build a loop in your browser
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Not a browser person? `loopsmith --guided` asks the same questions in the
|
|
67
|
+
terminal. Either way, nothing runs and nothing is spent while you answer.
|
|
68
|
+
|
|
69
|
+
To go straight to a file instead:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
loopsmith loop new --path ~/loops/my-loop --purpose "keep the roundup current"
|
|
73
|
+
loopsmith loop validate ~/loops/my-loop/loop.yaml # refuses, on purpose
|
|
74
|
+
loopsmith loop plan ~/loops/my-loop/loop.yaml # what it would do, and how fast
|
|
75
|
+
loopsmith run start ~/loops/my-loop/loop.yaml
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**That refusal is the point.** A fresh loop will not run until you tick the
|
|
79
|
+
steps saying you have done the job by hand at least once. Automating a process
|
|
80
|
+
nobody has performed produces the wrong answer faster, and at a scale that is
|
|
81
|
+
harder to undo.
|
|
82
|
+
|
|
83
|
+
## Fifteen worked loops to start from
|
|
84
|
+
|
|
85
|
+
Research, refactoring, traffic, trend tracking, landing pages, lead lists,
|
|
86
|
+
marketing, blogging, cold outreach, agent payments, a small game, idea
|
|
87
|
+
discovery, account watching, a container-isolated refactor, and one that
|
|
88
|
+
proposes improvements to itself. All fifteen are compiled into the binary and
|
|
89
|
+
load with one click in `--web`, or copy one from
|
|
90
|
+
[`config/examples/`](https://github.com/bitphill/loopsmith/tree/main/config/examples).
|
|
91
|
+
|
|
92
|
+
## Bring your own model
|
|
93
|
+
|
|
94
|
+
Every provider is a command template, so anything you can run from a shell can
|
|
95
|
+
serve a loop: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint
|
|
96
|
+
driven by `curl`, an MCP server over stdio. Adding one is a config edit, never
|
|
97
|
+
a rebuild. Keys are named, never read — `requires_env` says a key must be
|
|
98
|
+
present, and the value goes from your environment to the command without
|
|
99
|
+
passing through loopsmith or its ledger.
|
|
100
|
+
|
|
101
|
+
Cheap models carry the mechanical work; strong models carry judgment. And a
|
|
102
|
+
judge is refused outright if it would run on the same provider as the work it
|
|
103
|
+
is grading, because a model marking its own homework is not a check.
|
|
104
|
+
|
|
105
|
+
## Keeping it alive
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
loopsmith run watch loop.yaml # stay resident, run on every trigger
|
|
109
|
+
loopsmith run schedule loop.yaml --install # hand it to launchd, cron, or Task Scheduler
|
|
110
|
+
loopsmith run status loop.yaml <run-id> # what the gate has ruled so far
|
|
111
|
+
loopsmith run ledger loop.yaml <run-id> # everything that happened, including why it stopped
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
A run survives a crash: state is a real store on disk, and `loopsmith run
|
|
115
|
+
resume` picks up from the last checkpoint.
|
|
116
|
+
|
|
117
|
+
## Where the rest of it is
|
|
118
|
+
|
|
119
|
+
- [**README-FOR-DUMMIES.md**](https://github.com/bitphill/loopsmith/blob/main/README-FOR-DUMMIES.md)
|
|
120
|
+
— the same thing with no jargon, if this page assumed too much
|
|
121
|
+
- [**README.md**](https://github.com/bitphill/loopsmith/blob/main/README.md)
|
|
122
|
+
— the full version
|
|
123
|
+
- [**HOW-TO-USE.md**](https://github.com/bitphill/loopsmith/blob/main/HOW-TO-USE.md)
|
|
124
|
+
— every config section, one at a time, with what goes wrong if you skip it
|
|
125
|
+
- [**LOOP-TEMPLATE.md**](https://github.com/bitphill/loopsmith/blob/main/LOOP-TEMPLATE.md)
|
|
126
|
+
— a blank loop with a note on every field
|
|
127
|
+
- [**Concepts**](https://github.com/bitphill/loopsmith/wiki/Concepts)
|
|
128
|
+
— every word the config and the error messages use, defined once
|
|
129
|
+
- [**Architecture**](https://github.com/bitphill/loopsmith/wiki/Architecture)
|
|
130
|
+
· [**Commands**](https://github.com/bitphill/loopsmith/wiki/Commands)
|
|
131
|
+
· [**Migration 0.3 → 1.0**](https://github.com/bitphill/loopsmith/wiki/Migration-0-3-To-1-0)
|
|
132
|
+
- [**Code wiki**](https://bitphill.github.io/loopsmith/wiki/#overview)
|
|
133
|
+
— a page per subsystem, generated from the code
|
|
134
|
+
|
|
135
|
+
Runs on Linux, macOS, and Windows. MIT licensed.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/bitphill/loopsmith/main/assets/loopsmith-logo-256.png" alt="loopsmith" width="180" />
|
|
3
|
+
<h1>loopsmith</h1>
|
|
4
|
+
<p><em>Hand a repeating job to an AI. A checker you wrote — not the AI — decides when it is done.</em></p>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
[](https://pypi.org/project/loopsmith-cli/)
|
|
8
|
+
[](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
|
|
9
|
+

|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pipx install loopsmith-cli # or: pip install loopsmith-cli
|
|
14
|
+
loopsmith doctor
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
> **The distribution is `loopsmith-cli`; the command is `loopsmith`.** The
|
|
18
|
+
> shorter name was taken on PyPI. This package is a Rust binary with a thin
|
|
19
|
+
> Python launcher — there is nothing to `import`. The binary for your platform
|
|
20
|
+
> is downloaded on first run, so there is no Rust toolchain involved.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## What it is
|
|
25
|
+
|
|
26
|
+
You have a job you redo every week and are fussy about — a competitor roundup,
|
|
27
|
+
a lead list, a landing page, a research brief. You describe it once. loopsmith
|
|
28
|
+
runs it over and over on its own, and stops when a check **you** wrote says it
|
|
29
|
+
is done, or a limit **you** set says enough.
|
|
30
|
+
|
|
31
|
+
The part that makes it worth running unattended: whether a goal is done is
|
|
32
|
+
decided by compiled Rust, never by a model. The model does the work; a gate
|
|
33
|
+
that cannot be argued with decides whether the work counts. That gate can also
|
|
34
|
+
take "done" back — delete a required file and a satisfied goal flips straight
|
|
35
|
+
back to unsatisfied.
|
|
36
|
+
|
|
37
|
+
## Sixty seconds
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
loopsmith doctor # what this machine can and cannot do
|
|
41
|
+
loopsmith --web # build a loop in your browser
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Not a browser person? `loopsmith --guided` asks the same questions in the
|
|
45
|
+
terminal. Either way, nothing runs and nothing is spent while you answer.
|
|
46
|
+
|
|
47
|
+
To go straight to a file instead:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
loopsmith loop new --path ~/loops/my-loop --purpose "keep the roundup current"
|
|
51
|
+
loopsmith loop validate ~/loops/my-loop/loop.yaml # refuses, on purpose
|
|
52
|
+
loopsmith loop plan ~/loops/my-loop/loop.yaml # what it would do, and how fast
|
|
53
|
+
loopsmith run start ~/loops/my-loop/loop.yaml
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**That refusal is the point.** A fresh loop will not run until you tick the
|
|
57
|
+
steps saying you have done the job by hand at least once. Automating a process
|
|
58
|
+
nobody has performed produces the wrong answer faster, and at a scale that is
|
|
59
|
+
harder to undo.
|
|
60
|
+
|
|
61
|
+
## Fifteen worked loops to start from
|
|
62
|
+
|
|
63
|
+
Research, refactoring, traffic, trend tracking, landing pages, lead lists,
|
|
64
|
+
marketing, blogging, cold outreach, agent payments, a small game, idea
|
|
65
|
+
discovery, account watching, a container-isolated refactor, and one that
|
|
66
|
+
proposes improvements to itself. All fifteen are compiled into the binary and
|
|
67
|
+
load with one click in `--web`, or copy one from
|
|
68
|
+
[`config/examples/`](https://github.com/bitphill/loopsmith/tree/main/config/examples).
|
|
69
|
+
|
|
70
|
+
## Bring your own model
|
|
71
|
+
|
|
72
|
+
Every provider is a command template, so anything you can run from a shell can
|
|
73
|
+
serve a loop: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint
|
|
74
|
+
driven by `curl`, an MCP server over stdio. Adding one is a config edit, never
|
|
75
|
+
a rebuild. Keys are named, never read — `requires_env` says a key must be
|
|
76
|
+
present, and the value goes from your environment to the command without
|
|
77
|
+
passing through loopsmith or its ledger.
|
|
78
|
+
|
|
79
|
+
Cheap models carry the mechanical work; strong models carry judgment. And a
|
|
80
|
+
judge is refused outright if it would run on the same provider as the work it
|
|
81
|
+
is grading, because a model marking its own homework is not a check.
|
|
82
|
+
|
|
83
|
+
## Keeping it alive
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
loopsmith run watch loop.yaml # stay resident, run on every trigger
|
|
87
|
+
loopsmith run schedule loop.yaml --install # hand it to launchd, cron, or Task Scheduler
|
|
88
|
+
loopsmith run status loop.yaml <run-id> # what the gate has ruled so far
|
|
89
|
+
loopsmith run ledger loop.yaml <run-id> # everything that happened, including why it stopped
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
A run survives a crash: state is a real store on disk, and `loopsmith run
|
|
93
|
+
resume` picks up from the last checkpoint.
|
|
94
|
+
|
|
95
|
+
## Where the rest of it is
|
|
96
|
+
|
|
97
|
+
- [**README-FOR-DUMMIES.md**](https://github.com/bitphill/loopsmith/blob/main/README-FOR-DUMMIES.md)
|
|
98
|
+
— the same thing with no jargon, if this page assumed too much
|
|
99
|
+
- [**README.md**](https://github.com/bitphill/loopsmith/blob/main/README.md)
|
|
100
|
+
— the full version
|
|
101
|
+
- [**HOW-TO-USE.md**](https://github.com/bitphill/loopsmith/blob/main/HOW-TO-USE.md)
|
|
102
|
+
— every config section, one at a time, with what goes wrong if you skip it
|
|
103
|
+
- [**LOOP-TEMPLATE.md**](https://github.com/bitphill/loopsmith/blob/main/LOOP-TEMPLATE.md)
|
|
104
|
+
— a blank loop with a note on every field
|
|
105
|
+
- [**Concepts**](https://github.com/bitphill/loopsmith/wiki/Concepts)
|
|
106
|
+
— every word the config and the error messages use, defined once
|
|
107
|
+
- [**Architecture**](https://github.com/bitphill/loopsmith/wiki/Architecture)
|
|
108
|
+
· [**Commands**](https://github.com/bitphill/loopsmith/wiki/Commands)
|
|
109
|
+
· [**Migration 0.3 → 1.0**](https://github.com/bitphill/loopsmith/wiki/Migration-0-3-To-1-0)
|
|
110
|
+
- [**Code wiki**](https://bitphill.github.io/loopsmith/wiki/#overview)
|
|
111
|
+
— a page per subsystem, generated from the code
|
|
112
|
+
|
|
113
|
+
Runs on Linux, macOS, and Windows. MIT licensed.
|
|
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
|
6
6
|
# `loopsmith` on PyPI was already registered by an unrelated project, so the
|
|
7
7
|
# distribution is `loopsmith-cli`. The installed command is `loopsmith`.
|
|
8
8
|
name = "loopsmith-cli"
|
|
9
|
-
version = "0.
|
|
9
|
+
version = "1.0.0"
|
|
10
10
|
description = "Self-evolving agent loops behind a deterministic verification gate. Installs the prebuilt Rust binary as `loopsmith`."
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
license = "MIT"
|
|
@@ -25,11 +25,21 @@ import urllib.request
|
|
|
25
25
|
import zipfile
|
|
26
26
|
from pathlib import Path
|
|
27
27
|
|
|
28
|
-
__version__ = "0.
|
|
28
|
+
__version__ = "1.0.0"
|
|
29
29
|
|
|
30
30
|
REPO = "bitphill/loopsmith"
|
|
31
31
|
_RELEASE_BASE = f"https://github.com/{REPO}/releases/download/v{__version__}"
|
|
32
32
|
|
|
33
|
+
# Seconds for each blocking step of a download: connecting to one address, or
|
|
34
|
+
# one read. `urllib` tries a host's addresses one after another and spends the
|
|
35
|
+
# whole of this on each address that does not answer, so it is the cost of every
|
|
36
|
+
# unreachable CDN node, paid in silence. GitHub serves release assets from four
|
|
37
|
+
# anycast addresses, and a network that cannot reach one of them made the first
|
|
38
|
+
# run sit for two minutes per download — with 120 here, and two downloads —
|
|
39
|
+
# looking exactly like the hang this launcher's other comments warn about.
|
|
40
|
+
# Twenty keeps a genuinely slow link working and makes a dead node a pause.
|
|
41
|
+
_TIMEOUT = 20
|
|
42
|
+
|
|
33
43
|
|
|
34
44
|
class ResolveError(RuntimeError):
|
|
35
45
|
"""This host has no prebuilt binary, or one could not be verified."""
|
|
@@ -77,7 +87,7 @@ def cache_dir() -> Path:
|
|
|
77
87
|
|
|
78
88
|
|
|
79
89
|
def _read(url: str) -> bytes:
|
|
80
|
-
with urllib.request.urlopen(url, timeout=
|
|
90
|
+
with urllib.request.urlopen(url, timeout=_TIMEOUT) as response: # noqa: S310
|
|
81
91
|
return response.read()
|
|
82
92
|
|
|
83
93
|
|
|
@@ -125,6 +135,14 @@ def ensure_binary() -> Path:
|
|
|
125
135
|
# happens once per version. Not worth the failure mode.
|
|
126
136
|
target = _target()
|
|
127
137
|
asset = f"loopsmith-v{__version__}-{target}.{'zip' if windows else 'tar.gz'}"
|
|
138
|
+
# Said before the download, not after it. This runs once per version, it can
|
|
139
|
+
# take a while on a slow or partly broken network, and a first run that
|
|
140
|
+
# prints nothing until it is done is indistinguishable from a hang.
|
|
141
|
+
print(
|
|
142
|
+
f"[loopsmith] first run of {__version__}: fetching the {target} binary "
|
|
143
|
+
"from the GitHub release",
|
|
144
|
+
file=sys.stderr,
|
|
145
|
+
)
|
|
128
146
|
want = _expected_digest(asset)
|
|
129
147
|
payload = _read(f"{_RELEASE_BASE}/{asset}")
|
|
130
148
|
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: loopsmith-cli
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Self-evolving agent loops behind a deterministic verification gate. Installs the prebuilt Rust binary as `loopsmith`.
|
|
5
|
+
Author-email: Vaibhav Agarwal <bitphill@duck.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/bitphill/loopsmith
|
|
8
|
+
Project-URL: Repository, https://github.com/bitphill/loopsmith
|
|
9
|
+
Project-URL: Changelog, https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md
|
|
10
|
+
Project-URL: Issues, https://github.com/bitphill/loopsmith/issues
|
|
11
|
+
Keywords: agent,loop,llm,orchestration,cli,rust
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
+
Classifier: Programming Language :: Rust
|
|
19
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
20
|
+
Requires-Python: >=3.8
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
|
|
23
|
+
<div align="center">
|
|
24
|
+
<img src="https://raw.githubusercontent.com/bitphill/loopsmith/main/assets/loopsmith-logo-256.png" alt="loopsmith" width="180" />
|
|
25
|
+
<h1>loopsmith</h1>
|
|
26
|
+
<p><em>Hand a repeating job to an AI. A checker you wrote — not the AI — decides when it is done.</em></p>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
[](https://pypi.org/project/loopsmith-cli/)
|
|
30
|
+
[](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
|
|
31
|
+

|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pipx install loopsmith-cli # or: pip install loopsmith-cli
|
|
36
|
+
loopsmith doctor
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> **The distribution is `loopsmith-cli`; the command is `loopsmith`.** The
|
|
40
|
+
> shorter name was taken on PyPI. This package is a Rust binary with a thin
|
|
41
|
+
> Python launcher — there is nothing to `import`. The binary for your platform
|
|
42
|
+
> is downloaded on first run, so there is no Rust toolchain involved.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## What it is
|
|
47
|
+
|
|
48
|
+
You have a job you redo every week and are fussy about — a competitor roundup,
|
|
49
|
+
a lead list, a landing page, a research brief. You describe it once. loopsmith
|
|
50
|
+
runs it over and over on its own, and stops when a check **you** wrote says it
|
|
51
|
+
is done, or a limit **you** set says enough.
|
|
52
|
+
|
|
53
|
+
The part that makes it worth running unattended: whether a goal is done is
|
|
54
|
+
decided by compiled Rust, never by a model. The model does the work; a gate
|
|
55
|
+
that cannot be argued with decides whether the work counts. That gate can also
|
|
56
|
+
take "done" back — delete a required file and a satisfied goal flips straight
|
|
57
|
+
back to unsatisfied.
|
|
58
|
+
|
|
59
|
+
## Sixty seconds
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
loopsmith doctor # what this machine can and cannot do
|
|
63
|
+
loopsmith --web # build a loop in your browser
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Not a browser person? `loopsmith --guided` asks the same questions in the
|
|
67
|
+
terminal. Either way, nothing runs and nothing is spent while you answer.
|
|
68
|
+
|
|
69
|
+
To go straight to a file instead:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
loopsmith loop new --path ~/loops/my-loop --purpose "keep the roundup current"
|
|
73
|
+
loopsmith loop validate ~/loops/my-loop/loop.yaml # refuses, on purpose
|
|
74
|
+
loopsmith loop plan ~/loops/my-loop/loop.yaml # what it would do, and how fast
|
|
75
|
+
loopsmith run start ~/loops/my-loop/loop.yaml
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**That refusal is the point.** A fresh loop will not run until you tick the
|
|
79
|
+
steps saying you have done the job by hand at least once. Automating a process
|
|
80
|
+
nobody has performed produces the wrong answer faster, and at a scale that is
|
|
81
|
+
harder to undo.
|
|
82
|
+
|
|
83
|
+
## Fifteen worked loops to start from
|
|
84
|
+
|
|
85
|
+
Research, refactoring, traffic, trend tracking, landing pages, lead lists,
|
|
86
|
+
marketing, blogging, cold outreach, agent payments, a small game, idea
|
|
87
|
+
discovery, account watching, a container-isolated refactor, and one that
|
|
88
|
+
proposes improvements to itself. All fifteen are compiled into the binary and
|
|
89
|
+
load with one click in `--web`, or copy one from
|
|
90
|
+
[`config/examples/`](https://github.com/bitphill/loopsmith/tree/main/config/examples).
|
|
91
|
+
|
|
92
|
+
## Bring your own model
|
|
93
|
+
|
|
94
|
+
Every provider is a command template, so anything you can run from a shell can
|
|
95
|
+
serve a loop: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint
|
|
96
|
+
driven by `curl`, an MCP server over stdio. Adding one is a config edit, never
|
|
97
|
+
a rebuild. Keys are named, never read — `requires_env` says a key must be
|
|
98
|
+
present, and the value goes from your environment to the command without
|
|
99
|
+
passing through loopsmith or its ledger.
|
|
100
|
+
|
|
101
|
+
Cheap models carry the mechanical work; strong models carry judgment. And a
|
|
102
|
+
judge is refused outright if it would run on the same provider as the work it
|
|
103
|
+
is grading, because a model marking its own homework is not a check.
|
|
104
|
+
|
|
105
|
+
## Keeping it alive
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
loopsmith run watch loop.yaml # stay resident, run on every trigger
|
|
109
|
+
loopsmith run schedule loop.yaml --install # hand it to launchd, cron, or Task Scheduler
|
|
110
|
+
loopsmith run status loop.yaml <run-id> # what the gate has ruled so far
|
|
111
|
+
loopsmith run ledger loop.yaml <run-id> # everything that happened, including why it stopped
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
A run survives a crash: state is a real store on disk, and `loopsmith run
|
|
115
|
+
resume` picks up from the last checkpoint.
|
|
116
|
+
|
|
117
|
+
## Where the rest of it is
|
|
118
|
+
|
|
119
|
+
- [**README-FOR-DUMMIES.md**](https://github.com/bitphill/loopsmith/blob/main/README-FOR-DUMMIES.md)
|
|
120
|
+
— the same thing with no jargon, if this page assumed too much
|
|
121
|
+
- [**README.md**](https://github.com/bitphill/loopsmith/blob/main/README.md)
|
|
122
|
+
— the full version
|
|
123
|
+
- [**HOW-TO-USE.md**](https://github.com/bitphill/loopsmith/blob/main/HOW-TO-USE.md)
|
|
124
|
+
— every config section, one at a time, with what goes wrong if you skip it
|
|
125
|
+
- [**LOOP-TEMPLATE.md**](https://github.com/bitphill/loopsmith/blob/main/LOOP-TEMPLATE.md)
|
|
126
|
+
— a blank loop with a note on every field
|
|
127
|
+
- [**Concepts**](https://github.com/bitphill/loopsmith/wiki/Concepts)
|
|
128
|
+
— every word the config and the error messages use, defined once
|
|
129
|
+
- [**Architecture**](https://github.com/bitphill/loopsmith/wiki/Architecture)
|
|
130
|
+
· [**Commands**](https://github.com/bitphill/loopsmith/wiki/Commands)
|
|
131
|
+
· [**Migration 0.3 → 1.0**](https://github.com/bitphill/loopsmith/wiki/Migration-0-3-To-1-0)
|
|
132
|
+
- [**Code wiki**](https://bitphill.github.io/loopsmith/wiki/#overview)
|
|
133
|
+
— a page per subsystem, generated from the code
|
|
134
|
+
|
|
135
|
+
Runs on Linux, macOS, and Windows. MIT licensed.
|
loopsmith_cli-0.3.0/PKG-INFO
DELETED
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: loopsmith-cli
|
|
3
|
-
Version: 0.3.0
|
|
4
|
-
Summary: Self-evolving agent loops behind a deterministic verification gate. Installs the prebuilt Rust binary as `loopsmith`.
|
|
5
|
-
Author-email: Vaibhav Agarwal <bitphill@duck.com>
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/bitphill/loopsmith
|
|
8
|
-
Project-URL: Repository, https://github.com/bitphill/loopsmith
|
|
9
|
-
Project-URL: Changelog, https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md
|
|
10
|
-
Project-URL: Issues, https://github.com/bitphill/loopsmith/issues
|
|
11
|
-
Keywords: agent,loop,llm,orchestration,cli,rust
|
|
12
|
-
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: Environment :: Console
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
-
Classifier: Operating System :: MacOS :: MacOS X
|
|
17
|
-
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
-
Classifier: Programming Language :: Rust
|
|
19
|
-
Classifier: Topic :: Software Development :: Build Tools
|
|
20
|
-
Requires-Python: >=3.8
|
|
21
|
-
Description-Content-Type: text/markdown
|
|
22
|
-
|
|
23
|
-
<div align="center">
|
|
24
|
-
<img src="https://raw.githubusercontent.com/bitphill/loopsmith/v0.3.0/assets/loopsmith-logo-256.png" alt="loopsmith" width="180" />
|
|
25
|
-
<h1>loopsmith</h1>
|
|
26
|
-
<p><em>Self-evolving agent loops. The gate is code, so "done" cannot be argued.</em></p>
|
|
27
|
-
</div>
|
|
28
|
-
|
|
29
|
-
[](https://pypi.org/project/loopsmith-cli/)
|
|
30
|
-
[](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
|
|
31
|
-

|
|
32
|
-

|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
pip install loopsmith-cli
|
|
36
|
-
loopsmith doctor
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
> **This distribution is a Rust binary, not a Python library.** There is nothing to
|
|
40
|
-
> `import`. It installs a `loopsmith` command. To drive loops from Python, use
|
|
41
|
-
> `subprocess` — its exit codes are its API.
|
|
42
|
-
|
|
43
|
-
## TL;DR:
|
|
44
|
-
|
|
45
|
-
You have a job you redo every week and are fussy about — a competitor roundup, a
|
|
46
|
-
lead list, a landing page, a research brief. Write down **what you want** and
|
|
47
|
-
**how anyone would tell it's good**, in one plain text file. loopsmith puts an AI
|
|
48
|
-
to work on it, checks the result, sends it back when it falls short, and stops
|
|
49
|
-
when it passes. It can run on a schedule for weeks without you.
|
|
50
|
-
|
|
51
|
-
The rule that makes it safe to walk away: **the AI never gets to say "done".** A
|
|
52
|
-
deterministic checker reads the actual files and decides — and it can revoke, so
|
|
53
|
-
a goal that stops being true stops being satisfied.
|
|
54
|
-
|
|
55
|
-
**Not a developer?** Marketing, sales, research, ops — if you can edit a text
|
|
56
|
-
file, you can run a loop. And if you would rather not open a text file at all,
|
|
57
|
-
`loopsmith --web` builds one for you in a browser.
|
|
58
|
-
|
|
59
|
-
### ➜ [START-HERE — README-FOR-DUMMIES.md](https://github.com/bitphill/loopsmith/blob/v0.3.0/README-FOR-DUMMIES.md)
|
|
60
|
-
|
|
61
|
-
A plain-English guide: one install line, thirteen ready-made loops to copy, the
|
|
62
|
-
six settings you actually edit, and how to leave it running on a schedule.
|
|
63
|
-
|
|
64
|
-
There is also a generated [code wiki](https://bitphill.github.io/loopsmith/wiki/#overview) mapping the crates,
|
|
65
|
-
the execution engine, the gate, and the provider layer.
|
|
66
|
-
|
|
67
|
-
## What it is
|
|
68
|
-
|
|
69
|
-
You describe a purpose in a config — goals, how each is checked, what counts as
|
|
70
|
-
success, when to stop, what the loop may never do. loopsmith handles scheduling,
|
|
71
|
-
provider routing, memory, verification, and termination, and can run for weeks
|
|
72
|
-
without you.
|
|
73
|
-
|
|
74
|
-
One rule holds the whole design up:
|
|
75
|
-
|
|
76
|
-
> **A model must not be the thing that certifies its own completion.**
|
|
77
|
-
|
|
78
|
-
`goal_satisfied` is written by a deterministic Rust gate and by nothing else, and
|
|
79
|
-
the gate can **revoke**: delete a required artifact and a satisfied goal flips
|
|
80
|
-
back. A system that can only promote is a burndown chart with extra steps.
|
|
81
|
-
|
|
82
|
-
## The browser UI
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
loopsmith --web # or: loopsmith web
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Serves `http://127.0.0.1:3000` and opens a tab. Everything the CLI does, done by
|
|
89
|
-
clicking — with every field explained in place, for people who would rather not
|
|
90
|
-
learn a schema before they learn whether the tool is useful.
|
|
91
|
-
|
|
92
|
-
Six steps rather than one long form — Place, Power, Intent, Proof, Work, Ship —
|
|
93
|
-
carrying only the actions that make sense on each, and `⌘K` to reach any step,
|
|
94
|
-
section, action, or example directly.
|
|
95
|
-
|
|
96
|
-
It probes the machine first, so nothing has to be typed from memory: agent CLIs
|
|
97
|
-
on `PATH`, the Ollama models actually pulled, MCP servers already configured by
|
|
98
|
-
your editor, which API keys are set, and which sub-agents are installed. Found
|
|
99
|
-
CLIs become one-click provider cards prefilling a working argv, and a **Test**
|
|
100
|
-
button puts one real prompt through a provider so a wrong flag surfaces now
|
|
101
|
-
rather than in iteration four of an unattended run. The folder button opens your
|
|
102
|
-
operating system's own folder chooser, so no path has to be typed at all.
|
|
103
|
-
|
|
104
|
-
The right-hand panel re-checks the draft on every keystroke — the same validator,
|
|
105
|
-
planner, and permission derivation the CLI uses, in-process: every problem with
|
|
106
|
-
the field it belongs to, what a run could cost at the ceilings currently set (or
|
|
107
|
-
**unbounded** if none is), the wave schedule and the speedup ceiling no worker
|
|
108
|
-
count beats, and parallel builders that would overwrite each other.
|
|
109
|
-
|
|
110
|
-
All thirteen examples are compiled into the binary and load with one click. The
|
|
111
|
-
buttons spawn the real `loopsmith` binary and stream its output live, so the
|
|
112
|
-
browser can never drift from the CLI and can never do anything `loopsmith --help`
|
|
113
|
-
does not list. A run belongs to the server, not the page: close the tab and it
|
|
114
|
-
keeps going, reopen and the log picks up from the start.
|
|
115
|
-
|
|
116
|
-
Binds loopback only, and refuses any request not addressed to it. API keys go to
|
|
117
|
-
your shell profile or your OS secret store — only the variable *name* is ever
|
|
118
|
-
written into a config.
|
|
119
|
-
|
|
120
|
-
## Five minutes
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
pip install loopsmith-cli
|
|
124
|
-
|
|
125
|
-
# --path must be outside any repo you care about: a loop edits files and writes
|
|
126
|
-
# state, so it does not get pointed at the tool that runs it.
|
|
127
|
-
loopsmith new --path ~/loops/nightly-refactor --purpose "keep the module simple"
|
|
128
|
-
|
|
129
|
-
cd ~/loops/nightly-refactor
|
|
130
|
-
$EDITOR loop.yaml # your goals, and how each one is checked
|
|
131
|
-
loopsmith validate loop.yaml
|
|
132
|
-
loopsmith plan loop.yaml
|
|
133
|
-
./run.sh # run.cmd on Windows
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### `validate` fails on purpose
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
error pre_execution: 2 step(s) not marked done: Run this task manually end to
|
|
140
|
-
end at least once; Write down what 'done' means in checkable terms.
|
|
141
|
-
Automating before understanding produces fast, confident garbage
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
That refusal is the most valuable thing the tool does. Do the task by hand once —
|
|
145
|
-
the manual run *is* the spec. Mark each `pre_execution` step `done: true` once you
|
|
146
|
-
actually have.
|
|
147
|
-
|
|
148
|
-
## What a config looks like
|
|
149
|
-
|
|
150
|
-
Ten sections, **A** to **J**: information, the manual work list, goals,
|
|
151
|
-
validations, success criteria, stop gates, schedules, constraints, execution
|
|
152
|
-
guidelines, default skills. YAML or Markdown — the same model either way.
|
|
153
|
-
|
|
154
|
-
```yaml
|
|
155
|
-
name: nightly-refactor
|
|
156
|
-
description: keep the payments module simple without breaking it
|
|
157
|
-
|
|
158
|
-
pre_execution:
|
|
159
|
-
- step: Ran the refactor by hand on one file and kept the diff
|
|
160
|
-
done: true
|
|
161
|
-
|
|
162
|
-
goals:
|
|
163
|
-
- name: simpler
|
|
164
|
-
description: Cyclomatic complexity down, behaviour unchanged.
|
|
165
|
-
|
|
166
|
-
validations:
|
|
167
|
-
- target: simpler
|
|
168
|
-
name: tests-still-pass
|
|
169
|
-
mode: objective
|
|
170
|
-
statement: The suite exits clean.
|
|
171
|
-
detector:
|
|
172
|
-
type: script
|
|
173
|
-
command: ./scripts/check-tests.sh
|
|
174
|
-
expect_exit: 0
|
|
175
|
-
blocking: true
|
|
176
|
-
|
|
177
|
-
success:
|
|
178
|
-
- target: overall
|
|
179
|
-
name: all-blocking-pass
|
|
180
|
-
mode: percentage
|
|
181
|
-
statement: Every blocking validation passes.
|
|
182
|
-
threshold: 1.0
|
|
183
|
-
|
|
184
|
-
stop_gates:
|
|
185
|
-
max_iterations: 8
|
|
186
|
-
max_revisions_per_node: 3
|
|
187
|
-
max_cost_usd: 5.0
|
|
188
|
-
no_progress_iterations: 3
|
|
189
|
-
|
|
190
|
-
graph:
|
|
191
|
-
nodes:
|
|
192
|
-
- id: refactor
|
|
193
|
-
role: builder
|
|
194
|
-
instruction: Simplify one function. State any assumption you had to make.
|
|
195
|
-
goals: [simpler]
|
|
196
|
-
isolated: true # its own git worktree
|
|
197
|
-
- id: review
|
|
198
|
-
role: judge
|
|
199
|
-
instruction: Check the diff against the brief. Pass or fail per check, with evidence.
|
|
200
|
-
depends_on: [refactor]
|
|
201
|
-
goals: [simpler]
|
|
202
|
-
tier: strong
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Detectors are `file_exists`, `regex`, `script`, and composites. Only a detector
|
|
206
|
-
can satisfy a goal — a model's opinion of its own work never does.
|
|
207
|
-
|
|
208
|
-
## While it runs
|
|
209
|
-
|
|
210
|
-
| Question | Command |
|
|
211
|
-
|---|---|
|
|
212
|
-
| What does the gate say? | `loopsmith status <config> <run-id>` |
|
|
213
|
-
| What happened? | `loopsmith ledger <config> <run-id>` |
|
|
214
|
-
| Why did it stop? | the last line of `logs/<run-id>.log` |
|
|
215
|
-
| What does it want changed about itself? | `loopsmith proposals <config> <run-id>` |
|
|
216
|
-
| Which providers can it reach? | `loopsmith providers <config>` |
|
|
217
|
-
| Will this machine get in the way? | `loopsmith doctor <config>` |
|
|
218
|
-
|
|
219
|
-
**The loop never edits its own config.** Changes to goals, validations, success
|
|
220
|
-
criteria, and sub-agent adoption are written as *proposals* for a human to apply.
|
|
221
|
-
|
|
222
|
-
## Providers and BYOK
|
|
223
|
-
|
|
224
|
-
Every provider is a command template, which is what makes bring-your-own-key
|
|
225
|
-
free: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint driven by
|
|
226
|
-
`curl`, an MCP server over stdio — all of them are "a program you run with a
|
|
227
|
-
prompt". Adding one is a config edit, never a rebuild.
|
|
228
|
-
|
|
229
|
-
`requires_env` names variables that must **exist**. loopsmith never reads their
|
|
230
|
-
values, so a key cannot reach a prompt, a log, or the ledger.
|
|
231
|
-
|
|
232
|
-
> ⚠ Never paste an API key into a chat window, a config file, or an issue. If one
|
|
233
|
-
> ends up somewhere it should not be, rotate it — deleting the message is not
|
|
234
|
-
> enough.
|
|
235
|
-
|
|
236
|
-
## How this distribution installs the binary
|
|
237
|
-
|
|
238
|
-
The binary is fetched **on first run**, not during `pip install`, and cached under
|
|
239
|
-
`~/.loopsmith/bin/<version>/` (override with `LOOPSMITH_HOME`).
|
|
240
|
-
|
|
241
|
-
That is deliberate. A wheel that downloads at install time breaks in every
|
|
242
|
-
environment that installs without a network and runs with one — CI images, Docker
|
|
243
|
-
build stages, locked-down build hosts — and the failure surfaces as an install
|
|
244
|
-
error for a package the user has not tried to use yet.
|
|
245
|
-
|
|
246
|
-
Every download is **verified against the release's published `SHA256SUMS` before it
|
|
247
|
-
is executed**. Fetching a binary and running it unverified is a supply-chain hole
|
|
248
|
-
with a progress bar.
|
|
249
|
-
|
|
250
|
-
Prebuilt for:
|
|
251
|
-
|
|
252
|
-
| Platform | Target |
|
|
253
|
-
|---|---|
|
|
254
|
-
| Linux x86_64 (glibc) | `x86_64-unknown-linux-gnu` |
|
|
255
|
-
| Linux x86_64 (musl, auto-detected) | `x86_64-unknown-linux-musl` |
|
|
256
|
-
| Linux arm64 | `aarch64-unknown-linux-gnu` |
|
|
257
|
-
| macOS Intel | `x86_64-apple-darwin` |
|
|
258
|
-
| macOS Apple silicon | `aarch64-apple-darwin` |
|
|
259
|
-
| Windows x86_64 | `x86_64-pc-windows-msvc` |
|
|
260
|
-
|
|
261
|
-
Anywhere else, build from source — it is the same program:
|
|
262
|
-
|
|
263
|
-
```bash
|
|
264
|
-
cargo install loopsmith
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## The distribution name
|
|
268
|
-
|
|
269
|
-
`loopsmith` on PyPI was already registered by an unrelated project, so this
|
|
270
|
-
distribution is `loopsmith-cli`. The installed command is `loopsmith` either way.
|
|
271
|
-
Elsewhere: [`loopsmith`](https://crates.io/crates/loopsmith) on crates.io,
|
|
272
|
-
[`@bitphill/loopsmith`](https://www.npmjs.com/package/@bitphill/loopsmith) on npm,
|
|
273
|
-
and the `bitphill/loopsmith` Homebrew tap.
|
|
274
|
-
|
|
275
|
-
## Documentation
|
|
276
|
-
|
|
277
|
-
- [Full README](https://github.com/bitphill/loopsmith#readme)
|
|
278
|
-
- [Section-by-section config reference](https://github.com/bitphill/loopsmith/blob/main/HOW-TO-USE.md)
|
|
279
|
-
- [Architecture and the reasoning behind it](https://github.com/bitphill/loopsmith/blob/main/README-DETAIL.md)
|
|
280
|
-
- [Thirteen worked examples](https://github.com/bitphill/loopsmith/tree/main/config/examples)
|
|
281
|
-
- [Changelog](https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md)
|
|
282
|
-
|
|
283
|
-
MIT licensed. © bitphill
|
loopsmith_cli-0.3.0/README.md
DELETED
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/bitphill/loopsmith/v0.3.0/assets/loopsmith-logo-256.png" alt="loopsmith" width="180" />
|
|
3
|
-
<h1>loopsmith</h1>
|
|
4
|
-
<p><em>Self-evolving agent loops. The gate is code, so "done" cannot be argued.</em></p>
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
[](https://pypi.org/project/loopsmith-cli/)
|
|
8
|
-
[](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
|
|
9
|
-

|
|
10
|
-

|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
pip install loopsmith-cli
|
|
14
|
-
loopsmith doctor
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
> **This distribution is a Rust binary, not a Python library.** There is nothing to
|
|
18
|
-
> `import`. It installs a `loopsmith` command. To drive loops from Python, use
|
|
19
|
-
> `subprocess` — its exit codes are its API.
|
|
20
|
-
|
|
21
|
-
## TL;DR:
|
|
22
|
-
|
|
23
|
-
You have a job you redo every week and are fussy about — a competitor roundup, a
|
|
24
|
-
lead list, a landing page, a research brief. Write down **what you want** and
|
|
25
|
-
**how anyone would tell it's good**, in one plain text file. loopsmith puts an AI
|
|
26
|
-
to work on it, checks the result, sends it back when it falls short, and stops
|
|
27
|
-
when it passes. It can run on a schedule for weeks without you.
|
|
28
|
-
|
|
29
|
-
The rule that makes it safe to walk away: **the AI never gets to say "done".** A
|
|
30
|
-
deterministic checker reads the actual files and decides — and it can revoke, so
|
|
31
|
-
a goal that stops being true stops being satisfied.
|
|
32
|
-
|
|
33
|
-
**Not a developer?** Marketing, sales, research, ops — if you can edit a text
|
|
34
|
-
file, you can run a loop. And if you would rather not open a text file at all,
|
|
35
|
-
`loopsmith --web` builds one for you in a browser.
|
|
36
|
-
|
|
37
|
-
### ➜ [START-HERE — README-FOR-DUMMIES.md](https://github.com/bitphill/loopsmith/blob/v0.3.0/README-FOR-DUMMIES.md)
|
|
38
|
-
|
|
39
|
-
A plain-English guide: one install line, thirteen ready-made loops to copy, the
|
|
40
|
-
six settings you actually edit, and how to leave it running on a schedule.
|
|
41
|
-
|
|
42
|
-
There is also a generated [code wiki](https://bitphill.github.io/loopsmith/wiki/#overview) mapping the crates,
|
|
43
|
-
the execution engine, the gate, and the provider layer.
|
|
44
|
-
|
|
45
|
-
## What it is
|
|
46
|
-
|
|
47
|
-
You describe a purpose in a config — goals, how each is checked, what counts as
|
|
48
|
-
success, when to stop, what the loop may never do. loopsmith handles scheduling,
|
|
49
|
-
provider routing, memory, verification, and termination, and can run for weeks
|
|
50
|
-
without you.
|
|
51
|
-
|
|
52
|
-
One rule holds the whole design up:
|
|
53
|
-
|
|
54
|
-
> **A model must not be the thing that certifies its own completion.**
|
|
55
|
-
|
|
56
|
-
`goal_satisfied` is written by a deterministic Rust gate and by nothing else, and
|
|
57
|
-
the gate can **revoke**: delete a required artifact and a satisfied goal flips
|
|
58
|
-
back. A system that can only promote is a burndown chart with extra steps.
|
|
59
|
-
|
|
60
|
-
## The browser UI
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
loopsmith --web # or: loopsmith web
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Serves `http://127.0.0.1:3000` and opens a tab. Everything the CLI does, done by
|
|
67
|
-
clicking — with every field explained in place, for people who would rather not
|
|
68
|
-
learn a schema before they learn whether the tool is useful.
|
|
69
|
-
|
|
70
|
-
Six steps rather than one long form — Place, Power, Intent, Proof, Work, Ship —
|
|
71
|
-
carrying only the actions that make sense on each, and `⌘K` to reach any step,
|
|
72
|
-
section, action, or example directly.
|
|
73
|
-
|
|
74
|
-
It probes the machine first, so nothing has to be typed from memory: agent CLIs
|
|
75
|
-
on `PATH`, the Ollama models actually pulled, MCP servers already configured by
|
|
76
|
-
your editor, which API keys are set, and which sub-agents are installed. Found
|
|
77
|
-
CLIs become one-click provider cards prefilling a working argv, and a **Test**
|
|
78
|
-
button puts one real prompt through a provider so a wrong flag surfaces now
|
|
79
|
-
rather than in iteration four of an unattended run. The folder button opens your
|
|
80
|
-
operating system's own folder chooser, so no path has to be typed at all.
|
|
81
|
-
|
|
82
|
-
The right-hand panel re-checks the draft on every keystroke — the same validator,
|
|
83
|
-
planner, and permission derivation the CLI uses, in-process: every problem with
|
|
84
|
-
the field it belongs to, what a run could cost at the ceilings currently set (or
|
|
85
|
-
**unbounded** if none is), the wave schedule and the speedup ceiling no worker
|
|
86
|
-
count beats, and parallel builders that would overwrite each other.
|
|
87
|
-
|
|
88
|
-
All thirteen examples are compiled into the binary and load with one click. The
|
|
89
|
-
buttons spawn the real `loopsmith` binary and stream its output live, so the
|
|
90
|
-
browser can never drift from the CLI and can never do anything `loopsmith --help`
|
|
91
|
-
does not list. A run belongs to the server, not the page: close the tab and it
|
|
92
|
-
keeps going, reopen and the log picks up from the start.
|
|
93
|
-
|
|
94
|
-
Binds loopback only, and refuses any request not addressed to it. API keys go to
|
|
95
|
-
your shell profile or your OS secret store — only the variable *name* is ever
|
|
96
|
-
written into a config.
|
|
97
|
-
|
|
98
|
-
## Five minutes
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
pip install loopsmith-cli
|
|
102
|
-
|
|
103
|
-
# --path must be outside any repo you care about: a loop edits files and writes
|
|
104
|
-
# state, so it does not get pointed at the tool that runs it.
|
|
105
|
-
loopsmith new --path ~/loops/nightly-refactor --purpose "keep the module simple"
|
|
106
|
-
|
|
107
|
-
cd ~/loops/nightly-refactor
|
|
108
|
-
$EDITOR loop.yaml # your goals, and how each one is checked
|
|
109
|
-
loopsmith validate loop.yaml
|
|
110
|
-
loopsmith plan loop.yaml
|
|
111
|
-
./run.sh # run.cmd on Windows
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### `validate` fails on purpose
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
error pre_execution: 2 step(s) not marked done: Run this task manually end to
|
|
118
|
-
end at least once; Write down what 'done' means in checkable terms.
|
|
119
|
-
Automating before understanding produces fast, confident garbage
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
That refusal is the most valuable thing the tool does. Do the task by hand once —
|
|
123
|
-
the manual run *is* the spec. Mark each `pre_execution` step `done: true` once you
|
|
124
|
-
actually have.
|
|
125
|
-
|
|
126
|
-
## What a config looks like
|
|
127
|
-
|
|
128
|
-
Ten sections, **A** to **J**: information, the manual work list, goals,
|
|
129
|
-
validations, success criteria, stop gates, schedules, constraints, execution
|
|
130
|
-
guidelines, default skills. YAML or Markdown — the same model either way.
|
|
131
|
-
|
|
132
|
-
```yaml
|
|
133
|
-
name: nightly-refactor
|
|
134
|
-
description: keep the payments module simple without breaking it
|
|
135
|
-
|
|
136
|
-
pre_execution:
|
|
137
|
-
- step: Ran the refactor by hand on one file and kept the diff
|
|
138
|
-
done: true
|
|
139
|
-
|
|
140
|
-
goals:
|
|
141
|
-
- name: simpler
|
|
142
|
-
description: Cyclomatic complexity down, behaviour unchanged.
|
|
143
|
-
|
|
144
|
-
validations:
|
|
145
|
-
- target: simpler
|
|
146
|
-
name: tests-still-pass
|
|
147
|
-
mode: objective
|
|
148
|
-
statement: The suite exits clean.
|
|
149
|
-
detector:
|
|
150
|
-
type: script
|
|
151
|
-
command: ./scripts/check-tests.sh
|
|
152
|
-
expect_exit: 0
|
|
153
|
-
blocking: true
|
|
154
|
-
|
|
155
|
-
success:
|
|
156
|
-
- target: overall
|
|
157
|
-
name: all-blocking-pass
|
|
158
|
-
mode: percentage
|
|
159
|
-
statement: Every blocking validation passes.
|
|
160
|
-
threshold: 1.0
|
|
161
|
-
|
|
162
|
-
stop_gates:
|
|
163
|
-
max_iterations: 8
|
|
164
|
-
max_revisions_per_node: 3
|
|
165
|
-
max_cost_usd: 5.0
|
|
166
|
-
no_progress_iterations: 3
|
|
167
|
-
|
|
168
|
-
graph:
|
|
169
|
-
nodes:
|
|
170
|
-
- id: refactor
|
|
171
|
-
role: builder
|
|
172
|
-
instruction: Simplify one function. State any assumption you had to make.
|
|
173
|
-
goals: [simpler]
|
|
174
|
-
isolated: true # its own git worktree
|
|
175
|
-
- id: review
|
|
176
|
-
role: judge
|
|
177
|
-
instruction: Check the diff against the brief. Pass or fail per check, with evidence.
|
|
178
|
-
depends_on: [refactor]
|
|
179
|
-
goals: [simpler]
|
|
180
|
-
tier: strong
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
Detectors are `file_exists`, `regex`, `script`, and composites. Only a detector
|
|
184
|
-
can satisfy a goal — a model's opinion of its own work never does.
|
|
185
|
-
|
|
186
|
-
## While it runs
|
|
187
|
-
|
|
188
|
-
| Question | Command |
|
|
189
|
-
|---|---|
|
|
190
|
-
| What does the gate say? | `loopsmith status <config> <run-id>` |
|
|
191
|
-
| What happened? | `loopsmith ledger <config> <run-id>` |
|
|
192
|
-
| Why did it stop? | the last line of `logs/<run-id>.log` |
|
|
193
|
-
| What does it want changed about itself? | `loopsmith proposals <config> <run-id>` |
|
|
194
|
-
| Which providers can it reach? | `loopsmith providers <config>` |
|
|
195
|
-
| Will this machine get in the way? | `loopsmith doctor <config>` |
|
|
196
|
-
|
|
197
|
-
**The loop never edits its own config.** Changes to goals, validations, success
|
|
198
|
-
criteria, and sub-agent adoption are written as *proposals* for a human to apply.
|
|
199
|
-
|
|
200
|
-
## Providers and BYOK
|
|
201
|
-
|
|
202
|
-
Every provider is a command template, which is what makes bring-your-own-key
|
|
203
|
-
free: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint driven by
|
|
204
|
-
`curl`, an MCP server over stdio — all of them are "a program you run with a
|
|
205
|
-
prompt". Adding one is a config edit, never a rebuild.
|
|
206
|
-
|
|
207
|
-
`requires_env` names variables that must **exist**. loopsmith never reads their
|
|
208
|
-
values, so a key cannot reach a prompt, a log, or the ledger.
|
|
209
|
-
|
|
210
|
-
> ⚠ Never paste an API key into a chat window, a config file, or an issue. If one
|
|
211
|
-
> ends up somewhere it should not be, rotate it — deleting the message is not
|
|
212
|
-
> enough.
|
|
213
|
-
|
|
214
|
-
## How this distribution installs the binary
|
|
215
|
-
|
|
216
|
-
The binary is fetched **on first run**, not during `pip install`, and cached under
|
|
217
|
-
`~/.loopsmith/bin/<version>/` (override with `LOOPSMITH_HOME`).
|
|
218
|
-
|
|
219
|
-
That is deliberate. A wheel that downloads at install time breaks in every
|
|
220
|
-
environment that installs without a network and runs with one — CI images, Docker
|
|
221
|
-
build stages, locked-down build hosts — and the failure surfaces as an install
|
|
222
|
-
error for a package the user has not tried to use yet.
|
|
223
|
-
|
|
224
|
-
Every download is **verified against the release's published `SHA256SUMS` before it
|
|
225
|
-
is executed**. Fetching a binary and running it unverified is a supply-chain hole
|
|
226
|
-
with a progress bar.
|
|
227
|
-
|
|
228
|
-
Prebuilt for:
|
|
229
|
-
|
|
230
|
-
| Platform | Target |
|
|
231
|
-
|---|---|
|
|
232
|
-
| Linux x86_64 (glibc) | `x86_64-unknown-linux-gnu` |
|
|
233
|
-
| Linux x86_64 (musl, auto-detected) | `x86_64-unknown-linux-musl` |
|
|
234
|
-
| Linux arm64 | `aarch64-unknown-linux-gnu` |
|
|
235
|
-
| macOS Intel | `x86_64-apple-darwin` |
|
|
236
|
-
| macOS Apple silicon | `aarch64-apple-darwin` |
|
|
237
|
-
| Windows x86_64 | `x86_64-pc-windows-msvc` |
|
|
238
|
-
|
|
239
|
-
Anywhere else, build from source — it is the same program:
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
cargo install loopsmith
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
## The distribution name
|
|
246
|
-
|
|
247
|
-
`loopsmith` on PyPI was already registered by an unrelated project, so this
|
|
248
|
-
distribution is `loopsmith-cli`. The installed command is `loopsmith` either way.
|
|
249
|
-
Elsewhere: [`loopsmith`](https://crates.io/crates/loopsmith) on crates.io,
|
|
250
|
-
[`@bitphill/loopsmith`](https://www.npmjs.com/package/@bitphill/loopsmith) on npm,
|
|
251
|
-
and the `bitphill/loopsmith` Homebrew tap.
|
|
252
|
-
|
|
253
|
-
## Documentation
|
|
254
|
-
|
|
255
|
-
- [Full README](https://github.com/bitphill/loopsmith#readme)
|
|
256
|
-
- [Section-by-section config reference](https://github.com/bitphill/loopsmith/blob/main/HOW-TO-USE.md)
|
|
257
|
-
- [Architecture and the reasoning behind it](https://github.com/bitphill/loopsmith/blob/main/README-DETAIL.md)
|
|
258
|
-
- [Thirteen worked examples](https://github.com/bitphill/loopsmith/tree/main/config/examples)
|
|
259
|
-
- [Changelog](https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md)
|
|
260
|
-
|
|
261
|
-
MIT licensed. © bitphill
|
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: loopsmith-cli
|
|
3
|
-
Version: 0.3.0
|
|
4
|
-
Summary: Self-evolving agent loops behind a deterministic verification gate. Installs the prebuilt Rust binary as `loopsmith`.
|
|
5
|
-
Author-email: Vaibhav Agarwal <bitphill@duck.com>
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/bitphill/loopsmith
|
|
8
|
-
Project-URL: Repository, https://github.com/bitphill/loopsmith
|
|
9
|
-
Project-URL: Changelog, https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md
|
|
10
|
-
Project-URL: Issues, https://github.com/bitphill/loopsmith/issues
|
|
11
|
-
Keywords: agent,loop,llm,orchestration,cli,rust
|
|
12
|
-
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: Environment :: Console
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
-
Classifier: Operating System :: MacOS :: MacOS X
|
|
17
|
-
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
-
Classifier: Programming Language :: Rust
|
|
19
|
-
Classifier: Topic :: Software Development :: Build Tools
|
|
20
|
-
Requires-Python: >=3.8
|
|
21
|
-
Description-Content-Type: text/markdown
|
|
22
|
-
|
|
23
|
-
<div align="center">
|
|
24
|
-
<img src="https://raw.githubusercontent.com/bitphill/loopsmith/v0.3.0/assets/loopsmith-logo-256.png" alt="loopsmith" width="180" />
|
|
25
|
-
<h1>loopsmith</h1>
|
|
26
|
-
<p><em>Self-evolving agent loops. The gate is code, so "done" cannot be argued.</em></p>
|
|
27
|
-
</div>
|
|
28
|
-
|
|
29
|
-
[](https://pypi.org/project/loopsmith-cli/)
|
|
30
|
-
[](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
|
|
31
|
-

|
|
32
|
-

|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
pip install loopsmith-cli
|
|
36
|
-
loopsmith doctor
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
> **This distribution is a Rust binary, not a Python library.** There is nothing to
|
|
40
|
-
> `import`. It installs a `loopsmith` command. To drive loops from Python, use
|
|
41
|
-
> `subprocess` — its exit codes are its API.
|
|
42
|
-
|
|
43
|
-
## TL;DR:
|
|
44
|
-
|
|
45
|
-
You have a job you redo every week and are fussy about — a competitor roundup, a
|
|
46
|
-
lead list, a landing page, a research brief. Write down **what you want** and
|
|
47
|
-
**how anyone would tell it's good**, in one plain text file. loopsmith puts an AI
|
|
48
|
-
to work on it, checks the result, sends it back when it falls short, and stops
|
|
49
|
-
when it passes. It can run on a schedule for weeks without you.
|
|
50
|
-
|
|
51
|
-
The rule that makes it safe to walk away: **the AI never gets to say "done".** A
|
|
52
|
-
deterministic checker reads the actual files and decides — and it can revoke, so
|
|
53
|
-
a goal that stops being true stops being satisfied.
|
|
54
|
-
|
|
55
|
-
**Not a developer?** Marketing, sales, research, ops — if you can edit a text
|
|
56
|
-
file, you can run a loop. And if you would rather not open a text file at all,
|
|
57
|
-
`loopsmith --web` builds one for you in a browser.
|
|
58
|
-
|
|
59
|
-
### ➜ [START-HERE — README-FOR-DUMMIES.md](https://github.com/bitphill/loopsmith/blob/v0.3.0/README-FOR-DUMMIES.md)
|
|
60
|
-
|
|
61
|
-
A plain-English guide: one install line, thirteen ready-made loops to copy, the
|
|
62
|
-
six settings you actually edit, and how to leave it running on a schedule.
|
|
63
|
-
|
|
64
|
-
There is also a generated [code wiki](https://bitphill.github.io/loopsmith/wiki/#overview) mapping the crates,
|
|
65
|
-
the execution engine, the gate, and the provider layer.
|
|
66
|
-
|
|
67
|
-
## What it is
|
|
68
|
-
|
|
69
|
-
You describe a purpose in a config — goals, how each is checked, what counts as
|
|
70
|
-
success, when to stop, what the loop may never do. loopsmith handles scheduling,
|
|
71
|
-
provider routing, memory, verification, and termination, and can run for weeks
|
|
72
|
-
without you.
|
|
73
|
-
|
|
74
|
-
One rule holds the whole design up:
|
|
75
|
-
|
|
76
|
-
> **A model must not be the thing that certifies its own completion.**
|
|
77
|
-
|
|
78
|
-
`goal_satisfied` is written by a deterministic Rust gate and by nothing else, and
|
|
79
|
-
the gate can **revoke**: delete a required artifact and a satisfied goal flips
|
|
80
|
-
back. A system that can only promote is a burndown chart with extra steps.
|
|
81
|
-
|
|
82
|
-
## The browser UI
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
loopsmith --web # or: loopsmith web
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Serves `http://127.0.0.1:3000` and opens a tab. Everything the CLI does, done by
|
|
89
|
-
clicking — with every field explained in place, for people who would rather not
|
|
90
|
-
learn a schema before they learn whether the tool is useful.
|
|
91
|
-
|
|
92
|
-
Six steps rather than one long form — Place, Power, Intent, Proof, Work, Ship —
|
|
93
|
-
carrying only the actions that make sense on each, and `⌘K` to reach any step,
|
|
94
|
-
section, action, or example directly.
|
|
95
|
-
|
|
96
|
-
It probes the machine first, so nothing has to be typed from memory: agent CLIs
|
|
97
|
-
on `PATH`, the Ollama models actually pulled, MCP servers already configured by
|
|
98
|
-
your editor, which API keys are set, and which sub-agents are installed. Found
|
|
99
|
-
CLIs become one-click provider cards prefilling a working argv, and a **Test**
|
|
100
|
-
button puts one real prompt through a provider so a wrong flag surfaces now
|
|
101
|
-
rather than in iteration four of an unattended run. The folder button opens your
|
|
102
|
-
operating system's own folder chooser, so no path has to be typed at all.
|
|
103
|
-
|
|
104
|
-
The right-hand panel re-checks the draft on every keystroke — the same validator,
|
|
105
|
-
planner, and permission derivation the CLI uses, in-process: every problem with
|
|
106
|
-
the field it belongs to, what a run could cost at the ceilings currently set (or
|
|
107
|
-
**unbounded** if none is), the wave schedule and the speedup ceiling no worker
|
|
108
|
-
count beats, and parallel builders that would overwrite each other.
|
|
109
|
-
|
|
110
|
-
All thirteen examples are compiled into the binary and load with one click. The
|
|
111
|
-
buttons spawn the real `loopsmith` binary and stream its output live, so the
|
|
112
|
-
browser can never drift from the CLI and can never do anything `loopsmith --help`
|
|
113
|
-
does not list. A run belongs to the server, not the page: close the tab and it
|
|
114
|
-
keeps going, reopen and the log picks up from the start.
|
|
115
|
-
|
|
116
|
-
Binds loopback only, and refuses any request not addressed to it. API keys go to
|
|
117
|
-
your shell profile or your OS secret store — only the variable *name* is ever
|
|
118
|
-
written into a config.
|
|
119
|
-
|
|
120
|
-
## Five minutes
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
pip install loopsmith-cli
|
|
124
|
-
|
|
125
|
-
# --path must be outside any repo you care about: a loop edits files and writes
|
|
126
|
-
# state, so it does not get pointed at the tool that runs it.
|
|
127
|
-
loopsmith new --path ~/loops/nightly-refactor --purpose "keep the module simple"
|
|
128
|
-
|
|
129
|
-
cd ~/loops/nightly-refactor
|
|
130
|
-
$EDITOR loop.yaml # your goals, and how each one is checked
|
|
131
|
-
loopsmith validate loop.yaml
|
|
132
|
-
loopsmith plan loop.yaml
|
|
133
|
-
./run.sh # run.cmd on Windows
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### `validate` fails on purpose
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
error pre_execution: 2 step(s) not marked done: Run this task manually end to
|
|
140
|
-
end at least once; Write down what 'done' means in checkable terms.
|
|
141
|
-
Automating before understanding produces fast, confident garbage
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
That refusal is the most valuable thing the tool does. Do the task by hand once —
|
|
145
|
-
the manual run *is* the spec. Mark each `pre_execution` step `done: true` once you
|
|
146
|
-
actually have.
|
|
147
|
-
|
|
148
|
-
## What a config looks like
|
|
149
|
-
|
|
150
|
-
Ten sections, **A** to **J**: information, the manual work list, goals,
|
|
151
|
-
validations, success criteria, stop gates, schedules, constraints, execution
|
|
152
|
-
guidelines, default skills. YAML or Markdown — the same model either way.
|
|
153
|
-
|
|
154
|
-
```yaml
|
|
155
|
-
name: nightly-refactor
|
|
156
|
-
description: keep the payments module simple without breaking it
|
|
157
|
-
|
|
158
|
-
pre_execution:
|
|
159
|
-
- step: Ran the refactor by hand on one file and kept the diff
|
|
160
|
-
done: true
|
|
161
|
-
|
|
162
|
-
goals:
|
|
163
|
-
- name: simpler
|
|
164
|
-
description: Cyclomatic complexity down, behaviour unchanged.
|
|
165
|
-
|
|
166
|
-
validations:
|
|
167
|
-
- target: simpler
|
|
168
|
-
name: tests-still-pass
|
|
169
|
-
mode: objective
|
|
170
|
-
statement: The suite exits clean.
|
|
171
|
-
detector:
|
|
172
|
-
type: script
|
|
173
|
-
command: ./scripts/check-tests.sh
|
|
174
|
-
expect_exit: 0
|
|
175
|
-
blocking: true
|
|
176
|
-
|
|
177
|
-
success:
|
|
178
|
-
- target: overall
|
|
179
|
-
name: all-blocking-pass
|
|
180
|
-
mode: percentage
|
|
181
|
-
statement: Every blocking validation passes.
|
|
182
|
-
threshold: 1.0
|
|
183
|
-
|
|
184
|
-
stop_gates:
|
|
185
|
-
max_iterations: 8
|
|
186
|
-
max_revisions_per_node: 3
|
|
187
|
-
max_cost_usd: 5.0
|
|
188
|
-
no_progress_iterations: 3
|
|
189
|
-
|
|
190
|
-
graph:
|
|
191
|
-
nodes:
|
|
192
|
-
- id: refactor
|
|
193
|
-
role: builder
|
|
194
|
-
instruction: Simplify one function. State any assumption you had to make.
|
|
195
|
-
goals: [simpler]
|
|
196
|
-
isolated: true # its own git worktree
|
|
197
|
-
- id: review
|
|
198
|
-
role: judge
|
|
199
|
-
instruction: Check the diff against the brief. Pass or fail per check, with evidence.
|
|
200
|
-
depends_on: [refactor]
|
|
201
|
-
goals: [simpler]
|
|
202
|
-
tier: strong
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Detectors are `file_exists`, `regex`, `script`, and composites. Only a detector
|
|
206
|
-
can satisfy a goal — a model's opinion of its own work never does.
|
|
207
|
-
|
|
208
|
-
## While it runs
|
|
209
|
-
|
|
210
|
-
| Question | Command |
|
|
211
|
-
|---|---|
|
|
212
|
-
| What does the gate say? | `loopsmith status <config> <run-id>` |
|
|
213
|
-
| What happened? | `loopsmith ledger <config> <run-id>` |
|
|
214
|
-
| Why did it stop? | the last line of `logs/<run-id>.log` |
|
|
215
|
-
| What does it want changed about itself? | `loopsmith proposals <config> <run-id>` |
|
|
216
|
-
| Which providers can it reach? | `loopsmith providers <config>` |
|
|
217
|
-
| Will this machine get in the way? | `loopsmith doctor <config>` |
|
|
218
|
-
|
|
219
|
-
**The loop never edits its own config.** Changes to goals, validations, success
|
|
220
|
-
criteria, and sub-agent adoption are written as *proposals* for a human to apply.
|
|
221
|
-
|
|
222
|
-
## Providers and BYOK
|
|
223
|
-
|
|
224
|
-
Every provider is a command template, which is what makes bring-your-own-key
|
|
225
|
-
free: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint driven by
|
|
226
|
-
`curl`, an MCP server over stdio — all of them are "a program you run with a
|
|
227
|
-
prompt". Adding one is a config edit, never a rebuild.
|
|
228
|
-
|
|
229
|
-
`requires_env` names variables that must **exist**. loopsmith never reads their
|
|
230
|
-
values, so a key cannot reach a prompt, a log, or the ledger.
|
|
231
|
-
|
|
232
|
-
> ⚠ Never paste an API key into a chat window, a config file, or an issue. If one
|
|
233
|
-
> ends up somewhere it should not be, rotate it — deleting the message is not
|
|
234
|
-
> enough.
|
|
235
|
-
|
|
236
|
-
## How this distribution installs the binary
|
|
237
|
-
|
|
238
|
-
The binary is fetched **on first run**, not during `pip install`, and cached under
|
|
239
|
-
`~/.loopsmith/bin/<version>/` (override with `LOOPSMITH_HOME`).
|
|
240
|
-
|
|
241
|
-
That is deliberate. A wheel that downloads at install time breaks in every
|
|
242
|
-
environment that installs without a network and runs with one — CI images, Docker
|
|
243
|
-
build stages, locked-down build hosts — and the failure surfaces as an install
|
|
244
|
-
error for a package the user has not tried to use yet.
|
|
245
|
-
|
|
246
|
-
Every download is **verified against the release's published `SHA256SUMS` before it
|
|
247
|
-
is executed**. Fetching a binary and running it unverified is a supply-chain hole
|
|
248
|
-
with a progress bar.
|
|
249
|
-
|
|
250
|
-
Prebuilt for:
|
|
251
|
-
|
|
252
|
-
| Platform | Target |
|
|
253
|
-
|---|---|
|
|
254
|
-
| Linux x86_64 (glibc) | `x86_64-unknown-linux-gnu` |
|
|
255
|
-
| Linux x86_64 (musl, auto-detected) | `x86_64-unknown-linux-musl` |
|
|
256
|
-
| Linux arm64 | `aarch64-unknown-linux-gnu` |
|
|
257
|
-
| macOS Intel | `x86_64-apple-darwin` |
|
|
258
|
-
| macOS Apple silicon | `aarch64-apple-darwin` |
|
|
259
|
-
| Windows x86_64 | `x86_64-pc-windows-msvc` |
|
|
260
|
-
|
|
261
|
-
Anywhere else, build from source — it is the same program:
|
|
262
|
-
|
|
263
|
-
```bash
|
|
264
|
-
cargo install loopsmith
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## The distribution name
|
|
268
|
-
|
|
269
|
-
`loopsmith` on PyPI was already registered by an unrelated project, so this
|
|
270
|
-
distribution is `loopsmith-cli`. The installed command is `loopsmith` either way.
|
|
271
|
-
Elsewhere: [`loopsmith`](https://crates.io/crates/loopsmith) on crates.io,
|
|
272
|
-
[`@bitphill/loopsmith`](https://www.npmjs.com/package/@bitphill/loopsmith) on npm,
|
|
273
|
-
and the `bitphill/loopsmith` Homebrew tap.
|
|
274
|
-
|
|
275
|
-
## Documentation
|
|
276
|
-
|
|
277
|
-
- [Full README](https://github.com/bitphill/loopsmith#readme)
|
|
278
|
-
- [Section-by-section config reference](https://github.com/bitphill/loopsmith/blob/main/HOW-TO-USE.md)
|
|
279
|
-
- [Architecture and the reasoning behind it](https://github.com/bitphill/loopsmith/blob/main/README-DETAIL.md)
|
|
280
|
-
- [Thirteen worked examples](https://github.com/bitphill/loopsmith/tree/main/config/examples)
|
|
281
|
-
- [Changelog](https://github.com/bitphill/loopsmith/blob/main/CHANGELOG.md)
|
|
282
|
-
|
|
283
|
-
MIT licensed. © bitphill
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|