@brutalsystems/birddog 0.0.0 → 0.1.3

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 (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -2
  3. package/bin/birddog +0 -0
  4. package/package.json +47 -2
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mike Williams
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,105 @@
1
- # @brutalsystems/birddog
1
+ # birddog
2
2
 
3
- Placeholder 0.0.0, published to create the name. See https://github.com/BrutalSystems/birddog#readme
3
+ [![license](https://img.shields.io/github/license/BrutalSystems/birddog)](./LICENSE)
4
+
5
+ birddog watches live coding-agent sessions on one machine and tells an
6
+ orchestrating agent what it observed — a session went idle, asked for input,
7
+ exited, or went quiet. It never sends a prompt, never approves anything, and
8
+ never starts, stops or restarts a session.
9
+
10
+ **birddog monitors sessions; it does not manage their work.** Stopping birddog
11
+ leaves every watched agent running.
12
+
13
+ It is the observation half of a pair: [muster](https://github.com/BrutalSystems/muster)
14
+ launches instructed agents, [tincan](https://github.com/BrutalSystems/tincan)
15
+ lets them message each other, birddog watches them.
16
+
17
+ > **Status: working, early.** Instances run, observe Claude Code sessions and
18
+ > Codex threads, report what deserves attention, and can deliver alerts into a
19
+ > Claude Code orchestrator's inbox. The opencode adapter is next. What each
20
+ > runtime actually exposes — and does not — is in
21
+ > [`docs/providers.md`](./docs/providers.md).
22
+
23
+ ## Try it
24
+
25
+ ```sh
26
+ npm i -g @brutalsystems/birddog # macOS, Apple silicon
27
+ birddog discover # what can be watched
28
+ birddog doctor # what can and cannot be observed
29
+ ```
30
+
31
+ The package carries the compiled binary, so nothing is built at install time
32
+ and no Go toolchain is needed. From a clone, or without npm:
33
+
34
+ ```sh
35
+ go build -o birddog ./cmd/birddog
36
+ ```
37
+
38
+ Then watch something. Take a `session_id` (and, for Claude Code, the `pid` and
39
+ `proc_start` beside it) from `discover` into a config — see
40
+ [`examples/`](./examples/) — and start an instance:
41
+
42
+ ```sh
43
+ birddog start --config birddog.json
44
+ birddog status --instance <id>
45
+ birddog events --instance <id> --after <cursor> --wait 30
46
+ birddog stop --instance <id>
47
+ ```
48
+
49
+ The instance keeps observing after the shell that started it is gone, and
50
+ stopping it leaves every watched session running.
51
+
52
+ ```
53
+ NAME PROVIDER STATUS PID SESSION CWD
54
+ api-refactor claude busy 41207 11111111-2222-3333-4444-555555555555 /work/api
55
+ auth-thread codex unavailable 41880 01a0c46d-1afb-7b52-80d5-f91870af433f /work/auth
56
+ checkout-7f claude idle 41996 66666666-7777-8888-9999-000000000000 /work/checkout
57
+ ```
58
+
59
+ ## Seeing more
60
+
61
+ Two things birddog cannot observe from outside a session, both opt-in and both
62
+ per-user:
63
+
64
+ ```sh
65
+ birddog hooks install # Claude Code: tool calls and permission requests
66
+ ```
67
+
68
+ ```toml
69
+ # opencode: nothing outside the process can see it at all
70
+ [plugins.birddog]
71
+ npm = "@brutalsystems/birddog-opencode"
72
+ ```
73
+
74
+ Sessions already running pick hooks up without restarting. Both preserve what
75
+ is already configured, and both can be removed.
76
+
77
+ ## What it will not tell you
78
+
79
+ Liveness is only ever reported on evidence. A Claude Code session is live when
80
+ its socket answers **and** the process at its PID is still the one the registry
81
+ recorded; a Codex thread is live when a running process holds its writer lock.
82
+ When the evidence fails, the last observed status is preserved and marked
83
+ `(stale)` rather than presented as current.
84
+
85
+ `unavailable` is a real answer, not a gap to be filled in. Codex reports its
86
+ threads as `notLoaded` to anyone who does not own them, which describes the
87
+ asking process rather than the session — so birddog says it cannot see the
88
+ state instead of guessing one.
89
+
90
+ Nor will it tell you a worker is unblocked. No provider exposes permission
91
+ requests to an outside observer today, so every target reports input-request
92
+ visibility as `unavailable`. An absence of observation is never reported as
93
+ evidence of absence — and a turn ending is not work finishing.
94
+
95
+ ## Start here
96
+
97
+ - [`docs/README.md`](./docs/README.md) — index and current status
98
+ - [`docs/decisions.md`](./docs/decisions.md) — what has been decided, and why
99
+ - [`docs/providers.md`](./docs/providers.md) — what each runtime actually
100
+ exposes to an outside observer, and what it does not
101
+
102
+ ## Scope of the first version
103
+
104
+ macOS. Claude Code, Codex and opencode. Terminal and programmatically launched
105
+ sessions. Desktop apps are out of scope.
package/bin/birddog ADDED
Binary file
package/package.json CHANGED
@@ -1,13 +1,58 @@
1
1
  {
2
2
  "name": "@brutalsystems/birddog",
3
- "version": "0.0.0",
4
- "description": "Name claim. Every version anyone installs is published by CI with provenance.",
3
+ "version": "0.1.3",
4
+ "description": "Watch live coding-agent sessions on this machine and report what they are doing. Observation only: it never prompts, approves, or starts and stops a session.",
5
+ "keywords": [
6
+ "claude-code",
7
+ "codex",
8
+ "opencode",
9
+ "agents",
10
+ "monitoring",
11
+ "observability"
12
+ ],
5
13
  "license": "MIT",
14
+ "author": "Mike Williams",
6
15
  "repository": {
7
16
  "type": "git",
8
17
  "url": "git+https://github.com/BrutalSystems/birddog.git"
9
18
  },
19
+ "bugs": {
20
+ "url": "https://github.com/BrutalSystems/birddog/issues"
21
+ },
22
+ "homepage": "https://github.com/BrutalSystems/birddog#readme",
23
+ "type": "module",
24
+ "bin": {
25
+ "birddog": "./bin/birddog"
26
+ },
27
+ "files": [
28
+ "bin/birddog"
29
+ ],
30
+ "os": [
31
+ "darwin"
32
+ ],
33
+ "cpu": [
34
+ "arm64"
35
+ ],
36
+ "engines": {
37
+ "node": ">=22"
38
+ },
10
39
  "publishConfig": {
11
40
  "access": "public"
41
+ },
42
+ "scripts": {
43
+ "prepack": "go build -trimpath -ldflags \"-s -w\" -o bin/birddog ./cmd/birddog",
44
+ "typecheck:plugin": "tsc -p tsconfig.plugin.json",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "sync-version": "node scripts/sync-version.mjs",
48
+ "check-version": "node scripts/sync-version.mjs --check",
49
+ "verify-tarball": "node scripts/verify-tarball.mjs",
50
+ "version": "node scripts/sync-version.mjs && npm run check-version && git add plugins/opencode/package.json plugins/opencode/birddog.ts internal/version/version.go",
51
+ "postversion": "git push origin HEAD --follow-tags"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "22.20.4",
55
+ "typescript": "^5.6.0",
56
+ "vitest": "^2.1.0"
12
57
  }
13
58
  }