@bookedsolid/rea 0.26.1 → 0.28.0

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 (45) hide show
  1. package/README.md +16 -3
  2. package/agents/adversarial-test-specialist.md +113 -0
  3. package/agents/ast-parser-specialist.md +92 -0
  4. package/agents/codex-adversarial.md +50 -97
  5. package/agents/figma-dx-specialist.md +112 -0
  6. package/agents/mcp-protocol-specialist.md +94 -0
  7. package/agents/observability-specialist.md +103 -0
  8. package/agents/rea-orchestrator.md +25 -5
  9. package/agents/shell-scripting-specialist.md +101 -0
  10. package/commands/codex-review.md +62 -59
  11. package/data/claims/helix-022.json +51 -0
  12. package/data/claims/helix-023.json +44 -0
  13. package/data/claims/helix-024.json +72 -0
  14. package/data/claims/helix-028.json +23 -0
  15. package/data/claims/helix-031.json +27 -0
  16. package/dist/cli/hook.d.ts +78 -4
  17. package/dist/cli/hook.js +291 -4
  18. package/dist/cli/index.js +6 -0
  19. package/dist/cli/preflight.d.ts +12 -0
  20. package/dist/cli/preflight.js +65 -4
  21. package/dist/cli/status.d.ts +6 -0
  22. package/dist/cli/status.js +7 -0
  23. package/dist/cli/verify-claim.d.ts +149 -0
  24. package/dist/cli/verify-claim.js +386 -0
  25. package/dist/gateway/downstream-pool.d.ts +17 -0
  26. package/dist/gateway/downstream-pool.js +1 -0
  27. package/dist/gateway/downstream.d.ts +25 -0
  28. package/dist/gateway/downstream.js +40 -0
  29. package/dist/gateway/live-state.d.ts +12 -0
  30. package/dist/gateway/live-state.js +1 -0
  31. package/dist/hooks/bash-scanner/walker.js +196 -0
  32. package/dist/hooks/push-gate/codex-runner.d.ts +9 -0
  33. package/dist/hooks/push-gate/codex-runner.js +14 -1
  34. package/dist/hooks/push-gate/findings.d.ts +27 -0
  35. package/dist/hooks/push-gate/findings.js +87 -0
  36. package/dist/hooks/push-gate/index.js +58 -4
  37. package/dist/hooks/push-gate/policy.d.ts +15 -0
  38. package/dist/hooks/push-gate/policy.js +82 -0
  39. package/dist/policy/loader.d.ts +20 -0
  40. package/dist/policy/loader.js +12 -0
  41. package/dist/policy/types.d.ts +31 -0
  42. package/hooks/_lib/cmd-segments.sh +10 -0
  43. package/hooks/blocked-paths-bash-gate.sh +12 -0
  44. package/hooks/protected-paths-bash-gate.sh +21 -0
  45. package/package.json +2 -1
@@ -169,6 +169,37 @@ export interface ReviewPolicy {
169
169
  * a `rea.push_gate.verdict_flip` audit event and overwrite the cache.
170
170
  */
171
171
  cache_ttl_ms?: number;
172
+ /**
173
+ * 0.28.0 helix-029 — path-scoped finding filter. Gitignore-style
174
+ * globs against repo-relative paths. Findings whose `file` matches
175
+ * any glob in this list are filtered OUT before the verdict is
176
+ * computed, but are still emitted on stderr (so the operator can
177
+ * file them upstream). Useful for downstream consumers of rea who
178
+ * cannot patch rea-managed paths but should not be blocked from
179
+ * pushing while waiting on an upstream fix.
180
+ *
181
+ * Setting this list also enables `auto_exclude_managed` by default —
182
+ * paths from `.rea/install-manifest.json` are excluded in addition
183
+ * to whatever globs are listed here. Pass `auto_exclude_managed:
184
+ * false` to opt out and rely on `exclude_paths` alone.
185
+ *
186
+ * Empty (or unset) → no filtering, pre-0.28.0 behavior.
187
+ *
188
+ * The audit shape is unchanged; the gate emits a
189
+ * `filtered_findings_count` counter into the audit metadata so
190
+ * operators can grep `rea.push_gate.reviewed` to see how many
191
+ * findings were suppressed without re-parsing prose.
192
+ */
193
+ exclude_paths?: string[];
194
+ /**
195
+ * 0.28.0 helix-029 — derived default. When `exclude_paths` is set,
196
+ * defaults to `true` — paths from `.rea/install-manifest.json` are
197
+ * excluded in addition to the explicit globs. Set explicitly to
198
+ * `false` to rely only on `exclude_paths`. When `exclude_paths` is
199
+ * unset, this field is a no-op (no filter is active in the first
200
+ * place).
201
+ */
202
+ auto_exclude_managed?: boolean;
172
203
  /**
173
204
  * Local-first review enforcement (0.26.0+ — CTO directive 2026-05-05).
174
205
  *
@@ -162,6 +162,11 @@ _rea_unwrap_at_depth() {
162
162
  local _unwrap_sep
163
163
  _unwrap_sep=$'\x1c\x1d'
164
164
  local masked
165
+ # shellcheck disable=SC1078
166
+ # SC1078 fires inside the awk program because shellcheck's bash parser
167
+ # cannot model awk's nested-quote semantics (`'\''` here is the
168
+ # bash-to-awk single-apostrophe escape pattern, not an unclosed shell
169
+ # string). Verified false-positive — the awk program parses cleanly.
165
170
  masked=$(printf '%s%s' "$cmd" "$_unwrap_sep" | awk '
166
171
  BEGIN { RS = "\034\035" }
167
172
  {
@@ -527,6 +532,11 @@ _rea_split_segments() {
527
532
  # records; the existing pipeline then quote-masks and splits each
528
533
  # record independently. Inner payload anchors trigger words for the
529
534
  # `any_segment_*` checks downstream.
535
+ # shellcheck disable=SC1078
536
+ # SC1078 fires inside the awk program because shellcheck's bash parser
537
+ # cannot model awk's nested-quote semantics (`'\''` here is the
538
+ # bash-to-awk single-apostrophe escape pattern, not an unclosed shell
539
+ # string). Verified false-positive — the awk program parses cleanly.
530
540
  _rea_unwrap_nested_shells "$cmd" \
531
541
  | awk '
532
542
  BEGIN {
@@ -105,6 +105,18 @@ if [ "$sandbox_status" -ne 0 ] || [ "$sandbox_check" != "ok" ]; then
105
105
  exit 2
106
106
  fi
107
107
 
108
+ # 0.28.0 helix-027 (bash total-lockout postmortem) — version-probe per
109
+ # shim. See protected-paths-bash-gate.sh for the full rationale; this
110
+ # shim mirrors the behavior to detect a stale CLI before payload reach.
111
+ probe_out=$("${REA_ARGV[@]}" hook scan-bash --help 2>&1)
112
+ probe_status=$?
113
+ if [ "$probe_status" -ne 0 ] || ! printf '%s' "$probe_out" | grep -q -e 'scan-bash' -e '--mode'; then
114
+ printf 'rea: this shim requires the `rea hook scan-bash` subcommand (introduced in 0.23.0).\n' >&2
115
+ printf 'The resolved CLI at %s does not implement it.\n' "$RESOLVED_CLI_PATH" >&2
116
+ printf 'Run `pnpm install` (or `npm install`) to sync the CLI to the version this shim expects.\n' >&2
117
+ exit 2
118
+ fi
119
+
108
120
  payload=$(cat)
109
121
  if [ -z "$payload" ]; then
110
122
  exit 0
@@ -183,6 +183,27 @@ if [ "$sandbox_status" -ne 0 ] || [ "$sandbox_check" != "ok" ]; then
183
183
  exit 2
184
184
  fi
185
185
 
186
+ # 0.28.0 helix-027 (bash total-lockout postmortem) — version-probe per
187
+ # shim. The 0.23.0+ scan-bash subcommand is required; if the resolved
188
+ # CLI is older than 0.23.0 it will refuse with "unknown command" and the
189
+ # shim's exit-code dispatch lands on the catch-all "exit 2" branch
190
+ # WITHOUT explaining why. That was the symptom that locked Jake's
191
+ # helix workspace out of every Bash tool until he ran `pnpm install`.
192
+ #
193
+ # The probe runs `rea hook scan-bash --help` once per shim invocation
194
+ # (~30 LOC) and refuses with an actionable message if the subcommand
195
+ # does not exist. Probe failure is fail-closed (exit 2) — same posture
196
+ # the rest of the shim takes — but the message tells the operator
197
+ # exactly what to do (`pnpm install`).
198
+ probe_out=$("${REA_ARGV[@]}" hook scan-bash --help 2>&1)
199
+ probe_status=$?
200
+ if [ "$probe_status" -ne 0 ] || ! printf '%s' "$probe_out" | grep -q -e 'scan-bash' -e '--mode'; then
201
+ printf 'rea: this shim requires the `rea hook scan-bash` subcommand (introduced in 0.23.0).\n' >&2
202
+ printf 'The resolved CLI at %s does not implement it.\n' "$RESOLVED_CLI_PATH" >&2
203
+ printf 'Run `pnpm install` (or `npm install`) to sync the CLI to the version this shim expects.\n' >&2
204
+ exit 2
205
+ fi
206
+
186
207
  # Capture stdin once and forward it to the CLI.
187
208
  payload=$(cat)
188
209
  if [ -z "$payload" ]; then
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bookedsolid/rea",
3
- "version": "0.26.1",
3
+ "version": "0.28.0",
4
4
  "description": "Agentic governance layer for Claude Code — policy enforcement, hook-based safety gates, audit logging, and Codex-integrated adversarial review for AI-assisted projects",
5
5
  "license": "MIT",
6
6
  "author": "Booked Solid Technology <oss@bookedsolid.tech> (https://bookedsolid.tech)",
@@ -46,6 +46,7 @@
46
46
  "profiles/",
47
47
  "templates/",
48
48
  "scripts/",
49
+ "data/",
49
50
  ".husky/",
50
51
  "LICENSE",
51
52
  "README.md",