@onlooker-community/ecosystem 0.33.1 → 0.34.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/.agents/skills/beads/SKILL.md +80 -0
- package/.agents/skills/beads/agents/openai.yaml +4 -0
- package/.claude/settings.json +13 -0
- package/.claude/skills/writing-tests/SKILL.md +27 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.codex/config.toml +2 -0
- package/.codex/hooks.json +51 -0
- package/.markdownlint.json +3 -0
- package/.release-please-manifest.json +6 -6
- package/AGENTS.md +246 -0
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +56 -1
- package/docs/lesson-promotion-pipeline.md +210 -0
- package/docs/superpowers/plans/2026-08-09-lesson-transform.md +1537 -0
- package/docs/superpowers/specs/2026-08-09-lesson-transform-design.md +261 -0
- package/package.json +3 -2
- package/plugins/assayer/.claude-plugin/plugin.json +1 -1
- package/plugins/assayer/CHANGELOG.md +7 -0
- package/plugins/assayer/scripts/lib/assayer-config.sh +6 -0
- package/plugins/curator/.claude-plugin/plugin.json +1 -1
- package/plugins/curator/CHANGELOG.md +7 -0
- package/plugins/curator/scripts/lib/curator-emit.sh +2 -1
- package/plugins/historian/.claude-plugin/plugin.json +1 -1
- package/plugins/historian/CHANGELOG.md +7 -0
- package/plugins/historian/scripts/lib/historian-emit.sh +2 -1
- package/plugins/librarian/.claude-plugin/plugin.json +1 -1
- package/plugins/librarian/CHANGELOG.md +14 -0
- package/plugins/librarian/config.json +4 -0
- package/plugins/librarian/schema/PROVENANCE.json +7 -0
- package/plugins/librarian/schema/lesson-applies-to.subschema.json +74 -0
- package/plugins/librarian/schema/lesson-evidence.subschema.json +36 -0
- package/plugins/librarian/scripts/hooks/librarian-session-end.sh +26 -0
- package/plugins/librarian/scripts/lib/librarian-cli.sh +2 -1
- package/plugins/librarian/scripts/lib/librarian-emit.sh +2 -1
- package/plugins/librarian/scripts/lib/librarian-lesson-storage.sh +135 -0
- package/plugins/librarian/scripts/lib/librarian-lesson-transform.sh +311 -0
- package/plugins/librarian/scripts/lib/librarian-lesson-validate.sh +140 -0
- package/plugins/tribunal/.claude-plugin/plugin.json +1 -1
- package/plugins/tribunal/CHANGELOG.md +7 -0
- package/plugins/tribunal/scripts/lib/tribunal-aggregate.sh +3 -1
- package/plugins/tribunal/scripts/lib/tribunal-gate.sh +2 -1
- package/scripts/lib/prompt-rules.sh +6 -1
- package/scripts/lint/check-lesson-schema-drift.mjs +36 -0
- package/test/bats/archivist-inject.bats +1 -1
- package/test/bats/assayer-extract.bats +2 -2
- package/test/bats/bursar-session-start.bats +3 -3
- package/test/bats/cartographer-lock.bats +3 -3
- package/test/bats/compass-sanitizer.bats +11 -11
- package/test/bats/compass-transcript.bats +2 -2
- package/test/bats/config.bats +15 -15
- package/test/bats/curator-session-start.bats +10 -3
- package/test/bats/emit-payload-default.bats +52 -0
- package/test/bats/governor-ledger.bats +1 -1
- package/test/bats/historian-prompt-submit.bats +1 -1
- package/test/bats/inspector-post-write-hook.bats +4 -4
- package/test/bats/librarian-cli.bats +16 -16
- package/test/bats/librarian-lesson-transform.bats +609 -0
- package/test/bats/librarian-session-start.bats +2 -2
- package/test/bats/lineage-config.bats +1 -1
- package/test/bats/lineage-redact.bats +5 -5
- package/test/bats/session-tracker.bats +4 -4
- package/test/bats/tribunal-jury.bats +1 -1
- package/test/bats/turn-tracker.bats +1 -1
- package/test/bats/warden-sanitizer.bats +3 -3
- package/test/bats/worktree-tracker.bats +2 -2
- package/test/node/lesson-schema-drift.test.mjs +28 -0
- package/test/node/lesson-validate-agreement.test.mjs +154 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: beads
|
|
3
|
+
description: Use when working in a repository that uses bd or Beads for durable project task tracking, issue dependencies, blocker management, multi-session handoff, or shared work memory. Trigger when the user asks to find ready work, claim or close tasks, create follow-up work, inspect blockers, recover project context, or choose between local planning and persistent project tracking.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Beads
|
|
7
|
+
|
|
8
|
+
Use Beads as the shared project task system. Local plans, scratch files, and personal memories are useful, but they are not the durable source of truth for project work.
|
|
9
|
+
|
|
10
|
+
## First Step
|
|
11
|
+
|
|
12
|
+
Run:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bd prime
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
If that prints nothing, check whether the repository has an active Beads workspace:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
bd where
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Preferred Route
|
|
25
|
+
|
|
26
|
+
Use the `bd` CLI when shell access is available. It is the most compact and direct Beads interface.
|
|
27
|
+
|
|
28
|
+
## Core CLI Workflow
|
|
29
|
+
|
|
30
|
+
1. Find work:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
bd ready
|
|
34
|
+
bd list --status=open
|
|
35
|
+
bd list --status=in_progress
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
2. Inspect before editing:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
bd show <id>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
3. Claim work atomically:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
bd update <id> --claim
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
4. Create durable follow-up work when implementation reveals new tasks:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
bd create "Short title" --description="Why this exists and what needs to be done" --type=task --priority=2
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
5. Close completed work:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
bd close <id> --reason="Completed"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## What Belongs In Beads
|
|
63
|
+
|
|
64
|
+
Use Beads for:
|
|
65
|
+
|
|
66
|
+
- shared project tasks
|
|
67
|
+
- blockers and dependencies
|
|
68
|
+
- discovered follow-up work
|
|
69
|
+
- work that must survive thread reset, compaction, or handoff
|
|
70
|
+
- status that another person or agent should be able to resume
|
|
71
|
+
|
|
72
|
+
Use agent-local planning tools only for the current turn's execution checklist. Do not treat them as shared project state.
|
|
73
|
+
|
|
74
|
+
## Rules
|
|
75
|
+
|
|
76
|
+
- Do not create markdown TODO files as the source of truth when Beads is available.
|
|
77
|
+
- Do not use `bd edit`; it opens an interactive editor. Use `bd update` flags instead.
|
|
78
|
+
- Prefer `--json` when parsing `bd` output programmatically.
|
|
79
|
+
- If hooks are installed, `bd prime` may already be injected. Run it manually when context is missing.
|
|
80
|
+
- Do not auto-close or mutate tasks unless the work is actually complete.
|
package/.claude/settings.json
CHANGED
|
@@ -160,6 +160,33 @@ _seed_artifact() {
|
|
|
160
160
|
}
|
|
161
161
|
```
|
|
162
162
|
|
|
163
|
+
## Gate every assertion: non-final `[[ ]]` needs `|| return 1`
|
|
164
|
+
|
|
165
|
+
`bats` resolves `#!/usr/bin/env bash`, which on macOS is the system bash 3.2.
|
|
166
|
+
Under 3.2 a failing **non-final** `[[ ]]` does **not** fail the test body —
|
|
167
|
+
execution continues and the test reports `ok`. Single-bracket `[ ]`, failing
|
|
168
|
+
commands, and failing command substitutions all gate correctly even there; the
|
|
169
|
+
defect is specific to `[[ ]]`. Under bash 5.x (what CI runs) it gates properly,
|
|
170
|
+
so a broken assertion passes locally and only CI would catch it.
|
|
171
|
+
|
|
172
|
+
Only the **last** assertion in a test body is safe, because a body's exit
|
|
173
|
+
status is its last command. Any `[[ ]]` before that needs explicit gating:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
@test "example" {
|
|
177
|
+
[[ "$output" == *"expected"* ]] || return 1 # non-final — must gate
|
|
178
|
+
[ "$status" -eq 0 ] # final — gates on its own
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Do **not** "fix" this by swapping to `[ ]`. Most of these assertions rely on
|
|
183
|
+
`[[ ]]`-only behavior — `==` glob patterns, `=~` regex, internal `&&`/`||` —
|
|
184
|
+
and a blanket swap silently changes what they test.
|
|
185
|
+
|
|
186
|
+
When you add an assertion, break it on purpose once and confirm the test fails.
|
|
187
|
+
A test that passes whether or not the code is correct is worse than no test,
|
|
188
|
+
because it reports coverage that does not exist.
|
|
189
|
+
|
|
163
190
|
## Anti-patterns
|
|
164
191
|
|
|
165
192
|
Don't hand-roll these — each has bitten the suite before:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ecosystem",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.1",
|
|
4
4
|
"description": "Observability substrate for Claude Code. Provides the shared $ONLOOKER_DIR storage root (default $HOME/.onlooker), canonical schema-validated event emission, session and tool tracking hooks, and prompt rules. Required by all other Onlooker plugins.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Onlooker Community",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PostCompact": [
|
|
4
|
+
{
|
|
5
|
+
"hooks": [
|
|
6
|
+
{
|
|
7
|
+
"command": "bd codex-hook PostCompact",
|
|
8
|
+
"statusMessage": "Scheduling Beads context refresh",
|
|
9
|
+
"type": "command"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"matcher": "manual|auto"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"PreCompact": [
|
|
16
|
+
{
|
|
17
|
+
"hooks": [
|
|
18
|
+
{
|
|
19
|
+
"command": "bd codex-hook PreCompact",
|
|
20
|
+
"statusMessage": "Checking Beads context",
|
|
21
|
+
"type": "command"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"matcher": "manual|auto"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"SessionStart": [
|
|
28
|
+
{
|
|
29
|
+
"hooks": [
|
|
30
|
+
{
|
|
31
|
+
"command": "bd codex-hook SessionStart",
|
|
32
|
+
"statusMessage": "Loading Beads context",
|
|
33
|
+
"type": "command"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"matcher": "startup|resume|clear"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"UserPromptSubmit": [
|
|
40
|
+
{
|
|
41
|
+
"hooks": [
|
|
42
|
+
{
|
|
43
|
+
"command": "bd codex-hook UserPromptSubmit",
|
|
44
|
+
"statusMessage": "Refreshing Beads context",
|
|
45
|
+
"type": "command"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
}
|
package/.markdownlint.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
".": "0.
|
|
2
|
+
".": "0.34.1",
|
|
3
3
|
"plugins/archivist": "0.3.1",
|
|
4
|
-
"plugins/tribunal": "1.1.
|
|
4
|
+
"plugins/tribunal": "1.1.3",
|
|
5
5
|
"plugins/echo": "0.3.1",
|
|
6
6
|
"plugins/cartographer": "0.3.1",
|
|
7
7
|
"plugins/governor": "0.3.2",
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
"plugins/scribe": "0.4.2",
|
|
10
10
|
"plugins/counsel": "0.5.1",
|
|
11
11
|
"plugins/warden": "0.3.1",
|
|
12
|
-
"plugins/librarian": "0.
|
|
13
|
-
"plugins/curator": "0.2.
|
|
14
|
-
"plugins/historian": "0.3.
|
|
15
|
-
"plugins/assayer": "1.1.
|
|
12
|
+
"plugins/librarian": "0.7.1",
|
|
13
|
+
"plugins/curator": "0.2.3",
|
|
14
|
+
"plugins/historian": "0.3.3",
|
|
15
|
+
"plugins/assayer": "1.1.3",
|
|
16
16
|
"plugins/bursar": "0.3.0",
|
|
17
17
|
"plugins/lineage": "0.2.2",
|
|
18
18
|
"plugins/inspector": "0.3.2"
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Agent Instructions
|
|
2
|
+
|
|
3
|
+
This project uses **bd** (beads) for issue tracking. Run `bd prime` for full workflow context.
|
|
4
|
+
|
|
5
|
+
> **Architecture in one line:** Issues live in a local Dolt database
|
|
6
|
+
> (`.beads/dolt/`); cross-machine sync uses `bd dolt push/pull` (a
|
|
7
|
+
> git-compatible protocol), stored under `refs/dolt/data` on your git
|
|
8
|
+
> remote — separate from `refs/heads/*` where your code lives.
|
|
9
|
+
> `.beads/issues.jsonl` is a passive export, not the wire protocol.
|
|
10
|
+
>
|
|
11
|
+
> See [SYNC_CONCEPTS.md](https://github.com/gastownhall/beads/blob/main/docs/SYNC_CONCEPTS.md)
|
|
12
|
+
> for the one-screen overview and anti-patterns (don't treat JSONL as the
|
|
13
|
+
> source of truth; don't `bd import` during normal operation; don't
|
|
14
|
+
> reach for third-party Dolt hosting before trying the default).
|
|
15
|
+
|
|
16
|
+
## Quick Reference
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
bd ready # Find available work
|
|
20
|
+
bd show <id> # View issue details
|
|
21
|
+
bd update <id> --claim # Claim work atomically
|
|
22
|
+
bd close <id> # Complete work
|
|
23
|
+
bd dolt push # Push beads data to remote
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Non-Interactive Shell Commands
|
|
27
|
+
|
|
28
|
+
**ALWAYS use non-interactive flags** with file operations to avoid hanging on confirmation prompts.
|
|
29
|
+
|
|
30
|
+
Shell commands like `cp`, `mv`, and `rm` may be aliased to include `-i` (interactive) mode on some systems, causing the agent to hang indefinitely waiting for y/n input.
|
|
31
|
+
|
|
32
|
+
**Use these forms instead:**
|
|
33
|
+
```bash
|
|
34
|
+
# Force overwrite without prompting
|
|
35
|
+
cp -f source dest # NOT: cp source dest
|
|
36
|
+
mv -f source dest # NOT: mv source dest
|
|
37
|
+
rm -f file # NOT: rm file
|
|
38
|
+
|
|
39
|
+
# For recursive operations
|
|
40
|
+
rm -rf directory # NOT: rm -r directory
|
|
41
|
+
cp -rf source dest # NOT: cp -r source dest
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Other commands that may prompt:**
|
|
45
|
+
- `scp` - use `-o BatchMode=yes` for non-interactive
|
|
46
|
+
- `ssh` - use `-o BatchMode=yes` to fail instead of prompting
|
|
47
|
+
- `apt-get` - use `-y` flag
|
|
48
|
+
- `brew` - use `HOMEBREW_NO_AUTO_UPDATE=1` env var
|
|
49
|
+
|
|
50
|
+
<!-- The sections below are mirrored from CLAUDE.md. The two files are
|
|
51
|
+
independent — not symlinked, not sharing an inode — so an edit to the
|
|
52
|
+
repository's conventions must land in both or agents get different
|
|
53
|
+
instructions depending on which file their harness reads. Claude Code
|
|
54
|
+
reads CLAUDE.md; Codex and several other tools read this one. -->
|
|
55
|
+
|
|
56
|
+
## Repository layout
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
ecosystem/ ← substrate plugin (always-on observability)
|
|
60
|
+
hooks/ ← session, tool, and prompt hooks
|
|
61
|
+
scripts/lib/ ← shared bash helpers and the canonical event emitter
|
|
62
|
+
skills/ ← user-invocable slash commands
|
|
63
|
+
config.json ← ecosystem defaults
|
|
64
|
+
|
|
65
|
+
plugins/
|
|
66
|
+
archivist/ ← session memory across context truncation
|
|
67
|
+
bursar/ ← multi-session, per-project budget rollup (governor's cross-session view)
|
|
68
|
+
cartographer/ ← instruction-file auditor (CLAUDE.md, AGENTS.md, rules/)
|
|
69
|
+
compass/ ← pre-write alignment gate (design phase)
|
|
70
|
+
echo/ ← prompt-change regression detection
|
|
71
|
+
governor/ ← resource governance and budget enforcement
|
|
72
|
+
inspector/ ← per-edit lint and typecheck gate
|
|
73
|
+
lineage/ ← per-change provenance ("why does this line exist?")
|
|
74
|
+
tribunal/ ← multi-agent quality gate (Actor → Jury → Meta-Judge → Gate)
|
|
75
|
+
|
|
76
|
+
docs/
|
|
77
|
+
architecture.md ← how plugins compose and share the event bus
|
|
78
|
+
adr/ ← ecosystem-level architectural decisions
|
|
79
|
+
|
|
80
|
+
scripts/lib/onlooker-event.mjs ← canonical event builder; all plugins route through this
|
|
81
|
+
~/.onlooker/ ← shared runtime storage (logs, plugin artifacts)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Plugin map
|
|
85
|
+
|
|
86
|
+
| Plugin | Hook surface | When it fires |
|
|
87
|
+
|--------|-------------|---------------|
|
|
88
|
+
| ecosystem | SessionStart/End, PreToolUse, PostToolUse, PostToolUseFailure, UserPromptSubmit, UserPromptExpansion, PreCompact, PostCompact, TaskCreated, TaskCompleted, WorktreeCreate, WorktreeRemove | Always — substrate |
|
|
89
|
+
| archivist | PreCompact, SessionStart | Extracts decisions/dead-ends on compaction; reinjects at next SessionStart |
|
|
90
|
+
| cartographer | SessionStart, PostToolUse (Write, Edit, MultiEdit) | Audits instruction files on session start and after instruction-file writes |
|
|
91
|
+
| compass | PreToolUse (Write, Edit, MultiEdit, Bash) | Before any write — alignment check |
|
|
92
|
+
| echo | Stop | Regression-tests prompt changes after each agent stop |
|
|
93
|
+
| governor | SessionStart, PreToolUse (Task), PostToolUse (Task), Stop | Budget gates on subagent spawns; tracks spend per session |
|
|
94
|
+
| tribunal | Stop + skill invocation | Post-task quality gate; also invokable via `/tribunal` |
|
|
95
|
+
| warden | PostToolUse (WebFetch, Read), PreToolUse (Write, Edit, MultiEdit, Bash), SessionStart + skill invocation | Scans ingested content for injection; closes a content gate that blocks write-class tools until cleared via `/warden` |
|
|
96
|
+
| assayer | Stop | Verifies the agent's final-message claims against actual command results in the transcript; advisory |
|
|
97
|
+
| bursar | SessionStart, SessionEnd | Rolls each session's spend into a per-project ledger on SessionEnd; surfaces "this project burned $X this week" at SessionStart. Governor is per-session; bursar is the cross-session rollup |
|
|
98
|
+
| lineage | PostToolUse (Edit, Write, MultiEdit) + skill invocation | Records per-change provenance (session_id/turn + redacted, size-capped snippets) into a per-project ledger; `/lineage <file>:<line>` answers "why does this line exist?" by joining records to historian transcripts to recover prompt context |
|
|
99
|
+
| inspector | PostToolUse (Write, Edit, MultiEdit) | Per-edit verification: runs the project's configured lint + typecheck commands on just the touched file and emits `inspector.check.*` / `inspector.run.completed`. Surfaces issues to the agent for the next turn. Cheaper than the planned proctor (which runs the full project verify at Stop); complements assayer (which catches claims the agent makes without running anything) |
|
|
100
|
+
|
|
101
|
+
Plugins communicate by emitting events to the JSONL log — they do not call each other directly. All plugins depend on the ecosystem substrate; no plugin depends on another plugin directly.
|
|
102
|
+
|
|
103
|
+
## Compass plugin (design phase)
|
|
104
|
+
|
|
105
|
+
Compass is the pre-write alignment gate. It has no implementation yet. Design lives in `plugins/compass/docs/design.md`.
|
|
106
|
+
|
|
107
|
+
**What it does:** Fires on `PreToolUse` for write-class tools. Samples N=5 parallel Haiku evaluators to score intent clarity. Blocks when `confidence < 0.65 OR stddev > 0.20` and surfaces a clarification prompt.
|
|
108
|
+
|
|
109
|
+
**Critical architectural decision (ADR-001):** The evaluator must see the **prior assistant turn** alongside the current context — not the current context alone. Evaluating a reply in isolation produces a systematic false-positive class: a user answering an agent's enumerated question ("the internal one") looks ambiguous without the question that prompted it.
|
|
110
|
+
|
|
111
|
+
The pipeline is:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
Trigger Gate → Transcript Reader → Symbolic Skip Layer → Sanitizer → N=5 Evaluators → Gate
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- **Transcript reader** resolves `prior_assistant_turn` from `transcript_path` in the hook JSON payload (same field tribunal-stop-gate.sh reads). Reads one turn back from that file (already committed before `PreToolUse` fires — no timing-skew risk). If `transcript_path` is absent or unreadable, proceeds with an empty prior turn.
|
|
118
|
+
- **Symbolic skip layer** short-circuits to `confident` when the prior turn is an enumerated question and the current context is an option reference, without an LLM call. Controlled by `skip_patterns.reply_to_question.enabled` (default `true`).
|
|
119
|
+
- **Evaluator prompt** uses a structured pair: `<prior_assistant_turn>` and `<context_excerpt>` as separate XML-delimited slots. The convergence question is: *"Given the prior assistant turn as context, would two independent readers converge on the same interpretation of this write?"*
|
|
120
|
+
|
|
121
|
+
See `plugins/compass/docs/adr/001-evaluate-prompts-in-context.md` for the full decision record.
|
|
122
|
+
|
|
123
|
+
## Adding a new plugin
|
|
124
|
+
|
|
125
|
+
1. Create `plugins/<name>/` with `.claude-plugin/plugin.json`, `config.json`, `hooks/hooks.json`.
|
|
126
|
+
2. Use `scripts/lib/onlooker-event.mjs` for all event emission — never write directly to the JSONL log.
|
|
127
|
+
3. Store runtime artifacts under `${ONLOOKER_DIR:-$HOME/.onlooker}/<name>/<project-key>/`. Always use `$ONLOOKER_DIR` — never hardcode `~/.onlooker` — so the test suite's isolated temp home is respected.
|
|
128
|
+
4. Derive the project key via `tribunal_project_key` (or equivalent) — first 12 hex chars of SHA256(`remote:<origin-url>`), falling back to SHA256(`root:<repo-root>`) for repos without a remote. See `plugins/tribunal/scripts/lib/tribunal-project-key.sh`.
|
|
129
|
+
5. Register event types in `@onlooker-community/schema` before emitting them. The runtime emitter is dependency-free and **fails open**: it validates against the schema package only when that package is resolvable (dev, CI, tests) and emits unconditionally otherwise, because installed marketplace plugins ship no `node_modules`. Schema drift is caught in CI against the published schemas at `schema.onlooker.dev`. See [ADR-005](docs/adr/005-runtime-emitter-fails-open.md).
|
|
130
|
+
6. Fail-soft when `~/.onlooker/` is absent — plugins must not block a session they were not invited to.
|
|
131
|
+
|
|
132
|
+
## Development
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
mise install # installs all tools declared in mise.toml
|
|
136
|
+
npm ci
|
|
137
|
+
npm test # bats + schema validation
|
|
138
|
+
npm run test:ci # shellcheck + bats + schema + lint
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Tests use an isolated temp home; nothing writes to your real `~/.onlooker/`.
|
|
142
|
+
|
|
143
|
+
## Git workflow
|
|
144
|
+
|
|
145
|
+
**Always open a PR — never push directly to `main`.** Even though bypass rights allow direct pushes, this repo uses release-please for automated changelogs and versioning, so every change must travel through a PR to be picked up correctly. CI also runs on PRs before merge, catching failures before they land.
|
|
146
|
+
|
|
147
|
+
Workflow:
|
|
148
|
+
1. Create a feature branch: `git switch -c <type>/<short-description>`
|
|
149
|
+
2. Commit using `/commit`
|
|
150
|
+
3. Push the branch and open a PR using `/git-workflow:pr`
|
|
151
|
+
4. Wait for CI to pass before merging
|
|
152
|
+
|
|
153
|
+
## Conventions
|
|
154
|
+
|
|
155
|
+
- All hooks are bash scripts. No Python, no Node entry points in hook scripts (they may shell out to `node` for event emission or heavy lifting).
|
|
156
|
+
- Hook scripts source shared helpers from `scripts/lib/` (or the plugin's own `scripts/lib/`).
|
|
157
|
+
- Event types follow `<plugin>.<noun>.<verb>` — e.g. `compass.check.skipped`, `tribunal.gate.blocked`.
|
|
158
|
+
- ULIDs everywhere for IDs (not UUIDs). Each plugin ships its own `*_ulid` helper (e.g. `archivist-ulid.sh`, `tribunal-ulid.sh`); there is no shared ecosystem helper. Copy `plugins/tribunal/scripts/lib/tribunal-ulid.sh` as a starting point and rename the function prefix.
|
|
159
|
+
- Config defaults live in `config.json`. User overrides go in `~/.claude/settings.json` (global) or `.claude/settings.json` (per-project) under the plugin's namespace key (e.g. `"compass"`, `"tribunal"`). See ADR-004.
|
|
160
|
+
|
|
161
|
+
<!-- BEGIN BEADS INTEGRATION v:1 profile:minimal hash:970c3bf2 -->
|
|
162
|
+
## Beads Issue Tracker
|
|
163
|
+
|
|
164
|
+
This project uses **bd (beads)** for issue tracking. Run `bd prime` to see full workflow context and commands.
|
|
165
|
+
|
|
166
|
+
### Quick Reference
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
bd ready # Find available work
|
|
170
|
+
bd show <id> # View issue details
|
|
171
|
+
bd update <id> --claim # Claim work
|
|
172
|
+
bd close <id> # Complete work
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Rules
|
|
176
|
+
|
|
177
|
+
- Use `bd` for ALL task tracking — do NOT use TodoWrite, TaskCreate, or markdown TODO lists
|
|
178
|
+
- Run `bd prime` for detailed command reference and session close protocol
|
|
179
|
+
- Use `bd remember` for persistent knowledge — do NOT use MEMORY.md files
|
|
180
|
+
|
|
181
|
+
**Architecture in one line:** issues live in a local Dolt DB; sync uses `refs/dolt/data` on your git remote; `.beads/issues.jsonl` is a passive export. See <https://github.com/gastownhall/beads/blob/main/docs/SYNC_CONCEPTS.md> for details and anti-patterns.
|
|
182
|
+
|
|
183
|
+
## Agent Context Profiles
|
|
184
|
+
|
|
185
|
+
The managed Beads block is task-tracking guidance, not permission to override repository, user, or orchestrator instructions.
|
|
186
|
+
|
|
187
|
+
- **Conservative (default)**: Use `bd` for task tracking. Do not run git commits, git pushes, or Dolt remote sync unless explicitly asked. At handoff, report changed files, validation, and suggested next commands.
|
|
188
|
+
- **Minimal**: Keep tool instruction files as pointers to `bd prime`; use the same conservative git policy unless active instructions say otherwise.
|
|
189
|
+
- **Team-maintainer**: Only when the repository explicitly opts in, agents may close beads, run quality gates, commit, and push as part of session close. A current "do not commit" or "do not push" instruction still wins.
|
|
190
|
+
|
|
191
|
+
## Session Completion
|
|
192
|
+
|
|
193
|
+
This protocol applies when ending a Beads implementation workflow. It is subordinate to explicit user, repository, and orchestrator instructions.
|
|
194
|
+
|
|
195
|
+
1. **File issues for remaining work** - Create beads for anything that needs follow-up
|
|
196
|
+
2. **Run quality gates** (if code changed) - Tests, linters, builds
|
|
197
|
+
3. **Update issue status** - Close finished work, update in-progress items
|
|
198
|
+
4. **Handle git/sync by active profile**:
|
|
199
|
+
```bash
|
|
200
|
+
# Conservative/minimal/default: report status and proposed commands; wait for approval.
|
|
201
|
+
git status
|
|
202
|
+
|
|
203
|
+
# Team-maintainer opt-in only, unless current instructions forbid it:
|
|
204
|
+
git pull --rebase
|
|
205
|
+
bd dolt push
|
|
206
|
+
git push
|
|
207
|
+
git status
|
|
208
|
+
```
|
|
209
|
+
5. **Hand off** - Summarize changes, validation, issue status, and any blocked sync/commit/push step
|
|
210
|
+
|
|
211
|
+
**Critical rules:**
|
|
212
|
+
- Explicit user or orchestrator instructions override this Beads block.
|
|
213
|
+
- Do not commit or push without clear authority from the active profile or the current user request.
|
|
214
|
+
- If a required sync or push is blocked, stop and report the exact command and error.
|
|
215
|
+
<!-- END BEADS INTEGRATION -->
|
|
216
|
+
|
|
217
|
+
<!-- The Codex block below repeats the "Beads Issue Tracker" heading from the
|
|
218
|
+
integration block above. Both are generated and re-synced by different `bd`
|
|
219
|
+
subcommands, so neither heading can be renamed by hand without breaking
|
|
220
|
+
idempotent regeneration. These comments sit outside the BEGIN/END markers
|
|
221
|
+
so `bd` does not clobber them when it rewrites the block. -->
|
|
222
|
+
<!-- markdownlint-disable MD024 -->
|
|
223
|
+
<!-- BEGIN BEADS CODEX SETUP: generated by bd setup codex -->
|
|
224
|
+
## Beads Issue Tracker
|
|
225
|
+
|
|
226
|
+
Use Beads (`bd`) for durable task tracking in repositories that include it. Use the `beads` skill at `.agents/skills/beads/SKILL.md` (project install) or `~/.agents/skills/beads/SKILL.md` (global install) for Beads workflow guidance, then use the `bd` CLI for issue operations.
|
|
227
|
+
|
|
228
|
+
### Quick Reference
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
bd ready # Find available work
|
|
232
|
+
bd show <id> # View issue details
|
|
233
|
+
bd update <id> --claim # Claim work
|
|
234
|
+
bd close <id> # Complete work
|
|
235
|
+
bd prime # Refresh Beads context
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Rules
|
|
239
|
+
|
|
240
|
+
- Use `bd` for all task tracking; do not create markdown TODO lists.
|
|
241
|
+
- Run `bd prime` when Beads context is missing or stale. Codex 0.129.0+ can load Beads context automatically through native hooks; use `/hooks` to inspect or toggle them.
|
|
242
|
+
- Keep persistent project memory in Beads via `bd remember`; do not create ad hoc memory files.
|
|
243
|
+
|
|
244
|
+
**Architecture in one line:** issues live in a local Dolt DB; sync uses `refs/dolt/data` on your git remote; `.beads/issues.jsonl` is a passive export. See <https://github.com/gastownhall/beads/blob/main/docs/SYNC_CONCEPTS.md> for details and anti-patterns.
|
|
245
|
+
<!-- END BEADS CODEX SETUP -->
|
|
246
|
+
<!-- markdownlint-enable MD024 -->
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.34.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.34.0...ecosystem-v0.34.1) (2026-08-10)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* make the local bats suite tell the truth :mag: ([#135](https://github.com/onlooker-community/ecosystem/issues/135)) ([f0763e0](https://github.com/onlooker-community/ecosystem/commit/f0763e09f3caf2d39c89f28befd12567af0af845))
|
|
9
|
+
|
|
10
|
+
## [0.34.0](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.33.1...ecosystem-v0.34.0) (2026-08-09)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* **librarian:** transform artifacts into shareable lesson candidates :microscope: ([#132](https://github.com/onlooker-community/ecosystem/issues/132)) ([48adbc7](https://github.com/onlooker-community/ecosystem/commit/48adbc7ec572b96b47f1be5f92810088c98702c6))
|
|
16
|
+
|
|
3
17
|
## [0.33.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.33.0...ecosystem-v0.33.1) (2026-08-02)
|
|
4
18
|
|
|
5
19
|
|
package/CLAUDE.md
CHANGED
|
@@ -94,7 +94,7 @@ Tests use an isolated temp home; nothing writes to your real `~/.onlooker/`.
|
|
|
94
94
|
Workflow:
|
|
95
95
|
1. Create a feature branch: `git switch -c <type>/<short-description>`
|
|
96
96
|
2. Commit using `/commit`
|
|
97
|
-
3. Push the branch and open a PR using `/git:
|
|
97
|
+
3. Push the branch and open a PR using `/git-workflow:pr`
|
|
98
98
|
4. Wait for CI to pass before merging
|
|
99
99
|
|
|
100
100
|
## Conventions
|
|
@@ -104,3 +104,58 @@ Workflow:
|
|
|
104
104
|
- Event types follow `<plugin>.<noun>.<verb>` — e.g. `compass.check.skipped`, `tribunal.gate.blocked`.
|
|
105
105
|
- ULIDs everywhere for IDs (not UUIDs). Each plugin ships its own `*_ulid` helper (e.g. `archivist-ulid.sh`, `tribunal-ulid.sh`); there is no shared ecosystem helper. Copy `plugins/tribunal/scripts/lib/tribunal-ulid.sh` as a starting point and rename the function prefix.
|
|
106
106
|
- Config defaults live in `config.json`. User overrides go in `~/.claude/settings.json` (global) or `.claude/settings.json` (per-project) under the plugin's namespace key (e.g. `"compass"`, `"tribunal"`). See ADR-004.
|
|
107
|
+
|
|
108
|
+
<!-- BEGIN BEADS INTEGRATION v:1 profile:minimal hash:6cd5cc61 -->
|
|
109
|
+
## Beads Issue Tracker
|
|
110
|
+
|
|
111
|
+
This project uses **bd (beads)** for issue tracking. Run `bd prime` to see full workflow context and commands.
|
|
112
|
+
|
|
113
|
+
### Quick Reference
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
bd ready # Find available work
|
|
117
|
+
bd show <id> # View issue details
|
|
118
|
+
bd update <id> --claim # Claim work
|
|
119
|
+
bd close <id> # Complete work
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Rules
|
|
123
|
+
|
|
124
|
+
- Use `bd` for ALL task tracking — do NOT use TodoWrite, TaskCreate, or markdown TODO lists
|
|
125
|
+
- Run `bd prime` for detailed command reference and session close protocol
|
|
126
|
+
- Use `bd remember` for persistent knowledge — do NOT use MEMORY.md files
|
|
127
|
+
|
|
128
|
+
**Architecture in one line:** issues live in a local Dolt DB; sync uses `refs/dolt/data` on your git remote; `.beads/issues.jsonl` is a passive export. See <https://github.com/gastownhall/beads/blob/main/docs/SYNC_CONCEPTS.md> for details and anti-patterns.
|
|
129
|
+
|
|
130
|
+
## Agent Context Profiles
|
|
131
|
+
|
|
132
|
+
The managed Beads block is task-tracking guidance, not permission to override repository, user, or orchestrator instructions.
|
|
133
|
+
|
|
134
|
+
- **Conservative (default)**: Use `bd` for task tracking. Do not run git commits, git pushes, or Dolt remote sync unless explicitly asked. At handoff, report changed files, validation, and suggested next commands.
|
|
135
|
+
- **Minimal**: Keep tool instruction files as pointers to `bd prime`; use the same conservative git policy unless active instructions say otherwise.
|
|
136
|
+
- **Team-maintainer**: Only when the repository explicitly opts in, agents may close beads, run quality gates, commit, and push as part of session close. A current "do not commit" or "do not push" instruction still wins.
|
|
137
|
+
|
|
138
|
+
## Session Completion
|
|
139
|
+
|
|
140
|
+
This protocol applies when ending a Beads implementation workflow. It is subordinate to explicit user, repository, and orchestrator instructions.
|
|
141
|
+
|
|
142
|
+
1. **File issues for remaining work** - Create beads for anything that needs follow-up
|
|
143
|
+
2. **Run quality gates** (if code changed) - Tests, linters, builds
|
|
144
|
+
3. **Update issue status** - Close finished work, update in-progress items
|
|
145
|
+
4. **Handle git/sync by active profile**:
|
|
146
|
+
```bash
|
|
147
|
+
# Conservative/minimal/default: report status and proposed commands; wait for approval.
|
|
148
|
+
git status
|
|
149
|
+
|
|
150
|
+
# Team-maintainer opt-in only, unless current instructions forbid it:
|
|
151
|
+
git pull --rebase
|
|
152
|
+
git push
|
|
153
|
+
git status
|
|
154
|
+
```
|
|
155
|
+
5. **Hand off** - Summarize changes, validation, issue status, and any blocked sync/commit/push step
|
|
156
|
+
|
|
157
|
+
**Critical rules:**
|
|
158
|
+
- Explicit user or orchestrator instructions override this Beads block.
|
|
159
|
+
- Do not commit or push without clear authority from the active profile or the current user request.
|
|
160
|
+
- If a required sync or push is blocked, stop and report the exact command and error.
|
|
161
|
+
<!-- END BEADS INTEGRATION -->
|