@webpresso/plugin-claude 0.0.15 → 0.0.17

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.
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Webpresso app Claude Code plugin: blueprints, skills, hooks, MCP server",
9
- "version": "0.0.15"
9
+ "version": "0.0.17"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -27,5 +27,5 @@
27
27
  "renames": {
28
28
  "agent-kit": "wp"
29
29
  },
30
- "version": "0.0.15"
30
+ "version": "0.0.17"
31
31
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wp",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "Webpresso app: blueprints, skills, lore commit protocol, tech-debt lifecycle",
5
5
  "author": {
6
6
  "name": "Webpresso",
@@ -9,7 +9,7 @@
9
9
  "skills": "./skills",
10
10
  "commands": "./commands",
11
11
  "mcpServers": {
12
- "webpresso": {
12
+ "wp": {
13
13
  "command": "${CLAUDE_PLUGIN_ROOT}/bin/wp",
14
14
  "args": ["mcp"],
15
15
  "env": {
package/bin/wp CHANGED
@@ -17,8 +17,11 @@
17
17
  # when the admitted repository's own .git/worktrees/*/gitdir names it.
18
18
  # 3. else (no checkout ancestor at all) the nearest ancestor
19
19
  # .webpressorc.json: its top-level exact-semver "runtime" pin
20
- # -> ~/.webpresso/runtimes/<pin>/wp (missing = error)
21
- # 4. else the newest stable ~/.webpresso/runtimes/<x.y.z>/wp
20
+ # -> ~/.webpresso/versions/<pin>/bin/wp, else the legacy
21
+ # ~/.webpresso/runtimes/<pin>/wp (missing = error)
22
+ # 4. else the installer's active release ~/.webpresso/current/bin/wp, else
23
+ # the newest stable ~/.webpresso/versions/<x.y.z>/bin/wp, else the legacy
24
+ # newest stable ~/.webpresso/runtimes/<x.y.z>/wp
22
25
  # 5. else a named error, exit 127 — never a different runtime. A pre-shim
23
26
  # ~/.webpresso/bin/wp is never run implicitly (nothing in it proves it is
24
27
  # a release rather than a development build); name it with
@@ -110,7 +113,12 @@ is_exact_semver() {
110
113
  return 0
111
114
  }
112
115
 
113
- runtimes_dir=${HOME:-}/.webpresso/runtimes
116
+ # Release layout literals; src/runtime/runtime-selector-vocab.ts (WP_RELEASE_LAYOUTS)
117
+ # is the authority and bin/wp-shim.subprocess.test.ts asserts both directions.
118
+ webpresso_home=${HOME:-}/.webpresso
119
+ current_release=$webpresso_home/current/bin/wp
120
+ versions_dir=$webpresso_home/versions
121
+ runtimes_dir=$webpresso_home/runtimes
114
122
 
115
123
  # Sets PIN to the top-level "runtime" of $1 (empty when absent). The document
116
124
  # is opened non-blocking, must be a regular file, and is read through a
@@ -146,33 +154,50 @@ read_pin() {
146
154
  return 1
147
155
  }
148
156
 
149
- choose_latest_release() {
150
- best=
157
+ # Sets BEST to the newest stable x.y.z under directory $1 whose release binary
158
+ # is "$1/<version>/$2" (an executable file); empty when there is none.
159
+ scan_releases() {
160
+ BEST=
151
161
  best_major=
152
162
  best_minor=
153
163
  best_patch=
154
- for entry in "$runtimes_dir"/*/; do
164
+ for entry in "$1"/*/; do
155
165
  [ -d "$entry" ] || continue
156
166
  entry=${entry%/}
157
167
  version=${entry##*/}
158
168
  is_exact_semver "$version" stable || continue
159
- [ -f "$entry/wp" ] && [ -x "$entry/wp" ] || continue
169
+ [ -f "$entry/$2" ] && [ -x "$entry/$2" ] || continue
160
170
  major=${version%%.*}
161
171
  rest=${version#*.}
162
172
  minor=${rest%%.*}
163
173
  patch=${rest#*.}
164
- if [ -z "$best" ] ||
174
+ if [ -z "$BEST" ] ||
165
175
  [ "$major" -gt "$best_major" ] ||
166
176
  { [ "$major" -eq "$best_major" ] && [ "$minor" -gt "$best_minor" ]; } ||
167
177
  { [ "$major" -eq "$best_major" ] && [ "$minor" -eq "$best_minor" ] && [ "$patch" -gt "$best_patch" ]; }; then
168
- best=$version
178
+ BEST=$version
169
179
  best_major=$major
170
180
  best_minor=$minor
171
181
  best_patch=$patch
172
182
  fi
173
183
  done
174
- if [ -n "$best" ]; then
175
- choose latest-release "$runtimes_dir/$best/wp"
184
+ }
185
+
186
+ # The installer's active release (the current link) wins, then the newest
187
+ # versions/x.y.z/bin/wp, then the legacy runtimes/x.y.z/wp.
188
+ choose_latest_release() {
189
+ if [ -f "$current_release" ] && [ -x "$current_release" ]; then
190
+ choose current-release "$current_release"
191
+ return 0
192
+ fi
193
+ scan_releases "$versions_dir" bin/wp
194
+ if [ -n "$BEST" ]; then
195
+ choose latest-release "$versions_dir/$BEST/bin/wp"
196
+ return 0
197
+ fi
198
+ scan_releases "$runtimes_dir" wp
199
+ if [ -n "$BEST" ]; then
200
+ choose latest-release "$runtimes_dir/$BEST/wp"
176
201
  return 0
177
202
  fi
178
203
  return 1
@@ -189,14 +214,15 @@ choose_release() {
189
214
  read_pin "$rc_file" || fail pin-invalid "$rc_file $PIN_PROBLEM."
190
215
  if [ -n "$PIN" ]; then
191
216
  is_exact_semver "$PIN" || fail pin-invalid "$rc_file pins runtime \"$PIN\"; use an exact version such as 1.2.3 (no ranges)."
192
- pinned=$runtimes_dir/$PIN/wp
193
- [ -f "$pinned" ] && [ -x "$pinned" ] || fail pin-not-installed "$rc_file pins runtime $PIN, but $pinned is not installed under $runtimes_dir."
217
+ pinned=$versions_dir/$PIN/bin/wp
218
+ [ -f "$pinned" ] && [ -x "$pinned" ] || pinned=$runtimes_dir/$PIN/wp
219
+ [ -f "$pinned" ] && [ -x "$pinned" ] || fail pin-not-installed "$rc_file pins runtime $PIN, but it is installed under neither $versions_dir/$PIN/bin/wp nor $runtimes_dir/$PIN/wp."
194
220
  choose pinned-release "$pinned"
195
221
  return 0
196
222
  fi
197
223
  fi
198
224
  choose_latest_release && return 0
199
- fail no-release-installed "no webpresso source checkout above $PWD and no release under $runtimes_dir; install the Webpresso app, or name a runtime explicitly with WEBPRESSO_WP_BIN (for example a pre-shim \$HOME/.webpresso/bin/wp release) or WP_FORCE_JIT_PATH (a source checkout)."
225
+ fail no-release-installed "no webpresso source checkout above $PWD and no release at $current_release, under $versions_dir or under $runtimes_dir; install the Webpresso app, or name a runtime explicitly with WEBPRESSO_WP_BIN (for example a pre-shim \$HOME/.webpresso/bin/wp release) or WP_FORCE_JIT_PATH (a source checkout)."
200
226
  }
201
227
 
202
228
  : "${WEBPRESSO_WP_BIN:=}"
package/commands/audit.md CHANGED
@@ -2,7 +2,7 @@
2
2
  description: Run a webpresso audit
3
3
  ---
4
4
 
5
- Use the `wp_audit` tool when the requested audit is available through MCP.
5
+ Use the `audit` tool when the requested audit is available through MCP.
6
6
  For humans or MCP-unavailable hosts, use the global `wp audit <kind>` CLI
7
7
  compatibility path. Never use a repo-local `./bin/wp` launcher as the normal
8
8
  agent path. Common `kind` values include `guardrails`, `quality`,
@@ -4,24 +4,24 @@ description: Manage blueprints via focused MCP tools
4
4
 
5
5
  Use the focused blueprint MCP tools.
6
6
 
7
- - `wp_blueprint_projects` — discover visible projects and worktrees
8
- - `wp_blueprint_list` — list blueprints
9
- - `wp_blueprint_get` — fetch one blueprint with freshness metadata
10
- - `wp_blueprint_context` — assemble bounded task context
11
- - `wp_blueprint_create` — create a draft blueprint; requires `project_id` and accepts optional `request_id` and `head_at_ingest` for retry-safe, stale-write-safe creation
12
- - `wp_blueprint_put` — whole-document structured authoring; writes the canonical blueprint markdown from typed input and returns revision metadata
13
- - `wp_blueprint_transition` — optimistic-concurrency lifecycle transition; requires `expected_version` and returns updated revision metadata
14
- - `wp_blueprint_task_next` — return the next ready task; accepts optional `project_id` when the current cwd is a multi-repo workspace container
15
- - `wp_blueprint_task_advance` — change task status (non-`done`); requires `project_id` and `slug` (task ids are not unique across blueprints, so `slug` scopes the mutation to the right one), and accepts optional `request_id` and `head_at_ingest` for retry-safe mutation
16
- - `wp_blueprint_task_verify` — mark a task `done` with evidence; accepts optional `request_id` and `head_at_ingest` for retry-safe verification
17
- - `wp_blueprint_promote` / `wp_blueprint_finalize` — accept optional `project_id` for nested-workspace disambiguation
7
+ - `blueprint_projects` — discover visible projects and worktrees
8
+ - `blueprint_list` — list blueprints
9
+ - `blueprint_get` — fetch one blueprint with freshness metadata
10
+ - `blueprint_context` — assemble bounded task context
11
+ - `blueprint_create` — create a draft blueprint; requires `project_id` and accepts optional `request_id` and `head_at_ingest` for retry-safe, stale-write-safe creation
12
+ - `blueprint_put` — whole-document structured authoring; writes the canonical blueprint markdown from typed input and returns revision metadata
13
+ - `blueprint_transition` — optimistic-concurrency lifecycle transition; requires `expected_version` and returns updated revision metadata
14
+ - `blueprint_task_next` — return the next ready task; accepts optional `project_id` when the current cwd is a multi-repo workspace container
15
+ - `blueprint_task_advance` — change task status (non-`done`); requires `project_id` and `slug` (task ids are not unique across blueprints, so `slug` scopes the mutation to the right one), and accepts optional `request_id` and `head_at_ingest` for retry-safe mutation
16
+ - `blueprint_task_verify` — mark a task `done` with evidence; accepts optional `request_id` and `head_at_ingest` for retry-safe verification
17
+ - `blueprint_promote` / `blueprint_finalize` — accept optional `project_id` for nested-workspace disambiguation
18
18
 
19
19
  Guidance:
20
20
 
21
- - Prefer `project_id` from `wp_blueprint_projects` when multiple repos are visible.
21
+ - Prefer `project_id` from `blueprint_projects` when multiple repos are visible.
22
22
  - Use `request_id` for retry-safe mutations and reuse it only with the same payload.
23
23
  - Carry `head_at_ingest` from read/context tools into stale-write-sensitive mutations.
24
- - Author documents through `wp_blueprint_put`, then lifecycle with `wp_blueprint_transition`.
25
- - Deferred `wp_blueprint_patch` semantic ops (`add_task`, `update_task`, `set_summary`, `replace_decision`) are future layers; patch is **not** part of the v1 canonical surface.
26
- - MCP Apps editor support is a follow-on enhancement over `wp_blueprint_put` / `wp_blueprint_transition`.
24
+ - Author documents through `blueprint_put`, then lifecycle with `blueprint_transition`.
25
+ - Deferred `blueprint_patch` semantic ops (`add_task`, `update_task`, `set_summary`, `replace_decision`) are future layers; patch is **not** part of the v1 canonical surface.
26
+ - MCP Apps editor support is a follow-on enhancement over `blueprint_put` / `blueprint_transition`.
27
27
  - Hosts without MCP Apps support keep using the structured tools above.
package/commands/qa.md CHANGED
@@ -2,4 +2,4 @@
2
2
  description: Run lint + typecheck + tests in parallel via webpresso MCP
3
3
  ---
4
4
 
5
- Use the `wp_qa` tool to run lint, typecheck, and tests in parallel. No arguments required; the tool aggregates structured results from each sub-tool.
5
+ Use the `qa` tool to run lint, typecheck, and tests in parallel. No arguments required; the tool aggregates structured results from each sub-tool.
package/commands/test.md CHANGED
@@ -2,4 +2,4 @@
2
2
  description: Run tests via the webpresso MCP server
3
3
  ---
4
4
 
5
- Use the `wp_test` tool to run tests. Pass `packages` or `files` as arguments based on what the user asks for.
5
+ Use the `test` tool to run tests. Pass `packages` or `files` as arguments based on what the user asks for.
package/hooks/hooks.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "hooks": [
6
6
  {
7
7
  "type": "command",
8
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook sessionstart-routing <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-sessionstart-routing",
8
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook sessionstart-routing <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook sessionstart-routing <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-sessionstart-routing",
9
9
  "timeout": 5
10
10
  }
11
11
  ]
@@ -13,11 +13,11 @@
13
13
  ],
14
14
  "PreToolUse": [
15
15
  {
16
- "matcher": "Grep|Read|Write|Edit|MultiEdit|Workflow|mcp__.*wp_session_(?:batch_)?execute$|mcp__.*(?:wp_blueprint_errata)$",
16
+ "matcher": "Grep|Read|Write|Edit|MultiEdit|Workflow|mcp__(?:plugin_[a-z0-9-]+_)?wp__session_(?:batch_)?execute$|mcp__(?:plugin_[a-z0-9-]+_)?wp__(?:blueprint_errata)$",
17
17
  "hooks": [
18
18
  {
19
19
  "type": "command",
20
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook pretool-guard <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"deny\\\",\\\"permissionDecisionReason\\\":\\\"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor\\\"}}\"; printf '%s\\n' \"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor\" >&2; exit 2; fi; else printf '%s\\n' '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app\"}}'; printf '%s\\n' 'GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app' >&2; exit 2; fi # wp-pretool-guard",
20
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook pretool-guard <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook pretool-guard <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"deny\\\",\\\"permissionDecisionReason\\\":\\\"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor${hook_cause:+ (cause: $hook_cause)}\\\"}}\"; printf '%s\\n' \"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor${hook_cause:+ (cause: $hook_cause)}\" >&2; exit 2; fi; else printf '%s\\n' '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app\"}}'; printf '%s\\n' 'GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app' >&2; exit 2; fi # wp-pretool-guard",
21
21
  "timeout": 5
22
22
  }
23
23
  ]
@@ -27,7 +27,7 @@
27
27
  "hooks": [
28
28
  {
29
29
  "type": "command",
30
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook pretool-guard <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"deny\\\",\\\"permissionDecisionReason\\\":\\\"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor\\\"}}\"; printf '%s\\n' \"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor\" >&2; exit 2; fi; else printf '%s\\n' '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app\"}}'; printf '%s\\n' 'GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app' >&2; exit 2; fi # wp-pretool-guard",
30
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook pretool-guard <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook pretool-guard <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"permissionDecision\\\":\\\"deny\\\",\\\"permissionDecisionReason\\\":\\\"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor${hook_cause:+ (cause: $hook_cause)}\\\"}}\"; printf '%s\\n' \"GUARD_PRETOOL_FAILURE: pretool-guard exit $hook_status; run wp hooks doctor${hook_cause:+ (cause: $hook_cause)}\" >&2; exit 2; fi; else printf '%s\\n' '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app\"}}'; printf '%s\\n' 'GUARD_PRETOOL_FAILURE: wp missing; set WEBPRESSO_WP_BIN or install the app' >&2; exit 2; fi # wp-pretool-guard",
31
31
  "timeout": 5
32
32
  }
33
33
  ]
@@ -39,7 +39,7 @@
39
39
  "hooks": [
40
40
  {
41
41
  "type": "command",
42
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook post-tool <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-post-tool",
42
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook post-tool <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook post-tool <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-post-tool",
43
43
  "timeout": 5
44
44
  }
45
45
  ]
@@ -50,7 +50,7 @@
50
50
  "hooks": [
51
51
  {
52
52
  "type": "command",
53
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook guard-switch <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-guard-switch",
53
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook guard-switch <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook guard-switch <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-guard-switch",
54
54
  "timeout": 5
55
55
  }
56
56
  ]
@@ -61,7 +61,7 @@
61
61
  "hooks": [
62
62
  {
63
63
  "type": "command",
64
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook stop-qa <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-stop-qa",
64
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook stop-qa <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook stop-qa <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-stop-qa",
65
65
  "timeout": 5
66
66
  }
67
67
  ]
@@ -70,7 +70,7 @@
70
70
  "hooks": [
71
71
  {
72
72
  "type": "command",
73
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook stop-ultragoal <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-stop-ultragoal",
73
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook stop-ultragoal <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook stop-ultragoal <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-stop-ultragoal",
74
74
  "timeout": 5
75
75
  }
76
76
  ]
@@ -81,7 +81,7 @@
81
81
  "hooks": [
82
82
  {
83
83
  "type": "command",
84
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook precompact-snapshot <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-precompact-snapshot",
84
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook precompact-snapshot <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook precompact-snapshot <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-precompact-snapshot",
85
85
  "timeout": 5
86
86
  }
87
87
  ]
@@ -92,7 +92,7 @@
92
92
  "hooks": [
93
93
  {
94
94
  "type": "command",
95
- "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; kill -TERM \"$$\"' TERM; env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook permission-request <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-permission-request",
95
+ "command": "if [ -n \"${CLAUDE_PLUGIN_ROOT}\" ] && [ -x \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" ]; then hook_err=$(mktemp 2>/dev/null) || hook_err=''; hook_pid=''; exec 3<&0; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -INT \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -INT \"$$\"' INT; trap 'trap - INT TERM; if [ -n \"$hook_pid\" ]; then kill -TERM \"$hook_pid\" 2>/dev/null || true; wait \"$hook_pid\" 2>/dev/null || true; fi; [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; kill -TERM \"$$\"' TERM; if [ -n \"$hook_err\" ]; then env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook permission-request <&3 2>\"$hook_err\" & else env WP_HOOK_HOST='claude' \"${CLAUDE_PLUGIN_ROOT}/bin/wp\" hook permission-request <&3 & fi; hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; [ -z \"$hook_err\" ] || cat \"$hook_err\" >&2; hook_cause=$(grep -m1 '^wp-shim: error' \"$hook_err\" 2>/dev/null | cut -c1-160 | LC_ALL=C tr -c 'A-Za-z0-9 ._:/\\n-' '?'); [ -z \"$hook_err\" ] || rm -f \"$hook_err\"; if [ \"$hook_status\" -eq 2 ]; then exit 2; elif [ \"$hook_status\" -ne 0 ]; then true; fi; else true; fi # wp-permission-request",
96
96
  "timeout": 5
97
97
  }
98
98
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webpresso/plugin-claude",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "private": false,
5
5
  "description": "Claude Code plugin adapter for the Webpresso app (wp CLI) skills, commands, and MCP runtime.",
6
6
  "homepage": "https://github.com/webpresso/app#readme",
@@ -2,14 +2,17 @@
2
2
  "schemaVersion": 1,
3
3
  "host": "claude",
4
4
  "packageName": "@webpresso/plugin-claude",
5
- "packageVersion": "0.0.15",
5
+ "packageVersion": "0.0.17",
6
6
  "runtimeDirs": [".claude/skills"],
7
7
  "skills": {
8
8
  "ai-deslop": {
9
9
  "digest": "sha256:cf07df5835037f10401400e220c1c923f5325a6149d59c231ce316e10595fdfc"
10
10
  },
11
+ "antigravity": {
12
+ "digest": "sha256:729c4dd74e5c6394c31de23d04f664140088ee58ddfc57f3a2751394945a938b"
13
+ },
11
14
  "autopilot": {
12
- "digest": "sha256:6a72b2db563a48742c501f20d509050f193a5d31f2d413f6bef838f277d470c1"
15
+ "digest": "sha256:8355f6ddc6e53e68ada49248bdd8d8beb0069ed09d3f2d346debc2401270445c"
13
16
  },
14
17
  "autoresearch": {
15
18
  "digest": "sha256:b4d51cd53beb4a3271827172dfbd0b1d27bd58761ca07a35d49a5d6324b87fdf"
@@ -21,19 +24,19 @@
21
24
  "digest": "sha256:21fd24862e7f7c8a1feadea6bc376492b136b99fc381cf1b8927c9db80615431"
22
25
  },
23
26
  "claude": {
24
- "digest": "sha256:0205d693121b740b76041f1e25925a70d665774f7493070cdd6df40d0058ffe6"
27
+ "digest": "sha256:63b7afb2b65f65fb142e5ef142f80516be00c54d449c5fa7d7897bcaa6cae657"
25
28
  },
26
29
  "codex": {
27
- "digest": "sha256:88837502404449b641b71dbc4f018c75dab6294ad98af29d41de50e98649ff0e"
30
+ "digest": "sha256:574669e040141e9986e362e9f46e3176aa47eccfda0f4589205d9d6d65e57b8d"
28
31
  },
29
32
  "deep-interview": {
30
- "digest": "sha256:79fbf86a86024a311583a1500bb6960c82ad1383cc9f8ed3f04bbace41848ff7"
33
+ "digest": "sha256:6feeaa35de63a0e1f39dbe2882ca91a72928a058f138d4d79e70d81d09209693"
31
34
  },
32
35
  "deep-research": {
33
36
  "digest": "sha256:ece766cb18869317d7c8992fc562920b03250ff8c44bdcb9eccdc3b21922a83f"
34
37
  },
35
38
  "delivery-program": {
36
- "digest": "sha256:ebd6b35036c12fa26ff98649ac57ede607b7b3526c401784670a5ce68369a691"
39
+ "digest": "sha256:a2222cc04fb5366026b951273e4e5d5d8c296d426d51706da8a6b56761a4567f"
37
40
  },
38
41
  "design-review": {
39
42
  "digest": "sha256:5b213735e2842568774572f36b198bccf03c03a54b2732484aadd023f04acb23"
@@ -42,22 +45,22 @@
42
45
  "digest": "sha256:306355888da0827e3523022077f731845726bbaaf595ca12515cc91d8605b5e6"
43
46
  },
44
47
  "fix": {
45
- "digest": "sha256:4804c546291316439aad3ea05fb7d3f043bc191abd8b9c180eb1d349f19f64cf"
48
+ "digest": "sha256:aa5caa229f0a56290bd6ad4487f41fd2933ac9e9cf4fdf2191f04a559bf66943"
46
49
  },
47
50
  "handoff": {
48
- "digest": "sha256:eda4410dc75019b40b1ffae5f301bfc1e57d9313241d170e4743d379a1b6d846"
51
+ "digest": "sha256:5d40899f54fabe3f6ec8f99b417345a433850585086570872a137a1d0d837002"
49
52
  },
50
53
  "hooks-doctor": {
51
- "digest": "sha256:9d9147e842246955f284854c35cf57237d4d056dca23f4c66019e1b44bb09eb6"
54
+ "digest": "sha256:6169e2b4b3638b9b5430811cd44e7952a54685b6f6556ebe81a9aee8ade1a3e0"
52
55
  },
53
56
  "investigate": {
54
- "digest": "sha256:778b3a1f38323e8dd6101c6ace26ff8aada1246b20952b3641d5d1049bc50055"
57
+ "digest": "sha256:b6d82b2dc76297167a8fb75422d1f7037c4b9f0c74186cc4a2d719246764ca7e"
55
58
  },
56
59
  "lore-protocol": {
57
60
  "digest": "sha256:a80fbacc765e8b886437b9fdf7dd71e1ceb1b98b939078ec90fc88d06a8b4c69"
58
61
  },
59
62
  "opencode-go": {
60
- "digest": "sha256:a304b282fa078f97c2aa6a7d040d30eaae4c735de0aa5edf3af7368f62491804"
63
+ "digest": "sha256:9498e4f9d9c1b8ee2355d9ca57c65eaf2a3a9dbc2ba11ef0c4b0428769949f05"
61
64
  },
62
65
  "plan-ceo-review": {
63
66
  "digest": "sha256:4d426158518dd71f8998770e8d4037bcbfa3c65d7265a93a4a78a9b015ba881e"
@@ -72,31 +75,31 @@
72
75
  "digest": "sha256:b728dad90254d4c9f81b3818321d34ab53519b79ce20ff3bfe08bfacb2aa3e86"
73
76
  },
74
77
  "plan-refine": {
75
- "digest": "sha256:cf2c0743a81b0d8954417482e7812212a6a90e5046926c44cd82a6a309dfdc26"
78
+ "digest": "sha256:8a0e38564627565d267b347a0361eb222b9ba230961998c2d6812874ea7cf608"
76
79
  },
77
80
  "ralplan": {
78
- "digest": "sha256:d3e8ab6285f9882d18ee9feabf51bb6dd9d81f8aaa243c050e9eeaa3436927af"
81
+ "digest": "sha256:95d02771d3e3a46d225b1bf9dd12a33e83c9e0dbe2c126aad24986c4cb1d98a3"
79
82
  },
80
83
  "team": {
81
- "digest": "sha256:c27107b46e0cd7b9c264a6f51f74f505920d63e7ee2a2d26d2f288592fd10bd2"
84
+ "digest": "sha256:e403a5a92d145e777d7a344fe8fc6fe5df44640691aa2319b6dfd50b909166f5"
82
85
  },
83
86
  "tech-debt": {
84
- "digest": "sha256:2018bf8dc5f338baee3d982a5bf28c48773befea08e44f33b70561c18d897c56"
87
+ "digest": "sha256:fd2f8e26e006c9c5ed5ef6f1678c3f7472a35dfd2f743e58f7ec348606399353"
85
88
  },
86
89
  "testing-philosophy": {
87
90
  "digest": "sha256:23fdad944b089de3cfcd13957a5ac10c37bd3d136b192029af69368bca1470db"
88
91
  },
89
92
  "tooling-friction": {
90
- "digest": "sha256:64992c6a789d0283b7379a914d7686af5db97fe48cb5929f800a11d8f8e8f126"
93
+ "digest": "sha256:6f94949b6910d88ff974a95f4cd67bbaca05579db88fbeacc50126a13faf800b"
91
94
  },
92
95
  "tph": {
93
96
  "digest": "sha256:bed3684a850651534f315d355cdeae50d951c429817df0f105cccdb7f4e1561b"
94
97
  },
95
98
  "ultragoal": {
96
- "digest": "sha256:344177e32690fe6355577abe50659cea1af682933a78eb13a11765d1a1ad66d7"
99
+ "digest": "sha256:e60091f795311fd4ee8779b60b04f835522163fcca5d27122740b66f66afeceb"
97
100
  },
98
101
  "verify": {
99
- "digest": "sha256:c77aeb48d1d605496ed3b573b598323aff439e2bc9950a4369da8b3b43886b6a"
102
+ "digest": "sha256:e1aa3baed96ef005b144e17fac8a2153b90a075b142acee2fdfba7c89e613765"
100
103
  }
101
104
  }
102
105
  }
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: antigravity
3
+ description: "Antigravity outside-voice reviewer through Webpresso MCP."
4
+ license: MIT
5
+ ---
6
+
7
+ # Antigravity outside-voice review
8
+
9
+ Use only for a requested content-bound plan or delivery review. Treat output as external advice
10
+ until independently verified.
11
+
12
+ ## MCP-only contract
13
+
14
+ - Call `review_gate` exactly once for the real plan version or delivery diff.
15
+ - Observe the same durable operation with `review_gate_wait` when needed.
16
+ - Never invoke a provider command, the legacy review CLI, or a removed review-run surface.
17
+ - If the review MCP is unavailable, stop and report it unavailable. There is no CLI fallback.
18
+
19
+ ## Gate call
20
+
21
+ ```jsonc
22
+ {
23
+ "project_id": "<project>",
24
+ "slug": "<blueprint-slug>",
25
+ "purpose": "delivery",
26
+ "base_ref": "<full-base-sha>",
27
+ "authority_ref": "<full-head-sha>",
28
+ "caller_model": "<your own model id, exactly as your host reports it>",
29
+ "repository_access": "none",
30
+ }
31
+ ```
32
+
33
+ Each newly executed provider review that reaches a verdict is one formal round of the
34
+ slug's budget, and its approval is authority. An identical-subject call replays the recorded
35
+ verdict with no new review and no new round. A partial approval, withheld because adjudication
36
+ is incomplete (not every prior finding was briefed, or a briefed prior claim was marked
37
+ still-open without a matching finding), grants no authority and spends no round.
38
+
39
+ ## Reviewer selection
40
+
41
+ Pass `caller_model` with your OWN model id, exactly as your host reports it, and omit
42
+ `provider`, `model`, and `effort`: the gate selects the reviewer route itself — a cross-family
43
+ reviewer chosen for capability, current provider limits, and measured daily cost — and reports
44
+ the choice in `policy_selection`. Never name a reviewer model, probe a provider CLI for its
45
+ catalog, or read a credential store to discover models at invocation time; provider catalog
46
+ discovery belongs to the snapshot drift workflow. An operator may still pass an explicit
47
+ `provider`/`model` as a human override; agents must not.
48
+
49
+ ## Review quality
50
+
51
+ Follow `catalog/agent/rules/review-methodology-sota.md`; report typed verdict, model,
52
+ artifact, grounded findings, and independently verified conclusions.
@@ -21,11 +21,11 @@ argument-hint: "<brief|force: brief>"
21
21
  - parallel ready-set execution under ultragoal controller
22
22
 
23
23
  Drive an approved brief through `plan -> execute -> qa -> validate -> land -> complete`
24
- using `wp_ultragoal_run` / `wp ultragoal run` and the current handoff.
24
+ using `ultragoal_run` / `wp ultragoal run` and the current handoff.
25
25
 
26
26
  ## Outside-voice (required)
27
27
 
28
- After each ultragoal **phase or plan-gate milestone**, run an **OpenCode Go** outside-voice review and pick the model by purpose. The purpose→family ordering lives in one place — the committed reviewer policy rendered into the `opencode-go` skill — so follow that skill and do not restate the ordering here. Resolve IDs from live `opencode models opencode-go`. `wp_review_gate` has one mode: purpose plan for exact-version draft plan approval/auto-promotion, purpose delivery for implementation/phase review; each new provider verdict is a formal round and an approval is authority immediately. Never self-approve. Full protocol: the `ultragoal` skill. Respect `review_budget` (default owned by `workflow-skills-routing.md`): one sequential path, no multi-host stampede.
28
+ After each ultragoal **phase or plan-gate milestone**, run an outside-voice review. Pass `caller_model` with your own model id and omit `provider`/`model`/`effort`: the gate selects the cross-family reviewer route itself (capability, limits, measured daily cost) and reports it in `policy_selection`. Never resolve model ids from a live catalog at invocation time. `review_gate` has one mode: purpose plan for exact-version draft plan approval/auto-promotion, purpose delivery for implementation/phase review; each new provider verdict is a formal round and an approval is authority immediately. Never self-approve. Full protocol: the `ultragoal` skill. Respect `review_budget` (default owned by `workflow-skills-routing.md`): one sequential path, no multi-host stampede.
29
29
 
30
30
  ## Vague gate
31
31
 
@@ -45,23 +45,23 @@ skill.
45
45
 
46
46
  ## Tooling map
47
47
 
48
- | Pipeline step | Tools |
49
- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
50
- | Plan | `plan-refine`, `wp_blueprint_*`, `wp_session_capture` for decisions |
51
- | Create controller | `wp_ultragoal_new`, `wp_worktree` |
52
- | Execute | ready-set via blueprint tools; `/goal` or parallel subagents; `wp_session_context` for delegates; `wp_blueprint_task_verify` only to complete tasks |
53
- | Opportunistic repair | `/fix` up to `fix_budget`; else handoff backlog |
54
- | QA | `wp_qa` / `wp_lint` / `wp_typecheck` / `wp_test`; PR checks via `wp_pr_status` / `wp_pr_wait` |
55
- | Validate | one outside voice if merge-bound (OpenCode Go by purpose, or claude/codex); `wp review gate` for authority |
56
- | Land | `wp_pr_upsert`, green required checks, merge + owner cleanup |
57
- | Blocked / stop | `wp_ultragoal_handoff` ≤40 lines; `wp_ultragoal_cancel` if abandoned |
48
+ | Pipeline step | Tools |
49
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
50
+ | Plan | `plan-refine`, `blueprint_*`, `session_capture` for decisions |
51
+ | Create controller | `ultragoal_new`, `worktree` |
52
+ | Execute | ready-set via blueprint tools; `/goal` or parallel subagents; `session_context` for delegates; `blueprint_task_verify` only to complete tasks |
53
+ | Opportunistic repair | `/fix` up to `fix_budget`; else handoff backlog |
54
+ | QA | `qa` / `lint` / `typecheck` / `test`; PR checks via `pr_status` / `pr_wait` |
55
+ | Validate | one outside voice if merge-bound (the gate picks the cross-family reviewer from `caller_model`); `wp review gate` for authority |
56
+ | Land | `pr_upsert`, green required checks, merge + owner cleanup |
57
+ | Blocked / stop | `ultragoal_handoff` ≤40 lines; if the send channel is capped, the handoff records send-budget state (attempt count, last canary result); judgment requests ride the typed envelope or are named in the manifest; preserve the outbox, never route around a pause; `ultragoal_cancel` if abandoned |
58
58
 
59
59
  ## Pipeline
60
60
 
61
61
  1. **Plan:** refine blueprints and satisfy provenance-backed promotion approvals.
62
62
  2. **Execute:** implement current **ready** tasks in parallel up to `concurrency`; use only
63
- `wp_blueprint_task_verify` to mark them done.
64
- 3. **QA:** run affected checks and `wp_qa`; preserve normalized failure evidence. Prefer
63
+ `blueprint_task_verify` to mark them done.
64
+ 3. **QA:** run affected checks and `qa`; preserve normalized failure evidence. Prefer
65
65
  PR-bound CI when a PR exists.
66
66
  4. **Validate:** obtain verification + code-review evidence within `review_budget`. Each
67
67
  lane appends a tracked `reviews.md` record in one of these exact forms:
@@ -73,10 +73,10 @@ skill.
73
73
 
74
74
  5. **Land:** require green PR checks, complete the blueprint in the same PR, merge, and
75
75
  run owner cleanup.
76
- 6. **Complete:** stop only when `wp_ultragoal_run` records terminal evidence.
76
+ 6. **Complete:** stop only when `ultragoal_run` records terminal evidence.
77
77
 
78
78
  Resume from durable state after interruption. Obey `WP_ULTRAGOAL_DISABLE=1`,
79
79
  iteration/error/validation caps, and repository ownership. Never self-approve, directly
80
80
  mark tasks done, bypass evidence, push to main, or increase timeouts (keep every loop bounded and never increase timeouts). After every phase
81
- transition recorded by `wp ultragoal run`, obtain a fresh OpenCode Go outside review
81
+ transition recorded by `wp ultragoal run`, obtain a fresh outside-voice review
82
82
  before treating the milestone as closed (see Outside-voice above and the `ultragoal` skill).