@winding-labs/glow 0.1.1 → 0.1.11
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/README.md +81 -7
- package/SECURITY.md +78 -4
- package/bin/glow.mjs +322 -41
- package/lib/agents.mjs +42 -0
- package/lib/core.mjs +289 -6
- package/lib/hook.mjs +36 -9
- package/lib/runner.mjs +860 -0
- package/marketplace/.agents/plugins/marketplace.json +12 -0
- package/marketplace/.claude-plugin/marketplace.json +13 -0
- package/marketplace/glow/.claude-plugin/plugin.json +10 -0
- package/marketplace/glow/.codex-plugin/plugin.json +22 -0
- package/marketplace/glow/skills/ignore/SKILL.md +15 -0
- package/marketplace/glow/skills/run/SKILL.md +26 -0
- package/marketplace/glow/skills/status/SKILL.md +15 -0
- package/marketplace/glow/skills/unignore/SKILL.md +16 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -15,11 +15,19 @@ branch, commits and pull request. From that post in Glow you can send the sessio
|
|
|
15
15
|
- **Only to Glow** (`https://app.meetglow.ai`). The address is fixed when you set up and can't be changed by a repo or
|
|
16
16
|
an environment variable (the hook runs with an empty environment but `HOME` and `PATH`).
|
|
17
17
|
- **Only from linked repos.** A session in any other repo sends nothing. You link repos to products in Glow.
|
|
18
|
-
- **
|
|
19
|
-
|
|
20
|
-
-
|
|
18
|
+
- **Never from a repo you ignore.** `/glow:ignore` in a repo (or `npx @winding-labs/glow ignore`) and its sessions send
|
|
19
|
+
nothing from this computer, even if it's linked: the hook stops before it makes any request.
|
|
20
|
+
- **Only the agent's last reply and the request it answers**, with keys and tokens masked, plus the branch, the titles
|
|
21
|
+
of the branch's commits and a pull request link on the same repo, and which of GitHub (`gh` signed in), Chrome, Docker
|
|
22
|
+
and Xcode this computer has (yes or no each, for its tags in Glow). Never your code, files or the transcript: the hook
|
|
23
|
+
reads only your latest request from the agent's own session file.
|
|
24
|
+
- Glow turns the reply into a short summary right away and **doesn't keep the reply or the request**. From the request
|
|
25
|
+
it keeps only the recipe it names when it's a job you'd run again ("Pen test the API", "Optimize SEO"), so it can
|
|
26
|
+
count how often you run it and offer to run it for you. Don't want that? `npx @winding-labs/glow recipes off`.
|
|
21
27
|
- This computer's key can do three things: send a report, read which repos are linked, and fetch messages you sent to
|
|
22
|
-
its sessions.
|
|
28
|
+
its sessions. While `glow run` is on, it also picks up the sessions you start here and says how they're going (the
|
|
29
|
+
repo, the last command or file, masked; never output or code). It can't read anything else in your workspace. It
|
|
30
|
+
stops working after 90 days unused.
|
|
23
31
|
|
|
24
32
|
## Messages back
|
|
25
33
|
|
|
@@ -27,19 +35,85 @@ Only the person who paired the computer can message its sessions, and Glow asks
|
|
|
27
35
|
first. Claude Code picks a message up while it's idle (for 25 minutes after its last reply); Codex picks it up when its
|
|
28
36
|
current turn ends. Don't want that? `npx @winding-labs/glow messages off` on the computer.
|
|
29
37
|
|
|
38
|
+
## Run your queue here
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
npx @winding-labs/glow run ~/code --background
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Only if you want it, and only while it runs: press **Run** on your queue in the Glow app, look at your phone (Face ID),
|
|
45
|
+
and the tasks in it run here in Claude Code, a few at once, oldest first, with your own Claude Code model and effort
|
|
46
|
+
(whatever `claude` uses in a terminal). For the next 5 minutes, anything you add to the queue runs too. Nothing starts by
|
|
47
|
+
itself. Glow's Agents tab shows the
|
|
48
|
+
queue live: what's running and its last step, what's next, what finished and what came of it, with each run's time,
|
|
49
|
+
turns, cost and how full its context is. Tap one for its whole run: what it was asked, what it said and did, its reply.
|
|
50
|
+
**Run now** starts any task at once (Glow's suggestions and teammates' tasks run only when you press it); **New
|
|
51
|
+
session** starts one with a prompt you type. Each runs in your checkout of a repo that's linked to the task's product
|
|
52
|
+
and found under the folders you give it (the current folder by default). Its reply posts to the product's channel like
|
|
53
|
+
any session's, except for a task someone else wrote or one filed from a capture: then only you see it, on its run.
|
|
54
|
+
Pause the computer in Glow to hold the queue.
|
|
55
|
+
|
|
56
|
+
- **Only with your Glow phone's Face ID:** one phone on your account is your Glow phone (the app: Settings › Glow phone).
|
|
57
|
+
It holds a key that never leaves its Secure Enclave (or Android Keystore) and signs each session, and each message to
|
|
58
|
+
a session, after Face ID or your fingerprint: what runs, in which repo, on this computer. This computer checks that
|
|
59
|
+
signature against the phone it trusts before anything runs or reaches an agent, so Glow alone, or anyone who got into
|
|
60
|
+
your Glow account, can't run anything here. It trusts the first Glow phone Glow names; after you make a new phone
|
|
61
|
+
yours, run `npx @winding-labs/glow phone trust` here (it shows the fingerprint to check against the app).
|
|
62
|
+
`npx @winding-labs/glow phone` says which one it trusts.
|
|
63
|
+
- **Only yours:** only you (the person who paired the computer) start sessions on it. Glow's suggestions and teammates'
|
|
64
|
+
tasks run when you press Run on them, like yours.
|
|
65
|
+
- **Full access:** every session runs like your own `claude --dangerously-skip-permissions`: nothing asks before a
|
|
66
|
+
command, so start the runner only on a computer where you'd run that yourself. Each works in a git worktree of its own
|
|
67
|
+
(`.claude/worktrees/glow-…`, a new branch from your default branch), so your checkout stays as it is, and is told to
|
|
68
|
+
ship its work as a pull request: commit, push its branch, `gh pr create`, never your default branch. pnpm and yarn work
|
|
69
|
+
even if only Node's corepack is installed. Glow's own CLI and `~/.glow` stay denied (a session can't turn
|
|
70
|
+
Glow off, stop the runner or read the computer's key). Read a task someone else wrote, or one from a capture, before
|
|
71
|
+
you press Run: it runs with the same access.
|
|
72
|
+
- **This computer decides too**, whatever Glow sends: `--repo owner/name` (repeat it) runs only those repos,
|
|
73
|
+
and `--repo owner/name=~/code/zest` picks the checkout when a repo is checked out more than once (otherwise it doesn't
|
|
74
|
+
run; worktrees don't count: it runs in the main checkout). Only in a folder you've trusted in Claude Code (opened `claude` there and said yes), since its own `.claude`
|
|
75
|
+
settings and hooks apply. A session id is run once, never again.
|
|
76
|
+
- **What Glow keeps of a run:** its usage (how many of its tool calls failed, and how much of your Claude plan was used
|
|
77
|
+
when it started), and for 2 days its transcript (Claude Code's words, each tool or command,
|
|
78
|
+
the first lines of each result, its reply), keys masked and cut short, at most 256 KB, that only you can read.
|
|
79
|
+
- **Up to 3 at once** on a computer, even in one repo (each in its own worktree), the rest wait their turn, 30 a day, 3 hours each at most. Stop from Glow ends the session and
|
|
80
|
+
the commands it started. Pausing the computer in Glow stops them all; Ctrl-C (or closing the terminal) stops the
|
|
81
|
+
runner and its sessions, and everything they started.
|
|
82
|
+
- `run --background` keeps it going after you close the terminal (log: `~/.glow/runner.log`); `run stop` stops it. A
|
|
83
|
+
session the runner started can't stop it or turn Glow off.
|
|
84
|
+
|
|
85
|
+
## In Claude Code and Codex
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
/glow:status what this folder sends (and why not), what's set up, which repos report or are ignored
|
|
89
|
+
/glow:ignore this repo never sends to Glow from this computer (add a folder or owner/name for another)
|
|
90
|
+
/glow:unignore let it send again (only when you type it: an agent can't run it on its own in Claude Code)
|
|
91
|
+
/glow:run start (or stop) the runner in the background, for the linked repos under the session's folder
|
|
92
|
+
(only when you type it; --repo and other folders are for the terminal)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
In Codex they're `$glow:status`, `$glow:ignore`, `$glow:unignore` and `$glow:run`. Setup adds them as a `glow` plugin, through each
|
|
96
|
+
agent's own `plugin` command; each may run only its own `~/.glow/glow` command, and a session Glow started can't run
|
|
97
|
+
any of them.
|
|
98
|
+
|
|
30
99
|
## Commands
|
|
31
100
|
|
|
32
101
|
```
|
|
33
102
|
npx @winding-labs/glow set up (or add an agent you installed later)
|
|
34
|
-
npx @winding-labs/glow status what's set up
|
|
103
|
+
npx @winding-labs/glow status what this folder sends, what's set up, which repos report
|
|
104
|
+
npx @winding-labs/glow ignore [repo] this repo (or a folder, or owner/name) never sends from this computer
|
|
105
|
+
npx @winding-labs/glow unignore [repo] let it send again
|
|
35
106
|
npx @winding-labs/glow off | on stop or start sending from this computer
|
|
36
107
|
npx @winding-labs/glow messages off messages from Glow no longer reach your agents here (messages on: again)
|
|
37
|
-
npx @winding-labs/glow
|
|
108
|
+
npx @winding-labs/glow run [folders] run your queue (and sessions you start in Glow) in the linked repos under these folders
|
|
109
|
+
[--repo owner/name[=path]…] [--background]
|
|
110
|
+
npx @winding-labs/glow run stop stop the runner (and its sessions)
|
|
111
|
+
npx @winding-labs/glow uninstall remove the hooks and the plugin, revoke the key, delete ~/.glow
|
|
38
112
|
```
|
|
39
113
|
|
|
40
114
|
Codex asks before it runs any new hook: open Codex and run `/hooks` once to trust Glow's.
|
|
41
115
|
|
|
42
|
-
Files: `~/.glow/` (the key,
|
|
116
|
+
Files: `~/.glow/` (owner-only: the key, the ignored repos, a copy of this package and the plugin), a `Stop` hook in `~/.claude/settings.json` and `~/.codex/hooks.json` (a
|
|
43
117
|
symlinked settings file stays a link). The first time, the originals are copied to `*.before-glow`.
|
|
44
118
|
|
|
45
119
|
Security: [SECURITY.md](SECURITY.md).
|
package/SECURITY.md
CHANGED
|
@@ -7,12 +7,75 @@ Report a vulnerability to **security@meetglow.ai**. Please don't open a public i
|
|
|
7
7
|
- **Talk to one host:** `https://app.meetglow.ai`, fixed at setup in `~/.glow/config.json` (owner-only) and checked on
|
|
8
8
|
every call. Redirects are refused. The hook runs with an empty environment except `HOME` and `PATH`, so no proxy, TLS
|
|
9
9
|
or `NODE_*` setting can send it anywhere else.
|
|
10
|
-
- **Send only from repos you linked** to a product in Glow: the agent's last reply
|
|
11
|
-
|
|
10
|
+
- **Send only from repos you linked** to a product in Glow: the agent's last reply and the request it answers (keys and
|
|
11
|
+
tokens masked; the request only from a .jsonl under ~/.claude/projects or ~/.codex/sessions, never with `recipes
|
|
12
|
+
off`), the branch, up to five commit titles on it, and a pull request link on the same repo. Never code, files or
|
|
13
|
+
transcripts.
|
|
14
|
+
A repo you ignore here (`/glow:ignore`) sends nothing, linked or not: the hook stops before any request.
|
|
12
15
|
- **Run git read-only** (the origin URL, the branch, commit titles), with no shell, hooks, fsmonitor, pager, signature
|
|
13
|
-
checks or `GIT_*` variables, so a repo's `.git/config` can't make it run a program.
|
|
16
|
+
checks or `GIT_*` variables, so a repo's `.git/config` can't make it run a program. The runner (below) also fetches a
|
|
17
|
+
linked repo's default branch and adds a worktree for each session: hooks, fsmonitor and pager still off and none of
|
|
18
|
+
your `GIT_*` variables, but with your git credentials, so the fetch works.
|
|
14
19
|
- **Edit two settings files:** add one `Stop` hook to `~/.claude/settings.json` and `~/.codex/hooks.json`, keep
|
|
15
20
|
everything else, back up the originals once (`*.before-glow`), and never overwrite a file that isn't valid JSON.
|
|
21
|
+
- **Add one plugin** (`glow`, from `~/.glow/marketplace`) with each agent's own `claude plugin` / `codex plugin`
|
|
22
|
+
command. Each may run only its own `~/.glow/glow` command (`status`, `ignore …`, `unignore …`; `/glow:run`: exactly
|
|
23
|
+
`run --background`, `run stop` or `status`), and `/glow:unignore` and `/glow:run` run only when you type them.
|
|
24
|
+
|
|
25
|
+
- **Start Claude Code, only while `glow run` runs** (you start it; nothing installs it to start on its own). It runs
|
|
26
|
+
`claude` as an argument list (no shell), in your checkout of a linked repo found under the folders you gave it, with
|
|
27
|
+
the prompt on stdin (so a prompt can't become a flag), with `--dangerously-skip-permissions`: like your own Claude
|
|
28
|
+
Code with that flag, nothing asks before a command, and your Claude Code settings pick its model and effort (Glow
|
|
29
|
+
passes neither). Starting the runner is how you say yes to that, on this computer; it says so when it starts. Each
|
|
30
|
+
session runs in a git worktree of its own that the runner makes (`.claude/worktrees/glow-<id>`, letters and digits
|
|
31
|
+
only, on a new branch of that name from the default branch as origin has it, kept afterwards), never in the checkout
|
|
32
|
+
you work in. It's told to ship its work as a pull request: commit on that branch, push it and open one with `gh`,
|
|
33
|
+
never pushing to the default branch or merging (an instruction, not a limit: with full access it could). Where pnpm or
|
|
34
|
+
yarn isn't installed, corepack's own shims for them (`~/.cache/glow/bin`) go last on its PATH. Nothing starts by
|
|
35
|
+
itself: each session runs only with your Glow phone's signature over it (below), up to 3 at once; a task someone else
|
|
36
|
+
wrote, or one from a capture, runs with the same access when you press Run, so read it first. Always `--disallowedTools` for
|
|
37
|
+
Glow's own CLI (`~/.glow/glow`, `npx @winding-labs/glow`, `node …/glow.mjs`) and files (`~/.glow`, the computer's
|
|
38
|
+
key), which holds with permission checks skipped and no allow rule (the plugin's included) can grant back. That list
|
|
39
|
+
matches the command's text, so a session could spell its way around it (`~/.gl?w/glow`); the CLI also refuses any
|
|
40
|
+
command run from inside a session. One command per call: `glow ignore x run …` is refused, so a skill allowed to run one
|
|
41
|
+
command can't reach another. Stop, a pause in Glow, the 3-hour limit, Ctrl-C or closing the
|
|
42
|
+
terminal ends a session and everything it started: Claude Code's Bash tool and hooks start each command in a process
|
|
43
|
+
group of its own, so the runner signals every group under that Claude Code (SIGTERM, then SIGKILL after 5 s; SIGTERM
|
|
44
|
+
at once if the runner itself exits).
|
|
45
|
+
- **Run only what your Glow phone signed** (review-2026-11-03-signed-runs.md). Each session comes with a signature by
|
|
46
|
+
your Glow phone: ECDSA P-256 with a key made in its Secure Enclave or Android Keystore, usable only after Face ID or a
|
|
47
|
+
fingerprint (one check covers 5 minutes), over the session's id, this computer's id, the repo, the SHA-256 of the
|
|
48
|
+
prompt and the time. The runner checks it against the phone key this computer pinned (`~/.glow/config.json` `phone`:
|
|
49
|
+
the first phone Glow named, or the one you trusted with `glow phone trust` after checking its fingerprint at the
|
|
50
|
+
terminal; Glow naming another is only reported) before anything else, rebuilding what was signed from what would run,
|
|
51
|
+
within 6 hours (5 minutes of clock skew), and each signature once (`~/.glow/seen`). One that fails is reported failed
|
|
52
|
+
(`not_signed`, `bad_signature`, `untrusted_phone`) and never runs. Messages to a session are checked the same way by
|
|
53
|
+
the hook (over the message id, this computer, the session and the exact text, within a day) and dropped otherwise.
|
|
54
|
+
So a compromise of Glow's servers, or of your Glow account without your phone, can't run anything here.
|
|
55
|
+
- **Not take Glow's word for it.** The runner refuses, on your computer: a repo outside `--repo` when you gave it; a
|
|
56
|
+
folder Claude Code hasn't been trusted in (`claude -p` skips that question, and a repo's own `.claude` settings and
|
|
57
|
+
hooks would apply); a repo with more than one main checkout unless you pinned one (`--repo owner/name=path`; its
|
|
58
|
+
worktrees aren't copies: it runs in the main one); and a session id it has already been given. Glow sends only the
|
|
59
|
+
repo, the title and the prompt: no flag, model or effort of Glow's ever reaches `claude`. A command run inside one of
|
|
60
|
+
its sessions can't stop the runner, turn Glow off or change what it sends: besides the denied tools, `glow` refuses
|
|
61
|
+
when its environment has the session's marker (`GLOW_RUN_SESSION`, kept by `~/.glow/glow`), when a session's Claude
|
|
62
|
+
Code is among its parent processes, or when it runs in a session's process group.
|
|
63
|
+
Signed launch tokens (Glow signs each session, the computer checks it with a key it keeps) are a later step: today a
|
|
64
|
+
compromised Glow account or server could start a session within those limits, which, with full access, means a
|
|
65
|
+
command as you on this computer. Run the runner only where you'd run `claude --dangerously-skip-permissions`
|
|
66
|
+
yourself, and stop it (`glow run stop`) when you don't need it.
|
|
67
|
+
- **Say what runs here:** Glow's version on every call, and while the runner is on, Claude Code's and Codex's versions
|
|
68
|
+
(each one's `--version`), for the tags beside this computer in Glow.
|
|
69
|
+
- **Report how a session goes:** running, done, failed or stopped; the model Claude Code says it runs on; how much of
|
|
70
|
+
your Claude plan is used (a share of its fullest window, as Claude Code says once a session); turns, cost, tokens, how full its context is, how
|
|
71
|
+
many tool calls it made, failed or were turned down; and its last step as one line: a command by its program and subcommand only
|
|
72
|
+
(`$ psql …`, never its arguments), a file path relative to the repo, a search pattern or a web host. Keys and tokens
|
|
73
|
+
are masked before anything is cut, the home folder is `~`, and Glow cuts and scrubs it again.
|
|
74
|
+
- **Its transcript, for you only, for 2 days:** Claude Code's words, each tool call (a command whole, with secret-named
|
|
75
|
+
variables and keys masked), the first 600 characters of each result and its reply, each entry masked here and again
|
|
76
|
+
in Glow and cut short (4,000 characters), at most 2,000 entries and 256 KB a session. Glow keeps it in its storage
|
|
77
|
+
under the workspace, deletes it after 2 days (and with the workspace), and shows it only to the person who started
|
|
78
|
+
the session. Never file contents it wrote.
|
|
16
79
|
|
|
17
80
|
## What the key can do in Glow
|
|
18
81
|
|
|
@@ -23,5 +86,16 @@ The key (`glowc_…`, stored in Glow only as a hash) can send a session report,
|
|
|
23
86
|
messages you sent to this computer's sessions, and revoke itself. It can't read anything else in your workspace. It
|
|
24
87
|
stops working when you remove the computer, leave the workspace, or don't use it for 90 days.
|
|
25
88
|
|
|
26
|
-
Messages back: only the person who paired the computer can message its sessions, with a fresh second factor each time.
|
|
89
|
+
Messages back: only the person who paired the computer can message its sessions, with a fresh second factor each time and their Glow phone's signature, which the hook checks.
|
|
27
90
|
`npx @winding-labs/glow messages off` turns them off on the computer.
|
|
91
|
+
|
|
92
|
+
Sessions started from Glow: only the person who paired the computer can start one, in a repo linked to a product and
|
|
93
|
+
checked out on the computer, while `glow run` (0.1.10 or later) is on there, and only with their Glow phone's
|
|
94
|
+
signature (Face ID), which the computer checks. Nothing starts by itself. With the runner on, the key can
|
|
95
|
+
also say which linked repos are checked out, pick up a waiting session (Glow hands the prompt over once and then
|
|
96
|
+
deletes it) and report its status. Glow allows 3 at once per computer, the rest waiting their turn, and 30 a day; a session not signed in 2 minutes,
|
|
97
|
+
or signed but not picked up (in 6 hours, or 10 minutes with the runner off) fails (closed nightly at the latest, prompt deleted), and pausing or removing the computer stops
|
|
98
|
+
its sessions, as does Glow's own kill switch. Every session has full access (`--dangerously-skip-permissions`): nothing
|
|
99
|
+
asks before a command, and a task runs as you on this computer. When someone else wrote the task, or it came from a
|
|
100
|
+
capture, the session's reply goes to you only (under the session in the Agents tab), never to a channel. Only you see
|
|
101
|
+
which repos the runner found on your computer.
|