ironsilk 0.9.1__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.
- ironsilk-0.9.1/.gitignore +2 -0
- ironsilk-0.9.1/Makefile +66 -0
- ironsilk-0.9.1/OPERATOR-NOTE.md +184 -0
- ironsilk-0.9.1/PKG-INFO +494 -0
- ironsilk-0.9.1/README.md +465 -0
- ironsilk-0.9.1/RELEASE.md +95 -0
- ironsilk-0.9.1/bump.py +85 -0
- ironsilk-0.9.1/examples/config.yml +29 -0
- ironsilk-0.9.1/examples/demo-miadi-workspace.sh +63 -0
- ironsilk-0.9.1/examples/domains.yml +80 -0
- ironsilk-0.9.1/examples/universes.yml +76 -0
- ironsilk-0.9.1/hermes_navigator/__init__.py +39 -0
- ironsilk-0.9.1/hermes_navigator/approval_queue.py +228 -0
- ironsilk-0.9.1/hermes_navigator/audit.py +190 -0
- ironsilk-0.9.1/hermes_navigator/cli.py +2613 -0
- ironsilk-0.9.1/hermes_navigator/config.py +226 -0
- ironsilk-0.9.1/hermes_navigator/context_engine.py +558 -0
- ironsilk-0.9.1/hermes_navigator/daemon.py +354 -0
- ironsilk-0.9.1/hermes_navigator/desktop_focus.py +73 -0
- ironsilk-0.9.1/hermes_navigator/desktop_observer.py +292 -0
- ironsilk-0.9.1/hermes_navigator/domain_detector.py +405 -0
- ironsilk-0.9.1/hermes_navigator/focus.py +117 -0
- ironsilk-0.9.1/hermes_navigator/models.py +423 -0
- ironsilk-0.9.1/hermes_navigator/operator_report.py +260 -0
- ironsilk-0.9.1/hermes_navigator/paths.py +35 -0
- ironsilk-0.9.1/hermes_navigator/release_gate.py +175 -0
- ironsilk-0.9.1/hermes_navigator/scene.py +584 -0
- ironsilk-0.9.1/hermes_navigator/service.py +111 -0
- ironsilk-0.9.1/hermes_navigator/session_store.py +219 -0
- ironsilk-0.9.1/hermes_navigator/sqlite_async.py +85 -0
- ironsilk-0.9.1/hermes_navigator/telegram_bridge.py +298 -0
- ironsilk-0.9.1/hermes_navigator/terminal_checkpoint.py +426 -0
- ironsilk-0.9.1/hermes_navigator/terminal_inventory.py +255 -0
- ironsilk-0.9.1/hermes_navigator/terminal_registry.py +349 -0
- ironsilk-0.9.1/hermes_navigator/terminal_send.py +245 -0
- ironsilk-0.9.1/hermes_navigator/terminal_steer.py +320 -0
- ironsilk-0.9.1/hermes_navigator/tmux_session.py +185 -0
- ironsilk-0.9.1/hermes_navigator/tui/__init__.py +2 -0
- ironsilk-0.9.1/hermes_navigator/tui/app.py +656 -0
- ironsilk-0.9.1/hermes_navigator/tui/new_project_screen.py +94 -0
- ironsilk-0.9.1/hermes_navigator/tui/project.py +117 -0
- ironsilk-0.9.1/hermes_navigator/universe_detector.py +47 -0
- ironsilk-0.9.1/hermes_navigator/zellij_bridge.py +399 -0
- ironsilk-0.9.1/proposed/2026-05-13-slice7-guarded-send.patch +701 -0
- ironsilk-0.9.1/pyproject.toml +53 -0
- ironsilk-0.9.1/release.sh +62 -0
- ironsilk-0.9.1/scripts/setup-system-deps.sh +36 -0
- ironsilk-0.9.1/skills/navigator.skill.yml +330 -0
- ironsilk-0.9.1/tests/__init__.py +1 -0
- ironsilk-0.9.1/tests/test_approval_queue.py +139 -0
- ironsilk-0.9.1/tests/test_context_engine.py +314 -0
- ironsilk-0.9.1/tests/test_desktop_focus.py +217 -0
- ironsilk-0.9.1/tests/test_desktop_observer.py +288 -0
- ironsilk-0.9.1/tests/test_follow_up.py +617 -0
- ironsilk-0.9.1/tests/test_named_tmux_session.py +176 -0
- ironsilk-0.9.1/tests/test_operator_report.py +130 -0
- ironsilk-0.9.1/tests/test_release_gate.py +116 -0
- ironsilk-0.9.1/tests/test_scene.py +221 -0
- ironsilk-0.9.1/tests/test_scene_profiles.py +71 -0
- ironsilk-0.9.1/tests/test_service.py +76 -0
- ironsilk-0.9.1/tests/test_session_store.py +108 -0
- ironsilk-0.9.1/tests/test_terminal_checkpoint.py +275 -0
- ironsilk-0.9.1/tests/test_terminal_inventory.py +192 -0
- ironsilk-0.9.1/tests/test_terminal_registry.py +164 -0
- ironsilk-0.9.1/tests/test_terminal_send.py +248 -0
- ironsilk-0.9.1/tests/test_terminal_steer.py +257 -0
- ironsilk-0.9.1/tests/test_tui_project.py +57 -0
- ironsilk-0.9.1/tests/test_universe_detector.py +228 -0
ironsilk-0.9.1/Makefile
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
.PHONY: install install-dev test build wheel sdist upload upload-test test-release bump clean prepare-data clean-data
|
|
2
|
+
|
|
3
|
+
PKG_DATA = hermes_navigator/data
|
|
4
|
+
|
|
5
|
+
# ---------------------------------------------------------------------------
|
|
6
|
+
# dev
|
|
7
|
+
# ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
install:
|
|
10
|
+
pip install -e .
|
|
11
|
+
|
|
12
|
+
install-dev:
|
|
13
|
+
pip install -e ".[dev,controller,daemon,telegram]"
|
|
14
|
+
|
|
15
|
+
test:
|
|
16
|
+
pytest -v
|
|
17
|
+
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
# data assembly (temporary staging into package dir before build)
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
prepare-data:
|
|
23
|
+
mkdir -p $(PKG_DATA)
|
|
24
|
+
cp examples/config.yml $(PKG_DATA)/config.yml
|
|
25
|
+
cp examples/domains.yml $(PKG_DATA)/domains.yml
|
|
26
|
+
cp skills/navigator.skill.yml $(PKG_DATA)/skill.yml
|
|
27
|
+
|
|
28
|
+
clean-data:
|
|
29
|
+
rm -rf $(PKG_DATA)
|
|
30
|
+
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
# build
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
build: clean prepare-data
|
|
36
|
+
python -m build
|
|
37
|
+
$(MAKE) clean-data
|
|
38
|
+
|
|
39
|
+
wheel: prepare-data
|
|
40
|
+
python -m build --wheel
|
|
41
|
+
$(MAKE) clean-data
|
|
42
|
+
|
|
43
|
+
sdist: prepare-data
|
|
44
|
+
python -m build --sdist
|
|
45
|
+
$(MAKE) clean-data
|
|
46
|
+
|
|
47
|
+
upload: build
|
|
48
|
+
twine upload dist/*
|
|
49
|
+
|
|
50
|
+
upload-test: build
|
|
51
|
+
twine upload --repository testpypi dist/*
|
|
52
|
+
|
|
53
|
+
test-release: bump clean build
|
|
54
|
+
twine upload --repository testpypi dist/*
|
|
55
|
+
|
|
56
|
+
bump:
|
|
57
|
+
python bump.py $(TYPE)
|
|
58
|
+
|
|
59
|
+
# ---------------------------------------------------------------------------
|
|
60
|
+
# clean
|
|
61
|
+
# ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
clean: clean-data
|
|
64
|
+
rm -rf build/ dist/ *.egg-info hermes_navigator.egg-info __pycache__ .pytest_cache .hatch
|
|
65
|
+
find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
|
|
66
|
+
find . -type f -name "*.pyc" -delete
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# IronSilk Operator Slices
|
|
2
|
+
<!-- Ref: jgwill/Miadi#300 -->
|
|
3
|
+
|
|
4
|
+
## Slice 1: tmux Terminal Awareness
|
|
5
|
+
|
|
6
|
+
This slice proves that Hermes Navigator can know enough about a tmux session
|
|
7
|
+
before attaching to it.
|
|
8
|
+
|
|
9
|
+
Proof path:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
hnavig operator terminals
|
|
13
|
+
hnavig operator peek 7 --lines 80
|
|
14
|
+
hnavig operator attach 7
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`operator terminals` lists live tmux sessions and panes with attach commands.
|
|
18
|
+
`operator peek` captures recent scrollback without changing focus. `operator
|
|
19
|
+
attach` prints the exact attach, switch, and pane-select commands.
|
|
20
|
+
|
|
21
|
+
Running the attach is intentionally guarded:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
hnavig mode controller
|
|
25
|
+
hnavig operator attach 7 --run
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`--run` requires `ACTIVE_CONTROLLER` mode and an interactive local TTY. The safe
|
|
29
|
+
default is command printing only.
|
|
30
|
+
|
|
31
|
+
## Slice 2: Persisted Terminal Registry
|
|
32
|
+
|
|
33
|
+
This slice records terminal awareness as append-only JSONL, not SQLite, before
|
|
34
|
+
any resume automation exists.
|
|
35
|
+
|
|
36
|
+
Proof path:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
hnavig operator registry save
|
|
40
|
+
hnavig operator registry last-known
|
|
41
|
+
hnavig operator registry drift
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`registry save` appends one timestamped observation snapshot. `registry
|
|
45
|
+
last-known` reads the newest saved snapshot. `registry drift` compares current
|
|
46
|
+
tmux state with that snapshot.
|
|
47
|
+
|
|
48
|
+
The registry separates observed tmux fields from inferred Navigator fields.
|
|
49
|
+
Observed fields include session id, pane id, cwd, command, pid, and attach
|
|
50
|
+
state. Inferred fields include universe confidence and generated attach/switch
|
|
51
|
+
commands. Every snapshot includes provenance and `recorded_at`.
|
|
52
|
+
|
|
53
|
+
## Slice 3: Operator Checkpoint
|
|
54
|
+
|
|
55
|
+
This slice answers: what is going on, and where can I safely enter?
|
|
56
|
+
|
|
57
|
+
Proof path:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
hnavig operator checkpoint
|
|
61
|
+
hnavig operator checkpoint --target 7 --peek-lines 20
|
|
62
|
+
hnavig operator checkpoint --format json
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`checkpoint` is read-only. It combines current terminals, last-known registry
|
|
66
|
+
metadata, drift summary, stale/last-seen hints, and safe attach/switch/select
|
|
67
|
+
commands. It only captures scrollback when `--target` is explicit.
|
|
68
|
+
|
|
69
|
+
## Slice 4: Checkpoint Handoff Artifacts
|
|
70
|
+
|
|
71
|
+
This slice serializes the same checkpoint report into portable handoff files.
|
|
72
|
+
|
|
73
|
+
Proof path:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
hnavig operator checkpoint --write
|
|
77
|
+
hnavig operator checkpoint --target 7 --peek-lines 20 --write
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`--write` saves Markdown and JSON under
|
|
81
|
+
`HNAVIG_HOME/operator/checkpoints/<timestamp>-operator-checkpoint.*`. The
|
|
82
|
+
artifacts include provenance, the source command, and the no-attach/no-resume
|
|
83
|
+
safety note. It does not create a new storage schema or mutate terminals.
|
|
84
|
+
|
|
85
|
+
## Slice 5: Steer Proposal
|
|
86
|
+
|
|
87
|
+
This slice creates a human-reviewable follow-up message for one target without
|
|
88
|
+
sending it.
|
|
89
|
+
|
|
90
|
+
Proof path:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
hnavig operator steer-proposal 7 --message "continue from here"
|
|
94
|
+
hnavig operator steer-proposal 7 --message-file prompt.md --write
|
|
95
|
+
hnavig operator steer-proposal 7 --message "continue" --peek-lines 40
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`steer-proposal` is read-only. It resolves the explicit target, optionally
|
|
99
|
+
includes a peek excerpt, records the proposed message, and prints manual
|
|
100
|
+
`tmux send-keys` suggestions clearly marked as suggestions only. It never calls
|
|
101
|
+
`tmux send-keys`.
|
|
102
|
+
|
|
103
|
+
## Slice 6: Agent Install Smoke
|
|
104
|
+
|
|
105
|
+
This slice verifies that a fresh agent can install the published package and use
|
|
106
|
+
the existing operator workflow without source-checkout assumptions.
|
|
107
|
+
|
|
108
|
+
Proof path:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
python -m venv /tmp/hnavig-agent-smoke-venv
|
|
112
|
+
source /tmp/hnavig-agent-smoke-venv/bin/activate
|
|
113
|
+
pip install -U hermes-navigator
|
|
114
|
+
hnavig --help
|
|
115
|
+
hnavig operator --help
|
|
116
|
+
|
|
117
|
+
HNAVIG_HOME=/tmp/hnavig-agent-smoke hnavig operator terminals --format json
|
|
118
|
+
HNAVIG_HOME=/tmp/hnavig-agent-smoke hnavig operator checkpoint --format json
|
|
119
|
+
HNAVIG_HOME=/tmp/hnavig-agent-smoke hnavig operator checkpoint --write
|
|
120
|
+
HNAVIG_HOME=/tmp/hnavig-agent-smoke hnavig operator steer-proposal 0 --message "Please summarize your current state and wait for human confirmation." --write
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Use the visible `terminal_id` from `operator terminals` in place of `0` when the
|
|
124
|
+
local tmux target differs. This smoke remains read-only: no attach, no send, no
|
|
125
|
+
resume automation.
|
|
126
|
+
|
|
127
|
+
## Slice 7: Guarded Send / Apply
|
|
128
|
+
|
|
129
|
+
This slice closes the raw-`tmux send-keys` gap with an explicit, guarded
|
|
130
|
+
mutation primitive for reviewed steer.
|
|
131
|
+
|
|
132
|
+
Proof path:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
hnavig operator send 7 --message "continue from the last verified checkpoint"
|
|
136
|
+
hnavig operator send 7 --proposal-file /path/to/steer-proposal.json
|
|
137
|
+
hnavig mode controller
|
|
138
|
+
hnavig operator send 7 --proposal-file /path/to/steer-proposal.json --run
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`operator send` requires an explicit target and exactly one reviewed message
|
|
142
|
+
source: `--message`, `--message-file`, or `--proposal-file`. The default is a
|
|
143
|
+
dry-run plan that prints the exact `tmux send-keys -l` and `tmux send-keys -t
|
|
144
|
+
... C-m` commands without executing them. Actual mutation remains guarded by
|
|
145
|
+
`ACTIVE_CONTROLLER` mode plus an interactive local TTY. It also requires a
|
|
146
|
+
currently resolved tmux target before execution. It does not attach, resume, or
|
|
147
|
+
choose a target automatically.
|
|
148
|
+
|
|
149
|
+
## Slice 8: v0.7.0 Release Gate
|
|
150
|
+
|
|
151
|
+
This slice gives a fresh Hermes-Agent operator one command to verify the CLI
|
|
152
|
+
base before starting workspace registry work.
|
|
153
|
+
|
|
154
|
+
Proof path:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
hnavig doctor --release-target 0.7.0
|
|
158
|
+
hnavig doctor --release-target 0.7.0 --strict
|
|
159
|
+
hnavig doctor --release-target 0.7.0 --require-daemon --strict
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
`doctor` checks package version, state/config shape, tmux availability, daemon
|
|
163
|
+
ping/context readiness, user service hints, and the operator/session command
|
|
164
|
+
surfaces required for the 0.7.0 base. Missing daemon/service/context state is
|
|
165
|
+
reported clearly; `--require-daemon` promotes daemon absence to a failed check.
|
|
166
|
+
|
|
167
|
+
## Slice 9: Tmux-Backed Named Sessions
|
|
168
|
+
|
|
169
|
+
This slice makes the named session vocabulary concrete without introducing a
|
|
170
|
+
new runtime substrate before the Hermes-Agent boundary is stable.
|
|
171
|
+
|
|
172
|
+
Proof path:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
hnavig session new ava-260512 --cwd /usr/local/src/ironsilk
|
|
176
|
+
hnavig session attach ava-260512
|
|
177
|
+
hnavig mode controller
|
|
178
|
+
hnavig session new ava-260512 --cwd /usr/local/src/ironsilk --run
|
|
179
|
+
hnavig session attach ava-260512 --run
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
`session new` and `session attach` are dry-run by default. They print exact tmux
|
|
183
|
+
commands and record executed sessions in the existing session store. Execution
|
|
184
|
+
requires `ACTIVE_CONTROLLER` mode and an interactive local terminal.
|