原始内容
pi-morphllm-plugin
Pi runtime extension package that integrates Morph into Pi as real tools, commands, hooks, and compaction behavior, with file-based configuration for consistent setup.
This package is not just a prompt snippet or a thin skill wrapper. It installs as a normal Pi package and runs an active extension that registers Morph tools, lifecycle hooks, status commands, and Morph-first routing guidance.
What This Plugin Does
pi-morphllm-plugin makes Morph a practical part of everyday Pi coding sessions.
Use it when you want Pi to:
- apply larger or multi-location edits through
morph_fastapply - search the current workspace with natural language through
warpgrep_codebase_search - inspect public GitHub repositories through
warpgrep_github_search - test direct URLs through
morph_browser_test_url - test GitHub pull request previews through
morph_preview_test_pr - compact long conversations with Morph before falling back to Pi
- keep Morph configuration in one JSON file instead of scattered runtime environment variables
In short, this plugin turns Morph into a real Pi runtime integration instead of a manual workflow.
When To Use It
This plugin is a good fit if you use Pi regularly and want Morph to be part of your default workflow, especially for:
- refactoring or editing larger files safely
- searching unfamiliar codebases with natural language
- inspecting public GitHub repositories without cloning them locally
- validating direct URLs with Morph-managed browser automation
- validating PR preview deployments with CI-style browser checks
- reducing long session context with Morph compaction
- standardizing Morph setup across projects with file-based config
If you only need a one-off note about Morph or a manual prompt pattern, this package is probably more than you need.
Features
morph_fastapplyfor Fast Apply style file merging with dry-run previewmorph_context_researchfor WarpGrep collection plus Fast Model research briefswarpgrep_codebase_searchfor local exploratory code searchwarpgrep_github_searchfor public GitHub source lookupmorph_browser_test_urlfor generic URL testing with Morph browser automationmorph_preview_test_prfor PR-native preview testing with GitHub context and browser automation- Morph compaction integration for large conversations
- File-based
baseUrl/baseApiendpoint configuration - Single-key and multiple-key Morph API configuration
- Prompt-level Morph-first routing guidance without blocking native Pi tools
- Bundled skills for power users, reviewers, and PR testing workflows
Agent-Facing Tool Guide
This section is written for Pi, Codex-style coding agents, and humans who want predictable tool selection.
What the plugin adds
This plugin adds seven practical Morph capabilities to Pi:
- existing-file editing through
morph_fastapply - distilled context research through
morph_context_research - local codebase exploration through
warpgrep_codebase_search - public GitHub source exploration through
warpgrep_github_search - browser automation for direct URLs through
morph_browser_test_url - PR-aware preview validation through
morph_preview_test_pr - session compaction through Morph compact integration
Choose the right tool
- Existing file, non-trivial edit ->
morph_fastapply - Existing file, tiny exact one-block replacement -> native
edit - Brand new file -> native
write - Broad audit/explanation/planning before reading many files ->
morph_context_research - Local codebase question ->
warpgrep_codebase_search - Quick local codebase location question ->
warpgrep_codebase_search - Public GitHub source question ->
warpgrep_github_search - Direct URL or visible UI flow ->
morph_browser_test_url - PR preview with GitHub context ->
morph_preview_test_pr - Long session context reduction -> Morph compaction
FastApply guidance
Use morph_fastapply when all of the following are true:
- the file already exists
- the edit is non-trivial: file over about 80 lines, block-shape change, multi-location edit, refactor, or brittle exact replacement
- you have already read the file
- you can provide exact marker-wrapped anchor snippets
Do not use morph_fastapply when:
- the file is brand new
- the change is a tiny exact one-block replacement that native
edithandles cleanly - you have not read the file yet
- you only have feature intent and not actual
code_editanchor snippets
When using morph_fastapply:
- read the target file first
- provide
code_editwith// ... existing code ...markers - use
dry_run: truefirst for risky merges or large files - tighten anchors once if anchor quality is weak, then fall back to native
editonly for tiny exact replacements orwritefor new files
Context research guidance
Use morph_context_research for broad questions where the agent would otherwise read many files, such as audits, architecture explanations, debugging investigations, and planning. It collects contexts with WarpGrep, distills them with Fast Model when enabled, and falls back to local rg evidence when Morph keys are blocked, invalid, or rate-limited.
The output is a compact brief with direct answer, mechanism, relevant files, evidence, risks, recommended next reads, and explicit fallback notes. context-research means WarpGrep collection plus Fast Model distillation succeeded; local-fallback means Morph collection or distillation was unavailable and the tool returned lower-confidence local evidence. For edits, still read target files before modifying them.
Use warpgrep_codebase_search for quicker exploratory local questions such as:
- where a feature lives
- how routing works
- which files own a behavior
- where an API call is made
- which components, handlers, or imports are involved
- how a workflow is wired across the repo
Use warpgrep_github_search for the same style of question, but only for public GitHub source questions outside the local workspace.
Browser testing guidance
Use morph_browser_test_url when you already have a concrete URL and want Morph to:
- navigate pages
- click through flows
- smoke test a page
- verify visible UI behavior
- capture recording artifacts
Use morph_preview_test_pr when the task is specifically about a GitHub pull request and you want:
- PR context lookup
- preview deployment discovery
- browser validation against the preview
- check-run updates
- optional PR comments with artifacts
Fallback rules
If Morph is unavailable or a Morph call is not a good fit, use native Pi tools instead.
morph_fastapply-> tighten anchors once, then fall back to nativeeditonly for tiny exact replacements or nativewritefor new fileswarpgrep_codebase_search-> fall back tobashwithrg, then read matching fileswarpgrep_github_search-> fall back to GitHub search/file tools or web search- browser tools -> fall back to manual browser tools when Morph credentials or preview integration are missing
Install
From npm
pi install npm:pi-morphllm-plugin
This is the main installation path and does not require cloning the repository.
For the current run only
pi -e npm:pi-morphllm-plugin
This loads the package temporarily for the current Pi run without adding it to your installed package list.
For local development
pi -e .
This loads the package manifest from package.json, so Pi discovers the Morph extension, bundled prompt resource, and skills.
Compiled extension development shortcut
npm run build
pi -e ./dist/extensions/morph/index.js
Use the compiled extension entrypoint directly only when you intentionally want to test the extension file by itself. That path does not load the package prompt resource from prompts/morph-tools.md or bundled skills.
Editing Policy
Pi Morph uses guidance, not runtime blocking.
- Read the target file before choosing between native
editandmorph_fastapply. - Tiny exact one-block replacements should use native
edit; non-trivial existing-file edits should usemorph_fastapplyafter reading the file. - Brand new files should use native
write. - Files over about 80 lines, multi-location edits, block-shape changes, refactors, and brittle exact replacements should use
morph_fastapplyafter preparing marker-wrapped anchor snippets. - If the model chooses a workable native tool anyway, the extension allows it and continues instead of blocking.
Config
Pi Morph uses JSON config files only.
Config lookup order:
~/.pi/morph/morph.jsonas the default global Pi config.pi/morph.jsonin the current projectmorph.config.jsonin the current project
The recommended setup is global config in ~/.pi/morph/morph.json.
Pi Morph auto-creates that file on first runtime load when no existing Morph config is found. Installing the package alone does not create it; the extension must actually be loaded by Pi.
A repo example is available at .pi/morph.json.example.
You can also create the global config manually:
mkdir -p ~/.pi/morph
cp .pi/morph.json.example ~/.pi/morph/morph.json
Single API key
Example config:
{
"apiKey": "sk-...",
"editEnabled": true,
"warpgrepEnabled": true,
"warpgrepGithubEnabled": true,
"browserUrlEnabled": true,
"autoCompactEnabled": true,
"previewPrEnabled": true,
"routing": {
"editMode": "force",
"codebaseSearchMode": "force",
"githubSearchMode": "force",
"fallbackToNativeTools": true
},
"statsDashboard": {
"enabled": false,
"host": "127.0.0.1",
"port": 47631,
"token": "",
"autoOpen": true,
"storagePath": "~/.pi/morph/morph-stats.jsonl",
"retentionDays": 30
},
"fastModel": {
"enabled": true,
"model": "morph-qwen36-27b",
"fallbackModels": ["morph-qwen35-397b"],
"timeoutMs": 30000,
"errorClassifierEnabled": true,
"errorClassifierConfidenceThreshold": 0.8,
"contextResearchDistillationEnabled": true,
"repairSuggestionsEnabled": true
},
"compactContextThreshold": 0.85,
"compactPreserveRecent": 1,
"compactRatio": 0.3,
"compactEmergencyThreshold": 1.0,
"compactTargetThreshold": 0.5,
"compactEmergencyRatio": 0.05,
"compactMaxEmergencyPasses": 3,
"compactMinimumTriggerRatio": 0.8,
"compactQuery": "Keep the current user task, accepted constraints, recent decisions, file/code context, tool outputs, and next actionable steps. Remove greetings, repetition, and irrelevant detours.",
"compactIncludeMarkers": true,
"compactIncludeLineRanges": true,
"timeoutMs": 30000,
"warpGrepTimeoutMs": 60000,
"compactTimeoutMs": 60000,
"browserTimeoutMs": 300000,
"browserRecordingTimeoutMs": 300000,
"previewBrowserTimeoutMs": 300000
}
Multiple API keys
Pi Morph also supports rotation across multiple Morph API keys.
Set apiKey to "multiple", put keys in the fixed ~/.pi/morph/morph.env file, and choose an apiKeyStrategy.
Only add baseUrl when you want to use a custom Morph-compatible endpoint.
HTTP proxy support is separate from API-key rotation. Set proxyEnabled to true and put one HTTP(S) proxy per line in the fixed ~/.pi/morph/morp_proxy.txt file. When enabled, Morph API-key calls use the selected proxy. Multiple proxies support round-robin or random via proxyStrategy. Blank lines and # comments are ignored. Failed proxies are written to ~/.pi/morph/morph-proxies.json, skipped during their cooldown, and the same operation retries with the next available proxy when possible.
Example morp_proxy.txt:
http://user:pass@38.154.203.95:5863/
http://user:pass@proxy-2.example:5863/
{
"apiKey": "multiple",
"apiKeyStrategy": "round-robin"
}
Example morph.env:
sk-key-1
owner@example.com|sk-key-2
team|label|sk-key-3
Supported key-file line formats:
api-key- plain keyemail|api-key- owner metadata plus keyname|label|api-key- two metadata columns plus key
Supported strategies:
round-robin- rotate sequentially between configured keysrandom- choose a random configured key for each client call
Invalid-key failover and quarantine:
- Auth failures such as
401,403,unauthorized,forbidden, orinvalid api keyremove the failing key from fixed~/.pi/morph/morph.envand append the original line tomorph-invalid.env. - Invalid keys are not written to
morph-api-keys.json; that state file is only for temporary rate-limit cooldowns. - Same-call failover is built in: when one key fails authentication, Pi Morph retries the same operation with the next usable key in the configured list.
- Preferred or sticky keys still run first when applicable, then fall through to the remaining keys on auth failure.
The key file parser also ignores blank lines and # comments.
If a line contains pipe-delimited metadata like email|sk-key, Pi Morph uses the second field as the API key; with name|label|sk-key, it uses the third field.
All runtime settings come from JSON config files only.
Runtime config lives inside morph.json:
| Key | Default | Description |
|---|---|---|
apiKey |
none | Morph API key, or multiple to load keys from fixed ~/.pi/morph/morph.env. |
apiKeyStrategy |
round-robin |
API key selection strategy for multiple keys: round-robin or random. |
proxyEnabled |
false |
Enables HTTP proxy routing for Morph API calls. |
proxyStrategy |
round-robin |
Proxy selection strategy when ~/.pi/morph/morp_proxy.txt contains multiple proxies: round-robin or random. |
proxyStatePath |
~/.pi/morph/morph-proxies.json |
Local state file used for temporary failed-proxy cooldowns. |
proxyFailureCooldownMs |
600000 |
Cooldown window in milliseconds before a failed proxy is retried; default is 10 minutes. |
apiKeyStatePath |
~/.pi/morph/morph-api-keys.json |
Local state file used for temporary rate-limit cooldowns. Invalid auth keys are removed from ~/.pi/morph/morph.env and archived instead of being tracked here. |
invalidApiKeyCooldownMs |
Infinity |
Legacy compatibility field; confirmed auth-failed keys are now treated as permanently invalid and removed from the active pool instead of re-entering after a cooldown. |
editEnabled |
true |
Registers morph_fastapply. |
warpgrepEnabled |
true |
Registers warpgrep_codebase_search. |
warpgrepGithubEnabled |
true |
Registers warpgrep_github_search. |
contextResearchEnabled |
true |
Registers morph_context_research. |
contextResearchMaxContexts |
12 |
Default maximum contexts collected for a research brief. |
contextResearchMaxInputChars |
80000 |
Default evidence budget sent to Fast Model or local summary. |
contextResearchMaxOutputChars |
6000 |
Default Fast Model distillation output budget. |
browserUrlEnabled |
true |
Registers morph_browser_test_url for generic URL browser testing. |
previewPrEnabled |
true |
Registers morph_preview_test_pr for PR-native preview testing. |
autoCompactEnabled |
true |
Enables Morph-first automatic compaction. |
allowReadonlyAgents |
false |
Allows Morph mutating tools in readonly agents when true. |
profileRegistryPath |
~/.pi/morph/morph-profiles.json |
Local sticky browser profile registry path. |
routing.editMode |
force |
Prompt-level Morph edit guidance mode: prefer, strong, or force. |
routing.codebaseSearchMode |
force |
Prompt-level local WarpGrep guidance mode: prefer, strong, or force. |
routing.githubSearchMode |
force |
Prompt-level public GitHub WarpGrep guidance mode: prefer, strong, or force. |
routing.fallbackToNativeTools |
true |
Makes Morph tool guidance explicitly fall back to native Pi tools on failure. |
compactContextThreshold |
0.85 |
Fraction of the model context window that triggers proactive Morph compaction. |
compactPreserveRecent |
1 |
Number of recent messages to keep out of Morph compaction input. |
compactRatio |
0.3 |
Normal Morph compression ratio, clamped to the API minimum 0.05. |
compactEmergencyThreshold |
1.0 |
Multiplier of compactContextThreshold that switches compaction into emergency mode. |
compactTargetThreshold |
0.5 |
Emergency target as a fraction of the model context window. |
compactEmergencyRatio |
0.05 |
Emergency Morph compression ratio, clamped to the API minimum 0.05. |
compactMaxEmergencyPasses |
3 |
Maximum number of emergency re-compaction passes. |
compactMinimumTriggerRatio |
0.8 |
Safety guard: proactive auto compact will not trigger below this fraction of the selected model window, even if the char heuristic says the threshold was crossed. |
compactQuery |
built-in query | Relevance query sent to Morph Compact to preserve current task state and remove stale history. |
compactIncludeMarkers |
true |
Includes filtered-content markers in compacted output. |
compactIncludeLineRanges |
true |
Includes removed line-range metadata. |
compactTokenLimit |
unset | Optional token budget override for each Morph Compact request chunk. |
timeoutMs |
30000 |
Default Morph SDK request timeout. |
warpGrepTimeoutMs |
60000 |
WarpGrep request timeout. |
compactTimeoutMs |
60000 |
Morph Compact request timeout. |
browserTimeoutMs |
300000 |
Direct URL browser task completion timeout. |
browserRecordingTimeoutMs |
300000 |
Direct URL recording processing timeout after task completion. |
previewBrowserTimeoutMs |
300000 |
PR preview browser automation and recording timeout. |
fastModel.enabled |
true |
Master switch for OpenAI-compatible Morph Fast Model helpers. |
fastModel.model |
morph-qwen36-27b |
Fast Model name used by the AI helper calls; can be changed in morph.json. |
fastModel.fallbackModels |
["morph-qwen35-397b"] |
Backup Fast Models tried after transient model failures such as timeouts or 5xx responses. |
fastModel.baseUrl |
https://api.morphllm.com/v1 |
Optional OpenAI-compatible Fast Model endpoint override; omit it to use Morph's default. |
fastModel.timeoutMs |
30000 |
Timeout for Fast Model helper calls. |
fastModel.errorClassifierEnabled |
true |
Lets Fast Model classify unfamiliar assistant errors as context overflow before triggering auto-compact. |
fastModel.errorClassifierConfidenceThreshold |
0.8 |
Minimum confidence required before AI-classified context overflow triggers auto-compact. |
fastModel.contextResearchDistillationEnabled |
true |
Lets Fast Model distill collected local code research into a structured answer with evidence and recommended reads. |
fastModel.repairSuggestionsEnabled |
true |
Adds Fast Model repair hints to selected tool failures such as morph_fastapply anchor errors. |
Invalid routing mode strings automatically fall back to safe defaults:
routing.editMode->forcerouting.codebaseSearchMode->forcerouting.githubSearchMode->force
Commands
Core commands
/morph_statusshows the loaded config path, API key status, live API probe result, SDK status, base URL, feature flags, routing mode state, and whether Morph-first guidance is active./morph_settingsopens a simple interactive menu for updating routing settings inmorph.json./morph_selftestruns end-to-end checks for the API probe, FastApply, local WarpGrep, GitHub WarpGrep, compact, and reports Preview PR readiness or missing setup./morph_test_keystests every configured API key, clears keys that now pass, and keeps auth-failed keys quarantined for the configured cooldown window./morph_autoteststarts interactive URL-first autotest intake by default, or accepts a JSON context payload and returns an executable subflow-based autotest plan plus markdown report./morph_compactis explicit and Morph-only: the manual command requires Morph compaction and reports a clear warning when compaction cannot run.
Profile command
Use one consolidated /morph_profile <action> [json] command instead of many profile-specific slash commands.
Actions:
/morph_profile listshows local sticky-profile registry entries./morph_profile list-remoteshows remote Morph repos and profiles using a deterministic API key selection policy and prints the real active API key fingerprint./morph_profile register {...}registers or updates local profile metadata soprofileAliasand sticky-key selection can be used safely./morph_profile remove {...}removes only local sticky metadata without touching the remote Morph profile./morph_profile sync {...}syncs remote profiles for a repo into the local sticky registry using deterministic API key selection and prints the real active API key fingerprint./morph_profile create {...}creates a remote Morph profile and auto-binds it into the local sticky registry./morph_profile update {...}opens a remote Morph profile update flow, but does not treat local sticky metadata as confirmed until you register or sync after the remote update is actually finished./morph_profile delete {...}deletes a remote Morph profile and removes the matching local sticky metadata.
Interactive-friendly behavior:
- If you run
/morph_profile create,/morph_profile update,/morph_profile delete,/morph_profile sync,/morph_profile register, or/morph_profile removewithout JSON args, the command starts a short intake flow first. - The intake asks only for the missing fields, then guides you toward the exact command payload instead of forcing you to remember the JSON shape up front.
Automatic compaction behavior
- Automatic compaction is Morph-first when
autoCompactEnabledis enabled, then falls back to Pi if Morph cannot produce a result. - Proactive auto compaction runs internally inside the extension; it is not exposed as a user slash command.
compactQuerysends an explicit relevance query to Morph Compact so pruning stays focused on the active task instead of relying on auto-detection.compactIncludeMarkerscontrols whether Morph inserts(filtered N lines)markers in compacted output.compactIncludeLineRangescontrols whether Morph returns removed line-range metadata alongside compacted messages.- By default, automatic Morph compaction starts when the session reaches about
85%of the selected model context window viacompactContextThreshold: 0.85, but thecompactMinimumTriggerRatio: 0.8guard prevents proactive compaction from firing while the raw model-window estimate is still below about80%. - When
autoCompactEnabledisfalse, automatic compaction skips Morph entirely and leaves compaction to Pi.
Example /morph_status fields:
Morph plugin version: 0.2.0Morph config: ~/.pi/morph/morph.jsonMorph API key: configuredMorph API key source: single key,3 keys (round-robin), orkey file: ~/.pi/morph/morph.envdepending on your configurationMorph API live test: ok,failed (authentication error: ...),failed (request timeout: ...),failed (network/base URL error: ...), orskipped (...)Morph FastApply enabled: truePreview PR enabled: trueAuto compaction policy: Morph first, Pi fallbackManual /morph_compact policy: Morph requiredRouting edit mode: forceRouting codebase search mode: forceRouting GitHub search mode: forceMorph FastApply-first guidance active: trueMorph-first local search guidance active: trueMorph-first GitHub search guidance active: trueFallback to native tools: trueManual /morph_compactwill report a warning if there are no older messages available to compact.
/morph_status is the main summary view. Use /morph_settings when you want to change config interactively instead of editing JSON by hand. Reload the extension or session after credential or key-file changes so Morph clients are rebuilt with the new config. The footer also shows MorphLLM plus the loaded API key count, including the active strategy when multiple keys are configured.
Use /morph_test_keys after rotating credentials, recovering a previously invalid key, or when all keys appear blocked and you want to re-probe the pool immediately instead of waiting for the cooldown window to expire.
Stats Dashboard
- Access uses a stable query-string token such as
http://127.0.0.1:47631/?token=... - Storage uses JSONL so each Morph activity appends a lightweight event record
morph_fastapplydry runs are intentionally not recorded- File activity is grouped by project / repo / folder, then listed per edited file
- Multiple-key usage is summarized with safe identifiers based on the last 10 characters of each key
- The dashboard includes client-side search, filters, sorting, and pagination for project cards and recent events
- Filtering is available by project, tool, status, and key suffix, alongside free-text search across the rendered activity data
- The control surface uses a denser command-bar layout with stronger active-state styling so active filters and sorts are visible at a glance
For SSH usage with the default localhost bind:
ssh -L 47631:127.0.0.1:47631 user@host
Tools
morph_fastapplyhandles non-trivial edits in existing files using// ... existing code ...markers and supportsdry_runpreviews.- Read the file first and provide
code_editas marker-wrapped anchor snippets, not feature-level intent alone. warpgrep_codebase_searchanswers exploratory questions about the current workspace.warpgrep_github_searchsearches public GitHub repositories without cloning them locally.morph_browser_test_urlopens a direct URL in Morph browser automation, follows the provided task, and returns a summary plus recording artifacts when available.morph_preview_test_prfetches PR context through the Morph GitHub SDK, finds a successful preview deployment, runs a browser test, and updates a GitHub check run by default.- Set
postComment: truewhen you also want a PR comment with a recording preview. - Tool preference strength and fallback behavior are controlled by
routinginmorph.json. - In
forcemode, the extension applies the strongest Morph-first guidance for non-trivial existing-file edits after the file has been read and anchor snippets are available; nativeeditremains available for tiny exact replacements and nativewriteremains available for new files. - In
strongmode, the extension strongly prefers Morph tools for non-trivial existing-file edits after the file has been read and anchor snippets are available. - In
prefermode, the extension gives a softer recommendation without changing tool availability.
Example morph_fastapply diff preview:

Example morph_fastapply preview call:
{
"target_filepath": "src/utils/math.ts",
"instructions": "I am adding input validation to the add function.",
"code_edit": "function add(a: number, b: number): number {\n if (typeof a !== 'number' || typeof b !== 'number') {\n throw new TypeError('Both arguments must be numbers.');\n }\n // ... existing code ...\n}",
"dry_run": true
}
Use dry_run: true first when you want to inspect the diff preview without writing the file. Then rerun the same tool call with dry_run: false or omit it to apply the edit.
Example morph_browser_test_url call:
{
"url": "https://netq.me",
"task": "Open the premium page and confirm the premium section loads without obvious errors",
"recordVideo": true,
"maxSteps": 12
}
Example morph_browser_test_url call with auth + model:
{
"url": "https://staging.example.com/dashboard",
"task": "Open the dashboard, verify the login succeeds, and confirm the summary widgets load without obvious errors.",
"auth": {
"username": "test@example.com",
"password": "secret"
},
"model": "morph-computer-use-v1",
"recordVideo": true,
"maxSteps": 10
}
Example morph_browser_test_url call with sticky profile reuse:
{
"url": "https://staging.example.com/dashboard",
"task": "Open the dashboard and verify the summary widgets load without obvious errors.",
"profileAlias": "staging-dashboard-admin",
"recordVideo": true,
"maxSteps": 8
}
For repeated protected runs, prefer profileId or profileAlias first when a local Morph profile registry entry already exists and can resolve to an active API key. The local registry stores only metadata such as profile ID, alias, host mapping, and hashed API key fingerprint; it does not store live browser session secrets.
Minimal remote-managed profile workflow:
- Inspect remote repos and profiles if needed:
/morph_profile list-remote
- Create a remote Morph profile and auto-bind it locally:
/morph_profile create '{"name":"Staging","repoId":"repo_xxx","alias":"staging-dashboard-admin","hostPattern":"staging.example.com","preferredModel":"morph-computer-use-v1"}'
- If you already have a remote
profileId, register only the local sticky metadata:
/morph_profile register '{"profileId":"prof_xxx","alias":"staging-dashboard-admin","hostPattern":"staging.example.com","createdWithApiKeyFingerprint":"a1b2c3d4e5f67890","preferredModel":"morph-computer-use-v1"}'
- Verify the local registry:
/morph_profile list
- Optionally sync all remote profiles for a repo back into the local registry:
/morph_profile sync '{"repoId":"repo_xxx","repoFullName":"owner/repo"}'
Reuse the profile via
profileAliasorprofileIdinmorph_browser_test_url.Update or delete the remote profile later while preserving sticky-key affinity:
/morph_profile update '{"profileAlias":"staging-dashboard-admin","notes":"refresh login setup"}'
/morph_profile delete '{"profileAlias":"staging-dashboard-admin"}'
After /morph_profile update, treat the returned setup/edit URL as the source of truth. Once the remote edit is actually finished, run /morph_profile register or /morph_profile sync if you also want the local sticky metadata to reflect the final remote state.
- If you only want to detach local sticky metadata and keep the remote Morph profile intact:
/morph_profile remove '{"profileAlias":"staging-dashboard-admin"}'
Quick rule of thumb:
- use
/morph_profile createwhen AI should create the remote Morph profile for you - use
/morph_profile registerwhen the remoteprofileIdalready exists and you only need local sticky binding - use
/morph_profile syncwhen you want to pull remote profile state back into the local registry - use
/morph_profile removewhen you want to remove only the local binding - use
/morph_profile deletewhen you want to remove both the remote profile and its local sticky metadata
Remote command behavior notes:
/morph_profile list-remote,/morph_profile create, and/morph_profile syncnow use deterministic API key selection by taking the first active configured key instead of random or round-robin selection.- Remote command output now includes the real
apiKeyFingerprintthat was used, which makes sticky-key debugging much easier on large multi-key pools. - Remote listing and sync commands now surface clearer per-call errors instead of only generic failures.
/morph_profile updateintentionally does not rewrite local registry metadata up front; after the remote edit is actually finished, use/morph_profile registeror/morph_profile syncto persist the confirmed local view.
Test-mode note:
- Full test mode means the Pi harness dependencies are resolvable, so
test/extension.test.tscan exercise command/extension behavior normally through its compileddist-test/test/extension.test.jsoutput. - Degraded test mode means those harness dependencies are unavailable in the current environment. In that case,
test/extension.test.tsnow auto-skips harness-dependent cases instead of hard-failing at import time, while helper/config/profile tests still run normally.
Example morph_preview_test_pr call:
{
"owner": "acme",
"repo": "app",
"prNumber": 42,
"task": "Focus on the login and signup flows changed in this PR",
"preferredEnvironment": "preview",
"postComment": true
}
This tool assumes the Morph GitHub App is installed for the repository and that the PR has a successful preview deployment. By default it creates and updates a Morph Preview Test check run; set postComment: true to also publish a PR comment with the result and recording preview.
Skills
This package includes five bundled skills to enhance Morph workflows. All skills have been comprehensively improved with advanced techniques, troubleshooting guides, and real-world examples.
morph-power-user (13 KB)
Expert-level decision policy for morph_fastapply, warpgrep_codebase_search, and warpgrep_github_search.
Focus:
- Strategic tool selection (when to use FastApply vs native edit vs write)
- Dry run strategy and anchor quality guidelines
- WarpGrep usage patterns and fallback strategies
- Execution patterns for safe refactoring and exploratory edits
New in latest version:
- ✨ Comprehensive troubleshooting guide with diagnosis and solutions
- ✨ Real-world code examples (function renaming, validation, API updates)
- ✨ Multi-file refactoring coordination strategies (Sequential/Batch/Dependency-Ordered)
- ✨ Anchor quality metrics table
- ✨ Advanced techniques: anchor validation, progressive refinement, fallback chaining
Use when:
- Multi-file refactoring or scattered edits
- Exploring unfamiliar codebases
- Working with large files or whitespace-sensitive languages
- Need guidance on Morph tool selection
morph-reviewer (14 KB)
Quality gate and validation layer for Morph tool outputs.
Focus:
- Post-execution validation (anchor quality, completeness, safety)
- Search result quality assessment
- Compaction effectiveness evaluation
- Fallback appropriateness validation
New in latest version:
- ✨ Severity scoring system (0-10 scale) with priority matrix
- ✨ Automated checks for FastApply and WarpGrep
- ✨ Example review reports (success, warning, critical scenarios)
- ✨ Issue prioritization and escalation path
- ✨ Enhanced safety assessment framework
Use when:
- After FastApply completes (especially without dry run)
- After WarpGrep returns results
- After automatic compaction runs
- Before committing Morph-generated changes
morph-preview-pr (12 KB)
Specialized skill for morph_preview_test_pr — PR-native browser verification.
Focus:
- Task formulation for PR preview testing
- Environment selection strategies
- Check run vs PR comment decision guidance
- Result interpretation and retry strategies
New in latest version:
- ✨ Retry strategies for different failure types
- ✨ Flaky test identification and mitigation techniques
- ✨ CI/CD integration guidance with GitHub Actions example
- ✨ Multi-page flow testing examples
- ✨ Severity assessment framework (Critical/High/Medium/Low)
Use when:
- Validating PR preview deployments
- Testing UI changes in pull requests
- Running automated browser checks on PRs
- Need guidance on effective PR testing tasks
morph-production-tester (9.3 KB)
Automatic production site testing with code-aware analysis for morph_browser_test_url.
Focus:
- Automatic detection of routes and components using
warpgrep_codebase_search - Comprehensive analysis of buttons, forms, and interactive elements from code
- Single comprehensive browser test execution
- Authentication detection and credential handling
- Code-aware test result analysis and reporting
New in latest version:
- ✨ Reduced verbosity by 34% for faster comprehension
- ✨ Dynamic/SPA routing handling
- ✨ Improved end-to-end authentication flow guidance
- ✨ Error recovery strategies
- ✨ Simplified report template
- ✨ Better framework detection patterns (Next.js, React, Vue)
Use when:
- Pre-production validation before deploying
- Post-deployment smoke testing
- Testing all functionality on a specific page automatically
- Need code-aware comprehensive testing strategy
morph-autotest
Autonomous multi-session browser testing engine for morph_browser_test_url.
Focus:
- Preflight guardrails before any run starts
- Executable per-subflow planning instead of one long browser session
- Auth-path selection in this order:
profileAlias/profileId -> cookies -> username/password -> blocked - Mandatory code-aware analysis when the codebase is available
- Failure diagnosis that combines browser evidence, code evidence, and PRD alignment
- Markdown report generation with per-subflow status, code-suspect hints, and next actions
- Live code-search-enriched diagnosis for failed or partial subflows when local code search is available
- URL-first browser testing flow without GitHub/PR intake
Use when:
- You want TestSprite-style validation without vague automation theater
- You need a slash-command launcher to gather context, then hand off all reasoning to a skill
- You want final output in markdown with recording links and likely code suspects
Hooks And Compaction
Morph compaction labels require @earendil-works/pi-coding-agent >=0.75.0; older Pi cores still run compaction, but they ignore the optional label and show Pi's default compaction text.
This package uses Pi extension hooks rather than command aliases alone.
session_startandsession_shutdownmanage Morph runtime status in the UI.before_agent_startinjects Morph routing hints into the system prompt based onroutingconfig.tool_callnormalizes tool input before execution.tool_resultadds Morph metadata such as provider and base URL.model_selecttracks the active model context window.session_before_compactruns Morph compaction before Pi falls back to its normal compactor, so automatic compaction stays Morph-first while preserving Pi as the safety net wheneverautoCompactEnabledis on.- Proactive auto compaction is scheduled internally from
message_end; it no longer relies on injecting an internal slash command into the conversation. - When
autoCompactEnabledis off,session_before_compactskips Morph and leaves automatic compaction to Pi. /morph_compactuses the same hook-based path and always requires Morph compaction instead of silently falling back to Pi.
Development
Clone the repository only if you want to work on the package itself.
Copy .pi/morph.json.example to .pi/morph.json or create ~/.pi/morph/morph.json, fill in apiKey, then run:
pi -e .
Useful development modes:
pi -e .loads the full package manifest, extension, bundled prompt resource, and skills.npm run build && pi -e ./dist/extensions/morph/index.jsloads only the compiled extension entrypoint.npm testruns the package tests.
Notes
- Default Morph endpoint is
https://api.morphllm.com. - Set
baseUrlorbaseApiin JSON when you want a custom endpoint. - The package manifest in
package.jsonallows Pi to auto-discover the extension, prompt resource, and skills. - Automatic config creation happens on first runtime load, not during
pi install. - Automatic config creation only targets the global
~/.pi/morph/morph.jsonpath, never a project-local file by default.
Testing
Run:
npm test