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.
@@ -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
+ [![PyPI](https://img.shields.io/pypi/v/loopsmith-cli?logo=pypi&logoColor=white&label=PyPI&color=3775A9)](https://pypi.org/project/loopsmith-cli/)
30
+ [![license](https://img.shields.io/badge/license-MIT-C8CAD1?labelColor=222)](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
31
+ ![platforms](https://img.shields.io/badge/os-linux%20%7C%20macos%20%7C%20windows-2A5A8A)
32
+ ![python](https://img.shields.io/badge/python-%E2%89%A53.8-3776AB?logo=python&logoColor=white)
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
+ [![PyPI](https://img.shields.io/pypi/v/loopsmith-cli?logo=pypi&logoColor=white&label=PyPI&color=3775A9)](https://pypi.org/project/loopsmith-cli/)
8
+ [![license](https://img.shields.io/badge/license-MIT-C8CAD1?labelColor=222)](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
9
+ ![platforms](https://img.shields.io/badge/os-linux%20%7C%20macos%20%7C%20windows-2A5A8A)
10
+ ![python](https://img.shields.io/badge/python-%E2%89%A53.8-3776AB?logo=python&logoColor=white)
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.3.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.3.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=120) as response: # noqa: S310
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
+ [![PyPI](https://img.shields.io/pypi/v/loopsmith-cli?logo=pypi&logoColor=white&label=PyPI&color=3775A9)](https://pypi.org/project/loopsmith-cli/)
30
+ [![license](https://img.shields.io/badge/license-MIT-C8CAD1?labelColor=222)](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
31
+ ![platforms](https://img.shields.io/badge/os-linux%20%7C%20macos%20%7C%20windows-2A5A8A)
32
+ ![python](https://img.shields.io/badge/python-%E2%89%A53.8-3776AB?logo=python&logoColor=white)
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.
@@ -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
- [![PyPI](https://img.shields.io/pypi/v/loopsmith-cli?logo=python&logoColor=white&label=PyPI&color=3775a9)](https://pypi.org/project/loopsmith-cli/)
30
- [![license](https://img.shields.io/badge/license-MIT-C8CAD1?labelColor=222)](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
31
- ![platforms](https://img.shields.io/badge/os-linux%20%7C%20macos%20%7C%20windows-2A5A8A)
32
- ![python](https://img.shields.io/badge/python-%E2%89%A53.8-3775a9?logo=python&logoColor=white)
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
@@ -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
- [![PyPI](https://img.shields.io/pypi/v/loopsmith-cli?logo=python&logoColor=white&label=PyPI&color=3775a9)](https://pypi.org/project/loopsmith-cli/)
8
- [![license](https://img.shields.io/badge/license-MIT-C8CAD1?labelColor=222)](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
9
- ![platforms](https://img.shields.io/badge/os-linux%20%7C%20macos%20%7C%20windows-2A5A8A)
10
- ![python](https://img.shields.io/badge/python-%E2%89%A53.8-3775a9?logo=python&logoColor=white)
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
- [![PyPI](https://img.shields.io/pypi/v/loopsmith-cli?logo=python&logoColor=white&label=PyPI&color=3775a9)](https://pypi.org/project/loopsmith-cli/)
30
- [![license](https://img.shields.io/badge/license-MIT-C8CAD1?labelColor=222)](https://github.com/bitphill/loopsmith/blob/main/LICENSE)
31
- ![platforms](https://img.shields.io/badge/os-linux%20%7C%20macos%20%7C%20windows-2A5A8A)
32
- ![python](https://img.shields.io/badge/python-%E2%89%A53.8-3775a9?logo=python&logoColor=white)
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