Harness Open Source is an end-to-end developer platform with Source Control Management, CI/CD Pipelines, Hosted Developer Environments, and Artifact Registries.
2994 matches across 7 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | cmd/gitness/wire.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | cmd/gitness/driver_sqlite.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | cmd/gitness/driver_pq.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | cmd/gitness/main.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/infra_provider_factory.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/docker_client_factory.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/docker_client_factory_test.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/wire.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/infra_provider.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/docker_provider.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | infraprovider/docker_config.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | crypto/crypto.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | crypto/crypto_test.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/webhook.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/gitspace_settings.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/usergroup.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/pullreq_suggestion.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/config.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/config.go | 61 | // have to satisfy at least one of the following two conditions: |
| LOW | types/config.go | 81 | |
| LOW | types/config.go | 161 | // CI defines configuration related to build executions. |
| LOW | types/check.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/PackageTag.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/ai_agent_auth.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/execution.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/token.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/pullreq.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/pullreq_activity_metadata.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/git.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/image_data.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/multireader_closer.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/service.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/githook.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/user.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/codeowners.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/principal.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/platform_connector.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/path_test.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/rebase.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/types_test.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/stream.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/gitspace_error.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/lfs.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/resolved_feature.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/resolved_feature.go | 41 | |
| LOW | types/branch.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/repo_activity_payload.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/commit.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/fork.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/repo_activity.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/github_connector_data.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/code_comment.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/infrastructure.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/jetbrains.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/autolink.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/service_account.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/pullreq_reviewer_suggestion.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/gitspace_event.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/search.go | 1 | // Copyright 2023 Harness, Inc. |
| LOW | types/ai_task.go | 1 | // Copyright 2023 Harness, Inc. |
| 2674 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | web/cypress/utils/getRequestBodies.ts | 19 | export function getRandomCreateRegistryBody(name: string, packageType: PACKAGE_TYPE, type: REGISTRY_TYPE) { |
| LOW | …nfra/MachineLocationContent/MachineLocationContent.tsx | 112 | function CustomPersistentDiskColumn(row: Unknown) { |
| LOW | web/src/utils/Utils.ts | 686 | export function removeSpecificTextOptimized( |
| LOW | web/src/utils/Utils.ts | 1056 | export function combineAndNormalizePrincipalsAndGroups( |
| LOW | web/src/utils/FileUtils.ts | 50 | export function useFileContentViewerDecision({ |
| LOW | web/src/utils/timePopoverLocal/TimePopoverWithLocal.tsx | 40 | export function DateTimeWithLocalContentInline({ time }: { time: number }): JSX.Element { |
| LOW | …ponents/CommitModalButton/useCommitSuggestionModal.tsx | 52 | export function useCommitSuggestionsModal({ |
| LOW | …ponents/CommitModalButton/useCommitSuggestionModal.tsx | 141 | export function useCommitPullReqSuggestions() { |
| LOW | …arkdownEditorWithPreview/MarkdownEditorWithPreview.tsx | 151 | export function MarkdownEditorWithPreview({ |
| LOW | …arkdownEditorWithPreview/MarkdownEditorWithPreview.tsx | 762 | function scrollToAndSetCursorToEnd( |
| LOW | web/src/components/SourceCodeEditor/EditorUtils.ts | 56 | export function generateDefaultStepInsertionPath(stageIndex = 0): string { |
| LOW | web/src/components/Changes/CommitRange.tsx | 69 | function updatePageWhenCommitRangeIsChanged() { |
| LOW | web/src/components/Changes/CommitRange.tsx | 91 | function updateCommitRangeForCaller() { |
| LOW | web/src/components/Changes/Changes.tsx | 166 | function updateInternalRefsOnReadOnlyMode() { |
| LOW | web/src/components/Changes/Changes.tsx | 227 | function updateCacheWhenDiffDataArrives() { |
| LOW | web/src/components/Changes/Changes.tsx | 332 | function updatePageWhenCommitRangeIsChanged() { |
| LOW | web/src/components/Changes/Changes.tsx | 433 | function jumpToSelectedPathFromURL() { |
| LOW | web/src/components/CommentBox/CommentBox.tsx | 465 | function renderToggleCommentsButton() { |
| LOW | web/src/components/CommitsView/CommitsView.tsx | 287 | function renderPullRequestLinkFromCommitMessage( |
| LOW | web/src/components/CommitInfo/CommitInfo.tsx | 55 | function renderPullRequestLinkFromCommitMessage( |
| LOW | web/src/components/DiffViewer/DiffViewer.tsx | 255 | function alwaysExpandDiffIfChangedSinceLastView() { |
| LOW | web/src/components/DiffViewer/DiffViewer.tsx | 287 | function renderDiffAndCommentsIfInViewportOrSchedule() { |
| LOW | web/src/components/DiffViewer/DiffViewer.tsx | 321 | function serializeDeserializeContent() { |
| LOW | web/src/components/DiffViewer/DiffViewer.tsx | 417 | function adjustScrollPositionWhenCollapsingFile() { |
| LOW | web/src/components/DiffViewer/usePullReqComments.tsx | 943 | function bindClickEventToStartNewCommentThread() { |
| LOW | web/src/components/DiffViewer/DiffViewerUtils.tsx | 206 | export function createCommentOppositePlaceHolder(lineNumber: number, isNewCommentThread = false): HTMLTableRowElement { |
| LOW | web/src/components/DiffViewer/DiffViewerUtils.tsx | 236 | export function activitiesToDiffCommentItems( |
| LOW | web/src/hooks/useSetPageContainerWidthVar.tsx | 33 | export function useSetPageContainerWidthVar({ domRef }: { domRef: React.RefObject<HTMLElement> }) { |
| LOW | …/src/ar/__mocks__/hooks/useGovernanceMetaDataModal.tsx | 33 | export function useGovernanceMetaDataModal(_props: UseGovernanceModalProps): UseConnectorGovernanceModalPayload { |
| LOW | …loadRequestsProvider/AsyncDownloadRequestsProvider.tsx | 40 | function AsyncDownloadRequestsProvider({ children }: { children: React.ReactNode }) { |
| LOW | …AsyncDownloadRequestsProvider/AsyncDownloadRequest.tsx | 35 | function AsyncDownloadRequestStatusIcon(props: AsyncDownloadRequestStatusIconProps) { |
| LOW | …ents/IncludeExcludePatterns/IncludeExcludePatterns.tsx | 48 | function shouldShowIncludeExcludeList(values: FormData): boolean { |
| LOW | web/src/ar/components/CleanupPolicyList/utils.tsx | 21 | export function getFormattedFormDataForCleanupPolicy(values: RepositoryRequest): RepositoryRequest { |
| LOW | web/src/ar/components/CleanupPolicyList/utils.tsx | 29 | export function getFormattedIntialValuesForCleanupPolicy(values: RepositoryRequest): RepositoryRequest { |
| LOW | …s/MetadataFilterSelector/useMetadataFilterFromQuery.ts | 29 | export default function useMetadatadataFilterFromQuery() { |
| LOW | …/src/ar/components/Badge/RepositoryVisibilityBadge.tsx | 31 | export default function RepositoryVisibilityBadge(props: RepositoryVisibilityBadgeProps): JSX.Element { |
| LOW | web/src/ar/common/utils.ts | 34 | export function getIdentifierStringForBreadcrumb(label: string, value: string): string { |
| LOW | web/src/ar/common/utils.ts | 43 | export function getPackageTypesForApiQueryParams(packageTypes: RepositoryPackageType[]): string | undefined { |
| LOW | web/src/ar/hooks/useGetRepositoryListViewType.ts | 21 | export function useGetRepositoryListViewType() { |
| LOW | …c/ar/frameworks/Version/ArtifactTreeNodeViewWidget.tsx | 32 | export default function ArtifactTreeNodeViewWidget(props: ArtifactTreeNodeViewWidgetProps): JSX.Element { |
| LOW | …ar/frameworks/Version/VersionTreeNodeDetailsWidget.tsx | 32 | export default function VersionTreeNodeDetailsWidget(props: VersionTreeNodeDetailsWidgetProps): JSX.Element { |
| LOW | …r/frameworks/Version/ArtifactTreeNodeDetailsWidget.tsx | 31 | export default function ArtifactTreeNodeDetailsWidget(props: ArtifactTreeNodeDetailsWidgetProps): JSX.Element { |
| LOW | …rc/ar/frameworks/Version/VersionTreeNodeViewWidget.tsx | 32 | export default function VersionTreeNodeViewWidget(props: VersionTreeNodeViewWidgetProps): JSX.Element { |
| LOW | …r/frameworks/Version/ArtifactRowSubComponentWidget.tsx | 32 | export default function ArtifactRowSubComponentWidget(props: ArtifactRowSubComponentWidgetProps): JSX.Element { |
| LOW | …eworks/RepositoryStep/RepositoryTreeNodeViewWidget.tsx | 32 | export default function RepositoryTreeNodeViewWidget(props: RepositoryTreeNodeViewWidgetProps): JSX.Element { |
| LOW | …meworks/RepositoryStep/RepositorySetupClientWidget.tsx | 34 | export default function RepositorySetupClientWidget(props: RepositorySetupClientWidgetProps): JSX.Element { |
| LOW | …rks/RepositoryStep/RepositoryTreeNodeDetailsWidget.tsx | 31 | export default function RepositoryTreeNodeDetailsWidget(props: RepositoryTreeNodeDetailsWidgetProps): JSX.Element { |
| LOW | web/src/ar/pages/webhook-list/components/Forms/utils.ts | 30 | function convertSecretInputToFormFields( |
| LOW | web/src/ar/pages/webhook-list/components/Forms/utils.ts | 41 | export function transformFormValuesToSubmitValues( |
| LOW | web/src/ar/pages/webhook-list/components/Forms/utils.ts | 61 | function convertFormFieldsToSecreteInput(formData: Webhook, secretField: string, secretSpacePathField: string) { |
| LOW | web/src/ar/pages/webhook-list/components/Forms/utils.ts | 71 | export function transformWebhookDataToFormValues(data: Webhook, parent: Parent): WebhookRequestUI { |
| LOW | …list/components/ExemptionForm/ExemptionFormContent.tsx | 34 | function CreateExemptionFormContent(props: CreateExemptionFormContentProps) { |
| LOW | …onForm/ExemptionDetailsAndJustificationFormContent.tsx | 27 | export default function ExemptionDetailsAndJustificationFormContent( |
| LOW | …mponents/ExemptionForm/BasicInformationFormContent.tsx | 33 | export default function BasicInformationFormContent(props: BasicInformationFormContentProps) { |
| LOW | …ts/ViolationDetailsContent/ViolationFailureDetails.tsx | 48 | function SecurityPolicyFailureDetailsItem({ |
| LOW | …ts/ViolationDetailsContent/ViolationFailureDetails.tsx | 93 | function LicensePolicyFailureDetailItem({ data }: { data: LicensePolicyFailureDetailConfigV3 }) { |
| LOW | …ts/ViolationDetailsContent/ViolationFailureDetails.tsx | 114 | function PackageAgeViolationPolicyFailureDetailItem({ |
| LOW | …ts/ViolationDetailsContent/ViolationFailureDetails.tsx | 139 | function OssRiskLevelViolationPolicyFailureDetailItem({ data }: { data: OssRiskLevelPolicyFailureDetailConfigV3 }) { |
| LOW | …ts/ViolationDetailsContent/ViolationFailureDetails.tsx | 154 | function GenericPolicyFailureDetailItem({ data }: { data: KVO }) { |
| LOW | …ts/ViolationDetailsContent/ViolationFailureDetails.tsx | 168 | function ViolationFailureDetailsItem(props: ViolationFailureDetailsItemProps) { |
| 129 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | types/check.go | 94 | // CheckPayloadInternal is for internal use for more seamless integration for |
| MEDIUM | types/enum/pullreq.go | 88 | // Essentially, the Type determines the structure of the pull request activity's Payload structure. |
| MEDIUM | app/services/codeowners/service_test.go | 117 | \ \ \# user2@harness.io |
| MEDIUM | app/services/codeowners/service_test.go | 205 | a #user1@harness.io |
| MEDIUM | app/services/codeowners/service_test.go | 206 | b # user1@harness.io |
| MEDIUM | app/services/codeowners/service_test.go | 209 | e# user1@harness.io |
| MEDIUM | app/services/codeowners/service_test.go | 210 | f user1@harness.io#user2@harness.io |
| MEDIUM | app/services/codeowners/service_test.go | 211 | g user1@harness.io # user2@harness.io |
| MEDIUM | …details/NpmVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| MEDIUM | …details/NpmVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| MEDIUM | …details/NpmVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| MEDIUM | …ails/PythonVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| MEDIUM | …ails/PythonVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| MEDIUM | …ails/PythonVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| MEDIUM | stream/redis_consumer.go | 204 | // NOTE: for the first call ever we want to get the history of the consumer (to allow for seamless restarts) |
| MEDIUM | .engops/pr_source_code_changes.sh | 9 | # The purpose of this script is to facilitate auto-tagging of |
| MEDIUM | .engops/pr_source_code_changes.sh | 29 | # Called by https://harness0.harness.io/ng/account/l7B_kbSEQD2wjrM7PShm5w/all/orgs/Audit/projects/Engops_Audit/pipelines |
| MEDIUM | registry/types/digest.go | 247 | // These functions allow seamless conversion between types.Digest and digest.Digest. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | app/api/request/pullreq.go | 110 | // TODO: Remove the "includeGitStats := true" line and uncomment the following code block. |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 119 | // Step 1: Validate access key |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 125 | // Step 2: Get Docker client |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 135 | // Step 3: Check the current state of the container |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 141 | // Step 4: Handle different container states |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 177 | // Step 5: Retrieve container information and return response |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 287 | // Step 1: Get Docker client |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 294 | // Step 2: Check the current state of the container |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 300 | // Step 3: Handle container states |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 345 | // Step 4: Create log stream for stopping the container |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 352 | // Step 5: Stop the container |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 378 | // Step 1: Get Docker client |
| LOW | …or/container/embedded_docker_container_orchestrator.go | 385 | // Step 4: Create logger stream for stopping and removing the container |
| LOW | …ore/database/migrate/migrate_0151_migrate_artifacts.go | 51 | // Step 1: Get orphan manifest IDs (lightweight query). |
| LOW | …ore/database/migrate/migrate_0151_migrate_artifacts.go | 63 | // Step 2: Process in smaller sub-batches. |
| LOW | …rc/cde-gitness/pages/GitspaceDetails/Logger/Logger.tsx | 12 | // Step 1: Split by newline to get each JSON string |
| LOW | …rc/cde-gitness/pages/GitspaceDetails/Logger/Logger.tsx | 15 | // Step 2: Parse each line and clean up escaped strings inside 'out' key |
| LOW | tests/load/usage_metrics_test.go | 163 | // Step 1: Authenticate |
| LOW | tests/load/usage_metrics_test.go | 173 | // Step 2: Import repository from github.com/google/uuid |
| LOW | tests/load/usage_metrics_test.go | 182 | // Step 3: Wait for import to complete |
| LOW | tests/load/usage_metrics_test.go | 189 | // Step 4: Fetch a file from the repository (README.md) |
| LOW | registry/app/dist_temp/dcontext/http.go | 183 | // We need to check if that's intentional (could be a bug). |
| LOW | registry/app/api/handler/cargo/upload.go | 66 | // Step 1: Read first 4 bytes to get JSON length |
| LOW | registry/app/api/handler/cargo/upload.go | 72 | // Step 2: Read the JSON metadata |
| LOW | registry/app/store/database/artifact.go | 894 | // Step 1: Find the latest artifact ID |
| LOW | registry/app/store/database/artifact.go | 918 | // Step 2: Fetch full metadata for this specific artifact. |
| LOW | registry/app/store/database/registry.go | 360 | // Step 1: Fetch base registry data. |
| LOW | git/api/diff.go | 341 | // The purpose of this function is to get data based on which code comments could be repositioned. |
| LOW | git/api/diff.go | 393 | // The purpose of this function is to get diff data with which code comments could be generated. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | …itspace/orchestrator/utils/script_templates/set_env.sh | 18 | # Create the export statement |
| MEDIUM | registry/tests/conformance_test.sh | 24 | # Define the URL and request payload |
| MEDIUM | registry/tests/conformance_test.sh | 49 | # Define the URL and request payload |
| MEDIUM | registry/tests/maven/generate_junit_report.sh | 15 | # Create a timestamp for the report |
| MEDIUM | registry/tests/scripts/generate_report.sh | 47 | # Create a timestamp |
| MEDIUM | registry/tests/scripts/generate_report.sh | 50 | # Create a JSON report |
| MEDIUM | registry/tests/scripts/maven_tests.sh | 6 | # Create a Maven registry with timestamp to ensure uniqueness |
| MEDIUM | registry/tests/scripts/npm_tests.sh | 12 | # Create an NPM registry with timestamp to ensure uniqueness |
| MEDIUM | registry/tests/scripts/oci_tests.sh | 19 | # Create a temporary directory to run tests outside of the module |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | …or/utils/script_templates/install_tools_vs_code_web.sh | 7 | # Check if curl is installed |
| LOW | …ace/orchestrator/utils/script_templates/manage_user.sh | 8 | # Check if the user's home directory exists |
| LOW | …/orchestrator/utils/script_templates/run_vscode_web.sh | 33 | # Check if the process is still running |
| LOW | …pace/orchestrator/utils/script_templates/clone_code.sh | 57 | # Check if .devcontainer/devcontainer.json exists |
| LOW | …itspace/orchestrator/utils/script_templates/set_env.sh | 21 | # Check if the variable is already present in /etc/profile |
| LOW | …ace/orchestrator/utils/script_templates/install_git.sh | 9 | # Check if Git is installed |
| LOW | registry/tests/conformance_test.sh | 37 | # Check if jq command succeeded |
| LOW | registry/tests/conformance_test.sh | 59 | # Check if jq command succeeded |
| LOW | registry/tests/gopkg/scripts/setup_test.sh | 132 | # Set namespace to just the space name to avoid duplicate registry in path |
| LOW | registry/tests/cargo/scripts/setup_test.sh | 132 | # Set namespace to just the space name to avoid duplicate registry in path |
| LOW | registry/tests/maven/generate_junit_report.sh | 5 | # Check if the JSON report exists |
| LOW | registry/tests/maven/scripts/setup_test.sh | 114 | # Set namespace to just the space name to avoid duplicate registry in path |
| LOW | registry/tests/npm/scripts/setup_test.sh | 114 | # Set namespace to just the space name to avoid duplicate registry in path |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | …details/NpmVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |
| LOW | …ails/PythonVersion/pages/artifact-dertails/mockData.ts | 18 | "[](http://expressjs.com/)\n\n**Fast, unopinionated, mi |