@webpresso/plugin-antigravity 0.0.0-stage → 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.
Files changed (43) hide show
  1. package/LICENSE +104 -0
  2. package/bin/wp +276 -0
  3. package/hooks.json +54 -0
  4. package/mcp_config.json +11 -0
  5. package/package.json +37 -3
  6. package/plugin-skill-ownership.json +105 -0
  7. package/plugin.json +11 -0
  8. package/skills/ai-deslop/SKILL.md +96 -0
  9. package/skills/antigravity/SKILL.md +52 -0
  10. package/skills/autopilot/SKILL.md +82 -0
  11. package/skills/autoresearch/SKILL.md +49 -0
  12. package/skills/best-practice-research/SKILL.md +102 -0
  13. package/skills/browse/SKILL.md +25 -0
  14. package/skills/claude/SKILL.md +52 -0
  15. package/skills/codex/SKILL.md +52 -0
  16. package/skills/deep-interview/LICENSE.txt +28 -0
  17. package/skills/deep-interview/SKILL.md +270 -0
  18. package/skills/deep-research/SKILL.md +259 -0
  19. package/skills/delivery-program/SKILL.md +62 -0
  20. package/skills/design-review/SKILL.md +26 -0
  21. package/skills/devex-review/SKILL.md +28 -0
  22. package/skills/fix/SKILL.md +218 -0
  23. package/skills/handoff/SKILL.md +99 -0
  24. package/skills/hooks-doctor/SKILL.md +153 -0
  25. package/skills/investigate/SKILL.md +83 -0
  26. package/skills/lore-protocol/SKILL.md +84 -0
  27. package/skills/opencode-go/SKILL.md +52 -0
  28. package/skills/plan-ceo-review/SKILL.md +27 -0
  29. package/skills/plan-design-review/SKILL.md +27 -0
  30. package/skills/plan-devex-review/SKILL.md +19 -0
  31. package/skills/plan-eng-review/SKILL.md +24 -0
  32. package/skills/plan-refine/SKILL.md +122 -0
  33. package/skills/plan-refine/references/full-methodology.md +654 -0
  34. package/skills/ralplan/SKILL.md +196 -0
  35. package/skills/team/SKILL.md +121 -0
  36. package/skills/tech-debt/SKILL.md +95 -0
  37. package/skills/testing-philosophy/SKILL.md +53 -0
  38. package/skills/testing-philosophy/references/full-testing-philosophy.md +519 -0
  39. package/skills/tooling-friction/SKILL.md +234 -0
  40. package/skills/tph/SKILL.md +35 -0
  41. package/skills/ultragoal/SKILL.md +304 -0
  42. package/skills/verify/SKILL.md +399 -0
  43. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,104 @@
1
+ Elastic License 2.0
2
+ ===================
3
+
4
+ Copyright (c) 2026 Webpresso, Inc.
5
+
6
+ Acceptance
7
+ ----------
8
+
9
+ By using the software, you agree to all of the terms and conditions below.
10
+
11
+ Copyright License
12
+ -----------------
13
+
14
+ The licensor grants you a non-exclusive, royalty-free, worldwide,
15
+ non-sublicensable, non-transferable license to use, copy, distribute, make
16
+ available, and prepare derivative works of the software, in each case subject
17
+ to the limitations and conditions below.
18
+
19
+ Limitations
20
+ -----------
21
+
22
+ You may not provide the software to third parties as a hosted or managed
23
+ service, where the service provides users with access to any substantial set of
24
+ the features or functionality of the software.
25
+
26
+ You may not move, change, disable, or circumvent the license key
27
+ functionality in the software, and you may not remove or obscure any
28
+ functionality in the software that is protected by the license key.
29
+
30
+ You may not alter, remove, or obscure any licensing, copyright, or other
31
+ notices of the licensor in the software. Any use of the licensor's trademarks
32
+ is subject to applicable law.
33
+
34
+ Patents
35
+ -------
36
+
37
+ The licensor grants you a license, under any patent claims the licensor can
38
+ license, or becomes able to license, to make, have made, use, sell, offer for
39
+ sale, import and have imported the software, in each case subject to the
40
+ limitations and conditions in this license. This license does not cover any
41
+ patent claims that you cause to be infringed by modifications or additions to
42
+ the software.
43
+
44
+ If you or your company make any written claim that the software infringes or
45
+ contributes to infringement of any patent, your patent license for the software
46
+ granted under these terms ends immediately. If your company makes such a claim,
47
+ your patent license ends immediately for work on behalf of your company.
48
+
49
+ Notices
50
+ -------
51
+
52
+ You must ensure that anyone who gets a copy of any part of the software from
53
+ you also gets a copy of these terms.
54
+
55
+ If you modify the software, you must include in any modified copies of the
56
+ software prominent notices stating that you have modified the software.
57
+
58
+ No Other Rights
59
+ ---------------
60
+
61
+ These terms do not imply any licenses other than those expressly granted in
62
+ these terms.
63
+
64
+ Termination
65
+ -----------
66
+
67
+ If you use the software in violation of these terms, such use is not licensed,
68
+ and your licenses will automatically terminate. If the licensor provides you
69
+ with a notice of your violation, and you cease all violation of this license no
70
+ later than 30 days after you receive that notice, your licenses will be
71
+ reinstated retroactively. However, if you violate these terms after such
72
+ reinstatement, any additional violation of these terms will cause your licenses
73
+ to terminate automatically and permanently.
74
+
75
+ No Liability
76
+ ------------
77
+
78
+ As far as the law allows, the software comes as is, without any warranty or
79
+ condition, and the licensor will not be liable to you for any damages arising
80
+ out of these terms or the use or nature of the software, under any kind of
81
+ legal claim.
82
+
83
+ Definitions
84
+ -----------
85
+
86
+ The licensor is the entity offering these terms, and the software is the
87
+ software the licensor makes available under these terms, including any portion
88
+ of it.
89
+
90
+ you refers to the individual or entity agreeing to these terms.
91
+
92
+ your company is any legal entity, sole proprietorship, or other kind of
93
+ organization that you work for, plus all organizations that have control over,
94
+ are under the control of, or are under common control with that organization.
95
+ control means ownership of substantially all the assets of an entity, or the
96
+ power to direct its management and policies by vote, contract, or otherwise.
97
+ Control can be direct or indirect.
98
+
99
+ your licenses are all the licenses granted to you for the software under these
100
+ terms.
101
+
102
+ use means anything you do with the software requiring one of your licenses.
103
+
104
+ trademark means trademarks, service marks, and similar rights.
package/bin/wp ADDED
@@ -0,0 +1,276 @@
1
+ #!/bin/sh
2
+ # webpresso-wp-shim v1 — keep this marker on line 2 (shim loop guard).
3
+ #
4
+ # The one `wp` shim. Copied byte-identically into each plugin's bin/wp
5
+ # (packages/scripts/stage-plugin-runtime-artifacts.ts) and, once the release
6
+ # installer adopts it, into ~/.webpresso/bin/wp. It stores no state, writes
7
+ # nothing, and picks the runtime on EVERY call from where it is called:
8
+ #
9
+ # 1. WEBPRESSO_WP_BIN (an absolute executable) xor WP_FORCE_JIT_PATH (an
10
+ # absolute checkout)
11
+ # 2. the nearest ancestor of $PWD that is a webpresso source checkout
12
+ # (bin/wp + src/cli/cli.ts) ADMITTED in ~/.webpresso/source-checkouts
13
+ # -> <checkout>/bin/wp, whose own launcher guards freshness against HEAD.
14
+ # Layout is not trust: a source-shaped directory whose repository is not
15
+ # listed there fails with checkout-not-admitted instead of running its
16
+ # bin/wp. A linked worktree is admitted through its repository, and only
17
+ # when the admitted repository's own .git/worktrees/*/gitdir names it.
18
+ # 3. else (no checkout ancestor at all) the nearest ancestor
19
+ # .webpressorc.json: its top-level exact-semver "runtime" pin
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
25
+ # 5. else a named error, exit 127 — never a different runtime. A pre-shim
26
+ # ~/.webpresso/bin/wp is never run implicitly (nothing in it proves it is
27
+ # a release rather than a development build); name it with
28
+ # WEBPRESSO_WP_BIN.
29
+ #
30
+ # Bounded: a parent-directory walk, one-line reads of the user's admission file
31
+ # and of admitted repositories' worktree back-links, at most one size-capped
32
+ # JSON read (node, only in a consumer repo with a
33
+ # .webpressorc.json), one directory listing. No git, no network, no retries,
34
+ # no timeouts. Mode and error literals
35
+ # are the closed vocabulary in src/runtime/runtime-selector-vocab.ts.
36
+ #
37
+ # `exec`, not a spawn wrapper: the MCP server this launches is a long-lived
38
+ # stdio service, and a relay process could die and orphan it. Arguments are
39
+ # forwarded verbatim through "$@".
40
+
41
+ set -u
42
+
43
+ announced_modes='explicit-binary explicit-checkout'
44
+
45
+ fail() {
46
+ printf 'wp-shim: error %s: %s\n' "$1" "$2" >&2
47
+ exit 127
48
+ }
49
+
50
+ MODE=
51
+ TARGET=
52
+ choose() {
53
+ MODE=$1
54
+ TARGET=$2
55
+ }
56
+
57
+ admission_file=${HOME:-}/.webpresso/source-checkouts
58
+
59
+ is_source_shaped() {
60
+ [ -f "$1/bin/wp" ] && [ -x "$1/bin/wp" ] && [ -f "$1/src/cli/cli.ts" ]
61
+ }
62
+
63
+ # True when checkout $1 is an admitted repository's primary checkout, or one of
64
+ # its registered linked worktrees. The admission file is user-owned, one
65
+ # absolute primary-checkout path per line. Identity is by directory (-ef), and
66
+ # a linked worktree is recognized only from the admitted repository's own
67
+ # .git/worktrees/*/gitdir back-links: nothing inside the project (its .git
68
+ # file, symlink or metadata) is ever read or trusted, and stat never blocks.
69
+ is_admitted_checkout() {
70
+ [ -f "$admission_file" ] || return 1
71
+ while IFS= read -r entry || [ -n "$entry" ]; do
72
+ case $entry in /*) ;; *) continue ;; esac
73
+ [ "$entry" -ef "$1" ] && return 0
74
+ for meta in "$entry"/.git/worktrees/*/; do
75
+ [ -f "${meta}gitdir" ] || continue
76
+ back=
77
+ IFS= read -r back <"${meta}gitdir" || [ -n "$back" ] || continue
78
+ [ "${back%/.git}" -ef "$1" ] && return 0
79
+ done
80
+ done <"$admission_file"
81
+ return 1
82
+ }
83
+
84
+ # Exact semver x.y.z[-pre], no leading zeros, no build metadata. With a second
85
+ # argument "stable", a prerelease is rejected too.
86
+ is_exact_semver() {
87
+ version=$1
88
+ core=${version%%-*}
89
+ pre=
90
+ if [ "$core" != "$version" ]; then
91
+ pre=${version#*-}
92
+ [ "${2:-}" != stable ] || return 1
93
+ case $pre in '' | .* | *. | *..* | *[!0-9A-Za-z.-]*) return 1 ;; esac
94
+ saved_ifs=$IFS
95
+ IFS=.
96
+ # shellcheck disable=SC2086 # deliberate field split on "."
97
+ set -- $pre
98
+ IFS=$saved_ifs
99
+ for part in "$@"; do
100
+ case $part in 0?*) case $part in *[!0-9]*) ;; *) return 1 ;; esac ;; esac
101
+ done
102
+ fi
103
+ case $core in '' | .* | *. | *..* | *[!0-9.]*) return 1 ;; esac
104
+ saved_ifs=$IFS
105
+ IFS=.
106
+ # shellcheck disable=SC2086 # deliberate field split on "."
107
+ set -- $core
108
+ IFS=$saved_ifs
109
+ [ "$#" -eq 3 ] || return 1
110
+ for part in "$@"; do
111
+ case $part in '' | 0?* | *[!0-9]*) return 1 ;; esac
112
+ done
113
+ return 0
114
+ }
115
+
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
122
+
123
+ # Sets PIN to the top-level "runtime" of $1 (empty when absent). The document
124
+ # is opened non-blocking, must be a regular file, and is read through a
125
+ # 64 KiB + 1 buffer on that one descriptor (growth after open cannot exceed
126
+ # it); anything longer is refused. The pin
127
+ # is validated as an exact semver BEFORE it crosses back into the shell, so no
128
+ # shell transport (such as a stripped trailing newline) can change it.
129
+ read_pin() {
130
+ PIN=$(node -e '
131
+ const fs = require("node:fs");
132
+ let fd;
133
+ try { fd = fs.openSync(process.argv[1], fs.constants.O_RDONLY | fs.constants.O_NONBLOCK); } catch { process.exit(2); }
134
+ if (!fs.fstatSync(fd).isFile()) process.exit(3);
135
+ const limit = 65536;
136
+ const buffer = Buffer.alloc(limit + 1);
137
+ let length = 0;
138
+ for (let n; length <= limit && (n = fs.readSync(fd, buffer, length, limit + 1 - length, null)) > 0; ) length += n;
139
+ if (length > limit) process.exit(3);
140
+ let v;
141
+ try { v = JSON.parse(buffer.subarray(0, length).toString("utf8")); } catch { process.exit(2); }
142
+ if (v === null || typeof v !== "object" || Array.isArray(v) || !Object.hasOwn(v, "runtime")) process.exit(0);
143
+ const pattern = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*)?$/u;
144
+ if (typeof v.runtime !== "string" || !pattern.test(v.runtime)) process.exit(4);
145
+ process.stdout.write(v.runtime);
146
+ ' "$1" 2>/dev/null)
147
+ case $? in
148
+ 0) return 0 ;;
149
+ 3) PIN_PROBLEM="is not a regular file of at most 64 KiB" ;;
150
+ 4) PIN_PROBLEM="has a \"runtime\" pin that is not an exact version such as 1.2.3 (no ranges, no build metadata)" ;;
151
+ 127) PIN_PROBLEM="cannot be read: node is not on PATH" ;;
152
+ *) PIN_PROBLEM="is not valid JSON" ;;
153
+ esac
154
+ return 1
155
+ }
156
+
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=
161
+ best_major=
162
+ best_minor=
163
+ best_patch=
164
+ for entry in "$1"/*/; do
165
+ [ -d "$entry" ] || continue
166
+ entry=${entry%/}
167
+ version=${entry##*/}
168
+ is_exact_semver "$version" stable || continue
169
+ [ -f "$entry/$2" ] && [ -x "$entry/$2" ] || continue
170
+ major=${version%%.*}
171
+ rest=${version#*.}
172
+ minor=${rest%%.*}
173
+ patch=${rest#*.}
174
+ if [ -z "$BEST" ] ||
175
+ [ "$major" -gt "$best_major" ] ||
176
+ { [ "$major" -eq "$best_major" ] && [ "$minor" -gt "$best_minor" ]; } ||
177
+ { [ "$major" -eq "$best_major" ] && [ "$minor" -eq "$best_minor" ] && [ "$patch" -gt "$best_patch" ]; }; then
178
+ BEST=$version
179
+ best_major=$major
180
+ best_minor=$minor
181
+ best_patch=$patch
182
+ fi
183
+ done
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"
201
+ return 0
202
+ fi
203
+ return 1
204
+ }
205
+
206
+ is_shim_file() {
207
+ [ -f "$1" ] || return 1
208
+ { head -c 256 "$1" | grep -q 'webpresso-wp-shim'; } 2>/dev/null
209
+ }
210
+
211
+ choose_release() {
212
+ if [ -n "${1:-}" ]; then
213
+ rc_file=$1/.webpressorc.json
214
+ read_pin "$rc_file" || fail pin-invalid "$rc_file $PIN_PROBLEM."
215
+ if [ -n "$PIN" ]; then
216
+ is_exact_semver "$PIN" || fail pin-invalid "$rc_file pins runtime \"$PIN\"; use an exact version such as 1.2.3 (no ranges)."
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."
220
+ choose pinned-release "$pinned"
221
+ return 0
222
+ fi
223
+ fi
224
+ choose_latest_release && return 0
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)."
226
+ }
227
+
228
+ : "${WEBPRESSO_WP_BIN:=}"
229
+ : "${WP_FORCE_JIT_PATH:=}"
230
+
231
+ if [ -n "$WEBPRESSO_WP_BIN" ] && [ -n "$WP_FORCE_JIT_PATH" ]; then
232
+ fail both-overrides-set "WEBPRESSO_WP_BIN and WP_FORCE_JIT_PATH are both set; unset one."
233
+ elif [ -n "$WEBPRESSO_WP_BIN" ]; then
234
+ case $WEBPRESSO_WP_BIN in /*) ;; *) fail override-missing "WEBPRESSO_WP_BIN must be an absolute path (got $WEBPRESSO_WP_BIN); exec would otherwise search PATH for a different file." ;; esac
235
+ [ -f "$WEBPRESSO_WP_BIN" ] && [ -x "$WEBPRESSO_WP_BIN" ] || fail override-missing "WEBPRESSO_WP_BIN points to $WEBPRESSO_WP_BIN, which is not an executable file."
236
+ choose explicit-binary "$WEBPRESSO_WP_BIN"
237
+ elif [ -n "$WP_FORCE_JIT_PATH" ]; then
238
+ case $WP_FORCE_JIT_PATH in /*) ;; *) fail override-missing "WP_FORCE_JIT_PATH must be an absolute path (got $WP_FORCE_JIT_PATH)." ;; esac
239
+ is_source_shaped "$WP_FORCE_JIT_PATH" || fail override-missing "WP_FORCE_JIT_PATH points to $WP_FORCE_JIT_PATH, which is not a webpresso source checkout (executable bin/wp and src/cli/cli.ts)."
240
+ choose explicit-checkout "$WP_FORCE_JIT_PATH/bin/wp"
241
+ else
242
+ # Checkout first, across every ancestor: a .webpressorc.json nested inside
243
+ # a source checkout must not pin a foreign runtime there. Only when no
244
+ # ancestor is a checkout does the nearest consumer config decide.
245
+ dir=${PWD:-}
246
+ consumer_root=
247
+ while [ -n "$dir" ]; do
248
+ if is_source_shaped "$dir"; then
249
+ is_admitted_checkout "$dir" || fail checkout-not-admitted "$dir looks like a webpresso source checkout, but its repository is not listed in $admission_file; add the absolute path of its primary checkout there (one per line) to run its bin/wp, or set WP_FORCE_JIT_PATH=$dir for this call."
250
+ choose checkout "$dir/bin/wp"
251
+ break
252
+ fi
253
+ if [ -z "$consumer_root" ] && [ -e "$dir/.webpressorc.json" ]; then
254
+ consumer_root=$dir
255
+ fi
256
+ [ "$dir" != / ] || break
257
+ dir=${dir%/*}
258
+ [ -n "$dir" ] || dir=/
259
+ done
260
+ [ -n "$TARGET" ] || choose_release "$consumer_root"
261
+ fi
262
+
263
+ # Never exec a shim: this one (directly or through a symlink) or another
264
+ # byte-identical plugin copy would recurse instead of reaching a runtime.
265
+ if [ "$TARGET" = "$0" ] || [ "$TARGET" -ef "$0" ] || is_shim_file "$TARGET"; then
266
+ fail self-reference "$MODE resolved to a wp shim ($TARGET); point it at a wp runtime instead."
267
+ fi
268
+
269
+ case " $announced_modes " in
270
+ *" $MODE "*) printf 'wp-shim: %s %s\n' "$MODE" "$TARGET" >&2 ;;
271
+ esac
272
+
273
+ WP_SKIP_UPDATE_CHECK=${WP_SKIP_UPDATE_CHECK:-1}
274
+ export WP_SKIP_UPDATE_CHECK
275
+
276
+ exec "$TARGET" "$@"
package/hooks.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "webpresso": {
3
+ "SessionStart": [
4
+ {
5
+ "type": "command",
6
+ "command": "wp_bin=; if [ -n \"${WEBPRESSO_WP_BIN:-}\" ]; then if [ -f \"${WEBPRESSO_WP_BIN}\" ] && [ -x \"${WEBPRESSO_WP_BIN}\" ]; then wp_bin=\"${WEBPRESSO_WP_BIN}\"; fi; elif [ -f \"${HOME}/.webpresso/bin/wp\" ] && [ -x \"${HOME}/.webpresso/bin/wp\" ]; then wp_bin=\"${HOME}/.webpresso/bin/wp\"; elif [ -f \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ] && [ -x \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ]; then wp_bin=\"${HOME}/.gemini/config/plugins/wp/bin/wp\"; fi; if [ -n \"$wp_bin\" ]; 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='antigravity' \"$wp_bin\" hook sessionstart-routing <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-sessionstart-routing",
7
+ "timeout": 5
8
+ }
9
+ ],
10
+ "PreToolUse": [
11
+ {
12
+ "matcher": "*",
13
+ "hooks": [
14
+ {
15
+ "type": "command",
16
+ "command": "wp_bin=; if [ -n \"${WEBPRESSO_WP_BIN:-}\" ]; then if [ -f \"${WEBPRESSO_WP_BIN}\" ] && [ -x \"${WEBPRESSO_WP_BIN}\" ]; then wp_bin=\"${WEBPRESSO_WP_BIN}\"; fi; elif [ -f \"${HOME}/.webpresso/bin/wp\" ] && [ -x \"${HOME}/.webpresso/bin/wp\" ]; then wp_bin=\"${HOME}/.webpresso/bin/wp\"; elif [ -f \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ] && [ -x \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ]; then wp_bin=\"${HOME}/.gemini/config/plugins/wp/bin/wp\"; fi; if [ -n \"$wp_bin\" ]; 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='antigravity' \"$wp_bin\" hook pretool-guard <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -eq 2 ]; then exit 0; elif [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' \"{\\\"decision\\\":\\\"deny\\\",\\\"reason\\\":\\\"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 0; fi; else printf '%s\\n' '{\"decision\":\"deny\",\"reason\":\"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 0; fi # wp-pretool-guard",
17
+ "timeout": 5
18
+ }
19
+ ]
20
+ }
21
+ ],
22
+ "PostToolUse": [
23
+ {
24
+ "matcher": "*",
25
+ "hooks": [
26
+ {
27
+ "type": "command",
28
+ "command": "wp_bin=; if [ -n \"${WEBPRESSO_WP_BIN:-}\" ]; then if [ -f \"${WEBPRESSO_WP_BIN}\" ] && [ -x \"${WEBPRESSO_WP_BIN}\" ]; then wp_bin=\"${WEBPRESSO_WP_BIN}\"; fi; elif [ -f \"${HOME}/.webpresso/bin/wp\" ] && [ -x \"${HOME}/.webpresso/bin/wp\" ]; then wp_bin=\"${HOME}/.webpresso/bin/wp\"; elif [ -f \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ] && [ -x \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ]; then wp_bin=\"${HOME}/.gemini/config/plugins/wp/bin/wp\"; fi; if [ -n \"$wp_bin\" ]; 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='antigravity' \"$wp_bin\" hook post-tool <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-post-tool",
29
+ "timeout": 5
30
+ }
31
+ ]
32
+ }
33
+ ],
34
+ "PreInvocation": [
35
+ {
36
+ "type": "command",
37
+ "command": "wp_bin=; if [ -n \"${WEBPRESSO_WP_BIN:-}\" ]; then if [ -f \"${WEBPRESSO_WP_BIN}\" ] && [ -x \"${WEBPRESSO_WP_BIN}\" ]; then wp_bin=\"${WEBPRESSO_WP_BIN}\"; fi; elif [ -f \"${HOME}/.webpresso/bin/wp\" ] && [ -x \"${HOME}/.webpresso/bin/wp\" ]; then wp_bin=\"${HOME}/.webpresso/bin/wp\"; elif [ -f \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ] && [ -x \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ]; then wp_bin=\"${HOME}/.gemini/config/plugins/wp/bin/wp\"; fi; if [ -n \"$wp_bin\" ]; 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='antigravity' \"$wp_bin\" hook guard-switch <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{}'; fi; else printf '%s\\n' '{}'; fi # wp-guard-switch",
38
+ "timeout": 5
39
+ }
40
+ ],
41
+ "Stop": [
42
+ {
43
+ "type": "command",
44
+ "command": "wp_bin=; if [ -n \"${WEBPRESSO_WP_BIN:-}\" ]; then if [ -f \"${WEBPRESSO_WP_BIN}\" ] && [ -x \"${WEBPRESSO_WP_BIN}\" ]; then wp_bin=\"${WEBPRESSO_WP_BIN}\"; fi; elif [ -f \"${HOME}/.webpresso/bin/wp\" ] && [ -x \"${HOME}/.webpresso/bin/wp\" ]; then wp_bin=\"${HOME}/.webpresso/bin/wp\"; elif [ -f \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ] && [ -x \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ]; then wp_bin=\"${HOME}/.gemini/config/plugins/wp/bin/wp\"; fi; if [ -n \"$wp_bin\" ]; 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='antigravity' \"$wp_bin\" hook stop-qa <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{\"decision\":\"allow\"}'; fi; else printf '%s\\n' '{\"decision\":\"allow\"}'; fi # wp-stop-qa",
45
+ "timeout": 5
46
+ },
47
+ {
48
+ "type": "command",
49
+ "command": "wp_bin=; if [ -n \"${WEBPRESSO_WP_BIN:-}\" ]; then if [ -f \"${WEBPRESSO_WP_BIN}\" ] && [ -x \"${WEBPRESSO_WP_BIN}\" ]; then wp_bin=\"${WEBPRESSO_WP_BIN}\"; fi; elif [ -f \"${HOME}/.webpresso/bin/wp\" ] && [ -x \"${HOME}/.webpresso/bin/wp\" ]; then wp_bin=\"${HOME}/.webpresso/bin/wp\"; elif [ -f \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ] && [ -x \"${HOME}/.gemini/config/plugins/wp/bin/wp\" ]; then wp_bin=\"${HOME}/.gemini/config/plugins/wp/bin/wp\"; fi; if [ -n \"$wp_bin\" ]; 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='antigravity' \"$wp_bin\" hook stop-ultragoal <&3 & hook_pid=$!; wait \"$hook_pid\"; hook_status=$?; trap - INT TERM; exec 3<&-; if [ \"$hook_status\" -ne 0 ]; then printf '%s\\n' '{\"decision\":\"allow\"}'; fi; else printf '%s\\n' '{\"decision\":\"allow\"}'; fi # wp-stop-ultragoal",
50
+ "timeout": 5
51
+ }
52
+ ]
53
+ }
54
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "webpresso": {
4
+ "command": "wp",
5
+ "args": ["mcp"],
6
+ "env": {
7
+ "WP_SKIP_UPDATE_CHECK": "1"
8
+ }
9
+ }
10
+ }
11
+ }
package/package.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "@webpresso/plugin-antigravity",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.0.17",
4
+ "private": false,
5
+ "description": "Antigravity plugin adapter for the Webpresso app (wp CLI) skills, hooks, and MCP runtime.",
6
+ "homepage": "https://github.com/webpresso/app#readme",
7
+ "bugs": {
8
+ "url": "https://github.com/webpresso/app/issues"
9
+ },
10
+ "license": "Elastic-2.0",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/webpresso/app.git",
14
+ "directory": "packages/plugin-antigravity"
15
+ },
16
+ "files": [
17
+ "plugin.json",
18
+ "mcp_config.json",
19
+ "hooks.json",
20
+ "bin/wp",
21
+ "plugin-skill-ownership.json",
22
+ "skills/**/SKILL.md",
23
+ "skills/**/references/**",
24
+ "skills/**/LICENSE*",
25
+ "LICENSE",
26
+ "!README.md",
27
+ "!CHANGELOG.md",
28
+ "!**/*.test.js",
29
+ "!**/*.test.ts"
30
+ ],
31
+ "type": "module",
32
+ "sideEffects": false,
33
+ "publishConfig": {
34
+ "access": "public",
35
+ "registry": "https://registry.npmjs.org/"
36
+ },
37
+ "engines": {
38
+ "node": ">=24"
39
+ }
6
40
  }
@@ -0,0 +1,105 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "host": "antigravity",
4
+ "packageName": "@webpresso/plugin-antigravity",
5
+ "packageVersion": "0.0.17",
6
+ "runtimeDirs": [],
7
+ "skills": {
8
+ "ai-deslop": {
9
+ "digest": "sha256:cf07df5835037f10401400e220c1c923f5325a6149d59c231ce316e10595fdfc"
10
+ },
11
+ "antigravity": {
12
+ "digest": "sha256:729c4dd74e5c6394c31de23d04f664140088ee58ddfc57f3a2751394945a938b"
13
+ },
14
+ "autopilot": {
15
+ "digest": "sha256:8355f6ddc6e53e68ada49248bdd8d8beb0069ed09d3f2d346debc2401270445c"
16
+ },
17
+ "autoresearch": {
18
+ "digest": "sha256:b4d51cd53beb4a3271827172dfbd0b1d27bd58761ca07a35d49a5d6324b87fdf"
19
+ },
20
+ "best-practice-research": {
21
+ "digest": "sha256:b863ef3969b85e83934911d4ba65f0547c0f586b147597d6a37c41d4b7a762f3"
22
+ },
23
+ "browse": {
24
+ "digest": "sha256:21fd24862e7f7c8a1feadea6bc376492b136b99fc381cf1b8927c9db80615431"
25
+ },
26
+ "claude": {
27
+ "digest": "sha256:63b7afb2b65f65fb142e5ef142f80516be00c54d449c5fa7d7897bcaa6cae657"
28
+ },
29
+ "codex": {
30
+ "digest": "sha256:574669e040141e9986e362e9f46e3176aa47eccfda0f4589205d9d6d65e57b8d"
31
+ },
32
+ "deep-interview": {
33
+ "digest": "sha256:6feeaa35de63a0e1f39dbe2882ca91a72928a058f138d4d79e70d81d09209693"
34
+ },
35
+ "deep-research": {
36
+ "digest": "sha256:ece766cb18869317d7c8992fc562920b03250ff8c44bdcb9eccdc3b21922a83f"
37
+ },
38
+ "delivery-program": {
39
+ "digest": "sha256:a2222cc04fb5366026b951273e4e5d5d8c296d426d51706da8a6b56761a4567f"
40
+ },
41
+ "design-review": {
42
+ "digest": "sha256:5b213735e2842568774572f36b198bccf03c03a54b2732484aadd023f04acb23"
43
+ },
44
+ "devex-review": {
45
+ "digest": "sha256:306355888da0827e3523022077f731845726bbaaf595ca12515cc91d8605b5e6"
46
+ },
47
+ "fix": {
48
+ "digest": "sha256:aa5caa229f0a56290bd6ad4487f41fd2933ac9e9cf4fdf2191f04a559bf66943"
49
+ },
50
+ "handoff": {
51
+ "digest": "sha256:5d40899f54fabe3f6ec8f99b417345a433850585086570872a137a1d0d837002"
52
+ },
53
+ "hooks-doctor": {
54
+ "digest": "sha256:6169e2b4b3638b9b5430811cd44e7952a54685b6f6556ebe81a9aee8ade1a3e0"
55
+ },
56
+ "investigate": {
57
+ "digest": "sha256:b6d82b2dc76297167a8fb75422d1f7037c4b9f0c74186cc4a2d719246764ca7e"
58
+ },
59
+ "lore-protocol": {
60
+ "digest": "sha256:a80fbacc765e8b886437b9fdf7dd71e1ceb1b98b939078ec90fc88d06a8b4c69"
61
+ },
62
+ "opencode-go": {
63
+ "digest": "sha256:9498e4f9d9c1b8ee2355d9ca57c65eaf2a3a9dbc2ba11ef0c4b0428769949f05"
64
+ },
65
+ "plan-ceo-review": {
66
+ "digest": "sha256:4d426158518dd71f8998770e8d4037bcbfa3c65d7265a93a4a78a9b015ba881e"
67
+ },
68
+ "plan-design-review": {
69
+ "digest": "sha256:a8a33efe67844d0602ff595c0b7e8f5529e52f51a781112952636c91963ce19e"
70
+ },
71
+ "plan-devex-review": {
72
+ "digest": "sha256:a49b4f61f1c54a7d89111c270616684dcbf2a7236bc817fafb5919366a7cda31"
73
+ },
74
+ "plan-eng-review": {
75
+ "digest": "sha256:b728dad90254d4c9f81b3818321d34ab53519b79ce20ff3bfe08bfacb2aa3e86"
76
+ },
77
+ "plan-refine": {
78
+ "digest": "sha256:8a0e38564627565d267b347a0361eb222b9ba230961998c2d6812874ea7cf608"
79
+ },
80
+ "ralplan": {
81
+ "digest": "sha256:95d02771d3e3a46d225b1bf9dd12a33e83c9e0dbe2c126aad24986c4cb1d98a3"
82
+ },
83
+ "team": {
84
+ "digest": "sha256:e403a5a92d145e777d7a344fe8fc6fe5df44640691aa2319b6dfd50b909166f5"
85
+ },
86
+ "tech-debt": {
87
+ "digest": "sha256:fd2f8e26e006c9c5ed5ef6f1678c3f7472a35dfd2f743e58f7ec348606399353"
88
+ },
89
+ "testing-philosophy": {
90
+ "digest": "sha256:23fdad944b089de3cfcd13957a5ac10c37bd3d136b192029af69368bca1470db"
91
+ },
92
+ "tooling-friction": {
93
+ "digest": "sha256:6f94949b6910d88ff974a95f4cd67bbaca05579db88fbeacc50126a13faf800b"
94
+ },
95
+ "tph": {
96
+ "digest": "sha256:bed3684a850651534f315d355cdeae50d951c429817df0f105cccdb7f4e1561b"
97
+ },
98
+ "ultragoal": {
99
+ "digest": "sha256:e60091f795311fd4ee8779b60b04f835522163fcca5d27122740b66f66afeceb"
100
+ },
101
+ "verify": {
102
+ "digest": "sha256:e1aa3baed96ef005b144e17fac8a2153b90a075b142acee2fdfba7c89e613765"
103
+ }
104
+ }
105
+ }
package/plugin.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "wp",
3
+ "description": "Webpresso app: blueprints, skills, lore commit protocol, tech-debt lifecycle",
4
+ "version": "0.0.17",
5
+ "author": {
6
+ "name": "Webpresso",
7
+ "url": "https://github.com/webpresso"
8
+ },
9
+ "homepage": "https://github.com/webpresso/app#readme",
10
+ "repository": "https://github.com/webpresso/app"
11
+ }