Skip to content

ext:migrate now upgrades extensions - #10977

Open
inlined wants to merge 15 commits into
mainfrom
ext-migrate-update-check
Open

ext:migrate now upgrades extensions#10977
inlined wants to merge 15 commits into
mainfrom
ext-migrate-update-check

Conversation

@inlined

@inlined inlined commented Aug 24, 2026

Copy link
Copy Markdown
Member

Nudges users to upgrade their extension before migrating. After the numbers of errors I ran into testing a migration of storage-resize-images@0.1.13 to 0.3.6, I'm of the belief that we might need to require this.

This PR required several fixes to the existing extensions code revealed by this particular upgrade. New features added to extensions over the years actually caused problems with the updated extensions. We now re-prompt for parameters if:

  1. The parameter changed types (e.g. string -> SELECT_RESOURCE)
  2. The parameter changed validators and the old type now fails
  3. If the location system parameter is undefined (notably the only system parameter that is required). Short circuited if LOCATION was set previously
  4. If any parameters are left over after upgrade, re-prompt for advanced parameters (e.g. in case there was a MAX_INSTANCES that is now a system parameter)

Fixing this also required fixing some other things like changing how sameParam matches, making sure the actual original version of the spec is fixed, and fixing the select prompt library which didn't handle --force correctly.

### Description
Implement the initial Unique Veneer section of the ext:migrate workflow. This includes the extmigration experiment registration, replacements.json integration, table formatting of installed extensions, instance filtering, interactive prompt selection via createMigrationPlan, and the ext:migrate CLI command.

### Scenarios Tested
- Unit tests in src/extensions/migrate.spec.ts covering all 9 manual scenarios (no flags, --ext-instance, --extension, and error states).

### Sample Commands
firebase ext:migrate --project P
firebase ext:migrate --project P --ext-instance E1
firebase ext:migrate --project P --extension storage-resize-images

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the ext:migrate command to support migrating extension instances to function kits, along with updates to parameter prompting, validation, and default handling for multiselect parameters. The review feedback highlights several critical improvements: ensuring that checkbox prompts correctly use computed default options, propagating the --force flag to enforce non-interactive behavior across all sub-prompts, and safely handling potentially undefined instance.config.params to prevent runtime crashes during migration.

Comment thread src/prompt.ts
Comment on lines +170 to +177
let optsWithDefault = opts;
if (opts.default === undefined && Array.isArray(opts.choices)) {
const checkedValues = (opts.choices as Choice<Value>[])
.filter((c) => c && typeof c === "object" && "checked" in c && (c as Choice<Value>).checked)
.map((c) => c.value);
optsWithDefault = { ...opts, default: checkedValues };
}
const { shouldReturn, value } = guard(optsWithDefault);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

In interactive mode, the computed default values for the checkbox prompt are ignored because inquirer.checkbox is called with the original opts instead of optsWithDefault. Reassigning opts directly ensures that both guard(opts) and inquirer.checkbox(opts) use the updated options with the correct defaults.

Suggested change
let optsWithDefault = opts;
if (opts.default === undefined && Array.isArray(opts.choices)) {
const checkedValues = (opts.choices as Choice<Value>[])
.filter((c) => c && typeof c === "object" && "checked" in c && (c as Choice<Value>).checked)
.map((c) => c.value);
optsWithDefault = { ...opts, default: checkedValues };
}
const { shouldReturn, value } = guard(optsWithDefault);
if (opts.default === undefined && Array.isArray(opts.choices)) {
const checkedValues = (opts.choices as Choice<Value>[])
.filter((c) => c && typeof c === "object" && "checked" in c && (c as Choice<Value>).checked)
.map((c) => c.value);
opts = { ...opts, default: checkedValues };
}
const { shouldReturn, value } = guard(opts);

Comment on lines +27 to +35
.action(async (options: ExtMigrateOptions) => {
const projectId = needProjectId(options);
const plan = await createMigrationPlan(projectId, {
package: options.package,
extInstance: options.extInstance,
extension: options.extension,
nonInteractive: options.nonInteractive,
force: options.force,
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

When the --force flag is passed, the command should run completely non-interactively. However, because options.force is not propagated to sub-prompts (like parameter configuration), they will still prompt the user interactively. Setting options.nonInteractive = true and calling setNonInteractive(true) when options.force is active ensures that all prompts automatically fall back to their default values.

Suggested change
.action(async (options: ExtMigrateOptions) => {
const projectId = needProjectId(options);
const plan = await createMigrationPlan(projectId, {
package: options.package,
extInstance: options.extInstance,
extension: options.extension,
nonInteractive: options.nonInteractive,
force: options.force,
});
.action(async (options: ExtMigrateOptions) => {
const projectId = needProjectId(options);
if (options.force) {
options.nonInteractive = true;
const { setNonInteractive } = require("../prompt");
setNonInteractive(true);
}
const plan = await createMigrationPlan(projectId, {
package: options.package,
extInstance: options.extInstance,
extension: options.extension,
nonInteractive: options.nonInteractive,
force: options.force,
});

Comment thread src/extensions/migrate.ts
);

const targetRef = `${baseRef}@${latestVersion}`;
let finalParams = instance.config.params;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

instance.config.params can be undefined in some older or malformed extension instances. Initializing finalParams to instance.config.params || {} prevents potential runtime TypeError crashes when accessing or modifying parameter keys.

Suggested change
let finalParams = instance.config.params;
let finalParams = instance.config.params || {};

Comment thread src/extensions/migrate.ts Outdated
const paramBindings = await paramHelper.promptForNewParams({
spec: oldSpec,
newSpec: newExtensionVersion.spec,
currentParams: instance.config.params,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Pass finalParams (which is guaranteed to be defined) instead of instance.config.params to promptForNewParams to prevent a potential crash if instance.config.params is undefined.

Suggested change
currentParams: instance.config.params,
currentParams: finalParams,

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

inlined and others added 7 commits August 24, 2026 13:34
### Description
Address review feedback on PR #10974:
- Validate `--package` CLI option using `validateNpmPackageName`
- Simplify `getKitPackage` lookup logic (removed shortName fallback)
- Update error messages when no kit package is found to encourage forking
- Add unit test verifying `getKitPackage` returns undefined for extension refs without a replacement package

### Scenarios Tested
- Tested `ext:migrate` unit test suite (`npm run mocha:fast src/extensions/migrate.spec.ts`)
- Tested `functions:kits:install` unit test suite (`npm run mocha:fast src/commands/functions-kits-install.spec.ts`)
…propagate prompt cancellation

### Description
- Rebased cleanly onto PR #10974 ().
- Added  helper in  to separate user params from system params (such as ).
- Updated  in  to accept and forward  to .
- Refactored  in  to strictly enforce parameter prompting rules (only prompting for changed types, rejected validator values, newly required unset params, or advanced/system params when old params are dropped or location is unset).
- Removed error-swallowing try-catch in  () so Ctrl+C or prompt cancellations immediately abort instance updates.
- Added log bullet right before  execution.

### Scenarios Tested
- Executed unit test suite ( mocha tests passing).
- Clean build (
> firebase-tools@15.28.1 build
> npm run build:mcp-apps && tsc && npm run copyfiles

> firebase-tools@15.28.1 build:mcp-apps
> vite build --config src/mcp/apps/update_environment/vite.config.ts && vite build --config src/mcp/apps/init/vite.config.ts && vite build --config src/mcp/apps/deploy/vite.config.ts

vite v4.2.1 building for production...
transforming...
✓ 146 modules transformed.
rendering chunks...
../../../../lib/mcp/apps/update_environment/mcp-app.html  139.69 kB
✓ built in 396ms
vite v4.2.1 building for production...
transforming...
✓ 146 modules transformed.
rendering chunks...
../../../../lib/mcp/apps/init/mcp-app.html  142.63 kB
✓ built in 378ms
vite v4.2.1 building for production...
transforming...
✓ 146 modules transformed.
rendering chunks...
../../../../lib/mcp/apps/deploy/mcp-app.html  138.16 kB
✓ built in 371ms
src/extensions/askUserForParam.ts(199,15): error TS2554: Expected 1 arguments, but got 2.
src/extensions/migrate.spec.ts(362,9): error TS2554: Expected 3 arguments, but got 4.
src/extensions/migrate.spec.ts(380,9): error TS2554: Expected 3 arguments, but got 4.) and lint (
> firebase-tools@15.28.1 lint:changed-files
> ts-node ./scripts/lint-changed-files.ts

Ignoring changed files:
 - CHANGELOG.md

/Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/commands/index.ts
    4:33  warning  Unexpected any. Specify a different type                    @typescript-eslint/no-explicit-any
    4:51  warning  Unexpected any. Specify a different type                    @typescript-eslint/no-explicit-any
   11:18  warning  Missing return type on function                             @typescript-eslint/explicit-function-return-type
   12:13  warning  Unsafe assignment of an `any` value                         @typescript-eslint/no-unsafe-assignment
   12:32  warning  Require statement not part of import statement              @typescript-eslint/no-var-requires
   13:7   warning  Unsafe member access .register on an `any` value            @typescript-eslint/no-unsafe-member-access
   13:7   warning  Unsafe call of an `any` typed value                         @typescript-eslint/no-unsafe-call
   14:7   warning  Unsafe return of an `any` typed value                       @typescript-eslint/no-unsafe-return
   14:14  warning  Unsafe member access .runner on an `any` value              @typescript-eslint/no-unsafe-member-access
   14:14  warning  Unsafe call of an `any` typed value                         @typescript-eslint/no-unsafe-call
   17:37  warning  Unexpected any. Specify a different type                    @typescript-eslint/no-explicit-any
   18:13  warning  Unsafe assignment of an `any` value                         @typescript-eslint/no-unsafe-assignment
   19:7   warning  Unsafe return of an `any` typed value                       @typescript-eslint/no-unsafe-return
   19:14  warning  Unsafe call of an `any` typed value                         @typescript-eslint/no-unsafe-call
   24:7   warning  Unsafe member access .command on an `any` value             @typescript-eslint/no-unsafe-member-access
   24:7   warning  Unsafe call of an `any` typed value                         @typescript-eslint/no-unsafe-call
   24:7   warning  Require statement not part of import statement              @typescript-eslint/no-var-requires
   33:3   warning  Unsafe member access .debugtokens on an `any` value         @typescript-eslint/no-unsafe-member-access
   34:3   warning  Unsafe member access .debugtokens on an `any` value         @typescript-eslint/no-unsafe-member-access
   35:3   warning  Unsafe member access .debugtokens on an `any` value         @typescript-eslint/no-unsafe-member-access
   36:3   warning  Unsafe member access .debugtokens on an `any` value         @typescript-eslint/no-unsafe-member-access
   41:5   warning  Unsafe member access .services on an `any` value            @typescript-eslint/no-unsafe-member-access
   42:5   warning  Unsafe member access .services on an `any` value            @typescript-eslint/no-unsafe-member-access
   43:5   warning  Unsafe member access .services on an `any` value            @typescript-eslint/no-unsafe-member-access
   44:5   warning  Unsafe member access .services on an `any` value            @typescript-eslint/no-unsafe-member-access
   45:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
   46:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
   47:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
   48:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
   49:5   warning  Unsafe member access .apps on an `any` value                @typescript-eslint/no-unsafe-member-access
   50:5   warning  Unsafe member access .apps on an `any` value                @typescript-eslint/no-unsafe-member-access
   53:3   warning  Unsafe member access .distribute on an `any` value          @typescript-eslint/no-unsafe-member-access
   54:3   warning  Unsafe member access .testers on an `any` value             @typescript-eslint/no-unsafe-member-access
   55:3   warning  Unsafe member access .testers on an `any` value             @typescript-eslint/no-unsafe-member-access
   56:3   warning  Unsafe member access .testers on an `any` value             @typescript-eslint/no-unsafe-member-access
   57:3   warning  Unsafe member access .testers on an `any` value             @typescript-eslint/no-unsafe-member-access
   58:3   warning  Unsafe member access .groups on an `any` value              @typescript-eslint/no-unsafe-member-access
   59:3   warning  Unsafe member access .groups on an `any` value              @typescript-eslint/no-unsafe-member-access
   60:3   warning  Unsafe member access .groups on an `any` value              @typescript-eslint/no-unsafe-member-access
   61:3   warning  Unsafe member access .groups on an `any` value              @typescript-eslint/no-unsafe-member-access
   62:3   warning  Unsafe assignment of an `any` value                         @typescript-eslint/no-unsafe-assignment
   62:3   warning  Unsafe member access .group on an `any` value               @typescript-eslint/no-unsafe-member-access
   62:34  warning  Unsafe member access .groups on an `any` value              @typescript-eslint/no-unsafe-member-access
   63:3   warning  Unsafe member access .testCases on an `any` value           @typescript-eslint/no-unsafe-member-access
   64:3   warning  Unsafe member access .testCases on an `any` value           @typescript-eslint/no-unsafe-member-access
   65:3   warning  Unsafe member access .testCases on an `any` value           @typescript-eslint/no-unsafe-member-access
   67:3   warning  Unsafe member access .execute on an `any` value             @typescript-eslint/no-unsafe-member-access
   69:5   warning  Unsafe member access .wata on an `any` value                @typescript-eslint/no-unsafe-member-access
   72:3   warning  Unsafe member access .create on an `any` value              @typescript-eslint/no-unsafe-member-access
   73:3   warning  Unsafe member access .list on an `any` value                @typescript-eslint/no-unsafe-member-access
   74:3   warning  Unsafe member access .init on an `any` value                @typescript-eslint/no-unsafe-member-access
   75:3   warning  Unsafe member access .sdkconfig on an `any` value           @typescript-eslint/no-unsafe-member-access
   76:3   warning  Unsafe member access .android on an `any` value             @typescript-eslint/no-unsafe-member-access
   77:3   warning  Unsafe member access .android on an `any` value             @typescript-eslint/no-unsafe-member-access
   78:3   warning  Unsafe member access .android on an `any` value             @typescript-eslint/no-unsafe-member-access
   79:3   warning  Unsafe member access .android on an `any` value             @typescript-eslint/no-unsafe-member-access
   80:3   warning  Unsafe member access .android on an `any` value             @typescript-eslint/no-unsafe-member-access
   82:3   warning  Unsafe member access .export on an `any` value              @typescript-eslint/no-unsafe-member-access
   83:3   warning  Unsafe member access .import on an `any` value              @typescript-eslint/no-unsafe-member-access
   85:3   warning  Unsafe member access .onboard on an `any` value             @typescript-eslint/no-unsafe-member-access
   86:3   warning  Unsafe member access .onboard on an `any` value             @typescript-eslint/no-unsafe-member-access
   87:3   warning  Unsafe member access .symbols on an `any` value             @typescript-eslint/no-unsafe-member-access
   88:3   warning  Unsafe member access .symbols on an `any` value             @typescript-eslint/no-unsafe-member-access
   89:3   warning  Unsafe member access .mappingfile on an `any` value         @typescript-eslint/no-unsafe-member-access
   90:3   warning  Unsafe member access .mappingfile on an `any` value         @typescript-eslint/no-unsafe-member-access
   91:3   warning  Unsafe member access .mappingfile on an `any` value         @typescript-eslint/no-unsafe-member-access
   93:5   warning  Unsafe member access .sourcemap on an `any` value           @typescript-eslint/no-unsafe-member-access
   94:5   warning  Unsafe member access .sourcemap on an `any` value           @typescript-eslint/no-unsafe-member-access
   97:3   warning  Unsafe member access .get on an `any` value                 @typescript-eslint/no-unsafe-member-access
   98:3   warning  Unsafe member access .import on an `any` value              @typescript-eslint/no-unsafe-member-access
   99:3   warning  Unsafe member access .instances on an `any` value           @typescript-eslint/no-unsafe-member-access
  100:3   warning  Unsafe member access .instances on an `any` value           @typescript-eslint/no-unsafe-member-access
  101:3   warning  Unsafe member access .instances on an `any` value           @typescript-eslint/no-unsafe-member-access
  102:3   warning  Unsafe member access .profile on an `any` value             @typescript-eslint/no-unsafe-member-access
  103:3   warning  Unsafe member access .push on an `any` value                @typescript-eslint/no-unsafe-member-access
  104:3   warning  Unsafe member access .remove on an `any` value              @typescript-eslint/no-unsafe-member-access
  106:5   warning  Unsafe member access .rules on an `any` value               @typescript-eslint/no-unsafe-member-access
  107:5   warning  Unsafe member access .rules on an `any` value               @typescript-eslint/no-unsafe-member-access
  108:5   warning  Unsafe member access .rules on an `any` value               @typescript-eslint/no-unsafe-member-access
  109:5   warning  Unsafe member access .rules on an `any` value               @typescript-eslint/no-unsafe-member-access
  110:5   warning  Unsafe member access .rules on an `any` value               @typescript-eslint/no-unsafe-member-access
  111:5   warning  Unsafe member access .rules on an `any` value               @typescript-eslint/no-unsafe-member-access
  113:3   warning  Unsafe member access .set on an `any` value                 @typescript-eslint/no-unsafe-member-access
  114:3   warning  Unsafe member access .settings on an `any` value            @typescript-eslint/no-unsafe-member-access
  115:3   warning  Unsafe member access .settings on an `any` value            @typescript-eslint/no-unsafe-member-access
  116:3   warning  Unsafe member access .settings on an `any` value            @typescript-eslint/no-unsafe-member-access
  117:3   warning  Unsafe member access .update on an `any` value              @typescript-eslint/no-unsafe-member-access
  120:3   warning  Unsafe member access .exec on an `any` value                @typescript-eslint/no-unsafe-member-access
  121:3   warning  Unsafe member access .export on an `any` value              @typescript-eslint/no-unsafe-member-access
  122:3   warning  Unsafe member access .start on an `any` value               @typescript-eslint/no-unsafe-member-access
  124:3   warning  Unsafe member access .list on an `any` value                @typescript-eslint/no-unsafe-member-access
  125:3   warning  Unsafe member access .describe on an `any` value            @typescript-eslint/no-unsafe-member-access
  126:3   warning  Unsafe member access .enable on an `any` value              @typescript-eslint/no-unsafe-member-access
  127:3   warning  Unsafe member access .disable on an `any` value             @typescript-eslint/no-unsafe-member-access
  129:3   warning  Unsafe member access .configure on an `any` value           @typescript-eslint/no-unsafe-member-access
  130:3   warning  Unsafe member access .info on an `any` value                @typescript-eslint/no-unsafe-member-access
  131:3   warning  Unsafe member access .export on an `any` value              @typescript-eslint/no-unsafe-member-access
  132:3   warning  Unsafe member access .install on an `any` value             @typescript-eslint/no-unsafe-member-access
  133:3   warning  Unsafe member access .list on an `any` value                @typescript-eslint/no-unsafe-member-access
  134:3   warning  Unsafe member access .uninstall on an `any` value           @typescript-eslint/no-unsafe-member-access
  135:3   warning  Unsafe member access .update on an `any` value              @typescript-eslint/no-unsafe-member-access
  137:5   warning  Unsafe member access .migrate on an `any` value             @typescript-eslint/no-unsafe-member-access
  139:3   warning  Unsafe member access .sdk on an `any` value                 @typescript-eslint/no-unsafe-member-access
  140:3   warning  Unsafe member access .sdk on an `any` value                 @typescript-eslint/no-unsafe-member-access
  141:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  142:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  143:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  144:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  145:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  146:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  147:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  148:3   warning  Unsafe member access .dev on an `any` value                 @typescript-eslint/no-unsafe-member-access
  150:3   warning  Unsafe member access .delete on an `any` value              @typescript-eslint/no-unsafe-member-access
  151:3   warning  Unsafe member access .bulkDelete on an `any` value          @typescript-eslint/no-unsafe-member-access
  152:3   warning  Unsafe member access .indexes on an `any` value             @typescript-eslint/no-unsafe-member-access
  153:3   warning  Unsafe member access .locations on an `any` value           @typescript-eslint/no-unsafe-member-access
  154:3   warning  Unsafe member access .operations on an `any` value          @typescript-eslint/no-unsafe-member-access
  155:3   warning  Unsafe member access .operations on an `any` value          @typescript-eslint/no-unsafe-member-access
  156:3   warning  Unsafe member access .operations on an `any` value          @typescript-eslint/no-unsafe-member-access
  157:3   warning  Unsafe member access .operations on an `any` value          @typescript-eslint/no-unsafe-member-access
  158:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  159:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  160:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  161:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  162:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  163:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  164:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  165:3   warning  Unsafe member access .databases on an `any` value           @typescript-eslint/no-unsafe-member-access
  166:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  167:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  168:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  169:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  170:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  171:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  172:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  173:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  174:3   warning  Unsafe member access .backups on an `any` value             @typescript-eslint/no-unsafe-member-access
  176:3   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  177:3   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  178:3   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  179:3   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  180:3   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  181:3   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  182:3   warning  Unsafe member access .delete on an `any` value              @typescript-eslint/no-unsafe-member-access
  184:5   warning  Unsafe member access .export on an `any` value              @typescript-eslint/no-unsafe-member-access
  186:3   warning  Unsafe member access .log on an `any` value                 @typescript-eslint/no-unsafe-member-access
  187:3   warning  Unsafe member access .shell on an `any` value               @typescript-eslint/no-unsafe-member-access
  188:3   warning  Unsafe member access .list on an `any` value                @typescript-eslint/no-unsafe-member-access
  189:3   warning  Unsafe member access .lifecycle on an `any` value           @typescript-eslint/no-unsafe-member-access
  190:3   warning  Unsafe member access .lifecycle on an `any` value           @typescript-eslint/no-unsafe-member-access
  191:3   warning  Unsafe member access .lifecycle on an `any` value           @typescript-eslint/no-unsafe-member-access
  193:5   warning  Unsafe member access .deletegcfartifacts on an `any` value  @typescript-eslint/no-unsafe-member-access
  195:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  196:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  197:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  198:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  199:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  200:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  201:3   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  202:3   warning  Unsafe member access .artifacts on an `any` value           @typescript-eslint/no-unsafe-member-access
  203:3   warning  Unsafe member access .artifacts on an `any` value           @typescript-eslint/no-unsafe-member-access
  205:5   warning  Unsafe member access .kits on an `any` value                @typescript-eslint/no-unsafe-member-access
  206:5   warning  Unsafe member access .kits on an `any` value                @typescript-eslint/no-unsafe-member-access
  207:5   warning  Unsafe member access .kits on an `any` value                @typescript-eslint/no-unsafe-member-access
  211:3   warning  Unsafe member access .channel on an `any` value             @typescript-eslint/no-unsafe-member-access
  212:3   warning  Unsafe member access .channel on an `any` value             @typescript-eslint/no-unsafe-member-access
  213:3   warning  Unsafe member access .channel on an `any` value             @typescript-eslint/no-unsafe-member-access
  214:3   warning  Unsafe member access .channel on an `any` value             @typescript-eslint/no-unsafe-member-access
  215:3   warning  Unsafe member access .channel on an `any` value             @typescript-eslint/no-unsafe-member-access
  216:3   warning  Unsafe member access .channel on an `any` value             @typescript-eslint/no-unsafe-member-access
  217:3   warning  Unsafe member access .clone on an `any` value               @typescript-eslint/no-unsafe-member-access
  218:3   warning  Unsafe member access .disable on an `any` value             @typescript-eslint/no-unsafe-member-access
  219:3   warning  Unsafe member access .sites on an `any` value               @typescript-eslint/no-unsafe-member-access
  220:3   warning  Unsafe member access .sites on an `any` value               @typescript-eslint/no-unsafe-member-access
  221:3   warning  Unsafe member access .sites on an `any` value               @typescript-eslint/no-unsafe-member-access
  222:3   warning  Unsafe member access .sites on an `any` value               @typescript-eslint/no-unsafe-member-access
  223:3   warning  Unsafe member access .sites on an `any` value               @typescript-eslint/no-unsafe-member-access
  227:5   warning  Unsafe member access .frameworks on an `any` value          @typescript-eslint/no-unsafe-member-access
  228:5   warning  Unsafe member access .frameworks on an `any` value          @typescript-eslint/no-unsafe-member-access
  229:5   warning  Unsafe member access .functions on an `any` value           @typescript-eslint/no-unsafe-member-access
  230:5   warning  Unsafe member access .functions on an `any` value           @typescript-eslint/no-unsafe-member-access
  234:5   warning  Unsafe member access .backends on an `any` value            @typescript-eslint/no-unsafe-member-access
  235:5   warning  Unsafe member access .backends on an `any` value            @typescript-eslint/no-unsafe-member-access
  236:5   warning  Unsafe member access .backends on an `any` value            @typescript-eslint/no-unsafe-member-access
  237:5   warning  Unsafe member access .backends on an `any` value            @typescript-eslint/no-unsafe-member-access
  238:5   warning  Unsafe member access .backends on an `any` value            @typescript-eslint/no-unsafe-member-access
  239:5   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  240:5   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  241:5   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  242:5   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  243:5   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  244:5   warning  Unsafe member access .secrets on an `any` value             @typescript-eslint/no-unsafe-member-access
  245:5   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  246:5   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  247:5   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  249:7   warning  Unsafe member access .builds on an `any` value              @typescript-eslint/no-unsafe-member-access
  250:7   warning  Unsafe member access .builds on an `any` value              @typescript-eslint/no-unsafe-member-access
  251:7   warning  Unsafe member access .builds on an `any` value              @typescript-eslint/no-unsafe-member-access
  252:7   warning  Unsafe member access .repos on an `any` value               @typescript-eslint/no-unsafe-member-access
  253:7   warning  Unsafe member access .repos on an `any` value               @typescript-eslint/no-unsafe-member-access
  254:7   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  261:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
  262:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
  263:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
  264:5   warning  Unsafe member access .providers on an `any` value           @typescript-eslint/no-unsafe-member-access
  265:5   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  266:5   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  267:5   warning  Unsafe member access .config on an `any` value              @typescript-eslint/no-unsafe-member-access
  268:5   warning  Unsafe member access .templates on an `any` value           @typescript-eslint/no-unsafe-member-access
  269:5   warning  Unsafe member access .templates on an `any` value           @typescript-eslint/no-unsafe-member-access
  270:5   warning  Unsafe member access .templates on an `any` value           @typescript-eslint/no-unsafe-member-access
  271:5   warning  Unsafe member access .templates on an `any` value           @typescript-eslint/no-unsafe-member-access
  272:5   warning  Unsafe member access .templates on an `any` value           @typescript-eslint/no-unsafe-member-access
  273:5   warning  Unsafe member access .templates on an `any` value           @typescript-eslint/no-unsafe-member-access
  277:3   warning  Unsafe member access .add on an `any` value                 @typescript-eslint/no-unsafe-member-access
  278:3   warning  Unsafe member access .ci on an `any` value                  @typescript-eslint/no-unsafe-member-access
  279:3   warning  Unsafe member access .list on an `any` value                @typescript-eslint/no-unsafe-member-access
  280:3   warning  Unsafe member access .use on an `any` value                 @typescript-eslint/no-unsafe-member-access
  287:3   warning  Unsafe member access .addfirebase on an `any` value         @typescript-eslint/no-unsafe-member-access
  288:3   warning  Unsafe member access .create on an `any` value              @typescript-eslint/no-unsafe-member-access
  289:3   warning  Unsafe member access .list on an `any` value                @typescript-eslint/no-unsafe-member-access
  291:3   warning  Unsafe member access .get on an `any` value                 @typescript-eslint/no-unsafe-member-access
  292:3   warning  Unsafe member access .rollback on an `any` value            @typescript-eslint/no-unsafe-member-access
  293:3   warning  Unsafe member access .versions on an `any` value            @typescript-eslint/no-unsafe-member-access
  294:3   warning  Unsafe member access .versions on an `any` value            @typescript-eslint/no-unsafe-member-access
  295:3   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  296:3   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  297:3   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  298:3   warning  Unsafe member access .rollouts on an `any` value            @typescript-eslint/no-unsafe-member-access
  299:3   warning  Unsafe member access .experiments on an `any` value         @typescript-eslint/no-unsafe-member-access
  300:3   warning  Unsafe member access .experiments on an `any` value         @typescript-eslint/no-unsafe-member-access
  301:3   warning  Unsafe member access .experiments on an `any` value         @typescript-eslint/no-unsafe-member-access
  302:3   warning  Unsafe member access .experiments on an `any` value         @typescript-eslint/no-unsafe-member-access
  305:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  306:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  307:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  308:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  309:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  310:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  312:3   warning  Unsafe member access .emulators on an `any` value           @typescript-eslint/no-unsafe-member-access
  313:3   warning  Unsafe member access .execute on an `any` value             @typescript-eslint/no-unsafe-member-access
  314:3   warning  Unsafe member access .services on an `any` value            @typescript-eslint/no-unsafe-member-access
  315:3   warning  Unsafe member access .services on an `any` value            @typescript-eslint/no-unsafe-member-access
  316:3   warning  Unsafe member access .sql on an `any` value                 @typescript-eslint/no-unsafe-member-access
  317:3   warning  Unsafe member access .sql on an `any` value                 @typescript-eslint/no-unsafe-member-access
  318:3   warning  Unsafe member access .sql on an `any` value                 @typescript-eslint/no-unsafe-member-access
  319:3   warning  Unsafe member access .sql on an `any` value                 @typescript-eslint/no-unsafe-member-access
  320:3   warning  Unsafe member access .sql on an `any` value                 @typescript-eslint/no-unsafe-member-access
  321:3   warning  Unsafe member access .sql on an `any` value                 @typescript-eslint/no-unsafe-member-access
  322:3   warning  Unsafe member access .compile on an `any` value             @typescript-eslint/no-unsafe-member-access
  323:3   warning  Unsafe member access .sdk on an `any` value                 @typescript-eslint/no-unsafe-member-access
  324:3   warning  Unsafe member access .sdk on an `any` value                 @typescript-eslint/no-unsafe-member-access
  326:3   warning  Unsafe member access .export on an `any` value              @typescript-eslint/no-unsafe-member-access
  328:3   warning  Unsafe member access .apply on an `any` value               @typescript-eslint/no-unsafe-member-access
  329:3   warning  Unsafe member access .clear on an `any` value               @typescript-eslint/no-unsafe-member-access
  330:3   warning  Unsafe member access .remove on an `any` value              @typescript-eslint/no-unsafe-member-access

/Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/askUserForParam.ts
   82:1   warning  @PARAM path declaration ("args.projectId") appears before any real parameter                                                    jsdoc/check-param-names
  130:64  warning  Unsafe argument of type `any` assigned to a parameter of type `((value: void) => void | PromiseLike<void>) | null | undefined`  @typescript-eslint/no-unsafe-argument
  130:71  warning  Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
  141:50  warning  Unsafe argument of type `any` assigned to a parameter of type `((value: void) => void | PromiseLike<void>) | null | undefined`  @typescript-eslint/no-unsafe-argument
  141:57  warning  Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
  149:1   warning  @PARAM path declaration ("args.projectId") appears before any real parameter                                                    jsdoc/check-param-names

/Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/migrate.spec.ts
  352:67  warning  Unsafe argument of type `any` assigned to a parameter of type `ExtensionVersion | undefined`  @typescript-eslint/no-unsafe-argument
  356:12  warning  Unexpected any. Specify a different type                                                      @typescript-eslint/no-explicit-any
  370:67  warning  Unsafe argument of type `any` assigned to a parameter of type `ExtensionVersion | undefined`  @typescript-eslint/no-unsafe-argument
  374:12  warning  Unexpected any. Specify a different type                                                      @typescript-eslint/no-explicit-any

/Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/paramHelper.ts
   30:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc
   43:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc
   58:1   warning  Expected only 0 line after block description             jsdoc/tag-lines
   80:1   warning  Missing @PARAM "args.projectId"                          jsdoc/check-param-names
   80:1   warning  Missing @PARAM "args.instanceId"                         jsdoc/check-param-names
   80:1   warning  Missing @PARAM "args.paramSpecs"                         jsdoc/check-param-names
   80:1   warning  Missing @PARAM "args.nonInteractive"                     jsdoc/check-param-names
   80:1   warning  Missing @PARAM "args.reconfiguring"                      jsdoc/check-param-names
   81:1   warning  @PARAM "projectId" does not match parameter name "args"  jsdoc/check-param-names
  109:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc
  134:1   warning  Expected only 0 line after block description             jsdoc/tag-lines
  135:1   warning  Missing @PARAM "args.spec"                               jsdoc/check-param-names
  135:1   warning  Missing @PARAM "args.newSpec"                            jsdoc/check-param-names
  135:1   warning  Missing @PARAM "args.currentParams"                      jsdoc/check-param-names
  135:1   warning  Missing @PARAM "args.projectId"                          jsdoc/check-param-names
  135:1   warning  Missing @PARAM "args.instanceId"                         jsdoc/check-param-names
  136:1   warning  @PARAM "spec" does not match parameter name "args"       jsdoc/check-param-names
  267:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc
  280:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc
  281:49  warning  Unnecessary escape character: \.                         no-useless-escape
  285:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc
  303:8   warning  Missing JSDoc comment                                    jsdoc/require-jsdoc

/Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/extensions/updateHelper.ts
   27:8    warning  Missing JSDoc comment                                                  jsdoc/require-jsdoc
   65:8    warning  Missing return type on function                                        @typescript-eslint/explicit-function-return-type
   78:123  warning  Invalid type "string | undefined" of template literal expression       @typescript-eslint/restrict-template-expressions
  110:69   warning  Unexpected any. Specify a different type                               @typescript-eslint/no-explicit-any
  167:17   warning  Unexpected any. Specify a different type                               @typescript-eslint/no-explicit-any
  185:1    warning  @PARAM "existingSource" does not match an existing function parameter  jsdoc/check-param-names
  197:17   warning  Unexpected any. Specify a different type                               @typescript-eslint/no-explicit-any
  209:8    warning  Missing JSDoc comment                                                  jsdoc/require-jsdoc

/Users/inlined/.gemini/antigravity/worktrees/firebase-tools/super_vertex_darts_17h45/src/prompt.ts
   34:1  warning  Expected only 0 line after block description                               jsdoc/tag-lines
   37:1  warning  Invalid JSDoc tag (preference). Replace "returns" JSDoc tag with "return"  jsdoc/check-tag-names
   80:8  warning  Missing JSDoc comment                                                      jsdoc/require-jsdoc
  112:8  warning  Missing return type on function                                            @typescript-eslint/explicit-function-return-type
  112:8  warning  Missing JSDoc comment                                                      jsdoc/require-jsdoc
  247:8  warning  Missing JSDoc comment                                                      jsdoc/require-jsdoc
  281:8  warning  Missing JSDoc comment                                                      jsdoc/require-jsdoc

✖ 303 problems (0 errors, 303 warnings)
  0 errors and 17 warnings potentially fixable with the `--fix` option.).
@inlined
inlined force-pushed the ext-migrate-update-check branch from 67414ed to de08aeb Compare August 26, 2026 06:08
@inlined inlined changed the title feat: add --force flag and fix parameter update handling in ext:migrate ext:migrate now upgrades extensions Aug 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants