@extension.dev/mcp 5.3.0 → 5.3.1
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +25 -0
- package/dist/module.js +27 -13
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "extension-mcp",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "MCP tools for browser extension development: scaffold from 60+ templates, run the dev server with HMR, inspect the live DOM and logs, and publish store-ready builds for Chrome, Edge, and Firefox.",
|
|
13
|
-
"version": "5.3.
|
|
13
|
+
"version": "5.3.1",
|
|
14
14
|
"category": "development",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "Cezar Augusto"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extension-mcp",
|
|
3
3
|
"description": "MCP tools for browser extension development: scaffold from 60+ templates, run the dev server with HMR, inspect the live DOM and logs, and publish store-ready builds for Chrome, Edge, and Firefox. Ships /extension, /extension-add, /extension-debug, and /extension-publish commands.",
|
|
4
|
-
"version": "5.3.
|
|
4
|
+
"version": "5.3.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cezar Augusto",
|
|
7
7
|
"email": "boss@cezaraugusto.net",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.3.1
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- `extension_login` pending results lead with the one-click device link
|
|
8
|
+
when the flow provides one (RFC 8628 `verification_uri_complete`): the
|
|
9
|
+
user opens it and approves with the code pre-filled, no typing. The
|
|
10
|
+
bare URI and code stay in the result as the fallback for flows that
|
|
11
|
+
cannot prefill.
|
|
12
|
+
- `extension_deploy` and `extension_release_promote` accept each other's
|
|
13
|
+
spelling for the same build commit: deploy folds a `buildId` argument
|
|
14
|
+
onto its canonical `buildSha`, and promote folds `buildSha` onto its
|
|
15
|
+
canonical `buildId`. Full-schema validation errors enumerate the new
|
|
16
|
+
aliases alongside the rest of the contract.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Resuming `extension_login` with a `deviceCode` while authorization is
|
|
21
|
+
still pending no longer claims a userCode of "(see the previous
|
|
22
|
+
response)". Only a hash of the code is stored, so it cannot be echoed
|
|
23
|
+
again; the result now says plainly that the one-click link and code
|
|
24
|
+
from the previous response are still valid, to open that link (or
|
|
25
|
+
enter the code at the verification URI), then call `extension_login`
|
|
26
|
+
again with the same deviceCode.
|
|
27
|
+
|
|
3
28
|
## 5.3.0
|
|
4
29
|
|
|
5
30
|
The DevX surprise swarm ran ten personas over the full create-to-release
|
package/dist/module.js
CHANGED
|
@@ -210,7 +210,7 @@ __webpack_require__.d(whoami_namespaceObject, {
|
|
|
210
210
|
handler: ()=>whoami_handler,
|
|
211
211
|
schema: ()=>whoami_schema
|
|
212
212
|
});
|
|
213
|
-
var package_namespaceObject = JSON.parse('{"rE":"5.3.
|
|
213
|
+
var package_namespaceObject = JSON.parse('{"rE":"5.3.1","El":{"OP":"^4.0.13"}}');
|
|
214
214
|
function scaffoldEnginePin(projectPath) {
|
|
215
215
|
try {
|
|
216
216
|
const pkg = JSON.parse(node_fs.readFileSync(node_path.join(projectPath, "package.json"), "utf8"));
|
|
@@ -5806,13 +5806,28 @@ function success(creds) {
|
|
|
5806
5806
|
});
|
|
5807
5807
|
}
|
|
5808
5808
|
function login_pending(start) {
|
|
5809
|
+
const complete = String(start.verificationUriComplete || "").trim();
|
|
5810
|
+
const hasCompleteLink = complete.length > 0 && complete !== start.verificationUri;
|
|
5811
|
+
const message = hasCompleteLink ? `Open ${complete} and approve (code ${start.userCode} is pre-filled), then call extension_login again with this deviceCode (and the same project). If the page asks for a code, enter ${start.userCode} at ${start.verificationUri}.` : `Open ${start.verificationUri} and enter code ${start.userCode}, then call extension_login again with this deviceCode (and the same project).`;
|
|
5809
5812
|
return JSON.stringify({
|
|
5810
5813
|
ok: false,
|
|
5811
5814
|
status: "authorization_pending",
|
|
5812
5815
|
userCode: start.userCode,
|
|
5813
5816
|
verificationUri: start.verificationUri,
|
|
5817
|
+
...hasCompleteLink ? {
|
|
5818
|
+
verificationUriComplete: complete
|
|
5819
|
+
} : {},
|
|
5814
5820
|
deviceCode: start.deviceCode,
|
|
5815
|
-
message
|
|
5821
|
+
message
|
|
5822
|
+
});
|
|
5823
|
+
}
|
|
5824
|
+
function resumePending(deviceCode, verificationUri) {
|
|
5825
|
+
return JSON.stringify({
|
|
5826
|
+
ok: false,
|
|
5827
|
+
status: "authorization_pending",
|
|
5828
|
+
verificationUri,
|
|
5829
|
+
deviceCode,
|
|
5830
|
+
message: `Still waiting for authorization. The one-click link and code from the previous response are still valid: open that link (or enter the code at ${verificationUri}), then call extension_login again with this same deviceCode (and the same project).`
|
|
5816
5831
|
});
|
|
5817
5832
|
}
|
|
5818
5833
|
async function login_handler(args) {
|
|
@@ -5839,11 +5854,7 @@ async function login_handler(args) {
|
|
|
5839
5854
|
if ("expired" === poll.reason) return login_fail("LoginExpired", "The device code expired. Run extension_login again to restart.");
|
|
5840
5855
|
if ("denied" === poll.reason) return login_fail("LoginDenied", "Authorization was denied at extension.dev/device.");
|
|
5841
5856
|
if ("error" === poll.reason) return login_fail("LoginError", poll.message || "Device login failed.");
|
|
5842
|
-
return
|
|
5843
|
-
deviceCode: String(args.deviceCode),
|
|
5844
|
-
userCode: "(see the previous response)",
|
|
5845
|
-
verificationUri: config.verificationUri
|
|
5846
|
-
});
|
|
5857
|
+
return resumePending(String(args.deviceCode), config.verificationUri);
|
|
5847
5858
|
}
|
|
5848
5859
|
let start;
|
|
5849
5860
|
try {
|
|
@@ -5868,7 +5879,8 @@ async function login_handler(args) {
|
|
|
5868
5879
|
return login_pending({
|
|
5869
5880
|
deviceCode: start.deviceCode,
|
|
5870
5881
|
userCode: start.userCode,
|
|
5871
|
-
verificationUri: start.verificationUri
|
|
5882
|
+
verificationUri: start.verificationUri,
|
|
5883
|
+
verificationUriComplete: start.verificationUriComplete
|
|
5872
5884
|
});
|
|
5873
5885
|
}
|
|
5874
5886
|
if (args.deviceCode) {
|
|
@@ -5881,11 +5893,7 @@ async function login_handler(args) {
|
|
|
5881
5893
|
if (!poll.ok) {
|
|
5882
5894
|
if ("expired" === poll.reason) return login_fail("LoginExpired", "The device code expired. Run extension_login again to restart.");
|
|
5883
5895
|
if ("denied" === poll.reason) return login_fail("LoginDenied", "Authorization was denied on GitHub.");
|
|
5884
|
-
return
|
|
5885
|
-
deviceCode: String(args.deviceCode),
|
|
5886
|
-
userCode: "(see the previous response)",
|
|
5887
|
-
verificationUri: "https://github.com/login/device"
|
|
5888
|
-
});
|
|
5896
|
+
return resumePending(String(args.deviceCode), "https://github.com/login/device");
|
|
5889
5897
|
}
|
|
5890
5898
|
try {
|
|
5891
5899
|
const creds = await exchangeAndPersist({
|
|
@@ -6538,6 +6546,12 @@ const ARG_ALIASES = {
|
|
|
6538
6546
|
],
|
|
6539
6547
|
browser: [
|
|
6540
6548
|
"browserName"
|
|
6549
|
+
],
|
|
6550
|
+
buildSha: [
|
|
6551
|
+
"buildId"
|
|
6552
|
+
],
|
|
6553
|
+
buildId: [
|
|
6554
|
+
"buildSha"
|
|
6541
6555
|
]
|
|
6542
6556
|
};
|
|
6543
6557
|
function normalizeArgAliases(inputSchema, args) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@extension.dev/mcp",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.3.
|
|
4
|
+
"version": "5.3.1",
|
|
5
5
|
"description": "MCP server that lets AI agents (Claude Code, Claude Desktop, Cursor, Copilot, Codex) build, run, inspect, and publish browser extensions. 32 tools for scaffolding, live DOM inspection, log streaming, and store-ready builds across Chrome, Edge, Firefox, Safari, and every Chromium- or Gecko-based browser (Brave, Opera, Vivaldi, Yandex, Waterfox, LibreWolf). Powered by extension.dev and Extension.js.",
|
|
6
6
|
"mcpName": "io.github.extensiondev/mcp",
|
|
7
7
|
"license": "MIT",
|
package/server.json
CHANGED
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
9
|
"websiteUrl": "https://extension.dev",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.1",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
15
|
"identifier": "@extension.dev/mcp",
|
|
16
|
-
"version": "5.3.
|
|
16
|
+
"version": "5.3.1",
|
|
17
17
|
"runtimeHint": "npx",
|
|
18
18
|
"transport": {
|
|
19
19
|
"type": "stdio"
|