Skip to content

feat(drive): add +resolve shortcut for document URL resolution with wiki unwrapping - #946

Closed
fangshuyu-768 wants to merge 4 commits into
mainfrom
pr-935
Closed

feat(drive): add +resolve shortcut for document URL resolution with wiki unwrapping#946
fangshuyu-768 wants to merge 4 commits into
mainfrom
pr-935

Conversation

@fangshuyu-768

@fangshuyu-768 fangshuyu-768 commented May 18, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements #662: lark-cli drive +resolve --url <url> resolves any Lark/Feishu document URL to {type, title, token} with wiki unwrapping support.

Algorithm

  1. Parse URL path → {type, token} via new ParseResourceURL (inverse of existing BuildResourceURL)
  2. If type is wiki: call GET /open-apis/wiki/v2/spaces/get_node to unwrap to underlying document
  3. Call POST /open-apis/drive/v1/metas/batch_query to verify and get title
  4. Output JSON: {input_url, type, title, token, url, wiki_node?}

Usage

# Resolve a docx URL
lark-cli drive +resolve --url 'https://xxx.feishu.cn/docx/doxcnXXX'

# Resolve a wiki URL (auto-unwraps to underlying doc)
lark-cli drive +resolve --url 'https://xxx.feishu.cn/wiki/wikcnXXX'

# Bare token with explicit type
lark-cli drive +resolve --url doxcnXXX --type docx

# Pretty output
lark-cli drive +resolve --url 'https://xxx.feishu.cn/base/bascnXXX' --format pretty

Why drive +resolve?

  • drive not docs: URL resolution is a cross-document capability (docx, sheet, bitable, wiki, file, folder, mindnote, slides) backed by drive.metas.batch_query, not specific to document content operations.
  • +resolve not +info: The command resolves a URL to its canonical identity; +resolve is specific and actionable, while +info is too generic.

Changes

File Change
shortcuts/common/resource_url.go Added ResourceRef struct + ParseResourceURL function
shortcuts/common/resource_url_test.go Added 14 test cases + round-trip test
shortcuts/common/drive_meta.go New — extracted FetchDriveMetaTitle as public helper
shortcuts/drive/drive_info.go Newdrive +resolve shortcut implementation
shortcuts/drive/shortcuts.go Registered DriveInfo
shortcuts/drive/shortcuts_test.go Added +resolve to expected commands
shortcuts/drive/drive_export.go Use common.FetchDriveMetaTitle
shortcuts/drive/drive_export_common.go Removed local fetchDriveMetaTitle (moved to common)
tests/cli_e2e/drive/drive_info_dryrun_test.go New — 3 dry-run E2E tests

Test Plan

  • go build ./... — clean
  • go test -race ./shortcuts/... — all pass
  • go vet ./... — clean
  • gofmt -l . — clean
  • go mod tidy — no changes
  • Dry-run E2E tests (docx URL, wiki URL, bare token) — all pass

KhanCold and others added 2 commits May 18, 2026 11:20
Two DryRun functions in the sheets shortcuts called json.Unmarshal without
checking the return value. This looks like a bug, but Validate already
parses and validates the same --style / --data JSON before DryRun runs,
so the error is structurally impossible at this point.

Use _ = assignment + comment to silence the unchecked-error lint warning
and make the safety invariant explicit to future readers.
…rapping

Implements Issue #662: `lark-cli docs +info --url '<url>'` resolves any
Lark/Feishu document URL to {type, title, token} with wiki unwrapping support.

Algorithm:
1. Parse URL path → {type, token} via new ParseResourceURL (inverse of BuildResourceURL)
2. If type is wiki: call get_node API to unwrap to underlying doc
3. Call drive.metas.batch_query to verify and get title
4. Output JSON with type, title, token, url, and optional wiki_node

Also extracts FetchDriveMetaTitle to common package to avoid duplication.
@github-actions github-actions Bot added domain/ccm PR touches the ccm domain size/L Large or sensitive change across domains or core paths labels May 18, 2026
@coderabbitai

coderabbitai Bot commented May 18, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: face442a-c066-436f-87a1-d55257bd1ed7

📥 Commits

Reviewing files that changed from the base of the PR and between 6871d82 and a965b8d.

📒 Files selected for processing (3)
  • shortcuts/drive/drive_info.go
  • shortcuts/drive/shortcuts_test.go
  • tests/cli_e2e/drive/drive_info_dryrun_test.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • tests/cli_e2e/drive/drive_info_dryrun_test.go
  • shortcuts/drive/drive_info.go

📝 Walkthrough

Walkthrough

This PR adds resource-URL parsing and tests, a shared Drive metadata title helper, and a new drive +info shortcut (validation, dry-run planning, execution, and E2E dry-run tests). It updates drive export to use the shared helper and makes minor JSON-unmarshal error handling cleanup in sheets DryRun paths.

Changes

Drive +info Command and Resource Metadata Utilities

Layer / File(s) Summary
Resource URL parsing foundation
shortcuts/common/resource_url.go, shortcuts/common/resource_url_test.go
ResourceRef and ParseResourceURL parse brand-standard Lark/Feishu resource URLs into type and token; ordered path-prefix mapping and unit tests cover domains, query/fragment, trailing slash, and extra path segments.
Shared drive metadata helper
shortcuts/common/drive_meta.go
FetchDriveMetaTitle retrieves document title via /open-apis/drive/v1/metas/batch_query using runtime.CallAPI, handling errors and empty results.
drive +info command implementation
shortcuts/drive/drive_info.go
Adds exported DriveInfo shortcut: input validation (URL pattern or bare token with --type), DryRun plans (wiki two-step or single-step), and Execute path to unwrap wiki nodes when needed, fetch title, build canonical URL, and emit structured + human-readable output.
drive +info integration and E2E tests
shortcuts/drive/shortcuts.go, shortcuts/drive/shortcuts_test.go, tests/cli_e2e/drive/drive_info_dryrun_test.go
Registers DriveInfo in Shortcuts() and adds three CLI E2E dry-run tests validating planned API-step sequences for docx URL, wiki URL, and bare token with --type.
drive_export refactoring
shortcuts/drive/drive_export.go, shortcuts/drive/drive_export_common.go
Markdown export filename derivation now calls common.FetchDriveMetaTitle; removed duplicate in-file fetchDriveMetaTitle.
JSON parsing error cleanup
shortcuts/sheets/lark_sheets_cell_style_and_merge.go
In DryRun paths, json.Unmarshal errors are explicitly discarded with comments noting prior validation.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • larksuite/cli#935: Same DryRun json.Unmarshal error-discard changes in shortcuts/sheets/lark_sheets_cell_style_and_merge.go.
  • larksuite/cli#194: Related historical addition of fetchDriveMetaTitle used by drive export before moving to a shared helper.
  • larksuite/cli#680: Related work adding BuildResourceURL and URL-building logic used by drive +info.

Poem

🐰 I hop through links and metadata bright,
Parsing tokens by day and title by night,
A shared helper whispers the document's name,
Exports now cleaner, tests check the plan's frame,
JSON errors tucked away—huzzah, what a sight! 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: adding a +resolve shortcut to the drive service for resolving document URLs with wiki support.
Description check ✅ Passed The description is comprehensive and covers all required sections: summary with implementation reference, detailed algorithm, usage examples, rationale, complete file changes, and a thorough test plan with verification steps.
Docstring Coverage ✅ Passed Docstring coverage is 81.25% which is sufficient. The required threshold is 80.00%.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch pr-935

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 and usage tips.

@github-actions

github-actions Bot commented May 18, 2026

Copy link
Copy Markdown

🚀 PR Preview Install Guide

🧰 CLI update

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

🧩 Skill update

npx skills add larksuite/cli#pr-935 -y -g

@codecov

codecov Bot commented May 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 15.15152% with 112 lines in your changes missing coverage. Please review.
✅ Project coverage is 66.62%. Comparing base (898e0ee) to head (a965b8d).
⚠️ Report is 7 commits behind head on main.

Files with missing lines Patch % Lines
shortcuts/drive/drive_info.go 0.00% 88 Missing ⚠️
shortcuts/common/drive_meta.go 0.00% 20 Missing ⚠️
shortcuts/common/resource_url.go 80.00% 2 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #946      +/-   ##
==========================================
+ Coverage   65.92%   66.62%   +0.69%     
==========================================
  Files         523      565      +42     
  Lines       49692    52545    +2853     
==========================================
+ Hits        32758    35006    +2248     
- Misses      14134    14636     +502     
- Partials     2800     2903     +103     

☔ View full report in Codecov by Sentry.
📢 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: 2

🤖 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 `@shortcuts/common/resource_url.go`:
- Around line 106-113: ParseResourceURL currently accepts any host if the path
matches; restrict it to only real Lark/Feishu web URLs by validating the parsed
URL's scheme and hostname before checking path mappings. In ParseResourceURL
(using rawURL and the parsed u), ensure u.Scheme == "https" and that
u.Hostname() matches one of the allowed domains or suffixes for Lark/Feishu
(e.g., exact hosts or suffixes like "larksuite.com", "feishu.cn", and any known
subdomain patterns); if the host check fails return ResourceRef{}, false. Do
this check before iterating urlPathToType so only URLs from approved domains are
considered.

In `@shortcuts/doc/docs_info.go`:
- Around line 69-73: The dry-run setup for the wiki resolve endpoint currently
sets the query param as "wiki_token" via Set("wiki_token", ref.Token) on the
dry.GET("/open-apis/wiki/v2/spaces/get_node") call, but real execution uses
"token"; update the dry-run to use Set("token", ref.Token) so the dry-run
request shape matches Execute (modify the Set call associated with
dry.GET("/open-apis/wiki/v2/spaces/get_node")).
🪄 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

Run ID: d161c02f-9051-4292-b671-a8b46b553078

📥 Commits

Reviewing files that changed from the base of the PR and between 4b721c0 and 12f55f2.

📒 Files selected for processing (9)
  • shortcuts/common/drive_meta.go
  • shortcuts/common/resource_url.go
  • shortcuts/common/resource_url_test.go
  • shortcuts/doc/docs_info.go
  • shortcuts/doc/shortcuts.go
  • shortcuts/drive/drive_export.go
  • shortcuts/drive/drive_export_common.go
  • shortcuts/sheets/lark_sheets_cell_style_and_merge.go
  • tests/cli_e2e/docs/docs_info_dryrun_test.go
💤 Files with no reviewable changes (1)
  • shortcuts/drive/drive_export_common.go

Comment on lines +106 to +113
u, err := url.Parse(rawURL)
if err != nil {
return ResourceRef{}, false
}

path := u.Path

for _, mapping := range urlPathToType {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Restrict parsing to real Lark/Feishu web URLs.

ParseResourceURL currently accepts any host as long as the path matches (e.g., https://example.com/docx/...), which makes docs +info --url validation overly permissive.

💡 Proposed fix
 func ParseResourceURL(rawURL string) (ResourceRef, bool) {
 	rawURL = strings.TrimSpace(rawURL)
 	if rawURL == "" {
 		return ResourceRef{}, false
 	}

 	u, err := url.Parse(rawURL)
 	if err != nil {
 		return ResourceRef{}, false
 	}
+	if u.Scheme != "https" && u.Scheme != "http" {
+		return ResourceRef{}, false
+	}
+	host := strings.ToLower(strings.TrimSpace(u.Hostname()))
+	isFeishu := host == "feishu.cn" || strings.HasSuffix(host, ".feishu.cn")
+	isLark := host == "larksuite.com" || strings.HasSuffix(host, ".larksuite.com")
+	if !isFeishu && !isLark {
+		return ResourceRef{}, false
+	}

 	path := u.Path
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
u, err := url.Parse(rawURL)
if err != nil {
return ResourceRef{}, false
}
path := u.Path
for _, mapping := range urlPathToType {
u, err := url.Parse(rawURL)
if err != nil {
return ResourceRef{}, false
}
if u.Scheme != "https" && u.Scheme != "http" {
return ResourceRef{}, false
}
host := strings.ToLower(strings.TrimSpace(u.Hostname()))
isFeishu := host == "feishu.cn" || strings.HasSuffix(host, ".feishu.cn")
isLark := host == "larksuite.com" || strings.HasSuffix(host, ".larksuite.com")
if !isFeishu && !isLark {
return ResourceRef{}, false
}
path := u.Path
for _, mapping := range urlPathToType {
🤖 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 `@shortcuts/common/resource_url.go` around lines 106 - 113, ParseResourceURL
currently accepts any host if the path matches; restrict it to only real
Lark/Feishu web URLs by validating the parsed URL's scheme and hostname before
checking path mappings. In ParseResourceURL (using rawURL and the parsed u),
ensure u.Scheme == "https" and that u.Hostname() matches one of the allowed
domains or suffixes for Lark/Feishu (e.g., exact hosts or suffixes like
"larksuite.com", "feishu.cn", and any known subdomain patterns); if the host
check fails return ResourceRef{}, false. Do this check before iterating
urlPathToType so only URLs from approved domains are considered.

Comment on lines +69 to +73
dry.Desc("2-step: resolve wiki node, then batch query metadata")
dry.GET("/open-apis/wiki/v2/spaces/get_node").
Desc("[1] Resolve wiki node to underlying document").
Set("wiki_token", ref.Token)
dry.POST("/open-apis/drive/v1/metas/batch_query").

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Align DryRun wiki request params with Execute behavior.

Line 72 uses wiki_token, but Execute sends query param token for the same endpoint. Dry-run should mirror the actual request shape.

💡 Proposed fix
 		if ref.Type == "wiki" {
 			dry.Desc("2-step: resolve wiki node, then batch query metadata")
 			dry.GET("/open-apis/wiki/v2/spaces/get_node").
 				Desc("[1] Resolve wiki node to underlying document").
-				Set("wiki_token", ref.Token)
+				Params(map[string]interface{}{"token": ref.Token})
 			dry.POST("/open-apis/drive/v1/metas/batch_query").
 				Desc("[2] Batch query document metadata (title)")
 			return dry
 		}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
dry.Desc("2-step: resolve wiki node, then batch query metadata")
dry.GET("/open-apis/wiki/v2/spaces/get_node").
Desc("[1] Resolve wiki node to underlying document").
Set("wiki_token", ref.Token)
dry.POST("/open-apis/drive/v1/metas/batch_query").
dry.Desc("2-step: resolve wiki node, then batch query metadata")
dry.GET("/open-apis/wiki/v2/spaces/get_node").
Desc("[1] Resolve wiki node to underlying document").
Params(map[string]interface{}{"token": ref.Token})
dry.POST("/open-apis/drive/v1/metas/batch_query").
🤖 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 `@shortcuts/doc/docs_info.go` around lines 69 - 73, The dry-run setup for the
wiki resolve endpoint currently sets the query param as "wiki_token" via
Set("wiki_token", ref.Token) on the
dry.GET("/open-apis/wiki/v2/spaces/get_node") call, but real execution uses
"token"; update the dry-run to use Set("token", ref.Token) so the dry-run
request shape matches Execute (modify the Set call associated with
dry.GET("/open-apis/wiki/v2/spaces/get_node")).

URL resolution is a cross-document capability (docx, sheet, bitable,
wiki, file, etc.) backed by drive.metas.batch_query, so it belongs
under the drive service, not docs.
@fangshuyu-768 fangshuyu-768 changed the title feat(docs): add +info shortcut to resolve document URLs with wiki unwrapping feat(drive): add +info shortcut to resolve document URLs with wiki unwrapping May 18, 2026
The command resolves a document URL to its type/title/token, so
+resolve is more specific and actionable than the generic +info.

@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

♻️ Duplicate comments (1)
shortcuts/drive/drive_info.go (1)

70-72: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use the same wiki query key in DryRun and Execute.

Line 72 sends wiki_token, but Execute sends token (Line 107). Dry-run should mirror the real request shape.

💡 Proposed fix
 		if ref.Type == "wiki" {
 			dry.Desc("2-step: resolve wiki node, then batch query metadata")
 			dry.GET("/open-apis/wiki/v2/spaces/get_node").
 				Desc("[1] Resolve wiki node to underlying document").
-				Set("wiki_token", ref.Token)
+				Set("token", ref.Token)
 			dry.POST("/open-apis/drive/v1/metas/batch_query").
 				Desc("[2] Batch query document metadata (title)")
 			return dry
 		}
🤖 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 `@shortcuts/drive/drive_info.go` around lines 70 - 72, The dry-run request for
the wiki node uses a different query key than the real execute call; change the
dry GET setup so it mirrors the real request shape by replacing
Set("wiki_token", ref.Token) with the same key used by Execute (i.e.,
Set("token", ref.Token)) for the route
dry.GET("/open-apis/wiki/v2/spaces/get_node") so the DryRun and Execute use
identical query names.
🤖 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 `@tests/cli_e2e/drive/drive_info_dryrun_test.go`:
- Around line 62-70: The test currently only asserts the first dry-run step URL
via gjson.Get(result.Stdout, "api.0.url") but doesn't verify request params;
update the test in drive_info_dryrun_test.go to assert the wiki get_node params
include the expected token key/value by adding an assertion against the dry-run
JSON (use gjson.Get on result.Stdout, e.g. "api.0.params.<tokenKey>" or the
appropriate params path) so the first step not only has
"/open-apis/wiki/v2/spaces/get_node" but also contains the expected wiki token
param/value, keeping this as a pure dry-run assertion (no real API calls).

---

Duplicate comments:
In `@shortcuts/drive/drive_info.go`:
- Around line 70-72: The dry-run request for the wiki node uses a different
query key than the real execute call; change the dry GET setup so it mirrors the
real request shape by replacing Set("wiki_token", ref.Token) with the same key
used by Execute (i.e., Set("token", ref.Token)) for the route
dry.GET("/open-apis/wiki/v2/spaces/get_node") so the DryRun and Execute use
identical query names.
🪄 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

Run ID: 4f1433a4-434e-46d7-825a-b23565d9bace

📥 Commits

Reviewing files that changed from the base of the PR and between 12f55f2 and 6871d82.

📒 Files selected for processing (4)
  • shortcuts/drive/drive_info.go
  • shortcuts/drive/shortcuts.go
  • shortcuts/drive/shortcuts_test.go
  • tests/cli_e2e/drive/drive_info_dryrun_test.go

Comment on lines +62 to +70
// Should plan two steps: get_node + batch_query.
require.Equal(t, int64(2), gjson.Get(result.Stdout, "api.#").Int(),
"expected exactly 2 dry-run API steps for wiki URL, stdout:\n%s", result.Stdout)
require.Equal(t, "/open-apis/wiki/v2/spaces/get_node",
gjson.Get(result.Stdout, "api.0.url").String(),
"expected get_node as first step, stdout:\n%s", result.Stdout)
require.Equal(t, "/open-apis/drive/v1/metas/batch_query",
gjson.Get(result.Stdout, "api.1.url").String(),
"expected batch_query as second step, stdout:\n%s", result.Stdout)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Assert wiki get_node request params in dry-run output.

This test only checks URL order, so a wrong query key can still pass. Please also assert the first step includes the expected wiki token param key/value.

As per coding guidelines tests/cli_e2e/**/*_test.go: Dry-run E2E tests required for every shortcut change must validate request structure without calling real APIs.

🤖 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 `@tests/cli_e2e/drive/drive_info_dryrun_test.go` around lines 62 - 70, The test
currently only asserts the first dry-run step URL via gjson.Get(result.Stdout,
"api.0.url") but doesn't verify request params; update the test in
drive_info_dryrun_test.go to assert the wiki get_node params include the
expected token key/value by adding an assertion against the dry-run JSON (use
gjson.Get on result.Stdout, e.g. "api.0.params.<tokenKey>" or the appropriate
params path) so the first step not only has "/open-apis/wiki/v2/spaces/get_node"
but also contains the expected wiki token param/value, keeping this as a pure
dry-run assertion (no real API calls).

@fangshuyu-768 fangshuyu-768 changed the title feat(drive): add +info shortcut to resolve document URLs with wiki unwrapping feat(drive): add +resolve shortcut to resolve document URLs with wiki unwrapping May 18, 2026
@fangshuyu-768
fangshuyu-768 deleted the pr-935 branch May 18, 2026 12:13
@fangshuyu-768 fangshuyu-768 changed the title feat(drive): add +resolve shortcut to resolve document URLs with wiki unwrapping feat(drive): add +resolve shortcut for document URL resolution with wiki unwrapping May 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

domain/ccm PR touches the ccm domain size/L Large or sensitive change across domains or core paths

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants