--- name: temps-plugin description: > Design, build, test, and distribute external Temps plugins with TypeScript/Bun; provide development and local-testing guidance for existing Rust plugins. Use for creating a plugin, adding an embedded console UI or deployment-event automation, testing host permissions and AI, installing from GitHub, or submitting a plugin to the public catalog. End-to-end publishing covers TypeScript GitHub-source plugins, not Rust native-package releases or in-process TempsPlugin backend crates. --- # Create and ship a Temps plugin For TypeScript/Bun, deliver a working external plugin, an installable source repository, and evidence of what was verified. Continue an existing project when provided; preserve its identity, storage, and user changes. Publishing is a separate outcome from building or installing. Rust support here is limited to development and local simulator testing. Rust distribution requires the separate signed native npm-package/catalog pipeline, which this skill does not teach. Do not route a Cargo repository through the TypeScript GitHub installer or suggest copying/symlinking a binary into the host plugin directory. If Rust publication is requested, establish the supported native release procedure before claiming an end-to-end plan; do not silently change the user's implementation language. ## 1. Establish the contract Record the plugin's purpose, intended user, entry point in Temps, input/output, persisted data, required host permissions, resource limits, and supported host/SDK versions. Resolve only missing decisions that affect the implementation. Prefer TypeScript + Bun for a new GitHub-installable plugin; retain Rust for existing Rust plugins or an explicit choice. Read applicable repository instructions. Inspect the installed CLI's `plugin --help` and the SDK's exports instead of assuming commands from another release exist. The canonical TypeScript starter is [gotempsh/temps-plugin-template](https://github.com/gotempsh/temps-plugin-template). Use its current README, manifest, lockfile, and CI. The template may evolve ahead of the npm CLI; lack of a CLI command is not a reason to invent one. Current evidence sources in a Temps checkout: - `apps/temps-cli/src/commands/plugin/`: init, build, install, update, grants and dev simulator. - `crates/temps-external-plugins/src/repository.rs`: actual source-installer build contract. - `crates/temps-core/src/external_plugin/`: protocol, permissions, manifest and events. - `sdks/node/packages/plugin-sdk/src/` and `crates/temps-plugin-sdk/src/`: SDK APIs. - Root `DESIGN.md`, `web/src/components/ui/`, and `web/src/globals.css`: current console design. Read [development.md](references/development.md) when scaffolding or changing runtime behavior, [design.md](references/design.md) for UI work, and [publishing.md](references/publishing.md) before preparing a distributable repository. ## 2. Scaffold an independently buildable project Use the GitHub template or, when supported by the installed CLI: ```sh bunx --bun @temps-sdk/cli plugin init my-plugin --name @your-scope/my-plugin ``` This command scaffolds local files; it does not publish. Inspect generated files before continuing. Replace placeholder identity, author, repository, version and description; keep package metadata and runtime manifest consistent. Add only tested platforms. Commit the lockfile. Keep credentials, local databases, logs, auth material, and simulator session files out of Git. For GitHub installation, select either the repository root or a self-contained plugin subdirectory with `--path`. Use `--ref` for a branch, tag, or commit. Verify that a clean checkout compiles through the *host installer* path: lifecycle scripts and custom UI build commands are not implicitly run. See the publishing reference for the embedded-asset consequence. ## 3. Build the product Use the SDK to own the protocol handshake and transport. Keep protocol stdout clean; log diagnostics to stderr. Use verified caller context for authorization, typed errors, and plugin-owned storage in its assigned data directory. Host data and host-brokered AI come through the SDK, never database/provider credentials copied from the host. Declare the minimum host permissions and handle absent configuration and revoked grants visibly. Manifest declarations request permissions; administrators grant them. Permissions protect host APIs: native plugins still run with the host OS account's permissions. Do not describe the installed plugin as sandboxed. Register discoverable navigation for a UI plugin. Use the selected Temps design standard, embed assets, and test its real proxy path. For deployment automation, subscribe to `deployment.succeeded`, keep receipt handling quick, and use bounded persistent jobs, idempotency, cancellation and explicit environment/project settings. ## 4. Verify the TypeScript lifecycle at three levels 1. **Unit and integration checks:** success, validation, failures, persistence/restart, bounded work, and relevant security cases. Typecheck and compile the actual binary. 2. **Local plugin simulator:** real binary + SDK protocol + mock host. Exercise sidebar UI, event delivery, duplicates, denied/granted/revoked permissions, and role restrictions. 3. **Installed Temps instance:** install a reviewed repository revision, open the plugin through Temps, trigger the intended user workflow, change permissions, and update the same source. Verify persistence and relevant actor/audit attribution where supported. Read [development.md](references/development.md) for simulator commands. A standalone unauthenticated UI preview proves layout only. Simulator/mock AI results are not real provider calls or a full host installation. A received event is not proof the job finished. Do not label end-to-end verification complete unless the installed workflow was exercised; record a concrete limitation when that environment is unavailable. ## 5. Distribute, list, and maintain TypeScript plugins The default workflow is **GitHub repository → reviewed source installation → catalog PR**. No npm publication, cloud publisher token, or registry signing key is needed for this path. Read [publishing.md](references/publishing.md) for exact metadata and installation examples. `plugin publish` is a separate native npm/signed-catalog flow, not shorthand for listing a GitHub repository; use it only when that distribution channel is explicitly requested. Prepare and validate all artifacts before an external publication step. Respect the user's existing authorization: creating a skill or building a plugin does not itself request public npm publication, a release tag, or installation into production. When publication is requested, show the concrete repository/version/permissions and execute only that scope. Never ask users to paste credentials into chat. Finish with source location, preview/install instructions, declared permissions, verification evidence, distribution/catalog state and remaining limitations. For updates, retain the stable identity, version deliberately, migrate storage safely, and test a same-source upgrade. Pushing a commit does not automatically update installed plugins.