@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.
@@ -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.0",
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.0",
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.0","El":{"OP":"^4.0.13"}}');
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: `Open ${start.verificationUri} and enter code ${start.userCode}, then call extension_login again with this deviceCode (and the same project).`
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 login_pending({
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 login_pending({
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.0",
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.0",
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.0",
16
+ "version": "5.3.1",
17
17
  "runtimeHint": "npx",
18
18
  "transport": {
19
19
  "type": "stdio"