@provos/ironcurtain 0.6.0 → 0.7.1

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 (235) hide show
  1. package/README.md +29 -86
  2. package/dist/cli-help.d.ts +63 -0
  3. package/dist/cli-help.js +102 -0
  4. package/dist/cli-help.js.map +1 -0
  5. package/dist/cli.js +79 -56
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/config-command.js +136 -2
  8. package/dist/config/config-command.js.map +1 -1
  9. package/dist/config/constitution-readonly.md +21 -0
  10. package/dist/config/generated/tool-annotations.json +487 -338
  11. package/dist/config/generated-readonly/compiled-policy.json +468 -0
  12. package/dist/config/index.d.ts +21 -1
  13. package/dist/config/index.js +12 -4
  14. package/dist/config/index.js.map +1 -1
  15. package/dist/config/mcp-servers.json +2 -8
  16. package/dist/config/paths.d.ts +47 -0
  17. package/dist/config/paths.js +81 -0
  18. package/dist/config/paths.js.map +1 -1
  19. package/dist/config/tool-description-hints.json +15 -0
  20. package/dist/config/types.d.ts +7 -0
  21. package/dist/config/user-config.d.ts +21 -0
  22. package/dist/config/user-config.js +8 -0
  23. package/dist/config/user-config.js.map +1 -1
  24. package/dist/cron/compile-task-policy.d.ts +17 -0
  25. package/dist/cron/compile-task-policy.js +39 -0
  26. package/dist/cron/compile-task-policy.js.map +1 -0
  27. package/dist/cron/constitution-generator.d.ts +60 -0
  28. package/dist/cron/constitution-generator.js +217 -0
  29. package/dist/cron/constitution-generator.js.map +1 -0
  30. package/dist/cron/cron-scheduler.d.ts +65 -0
  31. package/dist/cron/cron-scheduler.js +184 -0
  32. package/dist/cron/cron-scheduler.js.map +1 -0
  33. package/dist/cron/file-lock.d.ts +41 -0
  34. package/dist/cron/file-lock.js +156 -0
  35. package/dist/cron/file-lock.js.map +1 -0
  36. package/dist/cron/format-utils.d.ts +18 -0
  37. package/dist/cron/format-utils.js +145 -0
  38. package/dist/cron/format-utils.js.map +1 -0
  39. package/dist/cron/git-sync.d.ts +22 -0
  40. package/dist/cron/git-sync.js +121 -0
  41. package/dist/cron/git-sync.js.map +1 -0
  42. package/dist/cron/headless-transport.d.ts +27 -0
  43. package/dist/cron/headless-transport.js +43 -0
  44. package/dist/cron/headless-transport.js.map +1 -0
  45. package/dist/cron/job-commands.d.ts +39 -0
  46. package/dist/cron/job-commands.js +585 -0
  47. package/dist/cron/job-commands.js.map +1 -0
  48. package/dist/cron/job-customizer.d.ts +22 -0
  49. package/dist/cron/job-customizer.js +47 -0
  50. package/dist/cron/job-customizer.js.map +1 -0
  51. package/dist/cron/job-store.d.ts +35 -0
  52. package/dist/cron/job-store.js +111 -0
  53. package/dist/cron/job-store.js.map +1 -0
  54. package/dist/cron/types.d.ts +135 -0
  55. package/dist/cron/types.js +22 -0
  56. package/dist/cron/types.js.map +1 -0
  57. package/dist/daemon/control-socket.d.ts +127 -0
  58. package/dist/daemon/control-socket.js +261 -0
  59. package/dist/daemon/control-socket.js.map +1 -0
  60. package/dist/daemon/daemon-command.d.ts +13 -0
  61. package/dist/daemon/daemon-command.js +230 -0
  62. package/dist/daemon/daemon-command.js.map +1 -0
  63. package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
  64. package/dist/daemon/ironcurtain-daemon.js +550 -0
  65. package/dist/daemon/ironcurtain-daemon.js.map +1 -0
  66. package/dist/docker/adapters/claude-code.js +7 -47
  67. package/dist/docker/adapters/claude-code.js.map +1 -1
  68. package/dist/docker/adapters/goose.d.ts +58 -0
  69. package/dist/docker/adapters/goose.js +250 -0
  70. package/dist/docker/adapters/goose.js.map +1 -0
  71. package/dist/docker/adapters/shared-scripts.d.ts +29 -0
  72. package/dist/docker/adapters/shared-scripts.js +80 -0
  73. package/dist/docker/adapters/shared-scripts.js.map +1 -0
  74. package/dist/docker/agent-adapter.d.ts +12 -0
  75. package/dist/docker/agent-adapter.js.map +1 -1
  76. package/dist/docker/agent-registry.d.ts +6 -1
  77. package/dist/docker/agent-registry.js +10 -1
  78. package/dist/docker/agent-registry.js.map +1 -1
  79. package/dist/docker/docker-agent-session.d.ts +2 -25
  80. package/dist/docker/docker-agent-session.js +7 -106
  81. package/dist/docker/docker-agent-session.js.map +1 -1
  82. package/dist/docker/docker-infrastructure.d.ts +8 -0
  83. package/dist/docker/docker-infrastructure.js +12 -11
  84. package/dist/docker/docker-infrastructure.js.map +1 -1
  85. package/dist/docker/mitm-proxy.js +10 -5
  86. package/dist/docker/mitm-proxy.js.map +1 -1
  87. package/dist/docker/oauth-credentials.js +2 -2
  88. package/dist/docker/oauth-credentials.js.map +1 -1
  89. package/dist/docker/pty-session.js +146 -39
  90. package/dist/docker/pty-session.js.map +1 -1
  91. package/dist/escalation/escalation-watcher.d.ts +2 -0
  92. package/dist/escalation/escalation-watcher.js +3 -0
  93. package/dist/escalation/escalation-watcher.js.map +1 -1
  94. package/dist/escalation/session-registry.js +1 -14
  95. package/dist/escalation/session-registry.js.map +1 -1
  96. package/dist/index.js +43 -5
  97. package/dist/index.js.map +1 -1
  98. package/dist/mux/mux-app.js +11 -6
  99. package/dist/mux/mux-app.js.map +1 -1
  100. package/dist/mux/mux-command.js +49 -10
  101. package/dist/mux/mux-command.js.map +1 -1
  102. package/dist/mux/mux-input-handler.d.ts +5 -0
  103. package/dist/mux/mux-input-handler.js +64 -9
  104. package/dist/mux/mux-input-handler.js.map +1 -1
  105. package/dist/mux/mux-renderer.d.ts +20 -0
  106. package/dist/mux/mux-renderer.js +127 -35
  107. package/dist/mux/mux-renderer.js.map +1 -1
  108. package/dist/mux/mux-splash.js +2 -1
  109. package/dist/mux/mux-splash.js.map +1 -1
  110. package/dist/mux/paste-interceptor.d.ts +22 -0
  111. package/dist/mux/paste-interceptor.js +143 -0
  112. package/dist/mux/paste-interceptor.js.map +1 -0
  113. package/dist/mux/pty-bridge.js +1 -1
  114. package/dist/mux/pty-bridge.js.map +1 -1
  115. package/dist/mux/types.d.ts +8 -1
  116. package/dist/mux/types.js +17 -5
  117. package/dist/mux/types.js.map +1 -1
  118. package/dist/persona/compile-persona-policy.d.ts +21 -0
  119. package/dist/persona/compile-persona-policy.js +50 -0
  120. package/dist/persona/compile-persona-policy.js.map +1 -0
  121. package/dist/persona/persona-command.d.ts +9 -0
  122. package/dist/persona/persona-command.js +479 -0
  123. package/dist/persona/persona-command.js.map +1 -0
  124. package/dist/persona/persona-customizer.d.ts +23 -0
  125. package/dist/persona/persona-customizer.js +52 -0
  126. package/dist/persona/persona-customizer.js.map +1 -0
  127. package/dist/persona/persona-prompt.d.ts +19 -0
  128. package/dist/persona/persona-prompt.js +42 -0
  129. package/dist/persona/persona-prompt.js.map +1 -0
  130. package/dist/persona/resolve.d.ts +46 -0
  131. package/dist/persona/resolve.js +108 -0
  132. package/dist/persona/resolve.js.map +1 -0
  133. package/dist/persona/types.d.ts +40 -0
  134. package/dist/persona/types.js +20 -0
  135. package/dist/persona/types.js.map +1 -0
  136. package/dist/pipeline/annotate.js +10 -4
  137. package/dist/pipeline/annotate.js.map +1 -1
  138. package/dist/pipeline/compile.d.ts +14 -31
  139. package/dist/pipeline/compile.js +50 -563
  140. package/dist/pipeline/compile.js.map +1 -1
  141. package/dist/pipeline/constitution-compiler.d.ts +6 -0
  142. package/dist/pipeline/constitution-compiler.js +42 -6
  143. package/dist/pipeline/constitution-compiler.js.map +1 -1
  144. package/dist/pipeline/constitution-customizer.d.ts +3 -0
  145. package/dist/pipeline/constitution-customizer.js +19 -5
  146. package/dist/pipeline/constitution-customizer.js.map +1 -1
  147. package/dist/pipeline/customizer-loop.d.ts +34 -0
  148. package/dist/pipeline/customizer-loop.js +167 -0
  149. package/dist/pipeline/customizer-loop.js.map +1 -0
  150. package/dist/pipeline/mcp-connections.d.ts +16 -0
  151. package/dist/pipeline/mcp-connections.js +61 -0
  152. package/dist/pipeline/mcp-connections.js.map +1 -0
  153. package/dist/pipeline/pipeline-runner.d.ts +86 -0
  154. package/dist/pipeline/pipeline-runner.js +547 -0
  155. package/dist/pipeline/pipeline-runner.js.map +1 -0
  156. package/dist/pipeline/pipeline-shared.d.ts +37 -3
  157. package/dist/pipeline/pipeline-shared.js +77 -16
  158. package/dist/pipeline/pipeline-shared.js.map +1 -1
  159. package/dist/pipeline/refresh-lists.js +38 -12
  160. package/dist/pipeline/refresh-lists.js.map +1 -1
  161. package/dist/pipeline/scenario-generator.js +2 -1
  162. package/dist/pipeline/scenario-generator.js.map +1 -1
  163. package/dist/pipeline/tool-annotator.d.ts +3 -3
  164. package/dist/pipeline/tool-annotator.js +114 -4
  165. package/dist/pipeline/tool-annotator.js.map +1 -1
  166. package/dist/pipeline/types.d.ts +52 -0
  167. package/dist/sandbox/index.js +36 -1
  168. package/dist/sandbox/index.js.map +1 -1
  169. package/dist/session/agent-session.d.ts +3 -0
  170. package/dist/session/agent-session.js +10 -1
  171. package/dist/session/agent-session.js.map +1 -1
  172. package/dist/session/index.d.ts +10 -0
  173. package/dist/session/index.js +134 -12
  174. package/dist/session/index.js.map +1 -1
  175. package/dist/session/preflight.js +26 -6
  176. package/dist/session/preflight.js.map +1 -1
  177. package/dist/session/prompts.d.ts +14 -0
  178. package/dist/session/prompts.js +39 -2
  179. package/dist/session/prompts.js.map +1 -1
  180. package/dist/session/session-manager.d.ts +105 -0
  181. package/dist/session/session-manager.js +134 -0
  182. package/dist/session/session-manager.js.map +1 -0
  183. package/dist/session/session-metadata.d.ts +18 -0
  184. package/dist/session/session-metadata.js +34 -0
  185. package/dist/session/session-metadata.js.map +1 -0
  186. package/dist/session/types.d.ts +47 -0
  187. package/dist/session/workspace-validation.d.ts +2 -0
  188. package/dist/session/workspace-validation.js +6 -5
  189. package/dist/session/workspace-validation.js.map +1 -1
  190. package/dist/signal/bot-command.d.ts +2 -0
  191. package/dist/signal/bot-command.js +8 -0
  192. package/dist/signal/bot-command.js.map +1 -1
  193. package/dist/signal/format.d.ts +27 -0
  194. package/dist/signal/format.js +59 -0
  195. package/dist/signal/format.js.map +1 -1
  196. package/dist/signal/signal-bot-daemon.d.ts +27 -25
  197. package/dist/signal/signal-bot-daemon.js +153 -135
  198. package/dist/signal/signal-bot-daemon.js.map +1 -1
  199. package/dist/signal/signal-container.js +63 -19
  200. package/dist/signal/signal-container.js.map +1 -1
  201. package/dist/signal/signal-transport.js +3 -8
  202. package/dist/signal/signal-transport.js.map +1 -1
  203. package/dist/trusted-process/domain-utils.d.ts +37 -4
  204. package/dist/trusted-process/domain-utils.js +130 -11
  205. package/dist/trusted-process/domain-utils.js.map +1 -1
  206. package/dist/trusted-process/index.js +6 -2
  207. package/dist/trusted-process/index.js.map +1 -1
  208. package/dist/trusted-process/mcp-client-manager.js +11 -5
  209. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  210. package/dist/trusted-process/mcp-proxy-server.d.ts +21 -0
  211. package/dist/trusted-process/mcp-proxy-server.js +91 -28
  212. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  213. package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
  214. package/dist/trusted-process/permissive-output-validator.js +10 -0
  215. package/dist/trusted-process/permissive-output-validator.js.map +1 -0
  216. package/dist/trusted-process/policy-engine.d.ts +29 -7
  217. package/dist/trusted-process/policy-engine.js +149 -92
  218. package/dist/trusted-process/policy-engine.js.map +1 -1
  219. package/dist/trusted-process/tool-description-hints.d.ts +19 -0
  220. package/dist/trusted-process/tool-description-hints.js +53 -0
  221. package/dist/trusted-process/tool-description-hints.js.map +1 -0
  222. package/dist/types/argument-roles.d.ts +33 -1
  223. package/dist/types/argument-roles.js +129 -1
  224. package/dist/types/argument-roles.js.map +1 -1
  225. package/dist/types/slug.d.ts +7 -0
  226. package/dist/types/slug.js +14 -0
  227. package/dist/types/slug.js.map +1 -0
  228. package/dist/utils/editor.d.ts +24 -0
  229. package/dist/utils/editor.js +66 -0
  230. package/dist/utils/editor.js.map +1 -0
  231. package/docker/Dockerfile.goose +34 -0
  232. package/docker/entrypoint-goose.sh +30 -0
  233. package/package.json +1 -1
  234. package/src/config/generated/tool-annotations.json +487 -338
  235. package/src/config/mcp-servers.json +2 -8
package/README.md CHANGED
@@ -56,7 +56,7 @@ See [SANDBOXING.md](SANDBOXING.md) for the full architecture with diagrams, laye
56
56
  ### Prerequisites
57
57
 
58
58
  - Node.js 22+ (required by `isolated-vm`; maximum Node 25)
59
- - Docker (required for Docker Agent Mode and PTY mode)
59
+ - Docker — not required but **strongly recommended** for Docker Agent Mode, which provides the strongest isolation
60
60
  - An API key for at least one LLM provider (Anthropic, Google, or OpenAI)
61
61
 
62
62
  ### Install
@@ -93,66 +93,13 @@ ironcurtain setup
93
93
 
94
94
  Walks you through GitHub token setup, web search provider, model selection, and other settings. Creates `~/.ironcurtain/config.json` with your choices.
95
95
 
96
- **3. Customize your policy** (optional but recommended):
96
+ ## Running IronCurtain
97
97
 
98
- ```bash
99
- ironcurtain customize-policy
100
- ```
101
-
102
- An LLM-assisted conversation that generates a constitution tailored to your workflow, saved to `~/.ironcurtain/constitution-user.md`. You can also edit this file directly.
103
-
104
- **4. Compile the policy:**
105
-
106
- ```bash
107
- ironcurtain compile-policy
108
- ```
109
-
110
- Translates your constitution into deterministic rules, generates test scenarios, and verifies them. Compiled artifacts go to `~/.ironcurtain/generated/`. The package ships with pre-compiled defaults — skip this step until you customize.
98
+ IronCurtain ships with a default policy geared towards the developer experience — read-only operations are allowed, mutations (writes, pushes, PR creation) escalate for human approval. You can start using it immediately after setup.
111
99
 
112
- ## Running Modes
100
+ ### Terminal multiplexer (recommended)
113
101
 
114
- ### Interactive mode
115
-
116
- A multi-turn session where you type tasks and the agent responds:
117
-
118
- ```bash
119
- ironcurtain start
120
- ```
121
-
122
- Escalated tool calls pause the agent and prompt you with `/approve` or `/deny`.
123
-
124
- ### Single-shot mode
125
-
126
- Send one task and exit when the agent finishes:
127
-
128
- ```bash
129
- ironcurtain start "Summarize the files in the current directory"
130
- ```
131
-
132
- ### Workspace mode
133
-
134
- Point the agent at an existing directory instead of a fresh sandbox:
135
-
136
- ```bash
137
- ironcurtain start -w ./my-project "Fix the failing tests"
138
- ironcurtain start --workspace /home/user/repos/my-app
139
- ```
140
-
141
- The workspace replaces the session sandbox as the agent's working area. All session infrastructure (logs, escalations, audit) still lives under `~/.ironcurtain/sessions/`. The path is validated to prevent use of sensitive directories (root, home, `~/.ironcurtain/`, or paths overlapping with protected paths).
142
-
143
- ### Session resume
144
-
145
- Resume a previous session's conversation history:
146
-
147
- ```bash
148
- ironcurtain start --resume <session-id>
149
- ```
150
-
151
- Session IDs are printed on session start and stored under `~/.ironcurtain/sessions/`.
152
-
153
- ### Terminal multiplexer (recommended for Docker Agent Mode)
154
-
155
- The terminal multiplexer is the recommended way to use IronCurtain with Docker Agent Mode. It gives you the full power of Claude Code's interactive TUI — spinners, diffs, file previews, slash commands — while IronCurtain mediates every tool call through its policy engine. All in a single terminal.
102
+ The recommended way to use IronCurtain. It gives you the full power of your agent's interactive TUI (Claude Code or Goose) while IronCurtain mediates every tool call through its policy engine — all in a single terminal.
156
103
 
157
104
  ```bash
158
105
  ironcurtain mux
@@ -160,53 +107,46 @@ ironcurtain mux
160
107
 
161
108
  **Key capabilities:**
162
109
 
163
- - **Full agent TUI** — Claude Code runs in a PTY inside a Docker container with no network access. You interact with it exactly as if it were running locally.
164
- - **Inline escalation handling** — When a tool call needs approval, an escalation panel overlays the viewport. No separate terminal needed — press Ctrl-A to enter command mode, `/approve N` or `/deny N`, and return.
110
+ - **Full agent TUI** — The agent runs in a PTY inside a Docker container with no network access. You interact with it exactly as if it were running locally.
111
+ - **Inline escalation handling** — When a tool call needs approval, an escalation panel overlays the viewport. Press Ctrl-A to enter command mode, `/approve N` or `/deny N`, and return.
165
112
  - **Trusted user input** — Text typed in command mode (Ctrl-A) is captured on the host side before entering the container. This creates a verified intent signal that the [auto-approver](#auto-approve-escalations) can use — e.g., typing "push my changes to origin" will auto-approve a subsequent `git_push` escalation.
166
113
  - **Tab management** — Spawn multiple concurrent sessions (`/new`), switch between them (`/tab N`, Alt-1..9), close them (`/close`).
167
114
 
168
115
  See [DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md) for the full walkthrough: input modes, trusted input security model, escalation workflow, and keyboard reference.
169
116
 
170
- ### PTY mode with a separate escalation listener
117
+ ### Builtin agent (no Docker required)
171
118
 
172
- An alternative to the mux run a raw PTY session in one terminal and handle escalations in another:
119
+ For quick tasks or environments without Docker, IronCurtain's builtin agent runs entirely locally in a V8 sandbox:
173
120
 
174
121
  ```bash
175
- # Terminal 1 — interactive Claude Code session
176
- ironcurtain start --pty
177
-
178
- # Terminal 2 — approve or deny escalations from all active PTY sessions
179
- ironcurtain escalation-listener
122
+ ironcurtain start # Interactive multi-turn session
123
+ ironcurtain start "Summarize the files in ./src" # Single-shot mode
124
+ ironcurtain start -w ./my-project "Fix the tests" # Workspace mode
180
125
  ```
181
126
 
182
- This workflow does not support trusted input or auto-approval for PTY sessions. The mux is recommended instead.
127
+ ### Other running modes
183
128
 
184
- **Emergency exit and terminal recovery:** Press `Ctrl-\` to trigger a graceful shutdown of the PTY session. If the process is killed ungracefully, run `reset` in that terminal to restore normal terminal mode.
129
+ IronCurtain also supports PTY mode with a separate escalation listener, a Signal messaging transport for mobile approval, and a daemon mode for scheduled cron jobs. See [RUNNING_MODES.md](RUNNING_MODES.md) for details.
185
130
 
186
- ### Signal messaging transport
131
+ ## Customizing Your Policy
187
132
 
188
- Run IronCurtain sessions via Signal messages send tasks, receive responses, and approve or deny escalations from your phone. All communication is end-to-end encrypted via the Signal protocol.
133
+ The default policy works well for general development, but you can tailor it to your workflow:
134
+
135
+ **1. Customize your constitution** (optional but recommended):
189
136
 
190
137
  ```bash
191
- ironcurtain setup-signal # One-time setup wizard
192
- ironcurtain bot # Start the Signal bot daemon
138
+ ironcurtain customize-policy
193
139
  ```
194
140
 
195
- See [TRANSPORT.md](TRANSPORT.md) for setup instructions, architecture details, and why we chose Signal over alternatives like Telegram.
196
-
197
- ## Session Commands
141
+ An LLM-assisted conversation that generates a constitution tailored to your workflow, saved to `~/.ironcurtain/constitution-user.md`. You can also edit this file directly.
198
142
 
199
- Commands available during an **interactive** or **single-shot** session:
143
+ **2. Compile the policy:**
200
144
 
201
- | Command | Description |
202
- | ---------- | ----------------------------------------------- |
203
- | `/approve` | Approve the pending escalation |
204
- | `/deny` | Deny the pending escalation |
205
- | `/budget` | Show resource consumption (tokens, steps, cost) |
206
- | `/logs` | Display diagnostic events |
207
- | `/quit` | End the session |
145
+ ```bash
146
+ ironcurtain compile-policy
147
+ ```
208
148
 
209
- In **PTY mode**, use the [terminal multiplexer](#terminal-multiplexer-recommended-for-docker-agent-mode) (`ironcurtain mux`) for inline escalation handling and trusted input support.
149
+ Translates your constitution into deterministic rules, generates test scenarios, and verifies them. Compiled artifacts go to `~/.ironcurtain/generated/`.
210
150
 
211
151
  ## Policy: Constitution → Enforcement
212
152
 
@@ -260,7 +200,7 @@ Review the generated `~/.ironcurtain/generated/compiled-policy.json` — these a
260
200
 
261
201
  ## Web Search
262
202
 
263
- IronCurtain's fetch server includes a `web_search` tool backed by your choice of provider. Configure via `ironcurtain config` → **Web Search**, or directly in `~/.ironcurtain/config.json`:
203
+ IronCurtain's fetch server includes a `web_search` tool backed by your choice of provider. Configure via `ironcurtain config` or directly in `~/.ironcurtain/config.json`:
264
204
 
265
205
  ```json
266
206
  {
@@ -291,6 +231,7 @@ IronCurtain stores configuration and session data in `~/.ironcurtain/`:
291
231
  ├── generated/ # User-compiled policy artifacts (overrides package defaults)
292
232
  ├── signal-data/ # Signal transport persistent data (registration keys)
293
233
  ├── pty-registry/ # Active PTY session registrations (auto-managed)
234
+ ├── jobs/ # Cron job definitions, workspaces, and run records
294
235
  ├── sessions/
295
236
  │ └── {sessionId}/
296
237
  │ ├── sandbox/ # Per-session filesystem sandbox
@@ -451,6 +392,8 @@ src/
451
392
  ├── escalation/ # Escalation listener: session registry, TUI dashboard, state
452
393
  ├── mux/ # Terminal multiplexer: PTY bridge, renderer, trusted input
453
394
  ├── signal/ # Signal messaging transport (bot daemon, setup, formatting)
395
+ ├── daemon/ # Unified daemon (Signal + cron scheduler, control socket)
396
+ ├── cron/ # Cron job management (scheduler, job store, git sync, policy)
454
397
  ├── docker/ # Docker agent mode, PTY session, MITM proxy, adapters
455
398
  ├── servers/ # Built-in MCP servers (fetch, web search providers)
456
399
  └── types/ # Shared type definitions
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Shared CLI help formatting module.
3
+ *
4
+ * Provides a declarative CommandSpec interface and formatting utilities
5
+ * so every subcommand produces consistent, aligned help output.
6
+ */
7
+ export interface CommandOption {
8
+ /** The long flag name, without dashes (e.g., 'agent'). */
9
+ readonly flag: string;
10
+ /** Optional single-character short alias (e.g., 'a'). */
11
+ readonly short?: string;
12
+ /** Human-readable description. */
13
+ readonly description: string;
14
+ /** Placeholder for the value (e.g., '<name>'). Omit for boolean flags. */
15
+ readonly placeholder?: string;
16
+ }
17
+ export interface CommandSpec {
18
+ /** The full command name as invoked (e.g., 'ironcurtain daemon'). */
19
+ readonly name: string;
20
+ /** One-line summary of what the command does. */
21
+ readonly description: string;
22
+ /** Usage lines shown at the top. Each string is a separate line. */
23
+ readonly usage: readonly string[];
24
+ /** Named subcommands, displayed in a table after the usage block. */
25
+ readonly subcommands?: readonly {
26
+ readonly name: string;
27
+ readonly description: string;
28
+ }[];
29
+ /** Command-line options, displayed in a table after subcommands. */
30
+ readonly options?: readonly CommandOption[];
31
+ /** Example invocations shown at the bottom. */
32
+ readonly examples?: readonly string[];
33
+ }
34
+ /**
35
+ * Formats a CommandSpec into a complete help string.
36
+ *
37
+ * Layout:
38
+ * <name> - <description>
39
+ *
40
+ * Usage:
41
+ * <usage lines>
42
+ *
43
+ * Subcommands: (if any)
44
+ * <table>
45
+ *
46
+ * Options: (if any)
47
+ * <table>
48
+ *
49
+ * Examples: (if any)
50
+ * <lines>
51
+ */
52
+ export declare function formatHelp(spec: CommandSpec): string;
53
+ /**
54
+ * Prints formatted help to stderr.
55
+ */
56
+ export declare function printHelp(spec: CommandSpec): void;
57
+ /**
58
+ * Convenience: if `values.help` is truthy, prints help and returns true.
59
+ * Callers can use: `if (checkHelp(values, spec)) return;`
60
+ */
61
+ export declare function checkHelp(values: {
62
+ help?: boolean;
63
+ }, spec: CommandSpec): boolean;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Shared CLI help formatting module.
3
+ *
4
+ * Provides a declarative CommandSpec interface and formatting utilities
5
+ * so every subcommand produces consistent, aligned help output.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Formatting
9
+ // ---------------------------------------------------------------------------
10
+ /** Pads `text` with spaces on the right to reach at least `width` characters. */
11
+ function pad(text, width) {
12
+ return text.length >= width ? text : text + ' '.repeat(width - text.length);
13
+ }
14
+ /** Formats a single option into its flag string (e.g., '-a, --agent <name>'). */
15
+ function formatOptionFlag(opt) {
16
+ const parts = [];
17
+ if (opt.short) {
18
+ parts.push(`-${opt.short},`);
19
+ }
20
+ let longFlag = `--${opt.flag}`;
21
+ if (opt.placeholder) {
22
+ longFlag += ` ${opt.placeholder}`;
23
+ }
24
+ if (opt.short) {
25
+ parts.push(longFlag);
26
+ }
27
+ else {
28
+ // Indent to align with flags that have a short alias.
29
+ // "-X, " is 4 chars, so we add 4 spaces of leading indent.
30
+ parts.push(` ${longFlag}`);
31
+ }
32
+ return parts.join(' ');
33
+ }
34
+ /**
35
+ * Renders a two-column table (label + description) with consistent alignment.
36
+ * Each row is indented by 2 spaces.
37
+ */
38
+ function formatTable(rows) {
39
+ const maxLabel = rows.reduce((max, r) => Math.max(max, r.label.length), 0);
40
+ const colWidth = maxLabel + 2; // 2 spaces between columns
41
+ return rows.map((r) => ` ${pad(r.label, colWidth)}${r.description}`).join('\n');
42
+ }
43
+ /**
44
+ * Formats a CommandSpec into a complete help string.
45
+ *
46
+ * Layout:
47
+ * <name> - <description>
48
+ *
49
+ * Usage:
50
+ * <usage lines>
51
+ *
52
+ * Subcommands: (if any)
53
+ * <table>
54
+ *
55
+ * Options: (if any)
56
+ * <table>
57
+ *
58
+ * Examples: (if any)
59
+ * <lines>
60
+ */
61
+ export function formatHelp(spec) {
62
+ const sections = [];
63
+ // Header
64
+ sections.push(`${spec.name} - ${spec.description}`);
65
+ // Usage
66
+ sections.push('Usage:\n' + spec.usage.map((u) => ` ${u}`).join('\n'));
67
+ // Subcommands
68
+ if (spec.subcommands && spec.subcommands.length > 0) {
69
+ const rows = spec.subcommands.map((s) => ({ label: s.name, description: s.description }));
70
+ sections.push('Subcommands:\n' + formatTable(rows));
71
+ }
72
+ // Options
73
+ if (spec.options && spec.options.length > 0) {
74
+ const rows = spec.options.map((o) => ({
75
+ label: formatOptionFlag(o),
76
+ description: o.description,
77
+ }));
78
+ sections.push('Options:\n' + formatTable(rows));
79
+ }
80
+ // Examples
81
+ if (spec.examples && spec.examples.length > 0) {
82
+ sections.push('Examples:\n' + spec.examples.map((e) => ` ${e}`).join('\n'));
83
+ }
84
+ return sections.join('\n\n');
85
+ }
86
+ /**
87
+ * Prints formatted help to stderr.
88
+ */
89
+ export function printHelp(spec) {
90
+ console.error(formatHelp(spec));
91
+ }
92
+ /**
93
+ * Convenience: if `values.help` is truthy, prints help and returns true.
94
+ * Callers can use: `if (checkHelp(values, spec)) return;`
95
+ */
96
+ export function checkHelp(values, spec) {
97
+ if (!values.help)
98
+ return false;
99
+ printHelp(spec);
100
+ return true;
101
+ }
102
+ //# sourceMappingURL=cli-help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -4,6 +4,7 @@ import { readFileSync } from 'node:fs';
4
4
  import { dirname, resolve } from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { parseArgs } from 'node:util';
7
+ import { checkHelp, printHelp as printSpecHelp } from './cli-help.js';
7
8
  const __dirname = dirname(fileURLToPath(import.meta.url));
8
9
  function getVersion() {
9
10
  // Works from both dist/ and src/ since package.json is one level up in either case.
@@ -11,57 +12,49 @@ function getVersion() {
11
12
  const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
12
13
  return pkg.version;
13
14
  }
14
- function printHelp() {
15
- console.error(`
16
- ironcurtain - Secure agent runtime with policy-driven tool mediation
17
-
18
- Usage:
19
- ironcurtain <command> [options]
20
-
21
- Commands:
22
- start [task] Run the agent (interactive or single-shot)
23
- mux Terminal multiplexer for PTY sessions (requires node-pty)
24
- escalation-listener Aggregate escalation notifications from PTY sessions
25
- bot Run the Signal messaging transport daemon
26
- setup Run the first-start wizard (always runs)
27
- setup-signal Interactive Signal transport onboarding
28
- --re-trust: re-verify a changed identity key
29
- annotate-tools Classify MCP tool arguments via LLM
30
- compile-policy Compile constitution into enforceable policy rules
31
- refresh-lists Re-resolve dynamic lists without full recompilation
32
- customize-policy Customize your policy via LLM-assisted conversation
33
- config Edit configuration interactively
34
- help Show this help message
35
-
36
- Options:
37
- -h, --help Show this help message
38
- -v, --version Show version number
39
- -a, --agent <name> Agent mode: builtin or claude-code (Docker)
40
- Auto-detects if omitted: Docker if available, else builtin
41
- -w, --workspace <path> Use an existing directory as the agent's workspace
42
- instead of creating a fresh sandbox
43
- --pty Attach terminal directly to agent PTY (Docker mode only)
44
- Ctrl-\\ is the emergency exit; run 'reset' to recover
45
- the terminal if killed ungracefully
46
- --list-agents List registered agent adapters
47
-
48
- Examples:
49
- ironcurtain start "task" # Auto-detects Docker or builtin
50
- ironcurtain start # Interactive session
51
- ironcurtain start "Summarize files in ." # Single-shot task
52
- ironcurtain start --resume <session-id> # Resume a session
53
- ironcurtain start -w ./my-project "Fix bugs" # Work in existing directory
54
- ironcurtain start --agent claude-code "task" # Docker: Claude Code
55
- ironcurtain start --pty # PTY mode: interactive Docker terminal
56
- ironcurtain start --list-agents # List available agents
57
- ironcurtain annotate-tools # Classify tool arguments
58
- ironcurtain compile-policy # Compile policy from constitution
59
- ironcurtain refresh-lists # Refresh all dynamic lists
60
- ironcurtain refresh-lists --list major-news # Refresh a single list
61
- ironcurtain refresh-lists --with-mcp # Include MCP-backed lists
62
- ironcurtain customize-policy # Customize policy interactively
63
- `.trim());
64
- }
15
+ const topLevelSpec = {
16
+ name: 'ironcurtain',
17
+ description: 'Secure agent runtime with policy-driven tool mediation',
18
+ usage: ['ironcurtain <command> [options]'],
19
+ subcommands: [
20
+ { name: 'start [task]', description: 'Run the agent (interactive or single-shot)' },
21
+ { name: 'daemon', description: 'Unified Signal + cron daemon' },
22
+ { name: 'mux', description: 'Terminal multiplexer for PTY sessions (requires node-pty)' },
23
+ { name: 'escalation-listener', description: 'Aggregate escalation notifications from PTY sessions' },
24
+ { name: 'bot', description: "Alias for 'daemon' (backward compatible)" },
25
+ { name: 'persona', description: 'Manage personas (named policy profiles)' },
26
+ { name: 'setup', description: 'Run the first-start wizard (always runs)' },
27
+ { name: 'setup-signal', description: 'Interactive Signal transport onboarding' },
28
+ { name: 'annotate-tools', description: 'Classify MCP tool arguments via LLM' },
29
+ { name: 'compile-policy', description: 'Compile constitution into enforceable policy rules' },
30
+ { name: 'refresh-lists', description: 'Re-resolve dynamic lists without full recompilation' },
31
+ { name: 'customize-policy', description: 'Customize your policy via LLM-assisted conversation' },
32
+ { name: 'config', description: 'Edit configuration interactively' },
33
+ { name: 'help', description: 'Show this help message' },
34
+ ],
35
+ options: [
36
+ { flag: 'help', short: 'h', description: 'Show this help message' },
37
+ { flag: 'version', short: 'v', description: 'Show version number' },
38
+ ],
39
+ examples: [
40
+ 'ironcurtain start "Summarize files in ." # Single-shot task',
41
+ 'ironcurtain start # Interactive session',
42
+ 'ironcurtain start --resume <session-id> # Resume a session',
43
+ 'ironcurtain start -w ./my-project "Fix bugs" # Work in existing directory',
44
+ 'ironcurtain start --agent claude-code "task" # Docker: Claude Code',
45
+ 'ironcurtain start --pty # PTY mode',
46
+ 'ironcurtain daemon # Start the daemon',
47
+ 'ironcurtain daemon list-jobs # List scheduled jobs',
48
+ 'ironcurtain compile-policy # Compile policy',
49
+ 'ironcurtain refresh-lists --with-mcp # Refresh dynamic lists',
50
+ ],
51
+ };
52
+ const setupSignalSpec = {
53
+ name: 'ironcurtain setup-signal',
54
+ description: 'Interactive Signal transport onboarding',
55
+ usage: ['ironcurtain setup-signal [options]'],
56
+ options: [{ flag: 're-trust', description: 'Re-verify a changed identity key' }],
57
+ };
65
58
  const { values, positionals } = parseArgs({
66
59
  args: process.argv.slice(2),
67
60
  options: {
@@ -76,8 +69,11 @@ if (values.version) {
76
69
  process.exit(0);
77
70
  }
78
71
  const subcommand = positionals[0];
79
- if (values.help || subcommand === 'help' || !subcommand) {
80
- printHelp();
72
+ // Show top-level help when no subcommand is given or 'help' is the subcommand.
73
+ // When a recognized subcommand is present, --help passes through to the
74
+ // subcommand handler via process.argv.slice(3).
75
+ if (!subcommand || subcommand === 'help') {
76
+ printSpecHelp(topLevelSpec);
81
77
  process.exit(0);
82
78
  }
83
79
  switch (subcommand) {
@@ -111,15 +107,40 @@ switch (subcommand) {
111
107
  await runConfigCommand();
112
108
  break;
113
109
  }
110
+ case 'persona': {
111
+ const { main: personaMain } = await import('./persona/persona-command.js');
112
+ await personaMain(process.argv.slice(3));
113
+ break;
114
+ }
114
115
  case 'setup': {
115
116
  const { runFirstStart } = await import('./config/first-start.js');
116
117
  await runFirstStart();
117
118
  break;
118
119
  }
120
+ case 'daemon': {
121
+ const { runDaemonCommand } = await import('./daemon/daemon-command.js');
122
+ await runDaemonCommand(process.argv.slice(3));
123
+ break;
124
+ }
119
125
  case 'bot': {
126
+ // 'bot' is an alias for 'daemon' (backward compatibility)
127
+ const botArgs = process.argv.slice(3);
128
+ if (botArgs.includes('--help') || botArgs.includes('-h')) {
129
+ const { botSpec } = await import('./signal/bot-command.js');
130
+ printSpecHelp(botSpec);
131
+ break;
132
+ }
120
133
  const agentName = values.agent;
121
- const { runBot } = await import('./signal/bot-command.js');
122
- await runBot({ agent: agentName });
134
+ if (botArgs.some((a) => !a.startsWith('-'))) {
135
+ // Has subcommands -- route through daemon command
136
+ const { runDaemonCommand } = await import('./daemon/daemon-command.js');
137
+ await runDaemonCommand(botArgs);
138
+ }
139
+ else {
140
+ // No subcommands -- existing bot behavior
141
+ const { runBot } = await import('./signal/bot-command.js');
142
+ await runBot({ agent: agentName });
143
+ }
123
144
  break;
124
145
  }
125
146
  case 'mux': {
@@ -133,6 +154,8 @@ switch (subcommand) {
133
154
  break;
134
155
  }
135
156
  case 'setup-signal': {
157
+ if (checkHelp({ help: process.argv.includes('--help') || process.argv.includes('-h') }, setupSignalSpec))
158
+ break;
136
159
  const reTrust = process.argv.includes('--re-trust');
137
160
  const { runSignalSetup } = await import('./signal/setup-signal.js');
138
161
  await runSignalSetup({ reTrust });
@@ -140,7 +163,7 @@ switch (subcommand) {
140
163
  }
141
164
  default:
142
165
  console.error(`Unknown command: ${subcommand}\n`);
143
- printHelp();
166
+ printSpecHelp(topLevelSpec);
144
167
  process.exit(1);
145
168
  }
146
169
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,UAAU;IACjB,oFAAoF;IACpF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAwB,CAAC;IACtF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,KAAK,CACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDH,CAAC,IAAI,EAAE,CACL,CAAC;AACJ,CAAC;AAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;QACrC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;KACzC;IACD,gBAAgB,EAAE,IAAI;IACtB,MAAM,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAElC,IAAI,MAAM,CAAC,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IACxD,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,UAAU,EAAE,CAAC;IACnB,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACxD,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACvD,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,eAAe,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QACvE,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM;IACR,CAAC;IACD,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM;IACR,CAAC;IACD,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,CAAC,KAA2B,CAAC;QACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC3D,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACnC,MAAM;IACR,CAAC;IACD,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM;IACR,CAAC;IACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAChF,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM;IACR,CAAC;IACD,KAAK,cAAc,CAAC,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACpE,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,IAAI,CAAC,CAAC;QAClD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}