Compare commits

...
Author SHA1 Message Date
paseo-bot[bot] deb1bdc266 test(plugins): wait for global recovery without an extra restart (#8250)
* test(plugins): observe global recovery without reloading again

* test(plugins): leave time for recovery failure cleanup

---------

Co-authored-by: paseo-bot[bot] <266920839+paseo-bot[bot]@users.noreply.github.com>
2026-10-30 03:38:37 +00:00
Matěj Pešl 9c7925de58 fix(skills): make invocation input portable across harnesses (#8252)
Read invocation input and conversation context without Claude argument substitution. Recognize Pi skill references when forwarding advisor requests.
2026-10-30 03:01:41 +00:00
6 changed files with 31 additions and 23 deletions
@@ -1075,23 +1075,29 @@ export default function contribute(plugin: unknown) {
const service = bindTestSessionHost( const service = bindTestSessionHost(
new PluginService(pino({ level: "silent" }), store, "0.4.0"), new PluginService(pino({ level: "silent" }), store, "0.4.0"),
); );
await service.start(); try {
await service.installDirectory({ path: first }); await service.start();
await service.installDirectory({ path: second }); await service.installDirectory({ path: first });
await service.installDirectory({ path: second });
expect(catalogIds(service)).toEqual(["first", "second"]);
await store.patch({ pluginsEnabled: false });
await store.patch({ pluginsEnabled: false }); expect(service.catalog()).toEqual([]);
await expect(service.invokePluginRpc("second", "anything", {})).rejects.toThrow(
expect(service.catalog()).toEqual([]); "Plugin is not available",
await expect(service.invokePluginRpc("second", "anything", {})).rejects.toThrow( );
"Plugin is not available", await store.patch({ pluginsEnabled: true });
); // Observe recovery itself. Reloading here restarts a healthy plugin and
await store.patch({ pluginsEnabled: true }); // would also conceal a failure to restart it after the global enable.
await service.reloadPlugin("first"); await expect
expect((await service.listPlugins()).map(({ id, status }) => ({ id, status }))).toEqual([ .poll(() => service.listPlugins(), { timeout: 10_000 })
{ id: "first", status: "running" }, .toMatchObject([
{ id: "second", status: "running" }, { id: "first", status: "running" },
]); { id: "second", status: "running" },
await service.stopAllPlugins(); ]);
} finally {
await service.stopAllPlugins();
}
}, 20_000); }, 20_000);
it("does not publish an in-flight start after a later global disable", async () => { it("does not publish an in-flight start after a later global disable", async () => {
+5 -3
View File
@@ -9,7 +9,7 @@ argument-hint: "[--profile <name>] <question or topic>"
Single agent. Reads the situation you're in. Gives a judgment. You decide what to do — the advisor doesn't drive the work. Single agent. Reads the situation you're in. Gives a judgment. You decide what to do — the advisor doesn't drive the work.
**User's request:** $ARGUMENTS Use the user's request and current conversation as input, including any arguments supplied with the skill invocation. Optional syntax: `[--profile <name>] <question or topic>`.
## Prerequisites ## Prerequisites
@@ -40,13 +40,15 @@ This is analysis only. Do NOT edit, create, or delete any files. Do NOT write co
## Forwarded skills ## Forwarded skills
If `$ARGUMENTS` contains another skill reference — `/unslop`, `/unslop-risk`, `$unslop`, etc. — the user is asking the advisor to run that skill against the current task. Examples: If the user's request contains another skill reference, such as `/unslop`, `/skill:unslop`, or `$unslop`, the user is asking the advisor to run that skill against the current task. Examples:
- `/paseo-advisor /unslop` → advisor runs `/unslop` on the current diff. - `/paseo-advisor /unslop` → advisor runs `/unslop` on the current diff.
- `/paseo-advisor /unslop-risk` → advisor does an unslop-risk review. - `/paseo-advisor /unslop-risk` → advisor does an unslop-risk review.
- `/paseo-advisor $diagnose this build failure` → advisor invokes `/diagnose`. - `/paseo-advisor $diagnose this build failure` → advisor invokes `/diagnose`.
- `/skill:paseo-advisor /skill:unslop` → advisor runs the `unslop` skill on the current diff in Pi.
- `$paseo-advisor $unslop` → advisor runs the `unslop` skill on the current diff in Codex.
Parse the forwarded skill name out of `$ARGUMENTS` (`/<name>` or `$<name>`). In the briefing, tell the advisor explicitly: Parse the forwarded skill name from the user's request (`/<name>`, `/skill:<name>`, or `$<name>`), excluding this skill's own invocation. In the briefing, tell the advisor explicitly:
``` ```
Invoke the `<name>` skill against this task. Load it via the Skill tool before doing anything else. Invoke the `<name>` skill against this task. Load it via the Skill tool before doing anything else.
+1 -1
View File
@@ -8,7 +8,7 @@ user-invocable: true
Two agents from contrasting profiles, fresh context, planning a solution in parallel. Two agents from contrasting profiles, fresh context, planning a solution in parallel.
**User's additional context:** $ARGUMENTS Use the user's request and current conversation as input, including any arguments supplied with the skill invocation.
## Prerequisites ## Prerequisites
+1 -1
View File
@@ -8,7 +8,7 @@ user-invocable: true
Transfer the current task — context, decisions, failed attempts, constraints — to a fresh agent. The receiving agent starts with **zero context**, so the handoff prompt must be a self-contained briefing. Transfer the current task — context, decisions, failed attempts, constraints — to a fresh agent. The receiving agent starts with **zero context**, so the handoff prompt must be a self-contained briefing.
**User's arguments:** $ARGUMENTS Use the user's request and current conversation as input, including any arguments supplied with the skill invocation.
## Prerequisites ## Prerequisites
+1 -1
View File
@@ -7,7 +7,7 @@ description: Answer questions about the Paseo product and app, including setup,
You are helping a user understand, configure, or troubleshoot Paseo itself. Answer their question directly, verify the answer against the current public documentation, and include the relevant documentation link. Do not send the user away to read the docs in place of helping them. You are helping a user understand, configure, or troubleshoot Paseo itself. Answer their question directly, verify the answer against the current public documentation, and include the relevant documentation link. Do not send the user away to read the docs in place of helping them.
**User's question:** $ARGUMENTS Use the user's question and current conversation as input, including any arguments supplied with the skill invocation.
## Use current documentation ## Use current documentation
+1 -1
View File
@@ -7,7 +7,7 @@ description: Build and manage trusted local Paseo plugins. Use when the user ask
Build or manage the requested plugin directly. Use the current public docs to catch contract changes, but keep working from this skill if the network is unavailable. Build or manage the requested plugin directly. Use the current public docs to catch contract changes, but keep working from this skill if the network is unavailable.
**User's request:** $ARGUMENTS Use the user's request and current conversation as input, including any arguments supplied with the skill invocation.
## Check current documentation ## Check current documentation