docs(sdk): feedback visible via windows.open + séparation Codex skills documentées — commands-and-feedback (surface normative + exemple), layouts-react (type↔contributes.layouts, capacité ui), manifest (exemple complet menu+layout+ui), windows (contrat ui, retour structuré), packaging-distribution (idea_plugin_install_from_directory, sémantique plugin_reloaded/ESM), nouveau codex-skills-and-idea-plugins, README (lien) — #280 QA verte
This commit is contained in:
@ -26,8 +26,9 @@ manifest contribution -> command id -> registered command handler -> optional ta
|
||||
- Feedback objects must be stable enough for agents and programmatic callers to
|
||||
parse, and their messages must be readable by humans.
|
||||
- The current human menu-click UI does not guarantee display of a command
|
||||
handler return value. Use logs, Work/task state or plugin-owned UI/files when
|
||||
a human needs visible feedback today.
|
||||
handler return value. When a human must see feedback from a menu action, open
|
||||
or focus a plugin layout/window from the handler with
|
||||
`ctx.services.windows.open({ layoutType, state })`.
|
||||
|
||||
## Preconditions
|
||||
|
||||
@ -76,6 +77,9 @@ Visible surfaces are intentionally distinct:
|
||||
- Command return value: immediate feedback for programmatic callers, agents and
|
||||
future host surfaces. It is not a guaranteed visible UI surface for current
|
||||
human menu clicks.
|
||||
- Plugin layout/window: the normative visible feedback surface for menu actions
|
||||
that need to show status, results or next steps to a human. The layout must be
|
||||
declared in `idea-plugin.json` and registered during activation.
|
||||
- Plugin logs: diagnostics for developers and operators.
|
||||
- Work/background-task surfaces: only for tasks actually launched through
|
||||
`runCommand()`.
|
||||
@ -105,6 +109,40 @@ state when invoked instead of assuming a watch was installed at activation.
|
||||
|
||||
## Example
|
||||
|
||||
Visible menu feedback:
|
||||
|
||||
```tsx
|
||||
import type { IdeAPluginModule, PluginLayoutProps } from "@idea/plugin-sdk";
|
||||
|
||||
function HealthView(_props: PluginLayoutProps<{ source?: string }>) {
|
||||
return <section>Unity tools are ready.</section>;
|
||||
}
|
||||
|
||||
const plugin: IdeAPluginModule = {
|
||||
activate(ctx) {
|
||||
ctx.layouts?.register({
|
||||
type: "unity-plugin.health",
|
||||
component: HealthView
|
||||
});
|
||||
|
||||
ctx.commands?.registerCommand("unity-plugin.health", async () => {
|
||||
const win = await ctx.services?.windows.open({
|
||||
layoutType: "unity-plugin.health",
|
||||
state: { source: "menu" }
|
||||
});
|
||||
|
||||
return win
|
||||
? { status: "opened", message: "Opened Unity Health.", alreadyOpen: win.alreadyOpen }
|
||||
: { status: "skipped", reason: "ui-service-unavailable", message: "UI service unavailable." };
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export default plugin;
|
||||
```
|
||||
|
||||
Background task feedback:
|
||||
|
||||
```ts
|
||||
const project = await ctx.services?.workspace.getCurrentProject();
|
||||
if (!project) {
|
||||
|
||||
Reference in New Issue
Block a user