diff --git a/docs/reference/integrations.md b/docs/reference/integrations.md index f538fac86f..fac1932544 100644 --- a/docs/reference/integrations.md +++ b/docs/reference/integrations.md @@ -264,6 +264,7 @@ The currently declared multi-install safe integrations are: | `gemini` | `.gemini/commands`, `GEMINI.md` | | `junie` | `.junie/commands`, `.junie/AGENTS.md` | | `kilocode` | `.kilocode/workflows`, `.kilocode/rules/specify-rules.md` | +| `kiro-cli` | `.kiro/prompts` | | `qodercli` | `.qoder/commands`, `QODER.md` | | `qwen` | `.qwen/commands`, `QWEN.md` | | `shai` | `.shai/commands`, `SHAI.md` | diff --git a/src/specify_cli/integrations/kiro_cli/__init__.py b/src/specify_cli/integrations/kiro_cli/__init__.py index 4c176e5127..fb56b6b10f 100644 --- a/src/specify_cli/integrations/kiro_cli/__init__.py +++ b/src/specify_cli/integrations/kiro_cli/__init__.py @@ -26,3 +26,9 @@ class KiroCliIntegration(MarkdownIntegration): "args": _KIRO_ARG_FALLBACK, "extension": ".md", } + # Isolated agent root (.kiro/) and command dir (.kiro/prompts) that do not + # collide with any other integration, a stable "." separator with no + # dynamic paths, and a dedicated install manifest — so kiro-cli meets every + # documented multi-install-safe criterion. The registry contract tests + # enforce this isolation against every other safe integration (#3471). + multi_install_safe = True diff --git a/tests/integrations/test_integration_kiro_cli.py b/tests/integrations/test_integration_kiro_cli.py index 29adb0a4a6..96c5aedd9d 100644 --- a/tests/integrations/test_integration_kiro_cli.py +++ b/tests/integrations/test_integration_kiro_cli.py @@ -53,6 +53,16 @@ def test_registrar_config(self): assert i.registrar_config["format"] == "markdown" assert i.registrar_config["extension"] == ".md" + def test_declared_multi_install_safe(self): + """kiro-cli uses a fully isolated .kiro/ root, a stable "." separator, + and a dedicated manifest, so it must be declared multi-install safe — + otherwise co-installing it (e.g. alongside claude) leaves + `integration status` permanently in ERROR with no way to resolve it + (#3471). The registry contract tests enforce the actual path isolation + against every other safe integration.""" + i = get_integration(self.KEY) + assert i.multi_install_safe is True + def test_registrar_config_args_is_exact_prose_fallback(self): """Layer 1 — pin the exact fallback so wording drift requires a deliberate paired commit (production constant + test update)."""