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.
Files changed (68) hide show
  1. ironsilk-0.9.1/.gitignore +2 -0
  2. ironsilk-0.9.1/Makefile +66 -0
  3. ironsilk-0.9.1/OPERATOR-NOTE.md +184 -0
  4. ironsilk-0.9.1/PKG-INFO +494 -0
  5. ironsilk-0.9.1/README.md +465 -0
  6. ironsilk-0.9.1/RELEASE.md +95 -0
  7. ironsilk-0.9.1/bump.py +85 -0
  8. ironsilk-0.9.1/examples/config.yml +29 -0
  9. ironsilk-0.9.1/examples/demo-miadi-workspace.sh +63 -0
  10. ironsilk-0.9.1/examples/domains.yml +80 -0
  11. ironsilk-0.9.1/examples/universes.yml +76 -0
  12. ironsilk-0.9.1/hermes_navigator/__init__.py +39 -0
  13. ironsilk-0.9.1/hermes_navigator/approval_queue.py +228 -0
  14. ironsilk-0.9.1/hermes_navigator/audit.py +190 -0
  15. ironsilk-0.9.1/hermes_navigator/cli.py +2613 -0
  16. ironsilk-0.9.1/hermes_navigator/config.py +226 -0
  17. ironsilk-0.9.1/hermes_navigator/context_engine.py +558 -0
  18. ironsilk-0.9.1/hermes_navigator/daemon.py +354 -0
  19. ironsilk-0.9.1/hermes_navigator/desktop_focus.py +73 -0
  20. ironsilk-0.9.1/hermes_navigator/desktop_observer.py +292 -0
  21. ironsilk-0.9.1/hermes_navigator/domain_detector.py +405 -0
  22. ironsilk-0.9.1/hermes_navigator/focus.py +117 -0
  23. ironsilk-0.9.1/hermes_navigator/models.py +423 -0
  24. ironsilk-0.9.1/hermes_navigator/operator_report.py +260 -0
  25. ironsilk-0.9.1/hermes_navigator/paths.py +35 -0
  26. ironsilk-0.9.1/hermes_navigator/release_gate.py +175 -0
  27. ironsilk-0.9.1/hermes_navigator/scene.py +584 -0
  28. ironsilk-0.9.1/hermes_navigator/service.py +111 -0
  29. ironsilk-0.9.1/hermes_navigator/session_store.py +219 -0
  30. ironsilk-0.9.1/hermes_navigator/sqlite_async.py +85 -0
  31. ironsilk-0.9.1/hermes_navigator/telegram_bridge.py +298 -0
  32. ironsilk-0.9.1/hermes_navigator/terminal_checkpoint.py +426 -0
  33. ironsilk-0.9.1/hermes_navigator/terminal_inventory.py +255 -0
  34. ironsilk-0.9.1/hermes_navigator/terminal_registry.py +349 -0
  35. ironsilk-0.9.1/hermes_navigator/terminal_send.py +245 -0
  36. ironsilk-0.9.1/hermes_navigator/terminal_steer.py +320 -0
  37. ironsilk-0.9.1/hermes_navigator/tmux_session.py +185 -0
  38. ironsilk-0.9.1/hermes_navigator/tui/__init__.py +2 -0
  39. ironsilk-0.9.1/hermes_navigator/tui/app.py +656 -0
  40. ironsilk-0.9.1/hermes_navigator/tui/new_project_screen.py +94 -0
  41. ironsilk-0.9.1/hermes_navigator/tui/project.py +117 -0
  42. ironsilk-0.9.1/hermes_navigator/universe_detector.py +47 -0
  43. ironsilk-0.9.1/hermes_navigator/zellij_bridge.py +399 -0
  44. ironsilk-0.9.1/proposed/2026-05-13-slice7-guarded-send.patch +701 -0
  45. ironsilk-0.9.1/pyproject.toml +53 -0
  46. ironsilk-0.9.1/release.sh +62 -0
  47. ironsilk-0.9.1/scripts/setup-system-deps.sh +36 -0
  48. ironsilk-0.9.1/skills/navigator.skill.yml +330 -0
  49. ironsilk-0.9.1/tests/__init__.py +1 -0
  50. ironsilk-0.9.1/tests/test_approval_queue.py +139 -0
  51. ironsilk-0.9.1/tests/test_context_engine.py +314 -0
  52. ironsilk-0.9.1/tests/test_desktop_focus.py +217 -0
  53. ironsilk-0.9.1/tests/test_desktop_observer.py +288 -0
  54. ironsilk-0.9.1/tests/test_follow_up.py +617 -0
  55. ironsilk-0.9.1/tests/test_named_tmux_session.py +176 -0
  56. ironsilk-0.9.1/tests/test_operator_report.py +130 -0
  57. ironsilk-0.9.1/tests/test_release_gate.py +116 -0
  58. ironsilk-0.9.1/tests/test_scene.py +221 -0
  59. ironsilk-0.9.1/tests/test_scene_profiles.py +71 -0
  60. ironsilk-0.9.1/tests/test_service.py +76 -0
  61. ironsilk-0.9.1/tests/test_session_store.py +108 -0
  62. ironsilk-0.9.1/tests/test_terminal_checkpoint.py +275 -0
  63. ironsilk-0.9.1/tests/test_terminal_inventory.py +192 -0
  64. ironsilk-0.9.1/tests/test_terminal_registry.py +164 -0
  65. ironsilk-0.9.1/tests/test_terminal_send.py +248 -0
  66. ironsilk-0.9.1/tests/test_terminal_steer.py +257 -0
  67. ironsilk-0.9.1/tests/test_tui_project.py +57 -0
  68. ironsilk-0.9.1/tests/test_universe_detector.py +228 -0
@@ -0,0 +1,2 @@
1
+ # build-time staging only — populated by `make prepare-data`, removed by `make clean-data`
2
+ hermes_navigator/data/
@@ -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.