Skip to content

Test PR - master#1094

Open
anwesha-palit-redhat wants to merge 1 commit into
openshift-pipelines:masterfrom
anwesha-palit-redhat:feat/SRVKP-11799
Open

Test PR - master#1094
anwesha-palit-redhat wants to merge 1 commit into
openshift-pipelines:masterfrom
anwesha-palit-redhat:feat/SRVKP-11799

Conversation

@anwesha-palit-redhat

Copy link
Copy Markdown
Contributor

No description provided.

@openshift-ci

openshift-ci Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: anwesha-palit-redhat

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:
  • OWNERS [anwesha-palit-redhat]

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Label for Approved PRs label Jun 3, 2026
@openshift-ci

openshift-ci Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

@anwesha-palit-redhat: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/frontend 7267ec1 link true /test frontend

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@anwesha-palit-redhat

Copy link
Copy Markdown
Contributor Author

/agentic_review

@qodo-code-review

qodo-code-review Bot commented Jun 15, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (5) 📘 Rule violations (0)

Grey Divider


Action required

1. Installed version lost 🐞 Bug ≡ Correctness ⭐ New
Description
PipelineQuickSearch sets an ArtifactHub item's attributes.installed from
installedTask.attributes.versions[0], but useTasksProvider can produce versions: [] while
still setting attributes.installed from the openshift.io/sem-version annotation. This makes
already-installed ArtifactHub tasks appear uninstalled (wrong CTA state) and can trigger unnecessary
updates/installs.
Code

src/components/task-quicksearch/PipelineQuickSearch.tsx[R119-123]

      item.attributes.installed = '';
Evidence
The UI CTA logic depends on attributes.installed, but installed tasks can have installed set
while versions is empty; PipelineQuickSearch then overwrites installed from versions[0]
(undefined), breaking the CTA state.

src/components/task-quicksearch/PipelineQuickSearch.tsx[112-123]
src/components/catalog/providers/useTasksProvider.tsx[38-77]
src/components/catalog/apis/artifactHub.ts[123-133]
src/components/task-quicksearch/pipeline-quicksearch-utils.ts[25-67]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`PipelineQuickSearch` derives `item.attributes.installed` from `installedTask.attributes.versions[0]`, but for ArtifactHub-installed tasks `useTasksProvider` may not populate `versions` (it depends on `app.kubernetes.io/version` label). This causes installed tasks to be treated as uninstalled.

### Issue Context
- `useTasksProvider` sets `attributes.installed` from the `openshift.io/sem-version` annotation for ArtifactHub tasks even when `attributes.versions` is empty.
- `createArtifactHubTask` sets the sem-version annotation but does not ensure the version label exists.

### Fix Focus Areas
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-124]
- src/components/catalog/providers/useTasksProvider.tsx[38-78]
- src/components/catalog/apis/artifactHub.ts[123-133]

### Implementation guidance
- In `PipelineQuickSearch.tsx`, when `installedTask` exists, set `item.attributes.installed` from `installedTask.attributes?.installed` (or directly from `installedTask.data.metadata.annotations[openshift.io/sem-version]`) instead of `installedTask.attributes.versions[0]`.
- Optionally harden `useTasksProvider` so ArtifactHub-installed tasks always produce `attributes.versions = [{ version: semVersion, id: semVersion }]` even when the `app.kubernetes.io/version` label is missing, to keep downstream UI logic consistent.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. useTektonHubIntegration still reads spec.hub 📎 Requirement gap ≡ Correctness
Description
The code still contains TektonHub-specific integration logic by querying config.spec?.hub?.params
for enable-devconsole-integration. This indicates a remaining functional dependency on TektonHub
configuration/behavior, violating the requirement to remove all TektonHub usages from the plugin.
Code

src/components/catalog/catalog-utils.ts[R163-166]

   const devconsoleIntegrationEnabled = config.spec?.hub?.params?.find(
-      (p) => p.name === TEKTON_HUB_INTEGRATION_KEY,
+      (p) => p.name === 'enable-devconsole-integration',
   );
   return devconsoleIntegrationEnabled?.value?.toLowerCase() !== 'false';
Evidence
PR Compliance ID 1 requires removing all TektonHub usages. The current code still checks
config.spec?.hub?.params for enable-devconsole-integration, which is TektonHub integration
configuration and therefore a remaining TektonHub dependency.

Remove all TektonHub imports/usages from the console plugin
src/components/catalog/catalog-utils.ts[154-168]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`useTektonHubIntegration()` still references TektonHub-specific configuration via `config.spec.hub.params` and the `enable-devconsole-integration` key, leaving a residual TektonHub dependency.
## Issue Context
TektonHub has been removed/deprecated; the plugin should not rely on TektonHub-related APIs, types, or configuration paths.
## Fix Focus Areas
- src/components/catalog/catalog-utils.ts[154-168]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. ArtifactHub URL/version mismatch 🐞 Bug ≡ Correctness
Description
getSelectedVersionUrl ignores its version argument and can return null until details populate
attributes.versions, but PipelineQuickSearch passes that value into
createArtifactHubTask/updateArtifactHubTask which call url.startsWith(...) and annotate the
task with the provided version. This can (a) throw at runtime when the CTA is clicked before
details load, and/or (b) install YAML for one version while recording a different
openshift.io/sem-version value.
Code

src/components/task-quicksearch/pipeline-quicksearch-utils.ts[R103-104]

export const getSelectedVersionUrl = (
 item: CatalogItem,
Evidence
The quicksearch flow computes selectedVersionUrl via getSelectedVersionUrl, then passes it
directly into ArtifactHub create/update APIs. Those APIs treat the URL as a required string and will
call startsWith, and they also record the passed version in annotations. Since the URL is
asynchronously populated and the helper ignores its version input, it’s possible to reach
create/update with a null URL or with a URL/version mismatch.

src/components/task-quicksearch/pipeline-quicksearch-utils.ts[103-111]
src/components/task-quicksearch/PipelineQuickSearch.tsx[112-174]
src/components/catalog/apis/artifactHub.ts[100-166]
src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[61-114]
src/components/quick-search/utils/quick-search-utils.tsx[10-26]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`getSelectedVersionUrl()` currently (1) returns `null` when `attributes.versions` is not present and (2) ignores the `version` parameter, returning only `attributes.selectedVersionContentUrl`. Callers then pass this potentially-null URL into `createArtifactHubTask`/`updateArtifactHubTask`, which assume a non-null string and also use the (possibly different) `selectedVersion` to set/update the semVersion annotation.
### Issue Context
This can lead to a crash when the user clicks the CTA before details fetching finishes, and it can produce mismatched “installed version” metadata if the URL reflects one version while the `version` argument reflects another.
### Fix Focus Areas
- src/components/task-quicksearch/pipeline-quicksearch-utils.ts[103-111]
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-174]
- src/components/catalog/apis/artifactHub.ts[100-167]
- src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[61-118]
- src/components/quick-search/utils/quick-search-utils.tsx[10-27]
### What to change
- Update `getSelectedVersionUrl(item, version)` to:
- Prefer `item.attributes.selectedVersionContentUrl` when it is a non-empty string.
- If absent, return `null` without depending on `attributes.versions` existing.
- Optionally (if `attributes.versions` contains URLs) select the correct URL by matching the `version` argument.
- In `PipelineQuickSearch.tsx`, guard against null/empty `selectedVersionUrl` before calling create/update; if missing, fail fast (and/or disable CTA until details are loaded).
- Ensure the version used for semVersion annotation matches the content URL’s version. If the UI allows selecting a version, make sure the selected version is actually passed through (i.e., don’t overwrite it in `handleCta`, or have `handleCta` respect `callbackProps.selectedVersion` when provided).
- In `PipelineQuickSearchDetails.tsx`, disable the CTA button for ArtifactHub items until `selectedItem.attributes.selectedVersionContentUrl` is available (details loaded).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. Non-ArtifactHub installs ignored 🐞 Bug ≡ Correctness ⭐ New
Description
isInstalledNamespaceTask and findInstalledTask only recognize tasks annotated with
openshift.io/installed-from === 'ArtifactHub', while useTasksProvider treats
openshift.io/installed-from as the provider string for any value present. This prevents
matching/filtering of externally-installed tasks that carry a different (legacy/other)
installed-from value, leading to duplicate “install” offerings for tasks that are already installed.
Code

src/components/task-quicksearch/pipeline-quicksearch-utils.ts[R119-123]

      i.uid !== item.uid &&
      i.name === item.name &&
      i.data.kind === TaskModel.kind &&
-      (i.data.metadata?.annotations?.[TektonTaskAnnotation.installedFrom] ===
-        TEKTONHUB ||
-        i.data.metadata?.annotations?.[TektonTaskAnnotation.installedFrom] ===
-          ARTIFACTHUB),
+      i.data.metadata?.annotations?.[TektonTaskAnnotation.installedFrom] ===
+        ARTIFACTHUB,
Evidence
Cluster tasks are normalized with provider taken from the installed-from annotation for any value,
but installed-task detection/matching only accepts ArtifactHub, so any other installed-from values
cannot be recognized as installed external tasks.

src/components/catalog/providers/useTasksProvider.tsx[38-40]
src/components/task-quicksearch/pipeline-quicksearch-utils.ts[86-125]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Installed task matching/filtering currently hard-requires `openshift.io/installed-from` to equal `'ArtifactHub'`. Any tasks that were installed externally but have a different `installed-from` value will not be matched as installed and will remain searchable/installable as if missing.

### Issue Context
`useTasksProvider` sets `provider` directly from whatever `openshift.io/installed-from` annotation exists, but `isInstalledNamespaceTask`/`findInstalledTask` only accept the `ArtifactHub` value.

### Fix Focus Areas
- src/components/task-quicksearch/pipeline-quicksearch-utils.ts[86-125]
- src/components/catalog/providers/useTasksProvider.tsx[38-40]

### Implementation guidance
- Introduce an allowlist of external installation sources (e.g., `['ArtifactHub', <legacy values>]`) and use it in both `isInstalledNamespaceTask` and `findInstalledTask`.
- Alternatively, treat a task as externally-installed if it has `openshift.io/installed-from` set to something other than the internal/default provider AND has expected external-task metadata (e.g., `openshift.io/sem-version`), to avoid false positives.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Debounced effect no cleanup 🐞 Bug ☼ Reliability
Description
PipelineQuickSearchDetails starts a debounced async details fetch with const mounted = true and
has its unmount cleanup commented out, so it can still call setVersions/setHasInstalledVersion
after the modal closes. This produces React “state update on unmounted component” warnings and
unnecessary work.
Code

src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[R85-90]

 useEffect(() => {
   resetVersions();
   const mounted = true;
-    if (
-      isTektonHubTaskWithoutVersions(selectedItem) &&
-      !isArtifactHubTask(selectedItem)
-    ) {
-      const debouncedLoadVersions = debounce(async () => {
-        if (mounted) {
-          try {
-            const itemVersions = await getTektonHubTaskVersions(
-              selectedItem?.data?.id,
-              selectedItem?.attributes?.apiURL,
-            );
-
-            selectedItem.attributes.versions = itemVersions;
-
-            if (mounted) {
-              setVersions([...itemVersions]);
-              setHasInstalledVersion(isOneVersionInstalled(selectedItem));
-            }
-          } catch (err) {
-            if (mounted) {
-              resetVersions();
-            }
-            console.log('failed to fetch versions:', err); // eslint-disable-line no-console
-          }
-        }
-      }, 10);
-      debouncedLoadVersions();
-    }

   if (isArtifactHubTask(selectedItem)) {
     const debouncedLoadDetails = debounce(async () => {
Evidence
The effect currently creates debounced async work that calls React state setters, but the guard flag
never flips and there’s no cancellation/cleanup, so unmount does not prevent updates.

src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[85-117]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`PipelineQuickSearchDetails` uses a debounced async function inside a `useEffect`, but it never cancels the debounced work and the `mounted` flag is a `const` with cleanup commented out. As a result, state setters may run after unmount.
### Issue Context
This is especially likely when the user closes the quicksearch modal quickly after selecting an ArtifactHub item.
### Fix Focus Areas
- src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[85-117]
### What to change
- Change `const mounted = true;` to `let mounted = true;`.
- Return a cleanup function that sets `mounted = false`.
- Cancel the debounced function in cleanup (`debouncedLoadDetails.cancel()` if available) to avoid running queued work.
- (Optional) include `isDevConsoleProxyAvailable` in dependencies if it can change at runtime, to avoid stale closures.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Previous review results

Review updated until commit 7267ec1

Results up to commit 7267ec1


🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (1)

Context used

Action required
1. useTektonHubIntegration still reads spec.hub 📎 Requirement gap ≡ Correctness
Description
The code still contains TektonHub-specific integration logic by querying config.spec?.hub?.params
for enable-devconsole-integration. This indicates a remaining functional dependency on TektonHub
configuration/behavior, violating the requirement to remove all TektonHub usages from the plugin.
Code

src/components/catalog/catalog-utils.ts[R163-166]

    const devconsoleIntegrationEnabled = config.spec?.hub?.params?.find(
-      (p) => p.name === TEKTON_HUB_INTEGRATION_KEY,
+      (p) => p.name === 'enable-devconsole-integration',
    );
    return devconsoleIntegrationEnabled?.value?.toLowerCase() !== 'false';
Evidence
PR Compliance ID 1 requires removing all TektonHub usages. The current code still checks
config.spec?.hub?.params for enable-devconsole-integration, which is TektonHub integration
configuration and therefore a remaining TektonHub dependency.

Remove all TektonHub imports/usages from the console plugin
src/components/catalog/catalog-utils.ts[154-168]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`useTektonHubIntegration()` still references TektonHub-specific configuration via `config.spec.hub.params` and the `enable-devconsole-integration` key, leaving a residual TektonHub dependency.

## Issue Context
TektonHub has been removed/deprecated; the plugin should not rely on TektonHub-related APIs, types, or configuration paths.

## Fix Focus Areas
- src/components/catalog/catalog-utils.ts[154-168]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. ArtifactHub URL/version mismatch 🐞 Bug ≡ Correctness
Description
getSelectedVersionUrl ignores its version argument and can return null until details populate
attributes.versions, but PipelineQuickSearch passes that value into
createArtifactHubTask/updateArtifactHubTask which call url.startsWith(...) and annotate the
task with the provided version. This can (a) throw at runtime when the CTA is clicked before
details load, and/or (b) install YAML for one version while recording a different
openshift.io/sem-version value.
Code

src/components/task-quicksearch/pipeline-quicksearch-utils.ts[R103-104]

export const getSelectedVersionUrl = (
  item: CatalogItem,
Evidence
The quicksearch flow computes selectedVersionUrl via getSelectedVersionUrl, then passes it
directly into ArtifactHub create/update APIs. Those APIs treat the URL as a required string and will
call startsWith, and they also record the passed version in annotations. Since the URL is
asynchronously populated and the helper ignores its version input, it’s possible to reach
create/update with a null URL or with a URL/version mismatch.

src/components/task-quicksearch/pipeline-quicksearch-utils.ts[103-111]
src/components/task-quicksearch/PipelineQuickSearch.tsx[112-174]
src/components/catalog/apis/artifactHub.ts[100-166]
src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[61-114]
src/components/quick-search/utils/quick-search-utils.tsx[10-26]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`getSelectedVersionUrl()` currently (1) returns `null` when `attributes.versions` is not present and (2) ignores the `version` parameter, returning only `attributes.selectedVersionContentUrl`. Callers then pass this potentially-null URL into `createArtifactHubTask`/`updateArtifactHubTask`, which assume a non-null string and also use the (possibly different) `selectedVersion` to set/update the semVersion annotation.

### Issue Context
This can lead to a crash when the user clicks the CTA before details fetching finishes, and it can produce mismatched “installed version” metadata if the URL reflects one version while the `version` argument reflects another.

### Fix Focus Areas
- src/components/task-quicksearch/pipeline-quicksearch-utils.ts[103-111]
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-174]
- src/components/catalog/apis/artifactHub.ts[100-167]
- src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[61-118]
- src/components/quick-search/utils/quick-search-utils.tsx[10-27]

### What to change
- Update `getSelectedVersionUrl(item, version)` to:
 - Prefer `item.attributes.selectedVersionContentUrl` when it is a non-empty string.
 - If absent, return `null` without depending on `attributes.versions` existing.
 - Optionally (if `attributes.versions` contains URLs) select the correct URL by matching the `version` argument.
- In `PipelineQuickSearch.tsx`, guard against null/empty `selectedVersionUrl` before calling create/update; if missing, fail fast (and/or disable CTA until details are loaded).
- Ensure the version used for semVersion annotation matches the content URL’s version. If the UI allows selecting a version, make sure the selected version is actually passed through (i.e., don’t overwrite it in `handleCta`, or have `handleCta` respect `callbackProps.selectedVersion` when provided).
- In `PipelineQuickSearchDetails.tsx`, disable the CTA button for ArtifactHub items until `selectedItem.attributes.selectedVersionContentUrl` is available (details loaded).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
3. Debounced effect no cleanup 🐞 Bug ☼ Reliability
Description
PipelineQuickSearchDetails starts a debounced async details fetch with const mounted = true and
has its unmount cleanup commented out, so it can still call setVersions/setHasInstalledVersion
after the modal closes. This produces React “state update on unmounted component” warnings and
unnecessary work.
Code

src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[R85-90]

  useEffect(() => {
    resetVersions();
    const mounted = true;
-    if (
-      isTektonHubTaskWithoutVersions(selectedItem) &&
-      !isArtifactHubTask(selectedItem)
-    ) {
-      const debouncedLoadVersions = debounce(async () => {
-        if (mounted) {
-          try {
-            const itemVersions = await getTektonHubTaskVersions(
-              selectedItem?.data?.id,
-              selectedItem?.attributes?.apiURL,
-            );
-
-            selectedItem.attributes.versions = itemVersions;
-
-            if (mounted) {
-              setVersions([...itemVersions]);
-              setHasInstalledVersion(isOneVersionInstalled(selectedItem));
-            }
-          } catch (err) {
-            if (mounted) {
-              resetVersions();
-            }
-            console.log('failed to fetch versions:', err); // eslint-disable-line no-console
-          }
-        }
-      }, 10);
-      debouncedLoadVersions();
-    }

    if (isArtifactHubTask(selectedItem)) {
      const debouncedLoadDetails = debounce(async () => {
Evidence
The effect currently creates debounced async work that calls React state setters, but the guard flag
never flips and there’s no cancellation/cleanup, so unmount does not prevent updates.

src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[85-117]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`PipelineQuickSearchDetails` uses a debounced async function inside a `useEffect`, but it never cancels the debounced work and the `mounted` flag is a `const` with cleanup commented out. As a result, state setters may run after unmount.

### Issue Context
This is especially likely when the user closes the quicksearch modal quickly after selecting an ArtifactHub item.

### Fix Focus Areas
- src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[85-117]

### What to change
- Change `const mounted = true;` to `let mounted = true;`.
- Return a cleanup function that sets `mounted = false`.
- Cancel the debounced function in cleanup (`debouncedLoadDetails.cancel()` if available) to avoid running queued work.
- (Optional) include `isDevConsoleProxyAvailable` in dependencies if it can change at runtime, to avoid stale closures.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Qodo Logo

@anwesha-palit-redhat

Copy link
Copy Markdown
Contributor Author

/config

@qodo-code-review

Copy link
Copy Markdown
🛠️ Wiki configuration file settings:

🛠️ Local configuration file settings:
 

🛠️ Global configuration file settings:
[config]
command_prefix = "/q"

[github_app]
pr_commands = [ "/review", "/generate_labels" ]

[pr_reviewer]
enable_review_labels_security = true
enable_review_labels_effort = false
enable_chat_in_code_suggestions=false

🛠️ PR-Agent final configurations:
==================== CONFIG ====================
config.organization_id = 'codium.ai'  
config.qodo_llm_gateway_metadata_tags = True  
config.second_model_for_exhaustive_mode = 'openai/openai/o4-mini'  
config.model = 'openai/openai/gpt-5.2'  
config.model_turbo = 'openai/openai/gpt-5.4-mini'  
config.fetch_github_apps_from_platform = True  
config.model_reasoning = 'openai/vertex_ai/gemini-3.1-pro-preview'  
config.fallback_models = ['openai/anthropic/claude-sonnet-4-6', 'openai/openai/gpt-5.2']  
config.pr_compliance = {'ENABLE_RULES_PLATFORM': True}  
config.git_provider = 'github'  
config.publish_output = True  
config.publish_output_no_suggestions = True  
config.publish_output_progress = True  
config.enable_v1_deprecation_banner = True  
config.verbosity_level = 0  
config.publish_logs = False  
config.debug_mode = False  
config.use_wiki_settings_file = True  
config.use_repo_settings_file = True  
config.use_global_settings_file = True  
config.use_global_wiki_settings_file = False  
config.disable_auto_feedback = False  
config.ai_timeout = 300  
config.response_language = 'en-US'  
config.clone_repo_instead_of_fetch = True  
config.always_clone = False  
config.add_repo_metadata = True  
config.add_repo_metadata_resolve_references = False  
config.clone_repo_time_limit = 300  
config.publish_inline_comments_fallback_batch_size = 5  
config.publish_inline_comments_fallback_sleep_time = 2  
config.max_model_tokens = 32000  
config.custom_model_max_tokens = -1  
config.patch_extension_skip_types = ['.md', '.txt']  
config.extra_allowed_extensions = []  
config.allow_dynamic_context = True  
config.allow_forward_dynamic_context = True  
config.max_extra_lines_before_dynamic_context = 12  
config.patch_extra_lines_before = 5  
config.patch_extra_lines_after = 1  
config.ai_handler = 'litellm'  
config.cli_mode = False  
config.trial_git_org_max_invokes_per_month = 30  
config.trial_ratio_close_to_limit = 0.8  
config.quota_just_exceeded_message = '### Qodo reviews are paused for this user.\n\nTroubleshooting steps vary by plan [Learn more →](https://docs.qodo.ai/subscription-plans#what-you%E2%80%99ll-see-when-reviews-are-paused)\n\n\n**On a Teams plan?**\nReviews resume once this user has a paid seat *and* their Git account is linked in Qodo.\n[Link Git account →](https://docs.qodo.ai/subscription-plans#linking-a-git-account)\n\n**Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?**\nThese require an Enterprise plan - Contact us\n[Contact us →](https://docs.qodo.ai/qodo-support#support)\n'  
config.invite_only_mode = False  
config.enable_request_access_msg_on_new_pr = False  
config.check_also_invites_field = False  
config.allowed_users = []  
config.disable_checkboxes = False  
config.output_relevant_configurations = False  
config.large_patch_policy = 'clip'  
config.seed = -1  
config.temperature = 0.2  
config.allow_dynamic_context_ab_testing = False  
config.choose_dynamic_context_ab_testing_ratio = 0.5  
config.ignore_pr_title = ['^\\[Auto\\]', '^Auto']  
config.ignore_pr_target_branches = []  
config.ignore_pr_source_branches = []  
config.ignore_pr_labels = []  
config.ignore_ticket_labels = []  
config.allow_only_specific_folders = []  
config.ignore_pr_authors = 'REDACTED'  
config.ignore_repositories = []  
config.ignore_language_framework = []  
config.is_auto_command = False  
config.is_new_pr = False  
config.enable_ai_metadata = True  
config.max_tickets = 10  
config.max_tickets_chars = 8000  
config.extract_tickets_from_pr_title = False  
config.max_tickets_from_title = 1  
config.title_extraction_skip_patterns = ['^revert\\b', '^merge\\b', '^release\\b', '^backport\\b', '^bump\\b']  
config.prevent_any_approval = False  
config.enable_comment_approval = False  
config.enable_auto_approval = False  
config.auto_approve_for_low_review_effort = -1  
config.auto_approve_for_no_suggestions = False  
config.ensure_ticket_compliance = False  
config.new_diff_format = True  
config.new_diff_format_add_external_references = True  
config.tasks_queue_ttl_from_dequeue_in_seconds = 1200  
config.enable_custom_labels = False  
config.custom_labels_discovery_prefixes = ['pr_agent:', 'qodo:']  
config.command_prefix = '/q'  

==================== PR_REVIEWER ====================
pr_reviewer.require_score_review = False  
pr_reviewer.require_tests_review = True  
pr_reviewer.require_estimate_effort_to_review = True  
pr_reviewer.require_can_be_split_review = False  
pr_reviewer.require_security_review = True  
pr_reviewer.require_todo_scan = False  
pr_reviewer.require_ticket_analysis_review = True  
pr_reviewer.require_ticket_labels = False  
pr_reviewer.require_no_ticket_labels = False  
pr_reviewer.check_pr_additional_content = False  
pr_reviewer.persistent_comment = True  
pr_reviewer.extra_instructions = ''  
pr_reviewer.final_update_message = True  
pr_reviewer.enable_review_labels_security = True  
pr_reviewer.enable_review_labels_effort = False  
pr_reviewer.enable_help_text = False  
pr_reviewer.enable_chat_in_code_suggestions = False  

==================== PR_COMPLIANCE ====================
pr_compliance.enabled = True  
pr_compliance.enable_rules_platform = True  
pr_compliance.rule_providers = []  
pr_compliance.rule_providers_max_rules = 300  
pr_compliance.assign_skill_rules_to_skill_findings = False  
pr_compliance.enable_security_section = True  
pr_compliance.enable_ticket_section = True  
pr_compliance.enable_codebase_duplication_section = True  
pr_compliance.enable_custom_compliance_section = True  
pr_compliance.require_ticket_analysis_review = True  
pr_compliance.allow_repo_pr_compliance = True  
pr_compliance.enable_global_pr_compliance = True  
pr_compliance.local_wiki_compliance_str = ''  
pr_compliance.global_wiki_pr_compliance = ''  
pr_compliance.local_repo_compliance_str = ''  
pr_compliance.global_repo_pr_compliance_str = ''  
pr_compliance.global_compliance_str = ''  
pr_compliance.enable_generic_custom_compliance_checklist = True  
pr_compliance.persist_generic_custom_compliance_checklist = False  
pr_compliance.display_no_compliance_only = False  
pr_compliance.enable_security_compliance = True  
pr_compliance.enable_update_pr_compliance_checkbox = True  
pr_compliance.enable_todo_scan = False  
pr_compliance.enable_ticket_labels = False  
pr_compliance.enable_no_ticket_labels = False  
pr_compliance.check_pr_additional_content = False  
pr_compliance.enable_compliance_labels_security = True  
pr_compliance.enable_user_defined_compliance_labels = True  
pr_compliance.enable_estimate_effort_to_review = True  
pr_compliance.max_rag_components_to_analyze = 5  
pr_compliance.min_component_size = 5  
pr_compliance.persistent_comment = True  
pr_compliance.enable_help_text = False  
pr_compliance.extra_instructions = ''  

==================== PR_DESCRIPTION ====================
pr_description.publish_labels = False  
pr_description.add_original_user_description = True  
pr_description.generate_ai_title = False  
pr_description.extra_instructions = ''  
pr_description.enable_pr_type = True  
pr_description.final_update_message = True  
pr_description.enable_help_text = False  
pr_description.enable_help_comment = False  
pr_description.bring_latest_tag = False  
pr_description.enable_pr_diagram = True  
pr_description.pr_diagram_direction = 'LR'  
pr_description.publish_description_as_comment = False  
pr_description.publish_description_as_comment_persistent = True  
pr_description.enable_semantic_files_types = True  
pr_description.collapsible_file_list = 'adaptive'  
pr_description.collapsible_file_list_threshold = 8  
pr_description.inline_file_summary = False  
pr_description.use_description_markers = False  
pr_description.include_generated_by_header = True  
pr_description.enable_large_pr_handling = True  
pr_description.max_ai_calls = 4  
pr_description.auto_create_ticket = False  

==================== PR_AGENTIC_DESCRIPTION ====================
pr_agentic_description.enable_file_changes_section = True  
pr_agentic_description.file_listing_style = 'cards'  
pr_agentic_description.publish_as_comment = True  

==================== PR_QUESTIONS ====================
pr_questions.aware_ai_handler = False  
pr_questions.enable_help_text = False  

==================== PR_CODE_SUGGESTIONS ====================
pr_code_suggestions.suggestions_depth = 'exhaustive'  
pr_code_suggestions.commitable_code_suggestions = False  
pr_code_suggestions.decouple_hunks = False  
pr_code_suggestions.dual_publishing_score_threshold = -1  
pr_code_suggestions.focus_only_on_problems = True  
pr_code_suggestions.allow_thumbs_up_down = False  
pr_code_suggestions.enable_suggestion_type_reuse = False  
pr_code_suggestions.enable_more_suggestions_checkbox = True  
pr_code_suggestions.high_level_suggestions_enabled = True  
pr_code_suggestions.extra_instructions = ''  
pr_code_suggestions.enable_help_text = False  
pr_code_suggestions.show_extra_context = False  
pr_code_suggestions.persistent_comment = True  
pr_code_suggestions.max_history_len = 5  
pr_code_suggestions.apply_suggestions_checkbox = True  
pr_code_suggestions.enable_chat_in_code_suggestions = True  
pr_code_suggestions.apply_limit_scope = True  
pr_code_suggestions.suggestions_score_threshold = 0  
pr_code_suggestions.new_score_mechanism = True  
pr_code_suggestions.new_score_mechanism_th_high = 9  
pr_code_suggestions.new_score_mechanism_th_medium = 7  
pr_code_suggestions.discard_unappliable_suggestions = False  
pr_code_suggestions.num_code_suggestions_per_chunk = 3  
pr_code_suggestions.num_best_practice_suggestions = 2  
pr_code_suggestions.max_number_of_calls = 3  
pr_code_suggestions.demand_code_suggestions_self_review = False  
pr_code_suggestions.code_suggestions_self_review_text = '**Author self-review**: I have reviewed the PR code suggestions, and addressed the relevant ones.'  
pr_code_suggestions.approve_pr_on_self_review = False  
pr_code_suggestions.fold_suggestions_on_self_review = True  
pr_code_suggestions.publish_post_process_suggestion_impact = True  
pr_code_suggestions.wiki_page_accepted_suggestions = True  
pr_code_suggestions.simplify_response = True  

==================== PR_CUSTOM_PROMPT ====================
pr_custom_prompt.prompt = 'The code suggestions should focus only on the following:\n- ...\n- ...\n...\n'  
pr_custom_prompt.suggestions_score_threshold = 0  
pr_custom_prompt.num_code_suggestions_per_chunk = 4  
pr_custom_prompt.self_reflect_on_custom_suggestions = True  
pr_custom_prompt.enable_help_text = False  

==================== PR_ADD_DOCS ====================
pr_add_docs.extra_instructions = ''  
pr_add_docs.docs_style = 'Sphinx'  
pr_add_docs.file = ''  
pr_add_docs.class_name = ''  

==================== PR_UPDATE_CHANGELOG ====================
pr_update_changelog.push_changelog_changes = False  
pr_update_changelog.extra_instructions = ''  
pr_update_changelog.add_pr_link = True  
pr_update_changelog.skip_ci_on_push = True  

==================== PR_ANALYZE ====================
pr_analyze.enable_help_text = False  

==================== PR_TEST ====================
pr_test.enable = True  
pr_test.extra_instructions = ''  
pr_test.testing_framework = ''  
pr_test.num_tests = 3  
pr_test.avoid_mocks = True  
pr_test.file = ''  
pr_test.class_name = ''  
pr_test.enable_help_text = False  

==================== PR_IMPROVE_COMPONENT ====================
pr_improve_component.num_code_suggestions = 4  
pr_improve_component.extra_instructions = ''  
pr_improve_component.file = ''  
pr_improve_component.class_name = ''  

==================== REVIEW_AGENT ====================
review_agent.llm_model = 'openai/openai/gpt-5.2_thinking'  
review_agent.enable_database_persistence = True  
review_agent.conversion_llm_model = 'openai/openai/gpt-5.2'  
review_agent.enabled = True  
review_agent.ensemble_models = ['openai/openai/gpt-5.2_thinking', 'openai/anthropic/claude-opus-4-6_thinking']  
review_agent.publish_output = True  
review_agent.enable_extended_mode = False  
review_agent.enable_context_collector = False  
review_agent.enable_issues_agent = True  
review_agent.enable_ticket_context = True  
review_agent.enable_compliance_agent = True  
review_agent.enable_spec_agent = True  
review_agent.enable_ui_agent = True  
review_agent.enable_persona_agent = False  
review_agent.persona_identifier = ''  
review_agent.persona_auto_select = True  
review_agent.persona_max_count = 2  
review_agent.persona_portal_base_url = ''  
review_agent.enable_deduplication = True  
review_agent.enable_conversion_agent = True  
review_agent.apply_conversion = True  
review_agent.enable_precision_agent = False  
review_agent.enable_cross_repo_agent = True  
review_agent.enable_qodo_review_skill = False  
review_agent.enable_past_bugs_collector = True  
review_agent.enable_skills_agent = False  
review_agent.enable_sandbox_usage = False  
review_agent.sandbox_configs_repo_name = 'qodo-sandbox-configs'  
review_agent.persistent_comment = True  
review_agent.persistent_comment_notification = True  
review_agent.enable_incremental_review = True  
review_agent.enable_a2a_auto_fix = False  
review_agent.enable_review_on_fix_pr = False  
review_agent.rules_enabled = True  
review_agent.requirements_gap_enabled = True  
review_agent.llm_call_timeout = 180  
review_agent.context_collector_llm_model = 'turbo'  
review_agent.feedback_tool_llm_model = 'turbo'  
review_agent.spec_llm_model = ''  
review_agent.persona_llm_model = ''  
review_agent.persona_selector_llm_model = ''  
review_agent.conversion_batching_mode = 'batch'  
review_agent.conversion_batch_size = 10  
review_agent.cross_repo_llm_model = ''  
review_agent.precision_llm_model = ''  
review_agent.precision_max_llm_calls = 45  
review_agent.precision_batching_mode = 'batch'  
review_agent.precision_batch_size = 50  
review_agent.precision_agent_vote_strategy = 'unanimous_discard'  
review_agent.langsmith_project_name = 'review-agent'  
review_agent.max_tokens_for_file = 'REDACTED'  
review_agent.single_unified_diff_tokens_limit = 'REDACTED'  
review_agent.max_llm_calls = 100  
review_agent.max_llm_calls_limit = 100  
review_agent.warn_when_remaining = 3  
review_agent.context_collector_max_llm_calls = 6  
review_agent.compliance_batch_size = 0  
review_agent.past_bugs_max_results = 10  
review_agent.past_bugs_llm_model = 'openai/gpt-5.4-mini'  
review_agent.skills_agent_dirs = ['.qodo/skills', '.claude/skills', '.cursor/skills', '.agents/skills', 'skills']  
review_agent.pass_previous_findings_to_agents = True  
review_agent.deduplication_llm_max_tokens = 'REDACTED'  
review_agent.publishing_action_level_rank_threshold = 0  
review_agent.comments_location_policy = 'both'  
review_agent.publish_inline_acknowledgment = False  
review_agent.inline_comments_severity_threshold = 3  
review_agent.enable_commitable_suggestions = False  
review_agent.commitable_suggestions_max_lines = 5  
review_agent.commitable_suggestions_max_concurrency = 5  
review_agent.prefer_single_line_comments = False  
review_agent.issues_user_guidelines = ''  
review_agent.compliance_user_guidelines = ''  
review_agent.additional_repos = []  
review_agent.demand_self_review = False  
review_agent.self_review_text = '**Author self-review**: I have reviewed the code review findings, and addressed the relevant ones.'  
review_agent.approve_pr_on_self_review = False  

==================== REVIEW_AGENT_UX ====================
review_agent_ux.finding_overflow_count = 3  
review_agent_ux.resolved_overflow_count = 3  
review_agent_ux.expand_description = True  
review_agent_ux.expand_code = True  
review_agent_ux.expand_evidence = False  
review_agent_ux.expand_recommendation = True  
review_agent_ux.expand_prompt = False  
review_agent_ux.show_prompt = True  
review_agent_ux.sub_categories_display = 'verbose'  
review_agent_ux.resolved_badge_display = 'both'  
review_agent_ux.display_mode = 'default'  
review_agent_ux.trial_banner_style = 'pre'  
review_agent_ux.trial_banner_position = 'footer'  

==================== PR_HELP ====================
pr_help.force_local_db = False  
pr_help.num_retrieved_snippets = 5  

==================== PR_NEW_ISSUE ====================
pr_new_issue.label_to_prompt_part = {'general': 'general question', 'feature': 'feature request (may already be addressed in the documentation)', 'bug': 'possible bug report (may be a by design behavior)'}  
pr_new_issue.supported_repos = ['qodo-ai/pr-agent']  

==================== PR_HELP_DOCS ====================
pr_help_docs.repo_url = ''  
pr_help_docs.repo_default_branch = 'main'  
pr_help_docs.docs_path = 'docs'  
pr_help_docs.exclude_root_readme = False  
pr_help_docs.supported_doc_exts = ['.md', '.mdx', '.rst']  
pr_help_docs.enable_help_text = False  

==================== PR_SIMILAR_ISSUE ====================
pr_similar_issue.skip_comments = False  
pr_similar_issue.force_update_dataset = False  
pr_similar_issue.max_issues_to_scan = 500  
pr_similar_issue.vectordb = 'pinecone'  

==================== PR_FIND_SIMILAR_COMPONENT ====================
pr_find_similar_component.class_name = ''  
pr_find_similar_component.file = ''  
pr_find_similar_component.search_from_org = False  
pr_find_similar_component.allow_fallback_less_words = True  
pr_find_similar_component.number_of_keywords = 5  
pr_find_similar_component.number_of_results = 5  

==================== BEST_PRACTICES ====================
best_practices.auto_best_practices_str = ''  
best_practices.wiki_best_practices_str = ''  
best_practices.global_wiki_best_practices = ''  
best_practices.local_repo_best_practices_str = ''  
best_practices.global_repo_best_practices_str = ''  
best_practices.global_best_practices_str = ''  
best_practices.organization_name = ''  
best_practices.max_lines_allowed = 2000  
best_practices.enable_global_best_practices = True  
best_practices.allow_repo_best_practices = True  
best_practices.enabled = True  

==================== AUTO_BEST_PRACTICES ====================
auto_best_practices.enable_auto_best_practices = True  
auto_best_practices.utilize_auto_best_practices = True  
auto_best_practices.extra_instructions = ''  
auto_best_practices.min_suggestions_to_auto_best_practices = 10  
auto_best_practices.number_of_days_to_update = 30  
auto_best_practices.max_patterns = 5  
auto_best_practices.minimal_date_to_update = '2025-01-26'  

==================== JIRA ====================
jira.jira_client_id = 'REDACTED'  
jira.jira_app_secret = 'REDACTED'  

==================== LINEAR ====================
linear.linear_client_id = 'REDACTED'  

==================== PR_TO_TICKET ====================
pr_to_ticket.default_base_url = ''  
pr_to_ticket.default_project_key = 'REDACTED'  
pr_to_ticket.fallback_to_git_provider_issues = True  
pr_to_ticket.direct_update_compliance = False  

==================== github_app ====================
github_app.bot_user = 'github-actions[bot]'  
github_app.override_deployment_type = True  
github_app.handle_pr_actions = ['opened', 'reopened', 'ready_for_review']  
github_app.pr_commands = ['/review', '/generate_labels']  
github_app.feedback_on_draft_pr = False  
github_app.handle_push_trigger = False  
github_app.push_commands = ['/agentic_review']  
github_app.ignore_pr_title = []  
github_app.ignore_bot_pr = True  

Comment on lines 163 to 166
const devconsoleIntegrationEnabled = config.spec?.hub?.params?.find(
(p) => p.name === TEKTON_HUB_INTEGRATION_KEY,
(p) => p.name === 'enable-devconsole-integration',
);
return devconsoleIntegrationEnabled?.value?.toLowerCase() !== 'false';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. usetektonhubintegration still reads spec.hub 📎 Requirement gap ≡ Correctness

The code still contains TektonHub-specific integration logic by querying config.spec?.hub?.params
for enable-devconsole-integration. This indicates a remaining functional dependency on TektonHub
configuration/behavior, violating the requirement to remove all TektonHub usages from the plugin.
Agent Prompt
## Issue description
`useTektonHubIntegration()` still references TektonHub-specific configuration via `config.spec.hub.params` and the `enable-devconsole-integration` key, leaving a residual TektonHub dependency.

## Issue Context
TektonHub has been removed/deprecated; the plugin should not rely on TektonHub-related APIs, types, or configuration paths.

## Fix Focus Areas
- src/components/catalog/catalog-utils.ts[154-168]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines 103 to 104
export const getSelectedVersionUrl = (
item: CatalogItem,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

2. Artifacthub url/version mismatch 🐞 Bug ≡ Correctness

getSelectedVersionUrl ignores its version argument and can return null until details populate
attributes.versions, but PipelineQuickSearch passes that value into
createArtifactHubTask/updateArtifactHubTask which call url.startsWith(...) and annotate the
task with the provided version. This can (a) throw at runtime when the CTA is clicked before
details load, and/or (b) install YAML for one version while recording a different
openshift.io/sem-version value.
Agent Prompt
### Issue description
`getSelectedVersionUrl()` currently (1) returns `null` when `attributes.versions` is not present and (2) ignores the `version` parameter, returning only `attributes.selectedVersionContentUrl`. Callers then pass this potentially-null URL into `createArtifactHubTask`/`updateArtifactHubTask`, which assume a non-null string and also use the (possibly different) `selectedVersion` to set/update the semVersion annotation.

### Issue Context
This can lead to a crash when the user clicks the CTA before details fetching finishes, and it can produce mismatched “installed version” metadata if the URL reflects one version while the `version` argument reflects another.

### Fix Focus Areas
- src/components/task-quicksearch/pipeline-quicksearch-utils.ts[103-111]
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-174]
- src/components/catalog/apis/artifactHub.ts[100-167]
- src/components/task-quicksearch/PipelineQuickSearchDetails.tsx[61-118]
- src/components/quick-search/utils/quick-search-utils.tsx[10-27]

### What to change
- Update `getSelectedVersionUrl(item, version)` to:
  - Prefer `item.attributes.selectedVersionContentUrl` when it is a non-empty string.
  - If absent, return `null` without depending on `attributes.versions` existing.
  - Optionally (if `attributes.versions` contains URLs) select the correct URL by matching the `version` argument.
- In `PipelineQuickSearch.tsx`, guard against null/empty `selectedVersionUrl` before calling create/update; if missing, fail fast (and/or disable CTA until details are loaded).
- Ensure the version used for semVersion annotation matches the content URL’s version. If the UI allows selecting a version, make sure the selected version is actually passed through (i.e., don’t overwrite it in `handleCta`, or have `handleCta` respect `callbackProps.selectedVersion` when provided).
- In `PipelineQuickSearchDetails.tsx`, disable the CTA button for ArtifactHub items until `selectedItem.attributes.selectedVersionContentUrl` is available (details loaded).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@arvindk-softwaredev

Copy link
Copy Markdown
Contributor

/agentic_review

@qodo-code-review

qodo-code-review Bot commented Jun 15, 2026

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 7267ec1

item.provider === TaskProviders.artifactHub &&
item.type !== TaskProviders.redhat
) {
item.attributes.installed = '';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. Installed version lost 🐞 Bug ≡ Correctness

PipelineQuickSearch sets an ArtifactHub item's attributes.installed from
installedTask.attributes.versions[0], but useTasksProvider can produce versions: [] while
still setting attributes.installed from the openshift.io/sem-version annotation. This makes
already-installed ArtifactHub tasks appear uninstalled (wrong CTA state) and can trigger unnecessary
updates/installs.
Agent Prompt
### Issue description
`PipelineQuickSearch` derives `item.attributes.installed` from `installedTask.attributes.versions[0]`, but for ArtifactHub-installed tasks `useTasksProvider` may not populate `versions` (it depends on `app.kubernetes.io/version` label). This causes installed tasks to be treated as uninstalled.

### Issue Context
- `useTasksProvider` sets `attributes.installed` from the `openshift.io/sem-version` annotation for ArtifactHub tasks even when `attributes.versions` is empty.
- `createArtifactHubTask` sets the sem-version annotation but does not ensure the version label exists.

### Fix Focus Areas
- src/components/task-quicksearch/PipelineQuickSearch.tsx[112-124]
- src/components/catalog/providers/useTasksProvider.tsx[38-78]
- src/components/catalog/apis/artifactHub.ts[123-133]

### Implementation guidance
- In `PipelineQuickSearch.tsx`, when `installedTask` exists, set `item.attributes.installed` from `installedTask.attributes?.installed` (or directly from `installedTask.data.metadata.annotations[openshift.io/sem-version]`) instead of `installedTask.attributes.versions[0]`.
- Optionally harden `useTasksProvider` so ArtifactHub-installed tasks always produce `attributes.versions = [{ version: semVersion, id: semVersion }]` even when the `app.kubernetes.io/version` label is missing, to keep downstream UI logic consistent.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Label for Approved PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants