feat(integration): add status reporting#2674
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds a new specify integration doctor subcommand to provide read-only diagnostics of a project’s integration state, with both human-readable and JSON outputs.
Changes:
- Introduces
integration_doctor.pyto compute a structured health report (findings, manifest checks, multi-install safety). - Adds CLI wiring + formatted console/JSON output for
specify integration doctor. - Adds integration tests and reference docs for the new command.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| tests/integrations/test_integration_subcommand.py | Adds integration tests covering integration doctor success and failure modes. |
| src/specify_cli/integration_doctor.py | Implements the diagnostic report generation and manifest/state validation logic. |
| src/specify_cli/init.py | Adds the integration doctor Typer command and report printing/JSON emission. |
| docs/reference/integrations.md | Documents usage and expected outputs for integration doctor. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
mnriem
requested changes
May 27, 2026
mnriem
left a comment
Collaborator
There was a problem hiding this comment.
Please address Copilot feedback. If not applicable, please explain why
Collaborator
|
Please address Copilot feedback |
Collaborator
|
Please address Copilot feedback |
Collaborator
|
Please address Copilot feedback |
d6d5a72 to
de5010c
Compare
mnriem
requested changes
Jun 4, 2026
mnriem
left a comment
Collaborator
There was a problem hiding this comment.
Please test & lint errors
…ainment On Windows, os.readlink() (and sometimes Path.resolve()) return paths with the \\?\ extended-length prefix. Comparing such a target against a plain project root via Path.relative_to() spuriously fails, so an in-project dangling symlink was classified as `invalid` instead of `missing` — failing test_status_treats_dangling_symlink_as_missing and the windows-style variant on the Windows CI runners. Centralize the containment check in _is_within_project() and strip the \\?\ / \\?\UNC\ prefix from both sides before relative_to(). Add portable regression tests for the prefix-stripping helper and the containment contract. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
A three-way merge / rebase onto main silently dropped the module-level `import pytest` from test_integration_subcommand.py: main reorganized the import block without it (using only a local `import pytest as _pytest`), while this branch added top-level fixtures and `pytest.skip`/`pytest.raises` usage. The overlapping import-hunk edits resolved by dropping the import, breaking collection with `NameError: name 'pytest' is not defined` on every runner. Re-add the import in the third-party group. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`test_strip_extended_length_prefix_normalizes_windows_paths` compared the str() form of the helper's output against a hand-built string. On Windows, pathlib renders a UNC root with a trailing separator (`\\server\share\`), so the exact string match failed there (`\\server\share\` != `\\server\share`) even though `_strip_extended_length_prefix` behaves correctly — the trailing separator is irrelevant to the `relative_to` containment check it feeds. Compare Path objects (semantic equality) instead of exact strings so the assertion holds on both POSIX and Windows. No production code change needed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The fallback `_manifest_suggestion` for the shared `speckit` manifest (used when no usable default integration is recorded) suggested `specify init --here --force`, which can trigger interactive integration selection. For CI/agent consumers of `integration status`, surface an explicit `--integration <key>` placeholder, matching the file's existing `<key>` suggestion style. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d742358 to
5c6548f
Compare
mnriem
approved these changes
Jun 9, 2026
Collaborator
|
Thank you! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
specify integration statusfor read-only integration status reportingCloses #2671
Maintainer feedback
integration doctorcommand tointegration statusafter maintainer feedback in [Feature]: Addspecify integration statusreporting command #2671.Review feedback
integration.jsonread for raw and normalized state.exists()prechecks with explicitlstat/stathandling.integration upgrade <unknown>suggestions for stale unknown integrations.initfor each status case.installed_integrationsvalues when deriving raw status checks.speckit, in JSON status output.Path.exists()and tracked symlinks are not followed withPath.stat().Testing
uv run --extra test pytest tests/integrations/test_integration_subcommand.py::TestIntegrationStatus -q- 36 passeduv run --extra test pytest tests/integrations/test_integration_subcommand.py tests/integrations/test_manifest.py -q- 124 passeduvx ruff check src/specify_cli/integration_state.py src/specify_cli/integration_status.py src/specify_cli/__init__.py tests/integrations/test_integration_subcommand.pygit diff --checkAI Disclosure
Used OpenAI Codex to inspect the integration state/manifest helpers, implement the status reporting command, add tests/docs, address maintainer and review feedback, run validation, and draft this PR.