@dreb/coding-agent 2.35.0 → 2.36.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.
package/docs/dashboard.md CHANGED
@@ -18,6 +18,10 @@ dreb dashboard [--port 5343]
18
18
 
19
19
  # or directly
20
20
  dreb-dashboard [--port 5343]
21
+
22
+ # remote over Tailscale with HTTPS (PWA + notifications on mobile)
23
+ dreb dashboard --remote --allow you@example.com \
24
+ --https --cert /path/cert.pem --key /path/key.pem
21
25
  ```
22
26
 
23
27
  If `@dreb/dashboard` is not installed, `dreb dashboard` fails loudly with
@@ -94,10 +98,108 @@ When the agent is idle, send is a plain prompt.
94
98
 
95
99
  ## Notifications
96
100
 
97
- The settings tab exposes a browser-local permission toggle for needs-attention
98
- notifications. When permission is granted, a hidden dashboard tab sends a
99
- browser notification when a session newly needs input; all browsers still get a
100
- `◆` tab-title badge fallback.
101
+ Needs-attention notifications are delivered through a **service worker**
102
+ (`registration.showNotification()`), not the page-context `Notification`
103
+ constructor the constructor was removed from Android Chrome (throws
104
+ `Illegal constructor`) and is absent from iOS Safari entirely. The service
105
+ worker handles `notificationclick`: it focuses an open dashboard client and
106
+ navigates to the session that needs attention, or opens one. All browsers still
107
+ get a `◆` tab-title badge fallback when the tab is hidden.
108
+
109
+ The settings tab exposes a browser-local permission toggle. Gating is unchanged:
110
+ notifications fire only when permission is granted **and** the tab is hidden.
111
+
112
+ **iOS:** notifications exist only in the **installed PWA** (Add to Home Screen,
113
+ iOS 16.4+) — a plain Safari tab has no Notification API regardless of HTTPS.
114
+ The settings copy explains the install prerequisite when it detects an
115
+ un-installed iOS Safari session. (Note: iOS 17.4+ in the EU dropped standalone
116
+ PWA support — installed PWAs open as Safari tabs and push is unavailable there.)
117
+
118
+ ## Installable PWA + secure context
119
+
120
+ The dashboard ships a web app manifest (`display: standalone`, theme/background
121
+ colors, icon set), an apple-touch-icon, and service worker registration, so it
122
+ is **installable to the home screen** on Android Chrome and iOS Safari 16.4+ —
123
+ no URL bar, app-like presence, and (on iOS) the only context where
124
+ notifications work.
125
+
126
+ Service workers and the Notifications API require a **secure context**: HTTPS,
127
+ or `localhost`/`127.0.0.1`. Local mode (`http://127.0.0.1:<port>`) already
128
+ qualifies — install and notifications work with no TLS setup. **Remote mode
129
+ over the tailnet is plain HTTP**, which is not a secure context, so the service
130
+ worker will not register and notifications are unavailable until you enable
131
+ HTTPS. See [Native TLS](#native-tls-remote-https) below.
132
+
133
+ ## Native TLS (remote HTTPS)
134
+
135
+ For PWA install + notifications from a phone over the tailnet, the dashboard
136
+ terminates TLS itself using certificate files from
137
+ [`tailscale cert`](https://tailscale.com/docs/how-to/set-up-https-certificates)
138
+ (no reverse proxy, **no auth-model change**):
139
+
140
+ ```bash
141
+ dreb dashboard --remote --allow you@example.com \
142
+ --https --cert /etc/dreb/cert.pem --key /etc/dreb/key.pem
143
+ ```
144
+
145
+ Because the dashboard terminates TLS directly, `req.socket.remoteAddress` is
146
+ still the phone's real tailnet IP — Tailscale identity resolution, the
147
+ allowlist, and pairing all keep working exactly as in plain-HTTP remote mode.
148
+ There is no header trust, no proxy, no weakening of the auth model.
149
+
150
+ ### One-time cert setup with `tailscale cert`
151
+
152
+ ```bash
153
+ # Enable HTTPS certificates in the Tailscale admin console (DNS → HTTPS) first.
154
+ sudo tailscale cert \
155
+ --cert-file=/etc/dreb/cert.pem \
156
+ --key-file=/etc/dreb/key.pem \
157
+ hostname.tailXXXX.ts.net
158
+ sudo chown dreb:dreb /etc/dreb/cert.pem /etc/dreb/key.pem
159
+ sudo chmod 644 /etc/dreb/cert.pem && sudo chmod 600 /etc/dreb/key.pem
160
+ ```
161
+
162
+ Renewal is **manual** — `tailscale cert` certs are Let's Encrypt, 90-day
163
+ lifetime. The dashboard hot-reloads the cert files on change
164
+ (`setSecureContext`), so a renewal that rewrites the files is picked up with
165
+ zero downtime. A daily systemd timer with `--min-validity=720h` (only renews
166
+ when within 30 days of expiry) is the recommended cadence:
167
+
168
+ ```ini
169
+ # /etc/systemd/system/dreb-cert.service
170
+ [Service]
171
+ Type=oneshot
172
+ ExecStart=/usr/bin/tailscale cert --cert-file=/etc/dreb/cert.pem \
173
+ --key-file=/etc/dreb/key.pem --min-validity=720h hostname.tailXXXX.ts.net
174
+ ExecStartPost=/bin/chown dreb:dreb /etc/dreb/cert.pem /etc/dreb/key.pem
175
+
176
+ # /etc/systemd/system/dreb-cert.timer
177
+ [Timer]
178
+ OnCalendar=daily
179
+ RandomizedDelaySec=3600
180
+ [Install]
181
+ WantedBy=timers.target
182
+ ```
183
+
184
+ Then open `https://hostname.tailXXXX.ts.net:<port>` on the phone.
185
+
186
+ > **Hostname note (important):** the `tailscale cert` certificate is issued
187
+ > for your machine's tailnet name (`hostname.tailXXXX.ts.net`) **only** — not
188
+ > `127.0.0.1`, not a raw tailnet IP. When `--https` is enabled the server
189
+ > speaks TLS on every address it binds, so on the host itself:
190
+ >
191
+ > - `https://hostname.tailXXXX.ts.net:<port>` — works, cert validates (resolves
192
+ > to your tailnet IP). But it's a *remote* request: you go through the full
193
+ > Tailscale allowlist + pairing flow, not instant loopback local mode.
194
+ > - `https://127.0.0.1:<port>` — the server answers, but the browser rejects
195
+ > the cert (no `127.0.0.1` SAN) with a scary warning.
196
+ > - `http://127.0.0.1:<port>` — **dead**: the server only speaks TLS now.
197
+ >
198
+ > If you want the host dashboard tab to stay instant (loopback local mode, no
199
+ > pairing, no warning), run a **second** dashboard process without `--https` on
200
+ > a different port for local-only use, and keep the TLS-enabled one for remote.
201
+ > `--https` is primarily for the `--remote` path; pure-local setups don't need
202
+ > it (`127.0.0.1` is already a secure context).
101
203
 
102
204
  ## Subagent observability
103
205
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreb/coding-agent",
3
- "version": "2.35.0",
3
+ "version": "2.36.1",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "drebConfig": {
@@ -18,7 +18,7 @@ This skill has two modes:
18
18
  2. **No `#N` in comment bodies** — Use "finding 3", "item 3" etc. instead.
19
19
  3. **Safe git** — Never use `git add -A` or `git add .`. Stage files by name. Never stage secrets.
20
20
  4. **Task tracking** — Use the `tasks_update` tool to show progress.
21
- 5. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks.
21
+ 5. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks. Write each body to a **unique per-invocation temp file** via `mktemp` (e.g. `GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"`) — never a fixed path like `/tmp/gh-comment.md`, which concurrent mach6 sessions on the same machine would clobber, cross-posting one session's body to another's PR/issue.
22
22
 
23
23
  ## Step 1: Parse input
24
24
 
@@ -16,7 +16,7 @@ argument-hint: "[issue-number | description]"
16
16
  4. **Safe git** — Never use `git add -A` or `git add .`. Stage files by name. Never stage secrets (.env, credentials, tokens, keys).
17
17
  5. **Task tracking** — Use the `tasks_update` tool to show progress through multi-step commands.
18
18
  6. **Project conventions** — Check for CLAUDE.md, AGENTS.md, .dreb/CONTEXT.md, and CONTRIBUTING.md before planning or implementing.
19
- 7. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks.
19
+ 7. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks. Write each body to a **unique per-invocation temp file** via `mktemp` (e.g. `GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"`) — never a fixed path like `/tmp/gh-comment.md`, which concurrent mach6 sessions on the same machine would clobber, cross-posting one session's body to another's PR/issue.
20
20
 
21
21
  ## Determine Mode
22
22
 
@@ -76,7 +76,8 @@ Present to the user:
76
76
  Post as an issue comment:
77
77
 
78
78
  ```bash
79
- cat > /tmp/gh-comment.md << 'MACH6_EOF'
79
+ GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"
80
+ cat > "$GH_BODY" << 'MACH6_EOF'
80
81
  <!-- mach6-assessment -->
81
82
  ## Issue Assessment
82
83
 
@@ -85,7 +86,7 @@ cat > /tmp/gh-comment.md << 'MACH6_EOF'
85
86
  ---
86
87
  *Automated assessment by mach6*
87
88
  MACH6_EOF
88
- gh issue comment <number> --body-file /tmp/gh-comment.md
89
+ gh issue comment <number> --body-file "$GH_BODY"
89
90
  ```
90
91
 
91
92
  Update task: post → completed.
@@ -127,10 +128,11 @@ Present the draft to the user for approval.
127
128
  ### Step 3: Create the issue
128
129
 
129
130
  ```bash
130
- cat > /tmp/gh-body.md << 'MACH6_EOF'
131
+ GH_BODY="$(mktemp /tmp/gh-body.XXXXXX.md)"
132
+ cat > "$GH_BODY" << 'MACH6_EOF'
131
133
  <body>
132
134
  MACH6_EOF
133
- gh issue create --title "<title>" --body-file /tmp/gh-body.md [--label "<labels>"]
135
+ gh issue create --title "<title>" --body-file "$GH_BODY" [--label "<labels>"]
134
136
  ```
135
137
 
136
138
  Report the issue number and URL. Suggest next step: `/skill:mach6-plan <number>`
@@ -18,7 +18,7 @@ This command is strictly for **planning**. Do NOT implement any code changes —
18
18
  4. **Safe git** — Never use `git add -A` or `git add .`. Stage files by name. Never stage secrets.
19
19
  5. **Task tracking** — Use the `tasks_update` tool to show progress through multi-step commands.
20
20
  6. **Project conventions** — Check for CLAUDE.md, AGENTS.md, .dreb/CONTEXT.md, and CONTRIBUTING.md before planning.
21
- 7. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks.
21
+ 7. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks. Write each body to a **unique per-invocation temp file** via `mktemp` (e.g. `GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"`) — never a fixed path like `/tmp/gh-comment.md`, which concurrent mach6 sessions on the same machine would clobber, cross-posting one session's body to another's PR/issue.
22
22
 
23
23
  ## Step 1: Set up task tracking
24
24
 
@@ -98,14 +98,15 @@ git commit --allow-empty -m "chore: open PR for issue <N>"
98
98
  git push -u origin feature/issue-<N>-<slug>
99
99
 
100
100
  # Open draft PR
101
- cat > /tmp/gh-body.md << 'MACH6_EOF'
101
+ GH_BODY="$(mktemp /tmp/gh-body.XXXXXX.md)"
102
+ cat > "$GH_BODY" << 'MACH6_EOF'
102
103
  Closes #<N>
103
104
 
104
105
  <brief description>
105
106
 
106
107
  Implementation plan posted as a comment below.
107
108
  MACH6_EOF
108
- gh pr create --draft --title "<title>" --body-file /tmp/gh-body.md
109
+ gh pr create --draft --title "<title>" --body-file "$GH_BODY"
109
110
  ```
110
111
 
111
112
  Update task: branch → completed, post → in_progress.
@@ -113,7 +114,8 @@ Update task: branch → completed, post → in_progress.
113
114
  ## Step 7: Post plan to PR
114
115
 
115
116
  ```bash
116
- cat > /tmp/gh-comment.md << 'MACH6_EOF'
117
+ GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"
118
+ cat > "$GH_BODY" << 'MACH6_EOF'
117
119
  <!-- mach6-plan -->
118
120
  ## Implementation Plan
119
121
 
@@ -122,7 +124,7 @@ cat > /tmp/gh-comment.md << 'MACH6_EOF'
122
124
  ---
123
125
  *Plan created by mach6*
124
126
  MACH6_EOF
125
- gh pr comment <pr-number> --body-file /tmp/gh-comment.md
127
+ gh pr comment <pr-number> --body-file "$GH_BODY"
126
128
  ```
127
129
 
128
130
  Update task: post → completed.
@@ -14,7 +14,7 @@ argument-hint: "<pr-number>"
14
14
  2. **No `#N` in comment bodies** — Use "finding 3", "item 3" etc. instead.
15
15
  3. **Safe git** — Never use `git add -A` or `git add .`. Stage files by name. Never stage secrets.
16
16
  4. **Task tracking** — Use the `tasks_update` tool to show progress.
17
- 5. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks.
17
+ 5. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks. Write each body to a **unique per-invocation temp file** via `mktemp` (e.g. `GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"`) — never a fixed path like `/tmp/gh-comment.md`, which concurrent mach6 sessions on the same machine would clobber, cross-posting one session's body to another's PR/issue.
18
18
 
19
19
  ## Step 1: Set up task tracking
20
20
 
@@ -181,10 +181,11 @@ git push --tags
181
181
 
182
182
  3. Present draft to user for approval, then create:
183
183
  ```bash
184
- cat > /tmp/gh-release-notes.md << 'MACH6_EOF'
184
+ GH_NOTES="$(mktemp /tmp/gh-release-notes.XXXXXX.md)"
185
+ cat > "$GH_NOTES" << 'MACH6_EOF'
185
186
  <release-notes>
186
187
  MACH6_EOF
187
- gh release create v<version> --title "v<version>" --notes-file /tmp/gh-release-notes.md
188
+ gh release create v<version> --title "v<version>" --notes-file "$GH_NOTES"
188
189
  ```
189
190
 
190
191
  Update task: release → completed.
@@ -15,7 +15,7 @@ argument-hint: "[commit message]"
15
15
  3. **No `#N` in comment bodies** — Use "finding 3", "item 3", "stage 2" etc. instead.
16
16
  4. **Safe git** — Never use `git add -A` or `git add .`. Stage files by name. Never stage secrets (.env, credentials, tokens, keys).
17
17
  5. **Task tracking** — Use the `tasks_update` tool to show progress.
18
- 6. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks.
18
+ 6. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks. Write each body to a **unique per-invocation temp file** via `mktemp` (e.g. `GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"`) — never a fixed path like `/tmp/gh-comment.md`, which concurrent mach6 sessions on the same machine would clobber, cross-posting one session's body to another's PR/issue.
19
19
 
20
20
  ## Step 1: Set up task tracking
21
21
 
@@ -81,7 +81,8 @@ If session context points to an issue but a PR also exists on the current branch
81
81
 
82
82
  Post a progress comment:
83
83
  ```bash
84
- cat > /tmp/gh-comment.md << 'MACH6_EOF'
84
+ GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"
85
+ cat > "$GH_BODY" << 'MACH6_EOF'
85
86
  <!-- mach6-progress -->
86
87
  ## Progress Update
87
88
 
@@ -92,7 +93,7 @@ cat > /tmp/gh-comment.md << 'MACH6_EOF'
92
93
  ---
93
94
  *Progress tracked by mach6*
94
95
  MACH6_EOF
95
- gh pr comment <number> --body-file /tmp/gh-comment.md
96
+ gh pr comment <number> --body-file "$GH_BODY"
96
97
  ```
97
98
 
98
99
  Update task: comment → completed.
@@ -14,7 +14,7 @@ argument-hint: "<pr-number> [code|errors|tests|completeness|simplify]"
14
14
  2. **HTML markers** — Use `<!-- mach6-review -->` and `<!-- mach6-assessment -->` as the first line of comment bodies.
15
15
  3. **No `#N` in comment bodies** — Use "finding 3", "item 3", "stage 2" etc. instead.
16
16
  4. **Task tracking** — Use the `tasks_update` tool to show progress.
17
- 5. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks.
17
+ 5. **Non-interactive `gh`** — Set `GH_PAGER=cat` and `GH_EDITOR=cat` before all `gh` commands to prevent interactive prompts from hanging the agent. Use `--body-file` instead of inline `--body` for all `gh pr comment`, `gh pr create`, and `gh issue create` calls to avoid shell interpretation of backticks. Write each body to a **unique per-invocation temp file** via `mktemp` (e.g. `GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"`) — never a fixed path like `/tmp/gh-comment.md`, which concurrent mach6 sessions on the same machine would clobber, cross-posting one session's body to another's PR/issue.
18
18
 
19
19
  **Important: Do NOT fix any issues in this session. Fixes happen via `/skill:mach6-implement`.**
20
20
 
@@ -96,7 +96,8 @@ Update task: review → completed, post-review → in_progress.
96
96
  Compile all findings from all agents into a single structured comment:
97
97
 
98
98
  ```bash
99
- cat > /tmp/gh-comment.md << 'MACH6_EOF'
99
+ GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"
100
+ cat > "$GH_BODY" << 'MACH6_EOF'
100
101
  <!-- mach6-review -->
101
102
  ## Code Review
102
103
 
@@ -117,7 +118,7 @@ cat > /tmp/gh-comment.md << 'MACH6_EOF'
117
118
  ---
118
119
  *Reviewed by mach6*
119
120
  MACH6_EOF
120
- gh pr comment <pr-number> --body-file /tmp/gh-comment.md
121
+ gh pr comment <pr-number> --body-file "$GH_BODY"
121
122
  ```
122
123
 
123
124
  Save the review comment URL:
@@ -156,7 +157,8 @@ Update task: assess → completed, post-assess → in_progress.
156
157
  ## Step 7: Post assessment
157
158
 
158
159
  ```bash
159
- cat > /tmp/gh-comment.md << 'MACH6_EOF'
160
+ GH_BODY="$(mktemp /tmp/gh-comment.XXXXXX.md)"
161
+ cat > "$GH_BODY" << 'MACH6_EOF'
160
162
  <!-- mach6-assessment -->
161
163
  ## Review Assessment
162
164
 
@@ -175,7 +177,7 @@ cat > /tmp/gh-comment.md << 'MACH6_EOF'
175
177
  ---
176
178
  *Assessment by mach6*
177
179
  MACH6_EOF
178
- gh pr comment <pr-number> --body-file /tmp/gh-comment.md
180
+ gh pr comment <pr-number> --body-file "$GH_BODY"
179
181
  ```
180
182
 
181
183
  Update task: post-assess → completed, summary → in_progress.
@@ -189,10 +191,11 @@ Present to the user:
189
191
 
190
192
  If any findings were classified as **deferred**, ask the user if they want to create issues for them:
191
193
  ```bash
192
- cat > /tmp/gh-body.md << 'MACH6_EOF'
194
+ GH_BODY="$(mktemp /tmp/gh-body.XXXXXX.md)"
195
+ cat > "$GH_BODY" << 'MACH6_EOF'
193
196
  <body referencing PR and finding>
194
197
  MACH6_EOF
195
- gh issue create --title "<title>" --body-file /tmp/gh-body.md
198
+ gh issue create --title "<title>" --body-file "$GH_BODY"
196
199
  ```
197
200
 
198
201
  Update task: summary → completed.