@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/bin/wp +40 -14
- package/commands/audit.md +1 -1
- package/commands/blueprint.md +15 -15
- package/commands/qa.md +1 -1
- package/commands/test.md +1 -1
- package/hooks/hooks.json +10 -10
- package/package.json +1 -1
- package/plugin-skill-ownership.json +21 -18
- package/skills/antigravity/SKILL.md +52 -0
- package/skills/autopilot/SKILL.md +16 -16
- package/skills/claude/SKILL.md +11 -6
- package/skills/codex/SKILL.md +11 -6
- package/skills/deep-interview/SKILL.md +13 -13
- package/skills/delivery-program/SKILL.md +4 -4
- package/skills/fix/SKILL.md +31 -18
- package/skills/handoff/SKILL.md +42 -11
- package/skills/hooks-doctor/SKILL.md +11 -9
- package/skills/investigate/SKILL.md +20 -9
- package/skills/opencode-go/SKILL.md +11 -10
- package/skills/plan-refine/SKILL.md +2 -1
- package/skills/ralplan/SKILL.md +5 -1
- package/skills/team/SKILL.md +62 -18
- package/skills/tech-debt/SKILL.md +1 -1
- package/skills/tooling-friction/SKILL.md +32 -12
- package/skills/ultragoal/SKILL.md +53 -58
- package/skills/verify/SKILL.md +45 -42
|
@@ -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.
|
|
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.
|
|
30
|
+
"version": "0.0.17"
|
|
31
31
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wp",
|
|
3
|
-
"version": "0.0.
|
|
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
|
-
"
|
|
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/
|
|
21
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
150
|
-
|
|
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 "$
|
|
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
|
|
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 "$
|
|
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
|
-
|
|
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
|
-
|
|
175
|
-
|
|
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=$
|
|
193
|
-
[ -f "$pinned" ] && [ -x "$pinned" ] ||
|
|
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 `
|
|
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`,
|
package/commands/blueprint.md
CHANGED
|
@@ -4,24 +4,24 @@ description: Manage blueprints via focused MCP tools
|
|
|
4
4
|
|
|
5
5
|
Use the focused blueprint MCP tools.
|
|
6
6
|
|
|
7
|
-
- `
|
|
8
|
-
- `
|
|
9
|
-
- `
|
|
10
|
-
- `
|
|
11
|
-
- `
|
|
12
|
-
- `
|
|
13
|
-
- `
|
|
14
|
-
- `
|
|
15
|
-
- `
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
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 `
|
|
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 `
|
|
25
|
-
- Deferred `
|
|
26
|
-
- MCP Apps editor support is a follow-on enhancement over `
|
|
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 `
|
|
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 `
|
|
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__
|
|
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.
|
|
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.
|
|
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:
|
|
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:
|
|
27
|
+
"digest": "sha256:63b7afb2b65f65fb142e5ef142f80516be00c54d449c5fa7d7897bcaa6cae657"
|
|
25
28
|
},
|
|
26
29
|
"codex": {
|
|
27
|
-
"digest": "sha256:
|
|
30
|
+
"digest": "sha256:574669e040141e9986e362e9f46e3176aa47eccfda0f4589205d9d6d65e57b8d"
|
|
28
31
|
},
|
|
29
32
|
"deep-interview": {
|
|
30
|
-
"digest": "sha256:
|
|
33
|
+
"digest": "sha256:6feeaa35de63a0e1f39dbe2882ca91a72928a058f138d4d79e70d81d09209693"
|
|
31
34
|
},
|
|
32
35
|
"deep-research": {
|
|
33
36
|
"digest": "sha256:ece766cb18869317d7c8992fc562920b03250ff8c44bdcb9eccdc3b21922a83f"
|
|
34
37
|
},
|
|
35
38
|
"delivery-program": {
|
|
36
|
-
"digest": "sha256:
|
|
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:
|
|
48
|
+
"digest": "sha256:aa5caa229f0a56290bd6ad4487f41fd2933ac9e9cf4fdf2191f04a559bf66943"
|
|
46
49
|
},
|
|
47
50
|
"handoff": {
|
|
48
|
-
"digest": "sha256:
|
|
51
|
+
"digest": "sha256:5d40899f54fabe3f6ec8f99b417345a433850585086570872a137a1d0d837002"
|
|
49
52
|
},
|
|
50
53
|
"hooks-doctor": {
|
|
51
|
-
"digest": "sha256:
|
|
54
|
+
"digest": "sha256:6169e2b4b3638b9b5430811cd44e7952a54685b6f6556ebe81a9aee8ade1a3e0"
|
|
52
55
|
},
|
|
53
56
|
"investigate": {
|
|
54
|
-
"digest": "sha256:
|
|
57
|
+
"digest": "sha256:b6d82b2dc76297167a8fb75422d1f7037c4b9f0c74186cc4a2d719246764ca7e"
|
|
55
58
|
},
|
|
56
59
|
"lore-protocol": {
|
|
57
60
|
"digest": "sha256:a80fbacc765e8b886437b9fdf7dd71e1ceb1b98b939078ec90fc88d06a8b4c69"
|
|
58
61
|
},
|
|
59
62
|
"opencode-go": {
|
|
60
|
-
"digest": "sha256:
|
|
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:
|
|
78
|
+
"digest": "sha256:8a0e38564627565d267b347a0361eb222b9ba230961998c2d6812874ea7cf608"
|
|
76
79
|
},
|
|
77
80
|
"ralplan": {
|
|
78
|
-
"digest": "sha256:
|
|
81
|
+
"digest": "sha256:95d02771d3e3a46d225b1bf9dd12a33e83c9e0dbe2c126aad24986c4cb1d98a3"
|
|
79
82
|
},
|
|
80
83
|
"team": {
|
|
81
|
-
"digest": "sha256:
|
|
84
|
+
"digest": "sha256:e403a5a92d145e777d7a344fe8fc6fe5df44640691aa2319b6dfd50b909166f5"
|
|
82
85
|
},
|
|
83
86
|
"tech-debt": {
|
|
84
|
-
"digest": "sha256:
|
|
87
|
+
"digest": "sha256:fd2f8e26e006c9c5ed5ef6f1678c3f7472a35dfd2f743e58f7ec348606399353"
|
|
85
88
|
},
|
|
86
89
|
"testing-philosophy": {
|
|
87
90
|
"digest": "sha256:23fdad944b089de3cfcd13957a5ac10c37bd3d136b192029af69368bca1470db"
|
|
88
91
|
},
|
|
89
92
|
"tooling-friction": {
|
|
90
|
-
"digest": "sha256:
|
|
93
|
+
"digest": "sha256:6f94949b6910d88ff974a95f4cd67bbaca05579db88fbeacc50126a13faf800b"
|
|
91
94
|
},
|
|
92
95
|
"tph": {
|
|
93
96
|
"digest": "sha256:bed3684a850651534f315d355cdeae50d951c429817df0f105cccdb7f4e1561b"
|
|
94
97
|
},
|
|
95
98
|
"ultragoal": {
|
|
96
|
-
"digest": "sha256:
|
|
99
|
+
"digest": "sha256:e60091f795311fd4ee8779b60b04f835522163fcca5d27122740b66f66afeceb"
|
|
97
100
|
},
|
|
98
101
|
"verify": {
|
|
99
|
-
"digest": "sha256:
|
|
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 `
|
|
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
|
|
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`, `
|
|
51
|
-
| Create controller | `
|
|
52
|
-
| Execute | ready-set via blueprint tools; `/goal` or parallel subagents; `
|
|
53
|
-
| Opportunistic repair | `/fix` up to `fix_budget`; else handoff backlog
|
|
54
|
-
| QA | `
|
|
55
|
-
| Validate | one outside voice if merge-bound (
|
|
56
|
-
| Land | `
|
|
57
|
-
| Blocked / stop | `
|
|
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
|
-
`
|
|
64
|
-
3. **QA:** run affected checks and `
|
|
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 `
|
|
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
|
|
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).
|