tag-agent 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tag_agent-0.1.0/LICENSE +21 -0
- tag_agent-0.1.0/MANIFEST.in +9 -0
- tag_agent-0.1.0/PKG-INFO +229 -0
- tag_agent-0.1.0/README.md +199 -0
- tag_agent-0.1.0/TODO.md +48 -0
- tag_agent-0.1.0/pyproject.toml +62 -0
- tag_agent-0.1.0/setup.cfg +4 -0
- tag_agent-0.1.0/src/tag/__init__.py +5 -0
- tag_agent-0.1.0/src/tag/__main__.py +7 -0
- tag_agent-0.1.0/src/tag/assets/skins/tag-control.yaml +61 -0
- tag_agent-0.1.0/src/tag/cli.py +7 -0
- tag_agent-0.1.0/src/tag/config/benchmark-suite.yaml +14 -0
- tag_agent-0.1.0/src/tag/config/default.yaml +135 -0
- tag_agent-0.1.0/src/tag/controller.py +2366 -0
- tag_agent-0.1.0/src/tag/docs/gap-analysis.md +247 -0
- tag_agent-0.1.0/src/tag/docs/hermes-capability-audit.md +162 -0
- tag_agent-0.1.0/src/tag/patches/hermes-ui.patch +245 -0
- tag_agent-0.1.0/src/tag/vendor/hermes-agent-upstream.tar.gz +0 -0
- tag_agent-0.1.0/src/tag_agent.egg-info/PKG-INFO +229 -0
- tag_agent-0.1.0/src/tag_agent.egg-info/SOURCES.txt +23 -0
- tag_agent-0.1.0/src/tag_agent.egg-info/dependency_links.txt +1 -0
- tag_agent-0.1.0/src/tag_agent.egg-info/entry_points.txt +2 -0
- tag_agent-0.1.0/src/tag_agent.egg-info/requires.txt +6 -0
- tag_agent-0.1.0/src/tag_agent.egg-info/top_level.txt +1 -0
- tag_agent-0.1.0/tests/test_controller.py +658 -0
tag_agent-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TAG
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include TODO.md
|
|
4
|
+
include pyproject.toml
|
|
5
|
+
recursive-include src/tag/assets *.yaml
|
|
6
|
+
recursive-include src/tag/config *.yaml
|
|
7
|
+
recursive-include src/tag/docs *.md
|
|
8
|
+
recursive-include src/tag/patches *.patch
|
|
9
|
+
recursive-include src/tag/vendor *.tar.gz
|
tag_agent-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tag-agent
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: TAG: a Hermes-based orchestration layer with patched TUI, profile routing, and OpenRouter/Codex workflows.
|
|
5
|
+
Author: TAG
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/sanskarpan/tag-agent
|
|
8
|
+
Project-URL: Repository, https://github.com/sanskarpan/tag-agent.git
|
|
9
|
+
Project-URL: Issues, https://github.com/sanskarpan/tag-agent/issues
|
|
10
|
+
Keywords: agents,cli,codex,hermes,openrouter,orchestration,tui
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development
|
|
20
|
+
Classifier: Topic :: Terminals
|
|
21
|
+
Requires-Python: <3.14,>=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: PyYAML>=6.0
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build>=1.2.2; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
28
|
+
Requires-Dist: twine>=6.1.0; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
# TAG
|
|
32
|
+
|
|
33
|
+
TAG is a standalone orchestration layer on top of Hermes. It packages the work
|
|
34
|
+
done in this workspace into one installable CLI with:
|
|
35
|
+
|
|
36
|
+
- a bundled Hermes source snapshot for first-run provisioning
|
|
37
|
+
- managed Hermes bootstrap
|
|
38
|
+
- shipped Hermes TUI patching
|
|
39
|
+
- a custom `tag-control` skin
|
|
40
|
+
- profile-based master/worker orchestration
|
|
41
|
+
- OpenRouter worker routing
|
|
42
|
+
- Codex import and runtime support
|
|
43
|
+
- direct execution, Kanban execution, and benchmark history
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pip install tag-agent
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
This installs the `tag` command.
|
|
52
|
+
|
|
53
|
+
For npm:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install -g tag-agent
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
For pnpm:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pnpm add -g tag-agent
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The npm package installs a thin Node launcher for `tag`. On first run it
|
|
66
|
+
creates an isolated Python runtime under `~/.tag/npm-runtime/<version>`,
|
|
67
|
+
installs the bundled TAG Python package there, and then executes the same TAG
|
|
68
|
+
CLI. That means the npm path still requires Python `>=3.11` and `<3.14` on
|
|
69
|
+
`PATH`. The launcher will probe `python3.13`, `python3.12`, `python3.11`,
|
|
70
|
+
`python3`, and `python` in that order on Unix-like systems.
|
|
71
|
+
|
|
72
|
+
For a build artifact install:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
python -m build
|
|
76
|
+
pip install dist/tag_agent-0.1.0-py3-none-any.whl
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
For an npm artifact check:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm pack
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## First run
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
tag
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Default behavior:
|
|
92
|
+
|
|
93
|
+
1. create `~/.tag/config/tag.yaml` and the benchmark suite if missing
|
|
94
|
+
2. extract the bundled Hermes snapshot into `~/.tag/managed/hermes-agent-upstream` if needed
|
|
95
|
+
3. create a virtualenv for Hermes
|
|
96
|
+
4. install Hermes with the required extras
|
|
97
|
+
5. apply the TAG TUI patch
|
|
98
|
+
6. install/build the Hermes TUI workspace
|
|
99
|
+
7. bootstrap the default TAG profiles
|
|
100
|
+
8. launch the orchestrator TUI
|
|
101
|
+
|
|
102
|
+
The same managed bootstrap now happens automatically for non-TUI commands that
|
|
103
|
+
need Hermes, for example:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
tag submit --task-type mixed --execution direct --prompt "Reply with exactly: smoke-ok"
|
|
107
|
+
tag benchmark --profile researcher --model-ref openrouter/deepseek/deepseek-v4-flash
|
|
108
|
+
tag model --profile orchestrator -- list
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
For those commands, TAG provisions Hermes on demand and skips the TUI build if
|
|
112
|
+
it is not needed, so `npm` is not required just to use submit/benchmark/model
|
|
113
|
+
flows.
|
|
114
|
+
|
|
115
|
+
If `tag` is started from a non-interactive context, it does not try to open the
|
|
116
|
+
TUI blindly. It exits with a clear message and tells you to use `tag doctor`,
|
|
117
|
+
`tag setup`, or `tag tui` from a real terminal.
|
|
118
|
+
|
|
119
|
+
If you want the setup step explicitly:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
tag setup
|
|
123
|
+
tag tui
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Main commands
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
tag
|
|
130
|
+
tag setup
|
|
131
|
+
tag doctor
|
|
132
|
+
tag bootstrap
|
|
133
|
+
tag status
|
|
134
|
+
tag assignments
|
|
135
|
+
tag models --profile researcher
|
|
136
|
+
tag openrouter-models --profile researcher --search gemini
|
|
137
|
+
tag set-model --profile reviewer --ref openrouter/deepseek/deepseek-v4-pro
|
|
138
|
+
tag submit --task-type mixed --execution direct --prompt "Reply with exactly: smoke-ok"
|
|
139
|
+
tag benchmark --profile researcher --model-ref openrouter/deepseek/deepseek-v4-flash
|
|
140
|
+
tag runs
|
|
141
|
+
tag import-codex --profile orchestrator --codex-home ~/.codex
|
|
142
|
+
tag chat --profile orchestrator -- --help
|
|
143
|
+
tag config --profile orchestrator -- edit
|
|
144
|
+
tag gateway --profile orchestrator -- start
|
|
145
|
+
tag kanban --profile orchestrator -- list
|
|
146
|
+
tag sessions --profile orchestrator -- list
|
|
147
|
+
tag skills --profile orchestrator -- list
|
|
148
|
+
tag plugins --profile orchestrator -- list
|
|
149
|
+
tag tools --profile orchestrator -- list
|
|
150
|
+
tag mcp --profile orchestrator -- list
|
|
151
|
+
tag logs --profile orchestrator -- --since 1h
|
|
152
|
+
tag dashboard --profile orchestrator -- --status
|
|
153
|
+
tag memory --profile orchestrator -- status
|
|
154
|
+
tag model --profile orchestrator -- list
|
|
155
|
+
tag profile -- list
|
|
156
|
+
tag completion --profile orchestrator -- zsh
|
|
157
|
+
tag prompt-size --profile orchestrator
|
|
158
|
+
tag update
|
|
159
|
+
tag hermes --profile orchestrator -- gateway start
|
|
160
|
+
tag tui --profile orchestrator
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Persistence
|
|
164
|
+
|
|
165
|
+
TAG stores its managed state under `~/.tag` by default:
|
|
166
|
+
|
|
167
|
+
- `config/tag.yaml`
|
|
168
|
+
- `config/benchmark-suite.yaml`
|
|
169
|
+
- `managed/hermes-agent-upstream`
|
|
170
|
+
- `runtime/home`
|
|
171
|
+
- `runtime/tag.sqlite3`
|
|
172
|
+
|
|
173
|
+
Override the root with:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
export TAG_HOME=/some/other/location
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Notes
|
|
180
|
+
|
|
181
|
+
- The managed Hermes checkout remains Hermes internally; TAG is the packaged
|
|
182
|
+
experience and command surface around it.
|
|
183
|
+
- TAG does not require a preinstalled Hermes checkout. By default it provisions
|
|
184
|
+
Hermes from a bundled source snapshot and only falls back to `git clone` if
|
|
185
|
+
that snapshot is unavailable.
|
|
186
|
+
- If TAG can already discover a valid local Hermes source checkout, it will
|
|
187
|
+
reuse it automatically instead of forcing a second separate install.
|
|
188
|
+
- If a real Codex CLI home already exists with `auth.json`, TAG imports that
|
|
189
|
+
into the managed orchestrator profiles automatically during setup.
|
|
190
|
+
- The shipped patch only touches Hermes TUI skin handling and profile-aware
|
|
191
|
+
chrome.
|
|
192
|
+
- OpenRouter keys and Codex auth remain per-profile concerns.
|
|
193
|
+
- TAG currently targets Python `>=3.11` and `<3.14` and expects `npm` for full first-run
|
|
194
|
+
bootstrap because Hermes' TUI workspace is built locally. `git` is still
|
|
195
|
+
recommended for Hermes features like worktrees and for refresh/update flows,
|
|
196
|
+
but it is no longer required for the default bundled install path.
|
|
197
|
+
- `tag update` is lifecycle-aware:
|
|
198
|
+
- on a bundled Hermes checkout, it refreshes the managed runtime from the
|
|
199
|
+
packaged snapshot and rebuilds it
|
|
200
|
+
- on a git-backed checkout, it delegates to Hermes' own update flow
|
|
201
|
+
- The npm distribution is a launcher wrapper around the Python package, not a
|
|
202
|
+
separate Node reimplementation.
|
|
203
|
+
|
|
204
|
+
## Command strategy
|
|
205
|
+
|
|
206
|
+
TAG currently has three layers of command surface:
|
|
207
|
+
|
|
208
|
+
1. Native TAG orchestration commands
|
|
209
|
+
- `setup`, `doctor`, `bootstrap`, `route`, `submit`, `benchmark`, `runs`
|
|
210
|
+
2. High-value managed Hermes wrappers
|
|
211
|
+
- `chat`, `gateway`, `kanban`, `model`, `profile`, `status`, `config`, `sessions`, `skills`, `plugins`, `tools`, `mcp`, `logs`, `dashboard`, `memory`, `completion`, `prompt-size`, `update`, `tui`
|
|
212
|
+
3. Full escape hatch
|
|
213
|
+
- `tag hermes -- ...`
|
|
214
|
+
|
|
215
|
+
This means TAG does not reimplement all of Hermes. Instead, it owns the
|
|
216
|
+
installation, profile layout, patching, orchestration, and default UX, while
|
|
217
|
+
still letting you reach the underlying Hermes runtime when needed.
|
|
218
|
+
|
|
219
|
+
## Release Checks
|
|
220
|
+
|
|
221
|
+
Before publishing, run:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
pytest -q tests/test_controller.py
|
|
225
|
+
python -m build
|
|
226
|
+
npm pack
|
|
227
|
+
tag doctor
|
|
228
|
+
tag setup --json
|
|
229
|
+
```
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# TAG
|
|
2
|
+
|
|
3
|
+
TAG is a standalone orchestration layer on top of Hermes. It packages the work
|
|
4
|
+
done in this workspace into one installable CLI with:
|
|
5
|
+
|
|
6
|
+
- a bundled Hermes source snapshot for first-run provisioning
|
|
7
|
+
- managed Hermes bootstrap
|
|
8
|
+
- shipped Hermes TUI patching
|
|
9
|
+
- a custom `tag-control` skin
|
|
10
|
+
- profile-based master/worker orchestration
|
|
11
|
+
- OpenRouter worker routing
|
|
12
|
+
- Codex import and runtime support
|
|
13
|
+
- direct execution, Kanban execution, and benchmark history
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install tag-agent
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This installs the `tag` command.
|
|
22
|
+
|
|
23
|
+
For npm:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g tag-agent
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
For pnpm:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pnpm add -g tag-agent
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The npm package installs a thin Node launcher for `tag`. On first run it
|
|
36
|
+
creates an isolated Python runtime under `~/.tag/npm-runtime/<version>`,
|
|
37
|
+
installs the bundled TAG Python package there, and then executes the same TAG
|
|
38
|
+
CLI. That means the npm path still requires Python `>=3.11` and `<3.14` on
|
|
39
|
+
`PATH`. The launcher will probe `python3.13`, `python3.12`, `python3.11`,
|
|
40
|
+
`python3`, and `python` in that order on Unix-like systems.
|
|
41
|
+
|
|
42
|
+
For a build artifact install:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
python -m build
|
|
46
|
+
pip install dist/tag_agent-0.1.0-py3-none-any.whl
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
For an npm artifact check:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm pack
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## First run
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
tag
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Default behavior:
|
|
62
|
+
|
|
63
|
+
1. create `~/.tag/config/tag.yaml` and the benchmark suite if missing
|
|
64
|
+
2. extract the bundled Hermes snapshot into `~/.tag/managed/hermes-agent-upstream` if needed
|
|
65
|
+
3. create a virtualenv for Hermes
|
|
66
|
+
4. install Hermes with the required extras
|
|
67
|
+
5. apply the TAG TUI patch
|
|
68
|
+
6. install/build the Hermes TUI workspace
|
|
69
|
+
7. bootstrap the default TAG profiles
|
|
70
|
+
8. launch the orchestrator TUI
|
|
71
|
+
|
|
72
|
+
The same managed bootstrap now happens automatically for non-TUI commands that
|
|
73
|
+
need Hermes, for example:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
tag submit --task-type mixed --execution direct --prompt "Reply with exactly: smoke-ok"
|
|
77
|
+
tag benchmark --profile researcher --model-ref openrouter/deepseek/deepseek-v4-flash
|
|
78
|
+
tag model --profile orchestrator -- list
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For those commands, TAG provisions Hermes on demand and skips the TUI build if
|
|
82
|
+
it is not needed, so `npm` is not required just to use submit/benchmark/model
|
|
83
|
+
flows.
|
|
84
|
+
|
|
85
|
+
If `tag` is started from a non-interactive context, it does not try to open the
|
|
86
|
+
TUI blindly. It exits with a clear message and tells you to use `tag doctor`,
|
|
87
|
+
`tag setup`, or `tag tui` from a real terminal.
|
|
88
|
+
|
|
89
|
+
If you want the setup step explicitly:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
tag setup
|
|
93
|
+
tag tui
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Main commands
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
tag
|
|
100
|
+
tag setup
|
|
101
|
+
tag doctor
|
|
102
|
+
tag bootstrap
|
|
103
|
+
tag status
|
|
104
|
+
tag assignments
|
|
105
|
+
tag models --profile researcher
|
|
106
|
+
tag openrouter-models --profile researcher --search gemini
|
|
107
|
+
tag set-model --profile reviewer --ref openrouter/deepseek/deepseek-v4-pro
|
|
108
|
+
tag submit --task-type mixed --execution direct --prompt "Reply with exactly: smoke-ok"
|
|
109
|
+
tag benchmark --profile researcher --model-ref openrouter/deepseek/deepseek-v4-flash
|
|
110
|
+
tag runs
|
|
111
|
+
tag import-codex --profile orchestrator --codex-home ~/.codex
|
|
112
|
+
tag chat --profile orchestrator -- --help
|
|
113
|
+
tag config --profile orchestrator -- edit
|
|
114
|
+
tag gateway --profile orchestrator -- start
|
|
115
|
+
tag kanban --profile orchestrator -- list
|
|
116
|
+
tag sessions --profile orchestrator -- list
|
|
117
|
+
tag skills --profile orchestrator -- list
|
|
118
|
+
tag plugins --profile orchestrator -- list
|
|
119
|
+
tag tools --profile orchestrator -- list
|
|
120
|
+
tag mcp --profile orchestrator -- list
|
|
121
|
+
tag logs --profile orchestrator -- --since 1h
|
|
122
|
+
tag dashboard --profile orchestrator -- --status
|
|
123
|
+
tag memory --profile orchestrator -- status
|
|
124
|
+
tag model --profile orchestrator -- list
|
|
125
|
+
tag profile -- list
|
|
126
|
+
tag completion --profile orchestrator -- zsh
|
|
127
|
+
tag prompt-size --profile orchestrator
|
|
128
|
+
tag update
|
|
129
|
+
tag hermes --profile orchestrator -- gateway start
|
|
130
|
+
tag tui --profile orchestrator
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Persistence
|
|
134
|
+
|
|
135
|
+
TAG stores its managed state under `~/.tag` by default:
|
|
136
|
+
|
|
137
|
+
- `config/tag.yaml`
|
|
138
|
+
- `config/benchmark-suite.yaml`
|
|
139
|
+
- `managed/hermes-agent-upstream`
|
|
140
|
+
- `runtime/home`
|
|
141
|
+
- `runtime/tag.sqlite3`
|
|
142
|
+
|
|
143
|
+
Override the root with:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
export TAG_HOME=/some/other/location
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Notes
|
|
150
|
+
|
|
151
|
+
- The managed Hermes checkout remains Hermes internally; TAG is the packaged
|
|
152
|
+
experience and command surface around it.
|
|
153
|
+
- TAG does not require a preinstalled Hermes checkout. By default it provisions
|
|
154
|
+
Hermes from a bundled source snapshot and only falls back to `git clone` if
|
|
155
|
+
that snapshot is unavailable.
|
|
156
|
+
- If TAG can already discover a valid local Hermes source checkout, it will
|
|
157
|
+
reuse it automatically instead of forcing a second separate install.
|
|
158
|
+
- If a real Codex CLI home already exists with `auth.json`, TAG imports that
|
|
159
|
+
into the managed orchestrator profiles automatically during setup.
|
|
160
|
+
- The shipped patch only touches Hermes TUI skin handling and profile-aware
|
|
161
|
+
chrome.
|
|
162
|
+
- OpenRouter keys and Codex auth remain per-profile concerns.
|
|
163
|
+
- TAG currently targets Python `>=3.11` and `<3.14` and expects `npm` for full first-run
|
|
164
|
+
bootstrap because Hermes' TUI workspace is built locally. `git` is still
|
|
165
|
+
recommended for Hermes features like worktrees and for refresh/update flows,
|
|
166
|
+
but it is no longer required for the default bundled install path.
|
|
167
|
+
- `tag update` is lifecycle-aware:
|
|
168
|
+
- on a bundled Hermes checkout, it refreshes the managed runtime from the
|
|
169
|
+
packaged snapshot and rebuilds it
|
|
170
|
+
- on a git-backed checkout, it delegates to Hermes' own update flow
|
|
171
|
+
- The npm distribution is a launcher wrapper around the Python package, not a
|
|
172
|
+
separate Node reimplementation.
|
|
173
|
+
|
|
174
|
+
## Command strategy
|
|
175
|
+
|
|
176
|
+
TAG currently has three layers of command surface:
|
|
177
|
+
|
|
178
|
+
1. Native TAG orchestration commands
|
|
179
|
+
- `setup`, `doctor`, `bootstrap`, `route`, `submit`, `benchmark`, `runs`
|
|
180
|
+
2. High-value managed Hermes wrappers
|
|
181
|
+
- `chat`, `gateway`, `kanban`, `model`, `profile`, `status`, `config`, `sessions`, `skills`, `plugins`, `tools`, `mcp`, `logs`, `dashboard`, `memory`, `completion`, `prompt-size`, `update`, `tui`
|
|
182
|
+
3. Full escape hatch
|
|
183
|
+
- `tag hermes -- ...`
|
|
184
|
+
|
|
185
|
+
This means TAG does not reimplement all of Hermes. Instead, it owns the
|
|
186
|
+
installation, profile layout, patching, orchestration, and default UX, while
|
|
187
|
+
still letting you reach the underlying Hermes runtime when needed.
|
|
188
|
+
|
|
189
|
+
## Release Checks
|
|
190
|
+
|
|
191
|
+
Before publishing, run:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
pytest -q tests/test_controller.py
|
|
195
|
+
python -m build
|
|
196
|
+
npm pack
|
|
197
|
+
tag doctor
|
|
198
|
+
tag setup --json
|
|
199
|
+
```
|
tag_agent-0.1.0/TODO.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# TAG Todo
|
|
2
|
+
|
|
3
|
+
This file tracks the remaining work needed before TAG can reasonably be
|
|
4
|
+
described as a polished standalone product instead of a strong prototype.
|
|
5
|
+
|
|
6
|
+
## In Progress
|
|
7
|
+
|
|
8
|
+
- [ ] None
|
|
9
|
+
|
|
10
|
+
## Pending
|
|
11
|
+
|
|
12
|
+
- [ ] None
|
|
13
|
+
|
|
14
|
+
## Completed
|
|
15
|
+
|
|
16
|
+
- [x] Harden packaging and distribution
|
|
17
|
+
- add package metadata suitable for publication
|
|
18
|
+
- include shipped resources and license in sdist/wheel builds
|
|
19
|
+
- verify non-editable wheel install behavior
|
|
20
|
+
- clean generated artifacts from the source tree
|
|
21
|
+
|
|
22
|
+
- [x] Re-run regression testing across all maintained surfaces
|
|
23
|
+
- TAG unit tests
|
|
24
|
+
- hermes-lab unit tests
|
|
25
|
+
- Hermes patched TUI tests/build
|
|
26
|
+
- installed `tag` smoke tests
|
|
27
|
+
|
|
28
|
+
- [x] Harden bare `tag` startup behavior
|
|
29
|
+
- add TTY detection
|
|
30
|
+
- add a non-interactive fallback mode
|
|
31
|
+
- avoid hanging when launched from non-interactive contexts
|
|
32
|
+
|
|
33
|
+
- [x] Improve `doctor` and `setup` prerequisite validation
|
|
34
|
+
- verify `git`, `npm`, and usable Python tooling up front
|
|
35
|
+
- surface missing dependencies before setup begins
|
|
36
|
+
- report whether Hermes checkout, patch state, and TUI build state are healthy
|
|
37
|
+
|
|
38
|
+
- [x] Clarify and strengthen TAG command-surface coverage
|
|
39
|
+
- decide which Hermes capabilities should remain passthrough-only
|
|
40
|
+
- document the intended contract of `tag hermes`
|
|
41
|
+
- add any missing high-value first-class TAG commands
|
|
42
|
+
|
|
43
|
+
- [x] Standalone `tag` Python package skeleton
|
|
44
|
+
- [x] Managed Hermes bootstrap flow
|
|
45
|
+
- [x] TAG config and benchmark suite persistence
|
|
46
|
+
- [x] Shipped `tag-control` skin
|
|
47
|
+
- [x] Hermes TUI patch integration
|
|
48
|
+
- [x] Profile bootstrap and rendered config installation
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "tag-agent"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "TAG: a Hermes-based orchestration layer with patched TUI, profile routing, and OpenRouter/Codex workflows."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11,<3.14"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [
|
|
14
|
+
{ name = "TAG" }
|
|
15
|
+
]
|
|
16
|
+
keywords = ["agents", "cli", "codex", "hermes", "openrouter", "orchestration", "tui"]
|
|
17
|
+
classifiers = [
|
|
18
|
+
"Development Status :: 3 - Alpha",
|
|
19
|
+
"Environment :: Console",
|
|
20
|
+
"Intended Audience :: Developers",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Topic :: Software Development",
|
|
27
|
+
"Topic :: Terminals",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"PyYAML>=6.0"
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.optional-dependencies]
|
|
34
|
+
dev = [
|
|
35
|
+
"build>=1.2.2",
|
|
36
|
+
"pytest>=8.0",
|
|
37
|
+
"twine>=6.1.0",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[project.urls]
|
|
41
|
+
Homepage = "https://github.com/sanskarpan/tag-agent"
|
|
42
|
+
Repository = "https://github.com/sanskarpan/tag-agent.git"
|
|
43
|
+
Issues = "https://github.com/sanskarpan/tag-agent/issues"
|
|
44
|
+
|
|
45
|
+
[project.scripts]
|
|
46
|
+
tag = "tag.controller:main"
|
|
47
|
+
|
|
48
|
+
[tool.setuptools]
|
|
49
|
+
package-dir = {"" = "src"}
|
|
50
|
+
include-package-data = true
|
|
51
|
+
|
|
52
|
+
[tool.setuptools.packages.find]
|
|
53
|
+
where = ["src"]
|
|
54
|
+
|
|
55
|
+
[tool.setuptools.package-data]
|
|
56
|
+
tag = [
|
|
57
|
+
"assets/skins/*.yaml",
|
|
58
|
+
"config/*.yaml",
|
|
59
|
+
"docs/*.md",
|
|
60
|
+
"patches/*.patch",
|
|
61
|
+
"vendor/*.tar.gz",
|
|
62
|
+
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: tag-control
|
|
2
|
+
description: TAG control-room skin with indigo panels, cobalt prompts, and electric-blue accents.
|
|
3
|
+
colors:
|
|
4
|
+
banner_border: "#44517A"
|
|
5
|
+
banner_title: "#8FA8FF"
|
|
6
|
+
banner_accent: "#52B6FF"
|
|
7
|
+
banner_dim: "#7587B3"
|
|
8
|
+
banner_text: "#E6EEFF"
|
|
9
|
+
ui_primary: "#8FA8FF"
|
|
10
|
+
ui_accent: "#52B6FF"
|
|
11
|
+
ui_border: "#44517A"
|
|
12
|
+
ui_text: "#E6EEFF"
|
|
13
|
+
ui_muted: "#7587B3"
|
|
14
|
+
ui_label: "#B7C7FF"
|
|
15
|
+
ui_ok: "#66D7A1"
|
|
16
|
+
ui_error: "#FF7D97"
|
|
17
|
+
ui_warn: "#7FD7FF"
|
|
18
|
+
prompt: "#8FA8FF"
|
|
19
|
+
input_rule: "#44517A"
|
|
20
|
+
response_border: "#52B6FF"
|
|
21
|
+
status_bar_bg: "#0D1324"
|
|
22
|
+
status_bar_text: "#DCE6FF"
|
|
23
|
+
status_bar_strong: "#52B6FF"
|
|
24
|
+
status_bar_dim: "#7587B3"
|
|
25
|
+
status_bar_good: "#66D7A1"
|
|
26
|
+
status_bar_warn: "#7FD7FF"
|
|
27
|
+
status_bar_bad: "#A88BFF"
|
|
28
|
+
status_bar_critical: "#FF7D97"
|
|
29
|
+
session_label: "#B7C7FF"
|
|
30
|
+
session_border: "#7587B3"
|
|
31
|
+
selection_bg: "#1D294A"
|
|
32
|
+
completion_menu_bg: "#0D1324"
|
|
33
|
+
completion_menu_current_bg: "#1D294A"
|
|
34
|
+
completion_menu_meta_bg: "#0A1020"
|
|
35
|
+
completion_menu_meta_current_bg: "#16254A"
|
|
36
|
+
shell_dollar: "#52B6FF"
|
|
37
|
+
branding:
|
|
38
|
+
agent_name: "TAG Control"
|
|
39
|
+
agent_icon: "◈"
|
|
40
|
+
welcome: "TAG control plane online. Type your message or /help."
|
|
41
|
+
goodbye: "TAG control plane offline."
|
|
42
|
+
response_label: " ◈ TAG "
|
|
43
|
+
prompt_symbol: "›"
|
|
44
|
+
help_header: "[tag] Commands"
|
|
45
|
+
tool_prefix: "│"
|
|
46
|
+
banner_logo: |
|
|
47
|
+
[bold #52B6FF]████████╗ █████╗ ██████╗[/]
|
|
48
|
+
[bold #8FA8FF]╚══██╔══╝██╔══██╗██╔════╝[/]
|
|
49
|
+
[bold #B7C7FF] ██║ ███████║██║ ███╗[/]
|
|
50
|
+
[bold #A88BFF] ██║ ██╔══██║██║ ██║[/]
|
|
51
|
+
[bold #7FD7FF] ██║ ██║ ██║╚██████╔╝[/]
|
|
52
|
+
banner_hero: |
|
|
53
|
+
[#52B6FF] ╭────────────╮[/]
|
|
54
|
+
[#8FA8FF] ╭───┤ TAG ├───╮[/]
|
|
55
|
+
[#7587B3] │ ╰────┬───────╯ │[/]
|
|
56
|
+
[#B7C7FF] │ ╭────┴────╮ │[/]
|
|
57
|
+
[#52B6FF] ├───┤ CONTROL ├───┬──┤[/]
|
|
58
|
+
[#7587B3] │ ╰────┬────╯ │ │[/]
|
|
59
|
+
[#A88BFF] │ ╭────┴────╮ │ │[/]
|
|
60
|
+
[#66D7A1] ╰───┤ AGENTS ├───╯ │[/]
|
|
61
|
+
[#7587B3] ╰─────────╯ │[/]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
cases:
|
|
2
|
+
- id: exact-echo
|
|
3
|
+
prompt: "Reply with exactly: bench-ok"
|
|
4
|
+
expected_exact: bench-ok
|
|
5
|
+
|
|
6
|
+
- id: math-json
|
|
7
|
+
prompt: 'Return only compact JSON {"status":"ok","sum":42}'
|
|
8
|
+
expected_json:
|
|
9
|
+
status: ok
|
|
10
|
+
sum: 42
|
|
11
|
+
|
|
12
|
+
- id: bullet-format
|
|
13
|
+
prompt: "Reply with exactly these two lines and nothing else: - alpha\n- beta"
|
|
14
|
+
expected_regex: '(^|\n)- alpha\n- beta\s*$'
|