Skip to content

feat(auth): add external credential integration#2033

Open
evandance wants to merge 5 commits into
mainfrom
feat/external-credential-platform
Open

feat(auth): add external credential integration#2033
evandance wants to merge 5 commits into
mainfrom
feat/external-credential-platform

Conversation

@evandance

@evandance evandance commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

Add opt-in external credential integration for Extended builds while keeping the Standard distribution and its normal user experience unchanged. Credential ownership and request authorization can remain outside the CLI when required by a managed runtime.

Existing profiles and commands retain their current behavior unless an administrator explicitly enables external credential configuration.

Credential Modes

  • Direct — Obtains a UAT or TAT from an administrator-approved helper at runtime, then calls Lark APIs directly.
  • Credential proxy — Obtains a short-lived proxy credential from an administrator-approved helper, then routes API, stream, and opaque file-handle traffic through a managed proxy without exposing Lark credentials to the CLI.
  • Platform proxy — Routes API, stream, and opaque file-handle traffic through an administrator-configured proxy without a Lark or proxy bearer, relying on the deployment environment to authenticate the workload out of band.

These are generic client integration paths. Deployment operators remain responsible for workload isolation, caller authentication, authorization, and service reliability; the CLI is responsible for not leaking credentials, preserving the configured client-side routing boundary, isolating helper execution, and failing closed when it cannot honor that boundary.

Real-time event consumption is intentionally unavailable with externally managed credentials in v1. event consume, the hidden event bus, legacy event +subscribe, and mail +watch fail closed in all three modes; read-only event discovery/status and local bus cleanup remain available.

Changes

  • Add direct credential resolution and two proxy-based request modes.
  • Add administrator-controlled configuration, executable verification, isolated helper execution, and fail-closed credential-source selection.
  • Route API requests, streams, and known service-returned file handles through shared runtime boundaries so business commands do not branch on credential mode or edition.
  • Keep proxy-mode startup on embedded API metadata so the CLI does not contact a Lark host outside the configured data plane.
  • Publish Standard and Extended artifacts together while keeping installation, update checks, and self-updates within the installed edition.
  • Keep the Standard command/output surface compatible, including its existing update source and error-envelope shape.

Test Plan

  • Standard and Extended targeted unit/race tests
  • Standard help/output and edition-isolation contract tests
  • Repository-local Extended helper/proxy API and opaque-file E2E
  • Native macOS/Windows helper-environment and path-trust CI coverage
  • Required-check, coverage-summary, and draft-before-public release workflow contracts
  • Full pre-PR suite on the final revision

Related Issues

  • None

@evandance
evandance requested a review from liangshuo-1 as a code owner July 23, 2026 10:54
@github-actions github-actions Bot added domain/mail PR touches the mail domain size/XL Architecture-level or global-impact change labels Jul 23, 2026
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds Standard and Extended CLI editions with external credential configuration, process-based providers, proxy HTTP/WebSocket transports, identity-aware events, diagnostics, secure file URL validation, release installers, and Extended update support.

Changes

Extended edition and external credential platform

Layer / File(s) Summary
Edition, release, and error contracts
.github/workflows/*, .goreleaser.yml, internal/build/*, cmd/version/*, errs/*, internal/output/*
Standard and Extended builds report distinct editions and capabilities, release artifacts include Extended scripts, typed errors carry origin and proxy request metadata, and CI validates build composition and installer syntax.
External credential configuration and provider wiring
internal/core/*, internal/externalcredential/*, internal/credential/*, internal/cmdutil/*
External credential schemas, strict validation, profile selection, trusted executable checks, process execution, caching, credential resolution, and proxy transport wiring are added with Standard-edition fallbacks.
External proxy transport and event handling
internal/externalcredential/transport*, internal/event/*, cmd/event/*
Proxy HTTP requests and WebSocket events carry identity and proxy metadata, refresh credentials, validate protocol frames, enforce identity matching, and preserve typed proxy errors.
CLI policy and diagnostics
cmd/auth/*, cmd/config/*, cmd/doctor/*, cmd/root*, internal/identitydiag/*
Read-only commands remain available with external providers, status/config output reports provider metadata, doctor checks proxy identities, and external identity verification is supported.
Extended update and installers
internal/extendedupdate/*, cmd/update/*, scripts/install-extended.*
Extended binaries are fetched, checksum-verified, edition-verified, atomically installed, and exposed through platform-specific installers and update flows.
Shortcut proxy routing and URL validation
shortcuts/apps/*, shortcuts/mail/*, shortcuts/event/*, shortcuts/minutes/*
File, mail, event, and minutes shortcuts validate proxy file URLs, select proxy-aware clients, resolve direct-mode app secrets, and preserve structured transport errors.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

  • larksuite/cli#144: Both changes modify doctor diagnostics and related CLI status plumbing.
  • larksuite/cli#252: Both changes extend credential-provider command gating and external-provider error handling.
  • larksuite/cli#1185: Both changes modify event handshake protocol wiring.

Suggested labels: domain/base, size/XL, feature

Suggested reviewers: liangshuo-1

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.23% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and accurately summarizes the main change: adding external credential integration to auth.
Description check ✅ Passed The description follows the required template and includes summary, changes, test plan, and related issues.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/external-credential-platform

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

npm i -g https://pkg.pr.new/larksuite/cli/@larksuite/cli@7ba5ae7efa49b585e8139f6cea2d6b1d8d76e09f

🧩 Skill update

npx skills add larksuite/cli#feat/external-credential-platform -y -g

@codecov

codecov Bot commented Jul 23, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 65.43504% with 580 lines in your changes missing coverage. Please review.
✅ Project coverage is 75.01%. Comparing base (a7865cd) to head (7ba5ae7).

Files with missing lines Patch % Lines
internal/externalcredential/process.go 64.75% 62 Missing and 24 partials ⚠️
internal/credential/inspection.go 53.23% 49 Missing and 16 partials ⚠️
internal/core/config.go 69.18% 30 Missing and 23 partials ⚠️
internal/externalcredential/transport.go 80.56% 25 Missing and 16 partials ⚠️
cmd/doctor/doctor.go 52.30% 22 Missing and 9 partials ⚠️
cmd/update/edition_extended.go 49.12% 24 Missing and 5 partials ⚠️
internal/client/remote_files.go 55.38% 18 Missing and 11 partials ⚠️
internal/externalcredential/profile_selection.go 40.47% 19 Missing and 6 partials ⚠️
internal/identitydiag/diagnostics.go 71.91% 13 Missing and 12 partials ⚠️
cmd/auth/check.go 58.49% 16 Missing and 6 partials ⚠️
... and 31 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2033      +/-   ##
==========================================
- Coverage   75.14%   75.01%   -0.14%     
==========================================
  Files         911      943      +32     
  Lines       96322    97874    +1552     
==========================================
+ Hits        72385    73423    +1038     
- Misses      18370    18716     +346     
- Partials     5567     5735     +168     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.goreleaser.yml (1)

14-37: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Exclude unsupported RISC-V target combinations.

Go does not support darwin/riscv64 or windows/riscv64, and GoReleaser expands both builds into the full OS/architecture matrix. Add ignore entries for those pairs in both standard and extended, or list only supported targets; otherwise the release builds are likely to fail before archives are produced.

Proposed configuration
   goarch:
     - amd64
     - arm64
     - riscv64
+  ignore:
+    - goos: darwin
+      goarch: riscv64
+    - goos: windows
+      goarch: riscv64
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.goreleaser.yml around lines 14 - 37, Add exclusions for the unsupported
darwin/riscv64 and windows/riscv64 combinations in both the standard and
extended GoReleaser build configurations. Keep linux/riscv64 and all currently
supported OS/architecture combinations unchanged, using each build’s ignore
entries or an equivalent supported-target list.
🧹 Nitpick comments (3)
cmd/doctor/doctor_test.go (1)

259-264: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prefer cmdutil.TestFactory over manual &cmdutil.Factory{} construction.

status_test.go's equivalent scenario (external credential provider override) uses cmdutil.TestFactory(t, cfg) then overrides f.Credential. This test instead hand-builds the Factory with only Config, Credential, and IOStreams set, skipping the shared helper. As per path instructions, "Use cmdutil.TestFactory(t, config) for test factories."

♻️ Suggested refactor
-	out := &bytes.Buffer{}
-	f := &cmdutil.Factory{
-		Config:     func() (*core.CliConfig, error) { return cfg, nil },
-		Credential: cred,
-		IOStreams:  &cmdutil.IOStreams{Out: out, ErrOut: &bytes.Buffer{}},
-	}
+	f, out, _, _ := cmdutil.TestFactory(t, cfg)
+	f.Credential = cred
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/doctor/doctor_test.go` around lines 259 - 264, Replace the manual
cmdutil.Factory construction in the affected doctor test with
cmdutil.TestFactory(t, cfg), then override its Credential field with cred and
preserve the existing output stream setup as needed.

Source: Path instructions

internal/identitydiag/diagnostics.go (1)

438-476: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

fetchExternalUserInfo loses HTTP status on non-JSON error bodies.

Unlike its sibling fetchBotInfo (which unmarshals first but always surfaces HTTP %d when status is bad, even if parsing fails), fetchExternalUserInfo returns immediately on any JSON decode error before checking resp.StatusCode. A non-2xx response with a non-JSON body (gateway timeout, proxy auth failure returning HTML/plain text, empty body) will surface only "decode user identity response: ...", hiding the actual HTTP status — undermining the diagnostic value of this exact code path.

🐛 Proposed fix
 	resp, err := httpClient.Do(req)
 	if err != nil {
 		return nil, err
 	}
 	defer resp.Body.Close()
 
+	body, _ := io.ReadAll(io.LimitReader(resp.Body, 1<<20))
 	var envelope struct {
 		Code int    `json:"code"`
 		Msg  string `json:"msg"`
 		Data struct {
 			OpenID string `json:"open_id"`
 			Name   string `json:"name"`
 		} `json:"data"`
 	}
-	if err := json.NewDecoder(io.LimitReader(resp.Body, 1<<20)).Decode(&envelope); err != nil {
-		return nil, fmt.Errorf("decode user identity response: %w", err)
-	}
-	if resp.StatusCode < 200 || resp.StatusCode >= 300 || envelope.Code != 0 {
-		return nil, fmt.Errorf("user identity verification failed: HTTP %d, code %d: %s", resp.StatusCode, envelope.Code, envelope.Msg)
-	}
+	parseErr := json.Unmarshal(body, &envelope)
+	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
+		if parseErr == nil && envelope.Code != 0 {
+			return nil, fmt.Errorf("user identity verification failed: HTTP %d, code %d: %s", resp.StatusCode, envelope.Code, envelope.Msg)
+		}
+		return nil, fmt.Errorf("user identity verification failed: HTTP %d", resp.StatusCode)
+	}
+	if parseErr != nil {
+		return nil, fmt.Errorf("decode user identity response: %w", parseErr)
+	}
+	if envelope.Code != 0 {
+		return nil, fmt.Errorf("user identity verification failed: code %d: %s", envelope.Code, envelope.Msg)
+	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/identitydiag/diagnostics.go` around lines 438 - 476, Update
fetchExternalUserInfo so HTTP status validation is performed even when decoding
the response body fails. Preserve the decoded API error details when available,
but ensure non-2xx responses with invalid or empty JSON still return an error
containing the HTTP status; keep successful responses requiring valid JSON and a
non-empty OpenID.
cmd/update/edition_extended_test.go (1)

40-43: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Isolate config state with LARKSUITE_CLI_CONFIG_DIR.

TestExtendedUpdateUsesExtendedReleaseInstaller runs without --check, so runEditionUpdate calls resolveSkillsBrand(opts.Factory, io.ErrOut), which reads on-disk configuration. Without pinning the config dir to a temp path, the test can read/pollute the real config and become environment-dependent.

♻️ Isolate config directory
 func TestExtendedUpdateUsesExtendedReleaseInstaller(t *testing.T) {
+	t.Setenv("LARKSUITE_CLI_CONFIG_DIR", t.TempDir())
 	oldFetch, oldInstall := fetchExtendedLatest, installExtended

As per coding guidelines: "set LARKSUITE_CLI_CONFIG_DIR to t.TempDir() with t.Setenv to isolate configuration state."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/update/edition_extended_test.go` around lines 40 - 43, Update
TestExtendedUpdateUsesExtendedReleaseInstaller to call t.Setenv for
LARKSUITE_CLI_CONFIG_DIR with t.TempDir() before invoking the command, isolating
resolveSkillsBrand configuration access from the real environment.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cmd/config/show.go`:
- Around line 72-82: Replace the loose result map in cmd/config/show.go lines
72-82 with a typed internal-config response struct. Define a distinct typed
external-provider response struct for cmd/config/show.go lines 107-125, using
omitempty on optional fields. Update cmd/config/config_test.go lines 525-545 to
unmarshal into the external response type or an equivalent typed assertion
struct, using pointer fields for values that may be omitted.
- Around line 92-101: Update the credential resolution flow around
ActiveExtensionProviderName and ResolveAccount to return typed errs failures or
preserve existing typed errors via .WithCause(err), rather than propagating raw
provider or LoadMultiAppConfig errors. Ensure both error paths retain their
original causes so command root handling does not classify them as
internal/unknown.

In `@cmd/doctor/doctor_test.go`:
- Around line 280-283: Update the config_file assertion in the doctor test to
validate configCheck.Message, or otherwise directly verify the skip reason,
rather than checking configCheck.Hint. Ensure the test requires the skip message
to mention local config usage while preserving the existing skip-status
assertion.

In `@cmd/version/version_test.go`:
- Line 18: Update the test setup around the factory creation to use
cmdutil.TestFactory(t, config) instead of cmdutil.NewDefault. Before creating
the factory, set LARKSUITE_CLI_CONFIG_DIR with t.Setenv to t.TempDir(),
preserving the test’s isolated configuration behavior.
- Around line 24-34: Update the version output assertion in the test to compare
got.Capabilities with build.Capabilities() in addition to the existing version
and edition checks, ensuring capability changes cannot pass unnoticed.

In `@cmd/version/version.go`:
- Around line 30-34: Replace the map[string]interface{} payload in the version
output path with a typed versionReport struct. Define versionReport with JSON
tags for version, edition, and capabilities, then instantiate it from
build.Version, build.Edition, and build.Capabilities() before passing it to
output.PrintJson.
- Around line 37-38: Update the version output flow around fmt.Fprintf to wrap
any write failure in errs.NewInternalError(...).WithCause(err) before returning,
while preserving successful output behavior. Add an error-path test for the
version command that verifies the typed error’s category, subtype, and original
writer error cause.

In `@internal/errclass/classify.go`:
- Line 163: Add a focused test for the unrecognized-category fallback in the
classification logic, asserting that the returned result has Origin set to
"lark". Keep the existing normal classification tests unchanged and ensure the
test would fail if the fallback assignment in the classifier were removed or
altered.

In `@internal/event/consume/consume_test.go`:
- Line 90: Update the handshake test around doHello to decode the returned Hello
message and directly assert that Hello.Identity equals "user", while retaining
the existing SubscriptionID assertion. Ensure the test would fail if
hello.Identity is not populated on the wire.

In `@internal/externalcredential/trust_unix_extended_test.go`:
- Line 24: Replace the fixture writes in the test setup around both
`vfs.WriteFile` calls with `os.WriteFile`, preserving the existing paths, data,
and permissions. Remove the `vfs` import if it is no longer referenced, and
ensure the standard-library `os` import is available.

In `@internal/externalcredential/trust_unix_extended.go`:
- Around line 18-39: Update validateAdminControlledPath to normalize target once
and use that cleaned value for both current initialization and the leaf
comparison. Ensure paths containing trailing components or ./ still execute the
final IsRegular and executable permission checks.

In `@scripts/install-extended.sh`:
- Around line 36-42: Update the latest-version fetch in the release-resolution
block to apply the same connection timeout, total transfer timeout, and maximum
redirect limits used by the checksum/archive downloads. Keep the existing
HTTPS-only options and URL extraction behavior unchanged.

In `@shortcuts/mail/mail_watch.go`:
- Around line 398-415: Update the proxy-mode branch around proxySource.Start to
use the same cancellable watchCtx and signal.Notify handling as the WebSocket
path. Run proxySource.Start asynchronously and route its result through the
existing startErrCh/shutdownBySignal select so Ctrl+C or termination cancels the
context, invokes handleMailWatchSignal, and preserves deferred
unsubscribeWithLog cleanup.

---

Outside diff comments:
In @.goreleaser.yml:
- Around line 14-37: Add exclusions for the unsupported darwin/riscv64 and
windows/riscv64 combinations in both the standard and extended GoReleaser build
configurations. Keep linux/riscv64 and all currently supported OS/architecture
combinations unchanged, using each build’s ignore entries or an equivalent
supported-target list.

---

Nitpick comments:
In `@cmd/doctor/doctor_test.go`:
- Around line 259-264: Replace the manual cmdutil.Factory construction in the
affected doctor test with cmdutil.TestFactory(t, cfg), then override its
Credential field with cred and preserve the existing output stream setup as
needed.

In `@cmd/update/edition_extended_test.go`:
- Around line 40-43: Update TestExtendedUpdateUsesExtendedReleaseInstaller to
call t.Setenv for LARKSUITE_CLI_CONFIG_DIR with t.TempDir() before invoking the
command, isolating resolveSkillsBrand configuration access from the real
environment.

In `@internal/identitydiag/diagnostics.go`:
- Around line 438-476: Update fetchExternalUserInfo so HTTP status validation is
performed even when decoding the response body fails. Preserve the decoded API
error details when available, but ensure non-2xx responses with invalid or empty
JSON still return an error containing the HTTP status; keep successful responses
requiring valid JSON and a non-empty OpenID.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7527cb25-5814-48b5-aaee-006c45147961

📥 Commits

Reviewing files that changed from the base of the PR and between 1e682bd and f5e846f.

📒 Files selected for processing (108)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .goreleaser.yml
  • Makefile
  • cmd/auth/auth.go
  • cmd/auth/auth_test.go
  • cmd/auth/qrcode.go
  • cmd/auth/status.go
  • cmd/auth/status_test.go
  • cmd/build.go
  • cmd/config/config.go
  • cmd/config/config_test.go
  • cmd/config/show.go
  • cmd/doctor/doctor.go
  • cmd/doctor/doctor_test.go
  • cmd/event/bus.go
  • cmd/event/consume.go
  • cmd/event/consume_external_proxy_test.go
  • cmd/event/format_helpers_test.go
  • cmd/root.go
  • cmd/root_test.go
  • cmd/update/edition_extended.go
  • cmd/update/edition_extended_test.go
  • cmd/update/edition_standard.go
  • cmd/update/update.go
  • cmd/update/update_test.go
  • cmd/version/version.go
  • cmd/version/version_test.go
  • docs/external-credential-platform.md
  • errs/ERROR_CONTRACT.md
  • errs/marshal_test.go
  • errs/problem.go
  • errs/subtypes.go
  • go.mod
  • internal/build/edition_extended.go
  • internal/build/edition_standard.go
  • internal/client/client.go
  • internal/cmdutil/factory.go
  • internal/cmdutil/factory_default.go
  • internal/cmdutil/factory_external_credential_test.go
  • internal/core/config.go
  • internal/core/config_test.go
  • internal/credential/credential_provider.go
  • internal/credential/default_provider.go
  • internal/credential/types.go
  • internal/errclass/classify.go
  • internal/errclass/classify_test.go
  • internal/event/bus/bus.go
  • internal/event/bus/handle_hello_test.go
  • internal/event/consume/consume.go
  • internal/event/consume/consume_test.go
  • internal/event/consume/handshake.go
  • internal/event/consume/handshake_test.go
  • internal/event/consume/startup.go
  • internal/event/consume/startup_fork_test.go
  • internal/event/consume/startup_guard_test.go
  • internal/event/protocol/messages.go
  • internal/event/source/external_proxy.go
  • internal/event/source/external_proxy_standard.go
  • internal/event/source/external_proxy_test.go
  • internal/event/source/source.go
  • internal/extendedupdate/update.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/availability_standard.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/config_path_unix.go
  • internal/externalcredential/config_path_windows.go
  • internal/externalcredential/file_url.go
  • internal/externalcredential/process.go
  • internal/externalcredential/process_standard.go
  • internal/externalcredential/process_test.go
  • internal/externalcredential/profile_selection.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/externalcredential/system_config.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/transport.go
  • internal/externalcredential/transport_standard.go
  • internal/externalcredential/transport_test.go
  • internal/externalcredential/trust_extended.go
  • internal/externalcredential/trust_unix_extended.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/trust_windows_extended.go
  • internal/identitydiag/diagnostics.go
  • internal/identitydiag/diagnostics_test.go
  • internal/output/errors.go
  • internal/output/errors_test.go
  • internal/output/exitcode.go
  • scripts/install-extended.ps1
  • scripts/install-extended.sh
  • shortcuts/apps/apps_file_download.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_list.go
  • shortcuts/apps/apps_file_sign.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_file_upload.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_html_publish.go
  • shortcuts/apps/file_common.go
  • shortcuts/apps/file_common_external_credential_test.go
  • shortcuts/event/subscribe.go
  • shortcuts/mail/helpers.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • shortcuts/mail/mail_watch.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/minutes/minutes_download.go
  • shortcuts/minutes/minutes_download_test.go

Comment thread cmd/config/show.go Outdated
Comment thread cmd/config/show.go Outdated
Comment thread cmd/doctor/doctor_test.go
Comment thread cmd/version/version_test.go Outdated
Comment thread cmd/version/version_test.go
Comment thread internal/event/consume/consume_test.go Outdated
Comment thread internal/externalcredential/trust_unix_extended_test.go
Comment thread internal/externalcredential/trust_unix_extended.go
Comment thread scripts/install-extended.sh
Comment thread shortcuts/mail/mail_watch.go Outdated
@evandance
evandance force-pushed the feat/external-credential-platform branch 2 times, most recently from 8c0f154 to da6ad79 Compare July 23, 2026 11:18
@evandance evandance changed the title feat: support external credential platforms feat(auth): add external credential integration Jul 23, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

♻️ Duplicate comments (3)
cmd/version/version.go (2)

29-34: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Replace the loose JSON map with a typed report struct.

map[string]interface{} is used for the --json version payload, which the coding guidelines explicitly disallow at boundaries ("Parse map[string]interface{} into typed structs at boundaries... Do not introduce new loose-map code"). Define a small versionReport{Version, Edition, Capabilities} struct with JSON tags instead.

♻️ Proposed fix
+type versionReport struct {
+	Version      string   `json:"version"`
+	Edition      string   `json:"edition"`
+	Capabilities []string `json:"capabilities"`
+}
+
 			if opts.json {
-				output.PrintJson(opts.factory.IOStreams.Out, map[string]interface{}{
-					"version":      build.Version,
-					"edition":      build.Edition,
-					"capabilities": build.Capabilities(),
-				})
+				output.PrintJson(opts.factory.IOStreams.Out, versionReport{
+					Version:      build.Version,
+					Edition:      build.Edition,
+					Capabilities: build.Capabilities(),
+				})
 				return nil
 			}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/version/version.go` around lines 29 - 34, Replace the
map[string]interface{} payload in the opts.json branch with a typed
versionReport struct containing Version, Edition, and Capabilities fields, each
with the appropriate JSON tags. Pass the versionReport instance to
output.PrintJson while preserving the existing build.Version, build.Edition, and
build.Capabilities() values.

Source: Coding guidelines


37-38: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Wrap the write failure in a typed error.

Returning the raw fmt.Fprintf error bypasses the typed errs.* stderr envelope contract required for command-facing failures. Wrap it: errs.NewInternalError(errs.SubtypeFileIO, ...).WithCause(err) (or the appropriate I/O subtype).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/version/version.go` around lines 37 - 38, Update the version output flow
around fmt.Fprintf to wrap any write failure in the command-facing errs.* typed
error envelope, using errs.NewInternalError with the appropriate file-I/O
subtype and attaching the original error via WithCause before returning it.

Source: Coding guidelines

internal/externalcredential/trust_unix_extended.go (1)

18-54: 🔒 Security & Privacy | 🔴 Critical | ⚡ Quick win

Normalize target once and compare against the cleaned value.

current is cleaned via filepath.Clean, but the leaf comparison at line 29 (current == target) still uses the raw argument. Non-canonical inputs (trailing slash, ./ prefix, etc.) never satisfy this comparison, so the leaf's IsRegular()/executable-bit checks are silently skipped and the function can return nil (trusted) without ever validating the actual file. This was already flagged on a prior commit with a reproduction script; it's still present.

🔒 Proposed fix
 func validateAdminControlledPath(target string, executable bool) error {
 	devOverride := build.Version == "DEV" && os.Getenv(devSystemConfigPathEnv) != ""
-	current := filepath.Clean(target)
+	target = filepath.Clean(target)
+	current := target
 	for {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/externalcredential/trust_unix_extended.go` around lines 18 - 54,
Normalize target once at the start of validateAdminControlledPath and use that
canonical value for both current initialization and the leaf comparison. Ensure
the regular-file and executable checks run for non-canonical inputs such as
trailing slashes or ./ prefixes, while preserving the existing ownership and
permission validation.
🧹 Nitpick comments (1)
.goreleaser.yml (1)

7-37: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider YAML anchors to cut duplication between build stanzas.

The standard and extended build entries repeat env, ldflags, goos, and goarch verbatim; only id/binary/tags differ. An anchor/alias would keep both in sync as flags evolve.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.goreleaser.yml around lines 7 - 37, Deduplicate the shared build
configuration between the standard and extended entries using a YAML anchor and
alias. Anchor the repeated env, ldflags, goos, and goarch settings, then reuse
them in both build stanzas while preserving each entry’s id, binary, and
extended tags.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@cmd/version/version.go`:
- Around line 29-34: Replace the map[string]interface{} payload in the opts.json
branch with a typed versionReport struct containing Version, Edition, and
Capabilities fields, each with the appropriate JSON tags. Pass the versionReport
instance to output.PrintJson while preserving the existing build.Version,
build.Edition, and build.Capabilities() values.
- Around line 37-38: Update the version output flow around fmt.Fprintf to wrap
any write failure in the command-facing errs.* typed error envelope, using
errs.NewInternalError with the appropriate file-I/O subtype and attaching the
original error via WithCause before returning it.

In `@internal/externalcredential/trust_unix_extended.go`:
- Around line 18-54: Normalize target once at the start of
validateAdminControlledPath and use that canonical value for both current
initialization and the leaf comparison. Ensure the regular-file and executable
checks run for non-canonical inputs such as trailing slashes or ./ prefixes,
while preserving the existing ownership and permission validation.

---

Nitpick comments:
In @.goreleaser.yml:
- Around line 7-37: Deduplicate the shared build configuration between the
standard and extended entries using a YAML anchor and alias. Anchor the repeated
env, ldflags, goos, and goarch settings, then reuse them in both build stanzas
while preserving each entry’s id, binary, and extended tags.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 812b869b-8a36-49a9-b2e9-120e7b74068e

📥 Commits

Reviewing files that changed from the base of the PR and between f5e846f and 8c0f154.

📒 Files selected for processing (107)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .goreleaser.yml
  • Makefile
  • cmd/auth/auth.go
  • cmd/auth/auth_test.go
  • cmd/auth/qrcode.go
  • cmd/auth/status.go
  • cmd/auth/status_test.go
  • cmd/build.go
  • cmd/config/config.go
  • cmd/config/config_test.go
  • cmd/config/show.go
  • cmd/doctor/doctor.go
  • cmd/doctor/doctor_test.go
  • cmd/event/bus.go
  • cmd/event/consume.go
  • cmd/event/consume_external_proxy_test.go
  • cmd/event/format_helpers_test.go
  • cmd/root.go
  • cmd/root_test.go
  • cmd/update/edition_extended.go
  • cmd/update/edition_extended_test.go
  • cmd/update/edition_standard.go
  • cmd/update/update.go
  • cmd/update/update_test.go
  • cmd/version/version.go
  • cmd/version/version_test.go
  • errs/ERROR_CONTRACT.md
  • errs/marshal_test.go
  • errs/problem.go
  • errs/subtypes.go
  • go.mod
  • internal/build/edition_extended.go
  • internal/build/edition_standard.go
  • internal/client/client.go
  • internal/cmdutil/factory.go
  • internal/cmdutil/factory_default.go
  • internal/cmdutil/factory_external_credential_test.go
  • internal/core/config.go
  • internal/core/config_test.go
  • internal/credential/credential_provider.go
  • internal/credential/default_provider.go
  • internal/credential/types.go
  • internal/errclass/classify.go
  • internal/errclass/classify_test.go
  • internal/event/bus/bus.go
  • internal/event/bus/handle_hello_test.go
  • internal/event/consume/consume.go
  • internal/event/consume/consume_test.go
  • internal/event/consume/handshake.go
  • internal/event/consume/handshake_test.go
  • internal/event/consume/startup.go
  • internal/event/consume/startup_fork_test.go
  • internal/event/consume/startup_guard_test.go
  • internal/event/protocol/messages.go
  • internal/event/source/external_proxy.go
  • internal/event/source/external_proxy_standard.go
  • internal/event/source/external_proxy_test.go
  • internal/event/source/source.go
  • internal/extendedupdate/update.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/availability_standard.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/config_path_unix.go
  • internal/externalcredential/config_path_windows.go
  • internal/externalcredential/file_url.go
  • internal/externalcredential/process.go
  • internal/externalcredential/process_standard.go
  • internal/externalcredential/process_test.go
  • internal/externalcredential/profile_selection.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/externalcredential/system_config.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/transport.go
  • internal/externalcredential/transport_standard.go
  • internal/externalcredential/transport_test.go
  • internal/externalcredential/trust_extended.go
  • internal/externalcredential/trust_unix_extended.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/trust_windows_extended.go
  • internal/identitydiag/diagnostics.go
  • internal/identitydiag/diagnostics_test.go
  • internal/output/errors.go
  • internal/output/errors_test.go
  • internal/output/exitcode.go
  • scripts/install-extended.ps1
  • scripts/install-extended.sh
  • shortcuts/apps/apps_file_download.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_list.go
  • shortcuts/apps/apps_file_sign.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_file_upload.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_html_publish.go
  • shortcuts/apps/file_common.go
  • shortcuts/apps/file_common_external_credential_test.go
  • shortcuts/event/subscribe.go
  • shortcuts/mail/helpers.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • shortcuts/mail/mail_watch.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/minutes/minutes_download.go
  • shortcuts/minutes/minutes_download_test.go
🚧 Files skipped from review as they are similar to previous changes (92)
  • internal/build/edition_standard.go
  • internal/build/edition_extended.go
  • internal/event/protocol/messages.go
  • cmd/version/version_test.go
  • internal/externalcredential/process_standard.go
  • shortcuts/apps/file_common_external_credential_test.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • internal/externalcredential/config_path_windows.go
  • internal/event/consume/handshake_test.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/event/consume/handshake.go
  • internal/externalcredential/config_path_unix.go
  • internal/errclass/classify.go
  • internal/event/consume/startup_guard_test.go
  • scripts/install-extended.ps1
  • cmd/auth/auth.go
  • cmd/event/format_helpers_test.go
  • cmd/update/edition_standard.go
  • internal/externalcredential/availability_standard.go
  • cmd/event/consume_external_proxy_test.go
  • internal/externalcredential/system_config.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_sign_test.go
  • Makefile
  • internal/event/consume/consume.go
  • cmd/auth/qrcode.go
  • shortcuts/apps/apps_file_list.go
  • go.mod
  • internal/output/errors.go
  • cmd/event/consume.go
  • errs/marshal_test.go
  • cmd/config/config.go
  • shortcuts/minutes/minutes_download_test.go
  • internal/externalcredential/transport_standard.go
  • cmd/update/update_test.go
  • internal/event/source/source.go
  • shortcuts/apps/apps_file_download.go
  • shortcuts/apps/file_common.go
  • internal/externalcredential/trust_extended.go
  • cmd/update/edition_extended_test.go
  • .github/workflows/release.yml
  • internal/externalcredential/system_config_test.go
  • internal/event/source/external_proxy_standard.go
  • cmd/event/bus.go
  • cmd/update/update.go
  • internal/output/errors_test.go
  • cmd/auth/status.go
  • errs/problem.go
  • internal/externalcredential/profile_selection.go
  • cmd/config/show.go
  • cmd/root_test.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/apps/apps_html_publish.go
  • shortcuts/apps/apps_file_upload.go
  • internal/client/client.go
  • internal/credential/default_provider.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_file_sign.go
  • internal/externalcredential/file_url.go
  • internal/event/bus/handle_hello_test.go
  • internal/credential/credential_provider.go
  • internal/credential/types.go
  • cmd/build.go
  • internal/extendedupdate/update_test.go
  • internal/cmdutil/factory.go
  • cmd/doctor/doctor.go
  • cmd/config/config_test.go
  • cmd/update/edition_extended.go
  • shortcuts/mail/signature_compose.go
  • internal/event/bus/bus.go
  • cmd/root.go
  • internal/errclass/classify_test.go
  • scripts/install-extended.sh
  • internal/identitydiag/diagnostics.go
  • internal/event/consume/startup.go
  • internal/event/consume/startup_fork_test.go
  • internal/externalcredential/transport_test.go
  • internal/event/source/external_proxy.go
  • shortcuts/minutes/minutes_download.go
  • internal/core/config_test.go
  • errs/ERROR_CONTRACT.md
  • shortcuts/mail/mail_watch.go
  • internal/cmdutil/factory_external_credential_test.go
  • shortcuts/event/subscribe.go
  • internal/externalcredential/transport.go
  • internal/core/config.go
  • internal/extendedupdate/update.go
  • internal/externalcredential/process_test.go
  • .github/workflows/ci.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/identitydiag/diagnostics_test.go`:
- Line 479: Isolate configuration in both tests by calling
t.Setenv("LARKSUITE_CLI_CONFIG_DIR", t.TempDir()) immediately before each
cmdutil.TestFactory call: internal/identitydiag/diagnostics_test.go lines
479-479 and 507-507. Apply the same setup at both sites.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 51142e8e-aaed-490f-9170-5d767f245fa1

📥 Commits

Reviewing files that changed from the base of the PR and between 8c0f154 and da6ad79.

📒 Files selected for processing (107)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .goreleaser.yml
  • Makefile
  • cmd/auth/auth.go
  • cmd/auth/auth_test.go
  • cmd/auth/qrcode.go
  • cmd/auth/status.go
  • cmd/auth/status_test.go
  • cmd/build.go
  • cmd/config/config.go
  • cmd/config/config_test.go
  • cmd/config/show.go
  • cmd/doctor/doctor.go
  • cmd/doctor/doctor_test.go
  • cmd/event/bus.go
  • cmd/event/consume.go
  • cmd/event/consume_external_proxy_test.go
  • cmd/event/format_helpers_test.go
  • cmd/root.go
  • cmd/root_test.go
  • cmd/update/edition_extended.go
  • cmd/update/edition_extended_test.go
  • cmd/update/edition_standard.go
  • cmd/update/update.go
  • cmd/update/update_test.go
  • cmd/version/version.go
  • cmd/version/version_test.go
  • errs/ERROR_CONTRACT.md
  • errs/marshal_test.go
  • errs/problem.go
  • errs/subtypes.go
  • go.mod
  • internal/build/edition_extended.go
  • internal/build/edition_standard.go
  • internal/client/client.go
  • internal/cmdutil/factory.go
  • internal/cmdutil/factory_default.go
  • internal/cmdutil/factory_external_credential_test.go
  • internal/core/config.go
  • internal/core/config_test.go
  • internal/credential/credential_provider.go
  • internal/credential/default_provider.go
  • internal/credential/types.go
  • internal/errclass/classify.go
  • internal/errclass/classify_test.go
  • internal/event/bus/bus.go
  • internal/event/bus/handle_hello_test.go
  • internal/event/consume/consume.go
  • internal/event/consume/consume_test.go
  • internal/event/consume/handshake.go
  • internal/event/consume/handshake_test.go
  • internal/event/consume/startup.go
  • internal/event/consume/startup_fork_test.go
  • internal/event/consume/startup_guard_test.go
  • internal/event/protocol/messages.go
  • internal/event/source/external_proxy.go
  • internal/event/source/external_proxy_standard.go
  • internal/event/source/external_proxy_test.go
  • internal/event/source/source.go
  • internal/extendedupdate/update.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/availability_standard.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/config_path_unix.go
  • internal/externalcredential/config_path_windows.go
  • internal/externalcredential/file_url.go
  • internal/externalcredential/process.go
  • internal/externalcredential/process_standard.go
  • internal/externalcredential/process_test.go
  • internal/externalcredential/profile_selection.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/externalcredential/system_config.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/transport.go
  • internal/externalcredential/transport_standard.go
  • internal/externalcredential/transport_test.go
  • internal/externalcredential/trust_extended.go
  • internal/externalcredential/trust_unix_extended.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/trust_windows_extended.go
  • internal/identitydiag/diagnostics.go
  • internal/identitydiag/diagnostics_test.go
  • internal/output/errors.go
  • internal/output/errors_test.go
  • internal/output/exitcode.go
  • scripts/install-extended.ps1
  • scripts/install-extended.sh
  • shortcuts/apps/apps_file_download.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_list.go
  • shortcuts/apps/apps_file_sign.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_file_upload.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_html_publish.go
  • shortcuts/apps/file_common.go
  • shortcuts/apps/file_common_external_credential_test.go
  • shortcuts/event/subscribe.go
  • shortcuts/mail/helpers.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • shortcuts/mail/mail_watch.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/minutes/minutes_download.go
  • shortcuts/minutes/minutes_download_test.go
🚧 Files skipped from review as they are similar to previous changes (93)
  • internal/build/edition_extended.go
  • internal/externalcredential/availability_standard.go
  • internal/externalcredential/availability_extended.go
  • cmd/auth/qrcode.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/config_path_unix.go
  • internal/event/consume/handshake_test.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/config_path_windows.go
  • internal/event/consume/consume_test.go
  • internal/event/source/external_proxy_standard.go
  • internal/output/exitcode.go
  • cmd/event/format_helpers_test.go
  • shortcuts/apps/apps_file_list.go
  • internal/externalcredential/profile_selection_standard_test.go
  • cmd/version/version_test.go
  • internal/build/edition_standard.go
  • internal/errclass/classify.go
  • cmd/update/edition_standard.go
  • cmd/update/update_test.go
  • internal/event/consume/startup_guard_test.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/file_common_external_credential_test.go
  • internal/externalcredential/process_standard.go
  • internal/event/consume/consume.go
  • scripts/install-extended.ps1
  • errs/marshal_test.go
  • errs/subtypes.go
  • cmd/auth/auth.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/trust_extended.go
  • internal/event/source/source.go
  • shortcuts/apps/apps_file_download.go
  • internal/event/bus/bus.go
  • Makefile
  • cmd/update/update.go
  • cmd/root_test.go
  • internal/output/errors.go
  • shortcuts/apps/apps_file_get.go
  • cmd/version/version.go
  • cmd/update/edition_extended.go
  • cmd/update/edition_extended_test.go
  • internal/externalcredential/system_config.go
  • cmd/event/consume_external_proxy_test.go
  • go.mod
  • internal/output/errors_test.go
  • internal/credential/types.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/apps/file_common.go
  • internal/event/protocol/messages.go
  • .github/workflows/ci.yml
  • shortcuts/apps/apps_file_sign.go
  • internal/cmdutil/factory.go
  • internal/externalcredential/profile_selection.go
  • cmd/event/consume.go
  • errs/problem.go
  • cmd/build.go
  • internal/externalcredential/transport_test.go
  • cmd/root.go
  • .github/workflows/release.yml
  • cmd/config/show.go
  • internal/event/consume/startup.go
  • shortcuts/apps/apps_html_publish.go
  • internal/externalcredential/transport_standard.go
  • .goreleaser.yml
  • cmd/config/config_test.go
  • internal/externalcredential/file_url.go
  • internal/event/consume/startup_fork_test.go
  • shortcuts/apps/apps_file_upload.go
  • cmd/auth/status.go
  • shortcuts/apps/apps_file_upload_test.go
  • internal/credential/default_provider.go
  • cmd/event/bus.go
  • shortcuts/minutes/minutes_download_test.go
  • shortcuts/event/subscribe.go
  • internal/errclass/classify_test.go
  • internal/event/bus/handle_hello_test.go
  • scripts/install-extended.sh
  • internal/externalcredential/trust_unix_extended.go
  • internal/event/source/external_proxy.go
  • errs/ERROR_CONTRACT.md
  • internal/credential/credential_provider.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/minutes/minutes_download.go
  • shortcuts/mail/helpers.go
  • internal/extendedupdate/update.go
  • internal/identitydiag/diagnostics.go
  • shortcuts/mail/mail_watch.go
  • internal/externalcredential/process_test.go
  • internal/cmdutil/factory_default.go
  • internal/externalcredential/transport.go

Comment thread internal/identitydiag/diagnostics_test.go
@evandance
evandance force-pushed the feat/external-credential-platform branch from da6ad79 to e9d88d3 Compare July 23, 2026 11:54
@evandance

evandance commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator Author

Follow-up review disposition:

  • Fixed the valid outside-diff findings: unsupported darwin/windows + riscv64 release targets, non-JSON identity diagnostic HTTP status reporting, test config isolation, and Extended coverage reporting.
  • Kept explicit Standard/Extended GoReleaser build blocks instead of introducing YAML anchors; the duplication is small and the release matrix remains easier to audit.
  • Did not add blanket docstrings or replace test vfs usage with os.* because those suggestions conflict with this repository’s conventions.

All inline threads have been replied to and resolved; CI is rerunning on the amended single commit.

@evandance
evandance force-pushed the feat/external-credential-platform branch from e9d88d3 to 43c92e4 Compare July 23, 2026 12:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
cmd/doctor/doctor_test.go (1)

256-260: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use cmdutil.TestFactory instead of a hand-built Factory.

This new test hand-constructs a cmdutil.Factory while the sibling test at Line 217 was just migrated to cmdutil.TestFactory. Use the helper here too for consistency and to inherit the standard wiring.

As per path instructions: "Use cmdutil.TestFactory(t, config) for test factories".

♻️ Proposed change
-	out := &bytes.Buffer{}
-	f := &cmdutil.Factory{
-		Config:     func() (*core.CliConfig, error) { return cfg, nil },
-		Credential: cred,
-		IOStreams:  &cmdutil.IOStreams{Out: out, ErrOut: &bytes.Buffer{}},
-	}
+	f, out, _, _ := cmdutil.TestFactory(t, cfg)
+	f.Credential = cred
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/doctor/doctor_test.go` around lines 256 - 260, Replace the hand-built
cmdutil.Factory in the affected test with cmdutil.TestFactory(t, config),
passing the test configuration and preserving the test’s required credential and
I/O setup through the helper’s standard wiring.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 274-287: Update the “Coverage summary” step to check for and read
coverage-standard.txt instead of coverage.txt, including its go tool cover -func
invocation. Leave the extended profile handling and coverage threshold step
unchanged.

---

Nitpick comments:
In `@cmd/doctor/doctor_test.go`:
- Around line 256-260: Replace the hand-built cmdutil.Factory in the affected
test with cmdutil.TestFactory(t, config), passing the test configuration and
preserving the test’s required credential and I/O setup through the helper’s
standard wiring.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9a8379eb-d76a-4491-b93f-b9be7cbd785b

📥 Commits

Reviewing files that changed from the base of the PR and between da6ad79 and e9d88d3.

📒 Files selected for processing (110)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .goreleaser.yml
  • Makefile
  • cmd/auth/auth.go
  • cmd/auth/auth_test.go
  • cmd/auth/qrcode.go
  • cmd/auth/status.go
  • cmd/auth/status_test.go
  • cmd/build.go
  • cmd/config/config.go
  • cmd/config/config_test.go
  • cmd/config/show.go
  • cmd/doctor/doctor.go
  • cmd/doctor/doctor_test.go
  • cmd/event/bus.go
  • cmd/event/consume.go
  • cmd/event/consume_external_proxy_test.go
  • cmd/event/format_helpers_test.go
  • cmd/root.go
  • cmd/root_test.go
  • cmd/update/edition_extended.go
  • cmd/update/edition_extended_test.go
  • cmd/update/edition_standard.go
  • cmd/update/update.go
  • cmd/update/update_test.go
  • cmd/version/version.go
  • cmd/version/version_test.go
  • errs/ERROR_CONTRACT.md
  • errs/marshal_test.go
  • errs/problem.go
  • errs/subtypes.go
  • go.mod
  • internal/build/edition_extended.go
  • internal/build/edition_standard.go
  • internal/client/client.go
  • internal/cmdutil/factory.go
  • internal/cmdutil/factory_default.go
  • internal/cmdutil/factory_external_credential_test.go
  • internal/core/config.go
  • internal/core/config_test.go
  • internal/credential/credential_provider.go
  • internal/credential/default_provider.go
  • internal/credential/types.go
  • internal/errclass/classify.go
  • internal/errclass/classify_internal_test.go
  • internal/errclass/classify_test.go
  • internal/event/bus/bus.go
  • internal/event/bus/handle_hello_test.go
  • internal/event/consume/consume.go
  • internal/event/consume/consume_test.go
  • internal/event/consume/handshake.go
  • internal/event/consume/handshake_test.go
  • internal/event/consume/startup.go
  • internal/event/consume/startup_fork_test.go
  • internal/event/consume/startup_guard_test.go
  • internal/event/protocol/messages.go
  • internal/event/source/external_proxy.go
  • internal/event/source/external_proxy_standard.go
  • internal/event/source/external_proxy_test.go
  • internal/event/source/source.go
  • internal/extendedupdate/update.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/availability_standard.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/config_path_unix.go
  • internal/externalcredential/config_path_windows.go
  • internal/externalcredential/file_url.go
  • internal/externalcredential/process.go
  • internal/externalcredential/process_standard.go
  • internal/externalcredential/process_test.go
  • internal/externalcredential/profile_selection.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/externalcredential/system_config.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/transport.go
  • internal/externalcredential/transport_standard.go
  • internal/externalcredential/transport_test.go
  • internal/externalcredential/trust_extended.go
  • internal/externalcredential/trust_unix_extended.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/trust_windows_extended.go
  • internal/identitydiag/diagnostics.go
  • internal/identitydiag/diagnostics_test.go
  • internal/output/errors.go
  • internal/output/errors_test.go
  • internal/output/exitcode.go
  • scripts/install-extended.ps1
  • scripts/install-extended.sh
  • shortcuts/apps/apps_file_download.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_list.go
  • shortcuts/apps/apps_file_sign.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_file_upload.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_html_publish.go
  • shortcuts/apps/file_common.go
  • shortcuts/apps/file_common_external_credential_test.go
  • shortcuts/event/subscribe.go
  • shortcuts/mail/helpers.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • shortcuts/mail/mail_watch.go
  • shortcuts/mail/mail_watch_test.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/minutes/minutes_download.go
  • shortcuts/minutes/minutes_download_test.go
  • tests/plugin_e2e/degrade_subsystem_test.go
🚧 Files skipped from review as they are similar to previous changes (93)
  • internal/externalcredential/config_path_windows.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/profile_selection_standard_test.go
  • cmd/event/consume_external_proxy_test.go
  • internal/externalcredential/process_standard.go
  • cmd/event/bus.go
  • shortcuts/apps/file_common_external_credential_test.go
  • internal/externalcredential/config_path_unix.go
  • internal/errclass/classify.go
  • internal/build/edition_standard.go
  • internal/build/edition_extended.go
  • cmd/update/update_test.go
  • errs/subtypes.go
  • errs/marshal_test.go
  • internal/externalcredential/system_config.go
  • cmd/build.go
  • internal/extendedupdate/update_test.go
  • internal/output/errors.go
  • cmd/version/version.go
  • internal/event/consume/handshake.go
  • internal/externalcredential/availability_standard.go
  • cmd/event/format_helpers_test.go
  • internal/event/consume/startup_guard_test.go
  • cmd/config/config.go
  • internal/externalcredential/config_path_darwin.go
  • cmd/auth/qrcode.go
  • internal/event/consume/consume_test.go
  • internal/event/source/source.go
  • internal/event/source/external_proxy_standard.go
  • errs/problem.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_html_publish.go
  • internal/externalcredential/trust_extended.go
  • shortcuts/apps/apps_file_sign.go
  • internal/externalcredential/trust_unix_extended.go
  • cmd/root.go
  • internal/output/exitcode.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/event/consume/handshake_test.go
  • cmd/update/edition_extended_test.go
  • cmd/update/update.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/apps/apps_file_download.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • internal/event/consume/startup_fork_test.go
  • cmd/doctor/doctor.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_list.go
  • go.mod
  • cmd/update/edition_standard.go
  • internal/externalcredential/file_url.go
  • internal/event/consume/startup.go
  • scripts/install-extended.ps1
  • internal/output/errors_test.go
  • internal/event/bus/bus.go
  • errs/ERROR_CONTRACT.md
  • .github/workflows/release.yml
  • internal/externalcredential/transport_test.go
  • shortcuts/minutes/minutes_download_test.go
  • internal/event/consume/consume.go
  • internal/event/bus/handle_hello_test.go
  • .goreleaser.yml
  • internal/errclass/classify_test.go
  • cmd/config/show.go
  • cmd/event/consume.go
  • Makefile
  • scripts/install-extended.sh
  • internal/client/client.go
  • internal/externalcredential/profile_selection.go
  • internal/event/protocol/messages.go
  • cmd/auth/auth_test.go
  • shortcuts/mail/signature_compose.go
  • cmd/auth/status.go
  • shortcuts/apps/file_common.go
  • shortcuts/apps/apps_file_upload_test.go
  • internal/credential/types.go
  • shortcuts/mail/helpers.go
  • shortcuts/apps/apps_file_upload.go
  • internal/extendedupdate/update.go
  • internal/cmdutil/factory.go
  • cmd/config/config_test.go
  • internal/externalcredential/transport.go
  • internal/cmdutil/factory_external_credential_test.go
  • cmd/update/edition_extended.go
  • internal/identitydiag/diagnostics.go
  • internal/core/config_test.go
  • shortcuts/event/subscribe.go
  • internal/credential/credential_provider.go
  • shortcuts/minutes/minutes_download.go
  • internal/event/source/external_proxy.go
  • internal/cmdutil/factory_default.go
  • internal/externalcredential/process_test.go

Comment thread .github/workflows/ci.yml
@evandance
evandance force-pushed the feat/external-credential-platform branch from 43c92e4 to 20ec014 Compare July 23, 2026 12:16

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
cmd/doctor/doctor_test.go (1)

245-260: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use cmdutil.TestFactory for consistency with the sibling test.

This test hand-builds &cmdutil.Factory{...} (only Config/Credential/IOStreams set, leaving HttpClient/LarkClient/Keychain nil), right after the adjacent test at line 217 was refactored to use cmdutil.TestFactory(t, cfg). Using the same helper here would keep the factory fully populated and avoid the now-unused t.Setenv("LARKSUITE_CLI_CONFIG_DIR", ...) at line 246 (unused since Config is a closure that bypasses disk config entirely).

♻️ Suggested consistency fix
-	out := &bytes.Buffer{}
-	f := &cmdutil.Factory{
-		Config:     func() (*core.CliConfig, error) { return cfg, nil },
-		Credential: cred,
-		IOStreams:  &cmdutil.IOStreams{Out: out, ErrOut: &bytes.Buffer{}},
-	}
+	f, out, _, _ := cmdutil.TestFactory(t, cfg)
+	f.Credential = cred
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/doctor/doctor_test.go` around lines 245 - 260, Update
TestDoctor_EnvironmentProviderDoesNotRequireLocalConfig to construct its factory
with cmdutil.TestFactory(t, cfg), then assign the test credential provider and
output buffer through that factory as needed. Remove the now-unnecessary
LARKSUITE_CLI_CONFIG_DIR environment setup and avoid hand-building a partial
cmdutil.Factory.
internal/externalcredential/trust_windows_extended.go (1)

46-120: 🔒 Security & Privacy | 🔵 Trivial | 🏗️ Heavy lift

Add Windows-specific ACL trust coverage.

internal/externalcredential/trust_windows_extended.go implements owner/DACL validation, but there is no internal/externalcredential/trust_windows_extended_test.go while the Unix variant has dedicated tests. Add Windows-gated coverage for validateWindowsACL, sidIn, and validateAdminControlledPath to protect this security boundary.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/externalcredential/trust_windows_extended.go` around lines 46 - 120,
Add a Windows-only test file covering validateWindowsACL, sidIn, and
validateAdminControlledPath. Create representative trusted and untrusted
ACL/owner scenarios, including file and directory handling, and assert both
acceptance and rejection paths so the Windows security boundary is exercised
without affecting non-Windows builds.
internal/externalcredential/process.go (1)

286-313: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Stderr from the credential process is discarded, hiding the only diagnostic detail on failure.

cmd.Stderr = io.Discard means that when the process exits non-zero and doesn't produce valid JSON, the resulting error is just "external credential process exited unsuccessfully" with the bare *exec.ExitError as cause — any diagnostic text the administrator's tool printed (missing binary output, permission errors, auth failures) is lost. Since this is an admin-configured integration point, that stderr content is valuable for troubleshooting.

♻️ Capture a bounded stderr excerpt for diagnostics
 	var stdout limitedBuffer
 	cmd.Stdout = &stdout
-	cmd.Stderr = io.Discard
+	var stderr limitedBuffer
+	cmd.Stderr = &stderr
 	err = cmd.Run()

Then include stderr.String() (truncated) in the fallback error's hint/cause when decodeErr != nil.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/externalcredential/process.go` around lines 286 - 313, Update the
credential process execution flow around cmd.Stderr and the fallback error in
processCredential (or the nearest enclosing function) to capture stderr in a
bounded buffer instead of discarding it, then include the truncated stderr
excerpt in the diagnostic hint or cause when decodeErr is non-nil and the
process exits unsuccessfully. Preserve existing timeout, context, response-size,
and JSON error classification behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/cmdutil/factory.go`:
- Around line 244-250: Guard cmd against nil before invoking GetRisk in
RequireBuiltinCredentialProviderForCommand. Preserve the RiskRead early return
for non-nil commands, while allowing nil commands to continue to the existing
command-name handling without dereferencing cmd.

---

Nitpick comments:
In `@cmd/doctor/doctor_test.go`:
- Around line 245-260: Update
TestDoctor_EnvironmentProviderDoesNotRequireLocalConfig to construct its factory
with cmdutil.TestFactory(t, cfg), then assign the test credential provider and
output buffer through that factory as needed. Remove the now-unnecessary
LARKSUITE_CLI_CONFIG_DIR environment setup and avoid hand-building a partial
cmdutil.Factory.

In `@internal/externalcredential/process.go`:
- Around line 286-313: Update the credential process execution flow around
cmd.Stderr and the fallback error in processCredential (or the nearest enclosing
function) to capture stderr in a bounded buffer instead of discarding it, then
include the truncated stderr excerpt in the diagnostic hint or cause when
decodeErr is non-nil and the process exits unsuccessfully. Preserve existing
timeout, context, response-size, and JSON error classification behavior.

In `@internal/externalcredential/trust_windows_extended.go`:
- Around line 46-120: Add a Windows-only test file covering validateWindowsACL,
sidIn, and validateAdminControlledPath. Create representative trusted and
untrusted ACL/owner scenarios, including file and directory handling, and assert
both acceptance and rejection paths so the Windows security boundary is
exercised without affecting non-Windows builds.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 49331db9-942e-405d-aa31-c9028fa335a2

📥 Commits

Reviewing files that changed from the base of the PR and between e9d88d3 and 43c92e4.

📒 Files selected for processing (110)
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .goreleaser.yml
  • Makefile
  • cmd/auth/auth.go
  • cmd/auth/auth_test.go
  • cmd/auth/qrcode.go
  • cmd/auth/status.go
  • cmd/auth/status_test.go
  • cmd/build.go
  • cmd/config/config.go
  • cmd/config/config_test.go
  • cmd/config/show.go
  • cmd/doctor/doctor.go
  • cmd/doctor/doctor_test.go
  • cmd/event/bus.go
  • cmd/event/consume.go
  • cmd/event/consume_external_proxy_test.go
  • cmd/event/format_helpers_test.go
  • cmd/root.go
  • cmd/root_test.go
  • cmd/update/edition_extended.go
  • cmd/update/edition_extended_test.go
  • cmd/update/edition_standard.go
  • cmd/update/update.go
  • cmd/update/update_test.go
  • cmd/version/version.go
  • cmd/version/version_test.go
  • errs/ERROR_CONTRACT.md
  • errs/marshal_test.go
  • errs/problem.go
  • errs/subtypes.go
  • go.mod
  • internal/build/edition_extended.go
  • internal/build/edition_standard.go
  • internal/client/client.go
  • internal/cmdutil/factory.go
  • internal/cmdutil/factory_default.go
  • internal/cmdutil/factory_external_credential_test.go
  • internal/core/config.go
  • internal/core/config_test.go
  • internal/credential/credential_provider.go
  • internal/credential/default_provider.go
  • internal/credential/types.go
  • internal/errclass/classify.go
  • internal/errclass/classify_internal_test.go
  • internal/errclass/classify_test.go
  • internal/event/bus/bus.go
  • internal/event/bus/handle_hello_test.go
  • internal/event/consume/consume.go
  • internal/event/consume/consume_test.go
  • internal/event/consume/handshake.go
  • internal/event/consume/handshake_test.go
  • internal/event/consume/startup.go
  • internal/event/consume/startup_fork_test.go
  • internal/event/consume/startup_guard_test.go
  • internal/event/protocol/messages.go
  • internal/event/source/external_proxy.go
  • internal/event/source/external_proxy_standard.go
  • internal/event/source/external_proxy_test.go
  • internal/event/source/source.go
  • internal/extendedupdate/update.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/availability_extended.go
  • internal/externalcredential/availability_standard.go
  • internal/externalcredential/config_path_darwin.go
  • internal/externalcredential/config_path_unix.go
  • internal/externalcredential/config_path_windows.go
  • internal/externalcredential/file_url.go
  • internal/externalcredential/process.go
  • internal/externalcredential/process_standard.go
  • internal/externalcredential/process_test.go
  • internal/externalcredential/profile_selection.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/externalcredential/system_config.go
  • internal/externalcredential/system_config_test.go
  • internal/externalcredential/transport.go
  • internal/externalcredential/transport_standard.go
  • internal/externalcredential/transport_test.go
  • internal/externalcredential/trust_extended.go
  • internal/externalcredential/trust_unix_extended.go
  • internal/externalcredential/trust_unix_extended_test.go
  • internal/externalcredential/trust_windows_extended.go
  • internal/identitydiag/diagnostics.go
  • internal/identitydiag/diagnostics_test.go
  • internal/output/errors.go
  • internal/output/errors_test.go
  • internal/output/exitcode.go
  • scripts/install-extended.ps1
  • scripts/install-extended.sh
  • shortcuts/apps/apps_file_download.go
  • shortcuts/apps/apps_file_get.go
  • shortcuts/apps/apps_file_list.go
  • shortcuts/apps/apps_file_sign.go
  • shortcuts/apps/apps_file_sign_test.go
  • shortcuts/apps/apps_file_upload.go
  • shortcuts/apps/apps_file_upload_test.go
  • shortcuts/apps/apps_html_publish.go
  • shortcuts/apps/file_common.go
  • shortcuts/apps/file_common_external_credential_test.go
  • shortcuts/event/subscribe.go
  • shortcuts/mail/helpers.go
  • shortcuts/mail/mail_signature.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • shortcuts/mail/mail_watch.go
  • shortcuts/mail/mail_watch_test.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/minutes/minutes_download.go
  • shortcuts/minutes/minutes_download_test.go
  • tests/plugin_e2e/degrade_subsystem_test.go
🚧 Files skipped from review as they are similar to previous changes (92)
  • cmd/config/config.go
  • cmd/auth/qrcode.go
  • cmd/event/format_helpers_test.go
  • internal/event/consume/handshake.go
  • internal/externalcredential/config_path_darwin.go
  • internal/event/consume/handshake_test.go
  • internal/event/source/external_proxy_standard.go
  • internal/externalcredential/system_config_test.go
  • shortcuts/apps/file_common_external_credential_test.go
  • cmd/event/consume_external_proxy_test.go
  • internal/output/errors.go
  • shortcuts/apps/apps_file_sign_test.go
  • cmd/update/edition_extended_test.go
  • internal/externalcredential/availability_standard.go
  • internal/build/edition_extended.go
  • cmd/version/version.go
  • cmd/event/bus.go
  • internal/build/edition_standard.go
  • shortcuts/apps/apps_file_get.go
  • cmd/build.go
  • internal/event/source/source.go
  • internal/externalcredential/process_standard.go
  • cmd/update/update.go
  • cmd/update/update_test.go
  • shortcuts/mail/mail_signature_external_credential_test.go
  • Makefile
  • internal/event/consume/startup_guard_test.go
  • errs/subtypes.go
  • internal/externalcredential/trust_extended.go
  • cmd/auth/auth.go
  • cmd/root_test.go
  • internal/errclass/classify.go
  • internal/output/errors_test.go
  • internal/errclass/classify_internal_test.go
  • internal/extendedupdate/update_test.go
  • internal/externalcredential/profile_selection_standard_test.go
  • internal/externalcredential/config_path_windows.go
  • internal/event/protocol/messages.go
  • cmd/update/edition_standard.go
  • errs/marshal_test.go
  • internal/event/consume/consume.go
  • internal/client/client.go
  • scripts/install-extended.sh
  • shortcuts/apps/apps_file_list.go
  • internal/event/consume/startup.go
  • .goreleaser.yml
  • internal/event/bus/handle_hello_test.go
  • errs/ERROR_CONTRACT.md
  • internal/event/consume/consume_test.go
  • internal/externalcredential/transport_test.go
  • shortcuts/apps/apps_file_download.go
  • tests/plugin_e2e/degrade_subsystem_test.go
  • internal/event/bus/bus.go
  • internal/externalcredential/transport_standard.go
  • shortcuts/apps/apps_file_sign.go
  • cmd/update/edition_extended.go
  • scripts/install-extended.ps1
  • cmd/event/consume.go
  • internal/externalcredential/trust_unix_extended_test.go
  • shortcuts/mail/mail_watch_test.go
  • shortcuts/mail/helpers.go
  • cmd/version/version_test.go
  • shortcuts/apps/apps_file_upload_test.go
  • internal/credential/types.go
  • internal/externalcredential/file_url.go
  • shortcuts/apps/file_common.go
  • shortcuts/mail/mail_signature.go
  • cmd/root.go
  • internal/event/consume/startup_fork_test.go
  • cmd/config/show.go
  • shortcuts/minutes/minutes_download_test.go
  • .github/workflows/release.yml
  • internal/cmdutil/factory_external_credential_test.go
  • shortcuts/mail/mail_watch.go
  • internal/externalcredential/profile_selection.go
  • shortcuts/mail/signature_compose.go
  • shortcuts/apps/apps_file_upload.go
  • shortcuts/event/subscribe.go
  • cmd/doctor/doctor.go
  • internal/event/source/external_proxy.go
  • .github/workflows/ci.yml
  • internal/extendedupdate/update.go
  • internal/externalcredential/trust_unix_extended.go
  • internal/externalcredential/transport.go
  • cmd/config/config_test.go
  • internal/identitydiag/diagnostics.go
  • internal/core/config.go
  • internal/externalcredential/process_test.go
  • internal/core/config_test.go
  • internal/cmdutil/factory_default.go
  • shortcuts/minutes/minutes_download.go
  • internal/credential/credential_provider.go

Comment thread internal/cmdutil/factory.go
@evandance
evandance force-pushed the feat/external-credential-platform branch from 20ec014 to 9c4b842 Compare July 23, 2026 12:32
@evandance
evandance force-pushed the feat/external-credential-platform branch from 9c4b842 to a7d2747 Compare July 24, 2026 08:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

domain/mail PR touches the mail domain size/XL Architecture-level or global-impact change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant