Skip to content

Support controlled multi-install for safe AI agent integrations#2389

Merged
mnriem merged 24 commits intogithub:mainfrom
PascalThuet:codex/controlled-multi-install-safe-integrations
May 1, 2026
Merged

Support controlled multi-install for safe AI agent integrations#2389
mnriem merged 24 commits intogithub:mainfrom
PascalThuet:codex/controlled-multi-install-safe-integrations

Conversation

@PascalThuet
Copy link
Copy Markdown
Contributor

@PascalThuet PascalThuet commented Apr 28, 2026

Summary

Fixes #2257.

This PR adds controlled support for installing multiple AI agent integrations in the same Spec Kit project.

The goal is not to encourage multi-agent workflows by default, but to support team portability for repositories where different contributors use different agents, while keeping one explicit default integration.

What changes

  • Track integration state with default_integration, installed_integrations, integration_settings, integration_state_schema, and the legacy-compatible integration field.
  • Add specify integration use <key> to change the default integration without uninstalling others.
  • Add specify integration use <key> --force to refresh managed shared templates even when they were locally modified.
  • Allow installing an additional integration automatically only when all involved integrations are declared multi_install_safe.
  • Add --force to explicitly opt into installing integrations that are not declared safe together.
  • Update install, uninstall, switch, upgrade, and list to understand multiple installed integrations.
  • Keep shared Spec Kit templates aligned with the command invocation style of the single default integration.
  • Preserve and merge the shared speckit.manifest.json instead of replacing it with an empty manifest during additional installs.
  • Warn when an existing shared manifest cannot be read, decoded, or parsed before falling back to a new one.
  • Refuse symlinked shared infrastructure destinations before writing or copying shared scripts/templates.
  • Refuse symlinked or escaping shared infrastructure directories before creating .specify/scripts or .specify/templates.
  • Preflight shared script/template destinations before batch refreshes so a later unsafe path cannot leave earlier files partially updated.
  • Support nested shared script source layouts while preserving the shared-infra preflight safety model.
  • Write shared text/templates with a non-world-writable default mode while preserving source modes for copied scripts.
  • Report unreadable integration manifests cleanly across uninstall, switch, and upgrade flows.
  • Strip user-edited integration keys and stored invoke separators while normalizing state.
  • Preserve newer on-disk integration state schema values during normalization and reject unsupported future schemas before CLI mutations.
  • Reject switch --integration-options for already-installed targets, because changing options requires reinstalling managed files.
  • Make switch <current> --force refresh managed shared templates instead of silently no-oping.
  • Clarify multi-install error messaging and switch --force / switch --integration-options documentation.
  • Preserve compatibility with existing .specify/integration.json files.
  • Document and display which integrations are currently multi-install safe.

Architecture

  • integration_state.py owns integration-state normalization, schema defaults, legacy compatibility, and JSON persistence.
  • integration_runtime.py owns runtime option resolution, per-integration settings, and invocation-separator lookup.
  • shared_infra.py owns shared Spec Kit script/template installation and the shared speckit.manifest.json lifecycle.
  • __init__.py remains the Typer command/orchestration layer, with thin wrappers where CLI-specific dependencies such as version lookup and console output are required.

Safety model

An integration is declared multi_install_safe only when it uses:

  • a static, unique agent root directory
  • a static, unique command directory
  • a static, unique context file that does not collide with another safe integration
  • stable command invocation settings recorded in integration_settings
  • a separate install manifest

The PR includes registry-level tests that enforce these invariants for every safe integration. The tests exercise every safe integration pair in both install orders inside one parametrized case per unordered pair, validating order-sensitive manifest isolation without doubling pytest case count. The table-output test verifies representative rows directly instead of matching loose tokens.

Integrations that share context files or command directories, require dynamic install paths, or merge shared tool settings remain unsafe by default and still require --force.

Why

Today, switching integrations is destructive from a team-portability perspective: a repository can only represent one agent integration cleanly at a time.

This PR keeps the existing single-default model while allowing safe integrations to coexist. That lets a repo support, for example, both Claude Code and Codex CLI without forcing contributors to constantly uninstall and reinstall agent-specific files.

Backward compatibility

Existing projects with legacy state such as:

{ "integration": "claude" }

continue to work. The state is normalized into the new model when integration commands run.

The legacy integration field is still written as an alias for the default integration, and whitespace around user-edited integration keys/settings is normalized before comparisons or persistence.

Testing

  • uvx ruff check src/specify_cli/shared_infra.py tests/integrations/test_cli.py
  • uv run pytest tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_refuses_symlinked_script_destination tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_refuses_symlinked_template_destination tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_template_refresh_refuses_symlinked_destination -q
  • uvx ruff check src/specify_cli/__init__.py src/specify_cli/shared_infra.py tests/integrations/test_integration_subcommand.py tests/integrations/test_cli.py
  • uv run pytest tests/integrations/test_integration_subcommand.py::TestIntegrationUse::test_use_does_not_persist_default_when_template_refresh_fails tests/integrations/test_integration_subcommand.py::TestIntegrationUse::test_use_installed_integration_sets_default tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_refuses_symlinked_template_destination -q
  • uv run pytest tests/integrations/test_cli.py -q
  • uv run pytest tests/integrations/test_integration_subcommand.py tests/integrations/test_cli.py -q
  • uv run pytest tests/integrations/test_manifest.py tests/integrations/test_integration_subcommand.py -q
  • uvx ruff check tests/integrations/test_integration_state.py tests/integrations/test_integration_subcommand.py
  • uv run pytest tests/integrations/test_integration_state.py tests/integrations/test_integration_subcommand.py -q
  • uvx ruff check tests/test_presets.py
  • uv run pytest tests/test_presets.py -q
  • uvx ruff check src/specify_cli/shared_infra.py src/specify_cli/integration_state.py src/specify_cli/__init__.py tests/integrations/test_cli.py tests/integrations/test_integration_state.py tests/integrations/test_integration_subcommand.py
  • uv run pytest tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_refuses_symlinked_specify_directory_before_mkdir tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_template_refresh_preflights_before_writing tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_install_preflights_before_writing tests/integrations/test_integration_state.py::test_normalize_integration_state_preserves_newer_schema tests/integrations/test_integration_subcommand.py::TestIntegrationList::test_list_rejects_newer_integration_state_schema -q
  • uv run pytest tests/integrations/test_cli.py tests/integrations/test_integration_state.py tests/integrations/test_integration_subcommand.py -q
  • uvx ruff check src/specify_cli/shared_infra.py tests/integrations/test_cli.py
  • uv run pytest tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_install_supports_nested_script_sources tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_install_preflights_before_writing tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_refuses_symlinked_specify_directory_before_mkdir -q
  • uv run pytest tests/integrations/test_cli.py -q
  • uvx ruff check src/specify_cli/shared_infra.py tests/integrations/test_cli.py
  • uv run pytest tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_template_writes_are_not_world_writable tests/integrations/test_cli.py::TestInitIntegrationFlag::test_shared_infra_install_supports_nested_script_sources -q
  • uv run pytest tests/integrations/test_cli.py -q
  • git diff --check
  • uv run pytest -q

Full suite result:

2598 passed, 29 skipped

@PascalThuet PascalThuet changed the title [codex] Support controlled multi-install for safe AI agent integrations Support controlled multi-install for safe AI agent integrations Apr 28, 2026
@PascalThuet PascalThuet marked this pull request as ready for review April 28, 2026 12:00
@PascalThuet PascalThuet requested a review from mnriem as a code owner April 28, 2026 12:00
@mnriem mnriem requested a review from Copilot April 28, 2026 13:35
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds controlled support for installing multiple AI agent integrations in a single Spec Kit project while keeping one explicit default integration, including state/schema migration and CLI workflows to manage the default without uninstalling others.

Changes:

  • Introduces schema-v1 integration state (default_integration, installed_integrations, integration_settings) with legacy compatibility, plus runtime helpers to resolve options/separators consistently.
  • Adds/updates integration commands to support multi-install (install, uninstall, switch, upgrade, new use) and keeps shared templates aligned with the default integration.
  • Expands registry/subcommand tests and updates docs, including surfacing “multi-install safe” status and declaring several built-in integrations safe.
Show a summary per file
File Description
src/specify_cli/__init__.py Updates integration command orchestration for multi-install state, new use, and shared-template alignment.
src/specify_cli/integration_state.py Adds schema-v1 normalization + persistence for multi-install integration state (legacy-compatible).
src/specify_cli/integration_runtime.py Adds helpers for resolving stored/CLI options and invoke separators per integration.
src/specify_cli/shared_infra.py Extracts shared infra install/refresh and preserves speckit.manifest.json across operations.
src/specify_cli/integrations/base.py Adds multi_install_safe flag to declare safe multi-install integrations.
src/specify_cli/integrations/auggie/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/claude/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codebuddy/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codex/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/cursor_agent/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/gemini/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/iflow/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/junie/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kilocode/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kimi/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qodercli/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qwen/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/roo/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/shai/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/tabnine/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/trae/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/windsurf/__init__.py Marks integration as multi_install_safe.
tests/integrations/test_integration_subcommand.py Adds coverage for multi-install flows, use, shared-template refresh behavior, and manifest preservation.
tests/integrations/test_integration_catalog.py Updates expected error messaging to reflect multi-install semantics (“not installed”).
tests/integrations/test_registry.py Adds contract tests ensuring multi_install_safe integrations have isolated paths and disjoint manifests.
docs/reference/integrations.md Documents multi-install model, new use command, safety rules, and safe integration list.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (1)

src/specify_cli/init.py:2545

  • In the target in installed_keys branch, force is passed as refresh_templates_force, meaning integration switch --force overwrites shared templates even though --force is documented (via option help) as only forcing removal of modified files during uninstall. Consider aligning the flag semantics/documentation (e.g., update the help text or split into distinct flags) so --force behavior is not surprising when no uninstall occurs.
            installed_keys,
            raw_options=raw_options,
            parsed_options=parsed_options,
            refresh_templates_force=force,
        )
  • Files reviewed: 26/26 changed files
  • Comments generated: 3

Comment thread src/specify_cli/shared_infra.py
Comment thread src/specify_cli/__init__.py Outdated
Comment thread docs/reference/integrations.md Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds controlled support for installing multiple AI agent integrations in one Spec Kit project while keeping a single explicit default integration, including state/schema migration for legacy .specify/integration.json.

Changes:

  • Introduces normalized multi-install integration state (default_integration, installed_integrations, integration_settings, schema v1) plus runtime helpers.
  • Adds specify integration use <key> [--force] and updates install/uninstall/switch/upgrade/list to understand multiple installed integrations and keep shared templates aligned to the default.
  • Declares a set of built-in integrations as multi_install_safe, adds isolation/manifest contract tests, and updates docs + CLI output to expose safety status.
Show a summary per file
File Description
src/specify_cli/__init__.py Updates integration CLI orchestration for multi-install state, adds integration use, and aligns shared infra/template behavior to the default integration.
src/specify_cli/integration_state.py New module for schema v1 normalization, legacy compatibility, and persistence of .specify/integration.json.
src/specify_cli/integration_runtime.py New module for resolving stored vs CLI integration options and persisted invocation separator/script settings.
src/specify_cli/shared_infra.py New module to install/refresh shared scripts/templates and preserve/merge speckit.manifest.json across installs.
src/specify_cli/integrations/base.py Adds multi_install_safe flag and documents the contract for safe multi-install integrations.
src/specify_cli/integrations/claude/__init__.py Marks Claude integration as multi-install safe.
src/specify_cli/integrations/codex/__init__.py Marks Codex integration as multi-install safe.
src/specify_cli/integrations/cursor_agent/__init__.py Marks Cursor Agent integration as multi-install safe.
src/specify_cli/integrations/gemini/__init__.py Marks Gemini integration as multi-install safe.
src/specify_cli/integrations/tabnine/__init__.py Marks Tabnine integration as multi-install safe.
src/specify_cli/integrations/auggie/__init__.py Marks Auggie integration as multi-install safe.
src/specify_cli/integrations/codebuddy/__init__.py Marks Codebuddy integration as multi-install safe.
src/specify_cli/integrations/iflow/__init__.py Marks Iflow integration as multi-install safe.
src/specify_cli/integrations/junie/__init__.py Marks Junie integration as multi-install safe.
src/specify_cli/integrations/kilocode/__init__.py Marks Kilocode integration as multi-install safe.
src/specify_cli/integrations/kimi/__init__.py Marks Kimi integration as multi-install safe.
src/specify_cli/integrations/qodercli/__init__.py Marks Qoder CLI integration as multi-install safe.
src/specify_cli/integrations/qwen/__init__.py Marks Qwen integration as multi-install safe.
src/specify_cli/integrations/roo/__init__.py Marks Roo integration as multi-install safe.
src/specify_cli/integrations/shai/__init__.py Marks Shai integration as multi-install safe.
src/specify_cli/integrations/trae/__init__.py Marks Trae integration as multi-install safe.
src/specify_cli/integrations/windsurf/__init__.py Marks Windsurf integration as multi-install safe.
tests/integrations/test_registry.py Adds registry-level isolation contracts + pairwise manifest-disjointness tests for safe integrations.
tests/integrations/test_integration_subcommand.py Adds CLI tests covering multi-safe installs, legacy migration, use, uninstall behavior, and default-template alignment.
tests/integrations/test_integration_catalog.py Updates assertions for new “not installed” messaging under multi-install semantics.
tests/integrations/test_cli.py Adds coverage for warning when shared manifest is unreadable before recreating it.
docs/reference/integrations.md Documents multi-install model, safety rules, use command, and updated semantics for install/switch/upgrade/list.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 27/27 changed files
  • Comments generated: 3

Comment thread src/specify_cli/integration_state.py Outdated
Comment thread tests/integrations/test_registry.py Outdated
Comment thread tests/integrations/test_integration_subcommand.py Outdated
Copy link
Copy Markdown
Collaborator

@mnriem mnriem left a comment

Choose a reason for hiding this comment

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

Please address Copilot feedback. If not applicable, please explain why

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a controlled multi-install model for Spec Kit AI agent integrations, enabling multiple installed integrations per project while keeping one explicit default and keeping shared templates aligned to that default.

Changes:

  • Introduces normalized integration state (default_integration, installed_integrations, integration_settings, integration_state_schema) with legacy compatibility.
  • Adds runtime/shared-infra helpers to refresh shared templates safely and preserve/merge the shared speckit.manifest.json.
  • Expands CLI + docs + tests to support multi-install safety declarations and the new specify integration use workflow.
Show a summary per file
File Description
tests/integrations/test_registry.py Adds contracts/tests enforcing isolation + disjoint manifests for multi_install_safe integrations.
tests/integrations/test_integration_subcommand.py Adds CLI behavior tests for multi-install, use, shared template refresh, and list output.
tests/integrations/test_integration_state.py Adds unit tests for integration-state normalization and persistence.
tests/integrations/test_integration_catalog.py Updates expectation to reflect “not installed” semantics under multi-install.
tests/integrations/test_cli.py Adds coverage for warning/fallback when the shared manifest is unreadable.
src/specify_cli/shared_infra.py New module to install/refresh shared scripts/templates while preserving shared manifest history.
src/specify_cli/integration_state.py New module for state normalization, schema defaults, deduping, and JSON persistence.
src/specify_cli/integration_runtime.py New module to resolve/stash per-integration options and invocation separator.
src/specify_cli/init.py Wires multi-install logic into install/uninstall/switch/upgrade/list, adds integration use, and delegates shared infra.
docs/reference/integrations.md Documents multi-install model, use, --force behavior updates, and safe-integration list.
src/specify_cli/integrations/base.py Introduces multi_install_safe flag and documents its isolation contract.
src/specify_cli/integrations/auggie/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/claude/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codex/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/cursor_agent/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/gemini/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/iflow/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/junie/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kilocode/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kimi/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qodercli/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qwen/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/roo/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/shai/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/tabnine/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/trae/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/windsurf/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codebuddy/init.py Marks integration as multi_install_safe.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 28/28 changed files
  • Comments generated: 3

Comment thread tests/integrations/test_registry.py Outdated
Comment thread tests/integrations/test_integration_subcommand.py Outdated
Comment thread src/specify_cli/shared_infra.py Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds controlled multi-install support for AI agent integrations in Spec Kit projects by introducing a normalized integration state model, a use subcommand to switch defaults non-destructively, and “multi-install safe” contracts/tests to gate automatic co-installs.

Changes:

  • Introduces integration state/runtime/shared-infra helper modules and updates CLI orchestration to support multiple installed integrations with a single default.
  • Adds specify integration use <key> (+ --force) and updates install/uninstall/switch/upgrade/list behaviors for multi-install.
  • Declares multiple built-in integrations as multi_install_safe, adds registry-level safety contract tests, and updates docs/output to surface safety status.
Show a summary per file
File Description
tests/integrations/test_registry.py Adds registry-level contract tests to enforce multi-install-safe isolation (paths/context/manifests).
tests/integrations/test_integration_subcommand.py Expands CLI subcommand tests for multi-install flows, new use command, and list output.
tests/integrations/test_integration_state.py Adds unit tests for integration state normalization/persistence helpers.
tests/integrations/test_integration_catalog.py Updates error expectation to reflect “not installed” semantics under multi-install.
tests/integrations/test_cli.py Adds coverage for warnings when the shared infra manifest is unreadable/invalid encoding.
src/specify_cli/shared_infra.py New module to install/refresh shared templates/scripts while preserving and merging a shared manifest.
src/specify_cli/integration_state.py New module to normalize/persist .specify/integration.json with legacy compatibility and schema versioning.
src/specify_cli/integration_runtime.py New module to resolve per-integration stored options/settings and invocation separator behavior.
src/specify_cli/init.py Refactors CLI orchestration to use new helpers; implements multi-install logic, use, and default-aligned shared templates.
src/specify_cli/integrations/base.py Adds multi_install_safe flag to the integration base contract.
src/specify_cli/integrations/claude/init.py Declares Claude integration as multi-install safe.
src/specify_cli/integrations/codex/init.py Declares Codex integration as multi-install safe.
src/specify_cli/integrations/cursor_agent/init.py Declares Cursor Agent integration as multi-install safe.
src/specify_cli/integrations/gemini/init.py Declares Gemini integration as multi-install safe.
src/specify_cli/integrations/iflow/init.py Declares Iflow integration as multi-install safe.
src/specify_cli/integrations/junie/init.py Declares Junie integration as multi-install safe.
src/specify_cli/integrations/kilocode/init.py Declares Kilocode integration as multi-install safe.
src/specify_cli/integrations/kimi/init.py Declares Kimi integration as multi-install safe.
src/specify_cli/integrations/qodercli/init.py Declares Qoder CLI integration as multi-install safe.
src/specify_cli/integrations/qwen/init.py Declares Qwen integration as multi-install safe.
src/specify_cli/integrations/roo/init.py Declares Roo integration as multi-install safe.
src/specify_cli/integrations/shai/init.py Declares Shai integration as multi-install safe.
src/specify_cli/integrations/tabnine/init.py Declares Tabnine integration as multi-install safe.
src/specify_cli/integrations/trae/init.py Declares Trae integration as multi-install safe.
src/specify_cli/integrations/windsurf/init.py Declares Windsurf integration as multi-install safe.
src/specify_cli/integrations/auggie/init.py Declares Auggie integration as multi-install safe.
src/specify_cli/integrations/codebuddy/init.py Declares Codebuddy integration as multi-install safe.
docs/reference/integrations.md Updates reference docs for multi-install behavior, use, and safety model/output.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (2)

src/specify_cli/init.py:2635

  • In integration switch, the IntegrationManifest.load(...) calls can raise UnicodeDecodeError for non-UTF-8 manifests (and OSError for IO issues), but the current exception handling only catches ValueError/FileNotFoundError. This can lead to an unhandled exception/traceback for a corrupt manifest; consider catching decode/IO errors and showing the same recovery guidance/warning instead.
            raise typer.Exit(1)

        # Clear metadata so a failed Phase 2 doesn't leave stale references

src/specify_cli/init.py:2804

  • IntegrationManifest.load(...) can raise UnicodeDecodeError when the manifest file isn't UTF-8 (and OSError for IO issues), but the upgrade path's error handling only catches ValueError/FileNotFoundError. Consider catching decode/IO failures too so integration upgrade fails gracefully with a clear recovery message instead of raising an unhandled exception.
        console.print("\nUse [cyan]--force[/cyan] to overwrite modified files, or resolve manually.")
        raise typer.Exit(1)

  • Files reviewed: 28/28 changed files
  • Comments generated: 2

Comment thread src/specify_cli/__init__.py
Comment thread tests/integrations/test_registry.py Outdated
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented Apr 28, 2026

Please address Copilot feedback. If not applicable, please explain why

Be aware that everyone has to go through this same cycle of relentless Copilot feedback, maintainers included

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds multi-install support for AI agent integrations in Spec Kit projects by introducing a richer integration state model (default + multiple installed), a new specify integration use command, and shared-infra behavior that keeps shared templates aligned with the current default integration.

Changes:

  • Introduces normalized integration state (default_integration, installed_integrations, per-integration settings, schema version) with legacy compatibility.
  • Adds integration use and updates install/uninstall/switch/upgrade/list to work with multiple installed integrations and multi-install safety rules.
  • Adds shared-infra helpers + tests enforcing multi-install-safe isolation and manifest disjointness.
Show a summary per file
File Description
src/specify_cli/__init__.py CLI orchestration updated for multi-install state, new use command, and shared template alignment logic.
src/specify_cli/integration_state.py New normalization + persistence helpers for multi-install integration state (legacy compatible).
src/specify_cli/integration_runtime.py New helpers for resolving/storing per-integration runtime options and invocation separators.
src/specify_cli/shared_infra.py New shared scripts/templates install + “refresh templates” logic with shared manifest preservation.
src/specify_cli/integrations/base.py Adds multi_install_safe flag on integrations.
src/specify_cli/integrations/*/__init__.py Marks a set of integrations as multi_install_safe=True.
tests/integrations/test_registry.py Adds registry-level contracts ensuring safe integrations have isolated paths and disjoint manifests.
tests/integrations/test_integration_subcommand.py Expands CLI behavior coverage for multi-install flows (install/use/switch/uninstall/upgrade).
tests/integrations/test_integration_state.py New unit tests for state normalization and persistence helpers.
tests/integrations/test_integration_catalog.py Updates expected error messaging for upgrade on non-installed integrations.
tests/integrations/test_cli.py Adds coverage for shared manifest read/encoding failure warnings.
docs/reference/integrations.md Documents multi-install behavior, use, safety model, and safe integrations list.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (1)

src/specify_cli/shared_infra.py:166

  • install_shared_infra() may overwrite files via shutil.copy2() / dst.write_text() even when the destination path is a symlink. That can be abused for arbitrary file overwrite outside the repo if .specify/scripts/... or .specify/templates/... contains symlinks. Please add a symlink check (skip unless explicitly handled) and ensure the resolved destination stays within project_path before writing.
                dst_path.parent.mkdir(parents=True, exist_ok=True)
                shutil.copy2(src_path, dst_path)
                rel = dst_path.relative_to(project_path).as_posix()
                manifest.record_existing(rel)

    templates_src = shared_templates_source(core_pack=core_pack, repo_root=repo_root)
    if templates_src.is_dir():
        dest_templates = project_path / ".specify" / "templates"
        dest_templates.mkdir(parents=True, exist_ok=True)
        for src in templates_src.iterdir():
            if not src.is_file() or src.name == "vscode-settings.json" or src.name.startswith("."):
                continue

            dst = dest_templates / src.name
            if dst.exists() and not force:
                skipped_files.append(str(dst.relative_to(project_path)))
                continue

            content = src.read_text(encoding="utf-8")
            content = IntegrationBase.resolve_command_refs(content, invoke_separator)
            dst.write_text(content, encoding="utf-8")
            rel = dst.relative_to(project_path).as_posix()
            manifest.record_existing(rel)

  • Files reviewed: 28/28 changed files
  • Comments generated: 1

Comment thread src/specify_cli/shared_infra.py
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented Apr 28, 2026

Please address Copilot feedback. Note somethings things like this come up as part of the review because code around it gets touched / same file gets touched and somehow Copilot missed it the first go around.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR implements controlled multi-install support for AI agent integrations in Spec Kit projects by introducing normalized integration state (default + installed set + per-integration settings), adding a specify integration use command to switch the default without uninstalling, and enforcing/communicating safety constraints for multi-install.

Changes:

  • Add integration state/runtime layers (integration_state.py, integration_runtime.py) and update CLI orchestration to support multiple installed integrations plus integration use.
  • Introduce shared-infra management module (shared_infra.py) that preserves/merges the shared speckit.manifest.json, refreshes default-sensitive templates, and hardens writes against symlink escapes.
  • Add multi_install_safe flag on integrations plus registry/CLI tests and docs updates to enforce and explain safe multi-install behavior.
Show a summary per file
File Description
tests/integrations/test_registry.py Adds contract tests ensuring multi_install_safe integrations have isolated paths and disjoint manifests.
tests/integrations/test_integration_subcommand.py Expands CLI lifecycle tests for multi-install, use, updated messaging, and error handling for unreadable manifests.
tests/integrations/test_integration_state.py Adds unit tests for state normalization/serialization behavior.
tests/integrations/test_integration_catalog.py Updates expectations to match “not installed” semantics for upgrade errors.
tests/integrations/test_cli.py Adds shared-infra manifest warning tests and symlink refusal tests.
src/specify_cli/shared_infra.py New shared infra installer/refresh logic with manifest preservation and safe destination checks.
src/specify_cli/integration_state.py New normalization + persistence helpers for .specify/integration.json schema v1.
src/specify_cli/integration_runtime.py New helpers for resolving/storing per-integration options and invoke separator.
src/specify_cli/init.py Refactors integration commands to support multi-install, adds integration use, updates shared infra handling, and improves rollback/error reporting.
src/specify_cli/integrations/base.py Adds multi_install_safe flag and documents its enforced invariants.
src/specify_cli/integrations/auggie/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/claude/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codebuddy/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codex/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/cursor_agent/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/gemini/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/iflow/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/junie/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kilocode/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kimi/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qodercli/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qwen/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/roo/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/shai/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/tabnine/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/trae/init.py Marks integration as multi_install_safe.
src/specify_cli/integrations/windsurf/init.py Marks integration as multi_install_safe.
docs/reference/integrations.md Updates docs for multi-install semantics, use, --force, and safe integration list.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 28/28 changed files
  • Comments generated: 2

Comment thread tests/integrations/test_integration_state.py Outdated
Comment thread tests/integrations/test_integration_subcommand.py Outdated
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented Apr 28, 2026

Please address Copilot feedback

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces controlled multi-install support for AI agent integrations within a single Spec Kit project, while preserving a single explicit default integration and keeping shared infrastructure aligned to that default.

Changes:

  • Adds persisted multi-integration state (default_integration, installed_integrations, per-integration integration_settings, schema versioning) plus normalization/back-compat helpers.
  • Introduces shared infrastructure lifecycle helpers (shared templates/scripts + shared manifest preservation, warning/rollback behaviors, symlink refusal).
  • Expands CLI and tests to support installing multiple integrations (with multi_install_safe gating and --force override), plus the new specify integration use <key> command and updated list/switch/upgrade/uninstall behavior.
Show a summary per file
File Description
tests/test_presets.py Filters an intentional preset warning during self-test preset installs to keep tests stable.
tests/integrations/test_registry.py Adds contract tests enforcing multi_install_safe isolation (paths, context files, disjoint manifests).
tests/integrations/test_integration_subcommand.py Adds/updates CLI lifecycle tests for multi-install, use, safe/unsafe gating, shared manifest preservation, and manifest read errors.
tests/integrations/test_integration_state.py Adds unit tests for integration state normalization and persistence helpers.
tests/integrations/test_integration_catalog.py Updates upgrade error expectation to align with multi-install semantics (“not installed”).
tests/integrations/test_cli.py Adds tests for shared infra manifest fallback warnings and symlink refusal behavior.
src/specify_cli/shared_infra.py Introduces shared scripts/templates install + shared manifest loading/merging, plus destination safety checks.
src/specify_cli/integration_state.py Adds integration state normalization, de-duping, settings normalization, and integration.json persistence utilities.
src/specify_cli/integration_runtime.py Adds helpers to resolve/store per-integration options and compute invoke separators consistently.
src/specify_cli/__init__.py Wires new state/runtime/shared-infra helpers into CLI commands; adds integration use; updates install/uninstall/switch/upgrade/list for multi-install.
src/specify_cli/integrations/base.py Adds the multi_install_safe flag (default False) and documents its contract.
src/specify_cli/integrations/auggie/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/claude/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codebuddy/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/codex/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/cursor_agent/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/gemini/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/iflow/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/junie/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kilocode/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/kimi/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qodercli/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/qwen/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/roo/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/shai/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/tabnine/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/trae/__init__.py Marks integration as multi_install_safe.
src/specify_cli/integrations/windsurf/__init__.py Marks integration as multi_install_safe.
docs/reference/integrations.md Updates documentation for multi-install behavior, --force, use, and safe/unsafe semantics.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Comment thread src/specify_cli/__init__.py Outdated
@PascalThuet PascalThuet force-pushed the codex/controlled-multi-install-safe-integrations branch from 7021d32 to 20b9fc4 Compare May 1, 2026 15:41
@mnriem mnriem requested a review from Copilot May 1, 2026 15:42
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds first-class support for multiple installed AI agent integrations per Spec Kit project while keeping a single explicit default integration. This introduces a new on-disk integration state model, a new integration use command, and hardened shared-infrastructure installation/refresh behavior to support safe multi-install scenarios.

Changes:

  • Introduce normalized multi-install integration state (default_integration, installed_integrations, integration_settings, schema gating) with backward compatibility for legacy .specify/integration.json.
  • Add CLI behavior for multi-install workflows (integration use, updated install/switch/upgrade/list/uninstall semantics) and keep shared templates aligned to the default integration’s invocation style.
  • Add/expand tests and documentation, plus shared-infra safety checks (symlink/path-escape refusal, preflight, safer file modes) and declare eligible integrations as multi_install_safe.
Show a summary per file
File Description
tests/test_presets.py Filters an expected self-test preset warning to keep preset tests stable.
tests/integrations/test_registry.py Adds contract tests ensuring multi_install_safe integrations are path/manifest-isolated.
tests/integrations/test_integration_subcommand.py Expands CLI tests for multi-install flows, use, schema rejection, and manifest-read error handling.
tests/integrations/test_integration_state.py Adds unit tests for integration state normalization and persistence helpers.
tests/integrations/test_integration_catalog.py Updates expectations for new “not installed” upgrade error messaging.
tests/integrations/test_cli.py Adds shared-infra safety tests (symlinks, preflight, nested sources, file modes, manifest warnings).
src/specify_cli/shared_infra.py New shared-infra installer/refresher with preflight safety, manifest preservation, and safer writes.
src/specify_cli/integration_state.py New integration-state normalization/persistence layer with schema handling and legacy compatibility.
src/specify_cli/integration_runtime.py New runtime helpers for resolving/storing per-integration options and invoke separators.
src/specify_cli/__init__.py Wires new state/runtime/shared-infra layers into Typer commands; adds integration use and multi-install logic.
src/specify_cli/integrations/base.py Adds multi_install_safe flag to the integration base class.
src/specify_cli/integrations/windsurf/__init__.py Marks Windsurf integration as multi_install_safe.
src/specify_cli/integrations/trae/__init__.py Marks Trae integration as multi_install_safe.
src/specify_cli/integrations/tabnine/__init__.py Marks Tabnine integration as multi_install_safe.
src/specify_cli/integrations/shai/__init__.py Marks Shai integration as multi_install_safe.
src/specify_cli/integrations/roo/__init__.py Marks Roo integration as multi_install_safe.
src/specify_cli/integrations/qwen/__init__.py Marks Qwen integration as multi_install_safe.
src/specify_cli/integrations/qodercli/__init__.py Marks Qoder CLI integration as multi_install_safe.
src/specify_cli/integrations/kimi/__init__.py Marks Kimi integration as multi_install_safe.
src/specify_cli/integrations/kilocode/__init__.py Marks Kilocode integration as multi_install_safe.
src/specify_cli/integrations/junie/__init__.py Marks Junie integration as multi_install_safe.
src/specify_cli/integrations/iflow/__init__.py Marks Iflow integration as multi_install_safe.
src/specify_cli/integrations/gemini/__init__.py Marks Gemini integration as multi_install_safe.
src/specify_cli/integrations/cursor_agent/__init__.py Marks Cursor Agent integration as multi_install_safe.
src/specify_cli/integrations/codex/__init__.py Marks Codex integration as multi_install_safe.
src/specify_cli/integrations/codebuddy/__init__.py Marks Codebuddy integration as multi_install_safe.
src/specify_cli/integrations/claude/__init__.py Marks Claude integration as multi_install_safe.
src/specify_cli/integrations/auggie/__init__.py Marks Auggie integration as multi_install_safe.
docs/reference/integrations.md Documents multi-install behavior, use, updated switch/upgrade semantics, and safe integration list.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Comment thread src/specify_cli/__init__.py Outdated
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented May 1, 2026

Please address Copilot feedback. Thank you for you continued efforts!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds first-class multi-install support for AI agent integrations in Spec Kit projects by introducing a richer on-disk integration state model, a non-destructive integration use command, and safer/shared-infra handling so multiple agent directories can coexist while keeping one explicit default integration.

Changes:

  • Introduces a new integration state schema (.specify/integration.json) supporting default_integration, installed_integrations, and per-integration integration_settings, plus normalization helpers.
  • Adds specify integration use <key> and updates install/uninstall/switch/upgrade/list to operate on multiple installed integrations with a default selection.
  • Adds/extends shared-infrastructure installation + refresh logic (including symlink/escape preflights, manifest preservation, and command-invocation-style template refresh) and expands test coverage to enforce multi_install_safe isolation contracts.
Show a summary per file
File Description
src/specify_cli/__init__.py CLI orchestration updated for multi-install state, new integration use, and shared template refresh alignment with the default integration
src/specify_cli/integration_state.py New integration state normalization + persistence helpers (schema v1)
src/specify_cli/integration_runtime.py New helpers for resolving stored options and invocation separators per integration
src/specify_cli/shared_infra.py New shared infra installer/refresher with safer write behavior and shared manifest loading
src/specify_cli/integrations/base.py Adds multi_install_safe flag documenting isolation expectations
src/specify_cli/integrations/*/__init__.py Marks selected integrations as multi_install_safe=True
docs/reference/integrations.md Updates docs for multi-install behavior, --force, and integration use
tests/integrations/test_registry.py Adds registry-level isolation/contract tests for safe integration pairs
tests/integrations/test_integration_subcommand.py Adds CLI behavior tests for multi-install flows, use, schema rejection, and manifest error handling
tests/integrations/test_integration_state.py Adds unit tests for integration-state normalization and writing
tests/integrations/test_integration_catalog.py Updates assertions for new “not installed” wording
tests/integrations/test_cli.py Adds shared-infra safety + manifest fallback tests and ensures new command(s) require a valid project
tests/test_presets.py Filters expected warning during self-test preset installation via helper

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (2)

src/specify_cli/shared_infra.py:226

  • manifest.save() persists the shared speckit.manifest.json without any explicit preflight against symlinked/escaping destinations. Since this PR adds strict symlink protections for shared infra writes, it would be more consistent (and safer) to apply the same checks to the manifest write as well, otherwise an attacker-controlled symlink could redirect the manifest write outside the project.
    for dst, rel, content in planned_updates:
        _write_shared_text(project_path, dst, content)
        manifest.record_existing(rel)

    manifest.save()

src/specify_cli/integration_state.py:162

  • write_integration_json() writes .specify/integration.json via mkdir(..., exist_ok=True) + write_text() without any symlink/escape preflight. If .specify/ or integration.json is symlinked, this can write outside the project root. Consider adding a containment + symlink check (similar to the shared-infra preflight model) and using an atomic temp-file + replace write to avoid partially written state.
    """Write ``.specify/integration.json`` with legacy-compatible state."""
    dest = project_root / INTEGRATION_JSON
    dest.parent.mkdir(parents=True, exist_ok=True)

    integration_key = clean_integration_key(integration_key)
    installed = dedupe_integration_keys(installed_integrations or [])
    if integration_key and integration_key not in installed:
        installed.insert(0, integration_key)
    if not integration_key and installed:
        integration_key = installed[0]

    normalized_settings = normalize_integration_settings(settings or {})
    normalized_settings = {
        key: normalized_settings[key] for key in installed if key in normalized_settings
    }

    data: dict[str, Any] = {
        "version": version,
        "integration_state_schema": INTEGRATION_STATE_SCHEMA,
        "installed_integrations": installed,
        "integration_settings": normalized_settings,
    }
    if integration_key:
        data["integration"] = integration_key
        data["default_integration"] = integration_key

    dest.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")

  • Files reviewed: 29/29 changed files
  • Comments generated: 2

Comment thread src/specify_cli/shared_infra.py
Comment thread src/specify_cli/__init__.py Outdated
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented May 1, 2026

Please address Copilot feedback

@mnriem mnriem requested review from Copilot and removed request for Copilot May 1, 2026 16:18
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds multi-install integration state + CLI flows so multiple AI agent integrations can coexist in one Spec Kit project while keeping a single explicit default integration, and hardens shared-infrastructure writes.

Changes:

  • Introduces normalized integration state (default_integration, installed_integrations, per-integration settings, schema) and adds specify integration use <key> to change defaults without uninstalling.
  • Implements shared-infra installer/refresh module that preserves/merges speckit.manifest.json and refuses unsafe (symlink/escaping) destinations.
  • Expands tests + docs to cover multi-install safety contracts, schema handling, shared-infra safety, and updated CLI behaviors.
Show a summary per file
File Description
src/specify_cli/__init__.py Orchestrates multi-install behaviors across install/uninstall/switch/upgrade/list and adds integration use; integrates shared-infra + state helpers.
src/specify_cli/integration_state.py New normalization + persistence helpers for .specify/integration.json with schema/versioning and legacy compatibility.
src/specify_cli/integration_runtime.py New helpers to resolve stored/runtime integration options and invocation separators consistently.
src/specify_cli/shared_infra.py New shared scripts/templates install + refresh logic with manifest preservation and symlink/escape safety checks.
src/specify_cli/integrations/base.py Adds multi_install_safe contract flag to the integration base class.
src/specify_cli/integrations/auggie/__init__.py Marks Auggie integration as multi_install_safe.
src/specify_cli/integrations/claude/__init__.py Marks Claude integration as multi_install_safe.
src/specify_cli/integrations/codebuddy/__init__.py Marks Codebuddy integration as multi_install_safe.
src/specify_cli/integrations/codex/__init__.py Marks Codex integration as multi_install_safe.
src/specify_cli/integrations/cursor_agent/__init__.py Marks Cursor Agent integration as multi_install_safe.
src/specify_cli/integrations/gemini/__init__.py Marks Gemini integration as multi_install_safe.
src/specify_cli/integrations/iflow/__init__.py Marks Iflow integration as multi_install_safe.
src/specify_cli/integrations/junie/__init__.py Marks Junie integration as multi_install_safe.
src/specify_cli/integrations/kilocode/__init__.py Marks Kilocode integration as multi_install_safe.
src/specify_cli/integrations/kimi/__init__.py Marks Kimi integration as multi_install_safe.
src/specify_cli/integrations/qodercli/__init__.py Marks Qoder CLI integration as multi_install_safe.
src/specify_cli/integrations/qwen/__init__.py Marks Qwen integration as multi_install_safe.
src/specify_cli/integrations/roo/__init__.py Marks Roo integration as multi_install_safe.
src/specify_cli/integrations/shai/__init__.py Marks Shai integration as multi_install_safe.
src/specify_cli/integrations/tabnine/__init__.py Marks Tabnine integration as multi_install_safe.
src/specify_cli/integrations/trae/__init__.py Marks Trae integration as multi_install_safe.
src/specify_cli/integrations/windsurf/__init__.py Marks Windsurf integration as multi_install_safe.
tests/integrations/test_cli.py Adds coverage for shared-infra manifest warnings, symlink refusal, preflight behavior, nested sources, and safe file modes.
tests/integrations/test_integration_subcommand.py Adds coverage for multi-install flows, use, schema rejection, safe/unsafe multi-install enforcement, and improved messaging.
tests/integrations/test_integration_state.py New unit tests for integration state normalization/persistence helpers.
tests/integrations/test_integration_catalog.py Aligns expected errors for upgrade behavior with multi-install semantics.
tests/integrations/test_registry.py Adds registry-level contract tests to enforce multi_install_safe isolation invariants and disjoint manifests.
tests/test_presets.py Filters an intentional self-test preset warning and centralizes self-test install helper usage.
docs/reference/integrations.md Documents multi-install behavior, use, --force semantics, and which integrations are declared safe.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 30/30 changed files
  • Comments generated: 0

@mnriem mnriem merged commit 38fd1f6 into github:main May 1, 2026
15 checks passed
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented May 1, 2026

Thank you!

@PascalThuet
Copy link
Copy Markdown
Contributor Author

Thank you for your dedication and reactivity !

@PascalThuet PascalThuet deleted the codex/controlled-multi-install-safe-integrations branch May 1, 2026 17:15
@mnriem
Copy link
Copy Markdown
Collaborator

mnriem commented May 1, 2026

Same to you

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.

[Feature]: Support multiple installed integrations in the same project

3 participants