@acedatacloud/skills 2026.627.0 → 2026.627.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acedatacloud/skills",
3
- "version": "2026.627.0",
3
+ "version": "2026.627.1",
4
4
  "description": "Agent Skills for AceDataCloud AI services — music, image, video generation, LLM chat, web search. Compatible with Claude Code, GitHub Copilot, Gemini CLI, OpenAI Codex, and 30+ AI coding agents.",
5
5
  "keywords": [
6
6
  "agent-skills",
@@ -1,14 +1,11 @@
1
1
  ---
2
2
  name: google-drive
3
- description: Read, search, upload, rename, move and delete Google Drive files / folders / shared content via the Drive v3 REST API. Use when the user mentions Drive files, "my drive", shared documents, Google Docs / Sheets / Slides, exporting / downloading a Drive file, searching by name / owner / folder, uploading a new file, renaming or moving files, or organising folders.
3
+ description: Read, export, upload, rename, move and delete Google Drive files explicitly selected or shared with the app via the Drive v3 REST API. Use when the user provides a Drive file ID/link or has selected files for the Google Drive connector.
4
4
  when_to_use: |
5
- Trigger when the user wants to list, search, read, download or
6
- modify files in their Google Drive including Google-native docs
7
- (Docs / Sheets / Slides) which need a special "export" call to get
8
- plain content, as well as uploads, renames, folder moves, and
9
- trashing files. The installed connector always grants `drive.readonly`;
10
- the user opts in to the broader `drive` scope (full read + write)
11
- at install time — confirm before performing destructive writes.
5
+ Trigger when the user wants to read, download, export or modify Google
6
+ Drive files they explicitly selected, created, opened, or shared with
7
+ this app. The installed connector currently grants only `drive.file`,
8
+ so do not browse, search, or summarize the user's entire Drive.
12
9
  connections: [google/drive]
13
10
  allowed_tools: [Bash]
14
11
  license: Apache-2.0
@@ -19,17 +16,21 @@ metadata:
19
16
 
20
17
  Drive Google Drive via `curl + jq`. The user's OAuth bearer token is
21
18
  in `$GOOGLE_DRIVE_TOKEN`; every call needs it as
22
- `Authorization: Bearer $GOOGLE_DRIVE_TOKEN`. At minimum the token
23
- carries `drive.readonly` plus the identity scopes
24
- (`openid email profile`); if the user opted in to write at install
25
- time it also carries the broader `drive` scope (full read + write).
19
+ `Authorization: Bearer $GOOGLE_DRIVE_TOKEN`. The token carries
20
+ `drive.file` plus identity scopes (`openid email profile`) and can only
21
+ access files the user selected, opened, created, or shared with this app.
26
22
 
27
23
  The Drive API returns standard JSON; failures surface as
28
24
  `{"error": {"code": 401|403|..., "message": "..."}}` — show that
29
25
  error verbatim to the user. `401` means the token expired and the
30
26
  user must re-install the connector. `403 insufficientPermissions`
31
- on a write means the user did not grant the `drive` scope at install
32
- ask them to re-install with the read+write box checked.
27
+ means the file was not shared with this app, or the action needs a
28
+ broader Drive scope that is temporarily disabled during Google review.
29
+
30
+ Do not use this skill for broad Drive discovery: no "list my recent
31
+ files", full-text search across Drive, shared-with-me scans, root-folder
32
+ cleanup, or bulk moves based on a Drive-wide query. Ask the user to pick
33
+ or paste the exact file/folder IDs first.
33
34
 
34
35
  **Before any destructive write** (renaming, moving, trashing, or
35
36
  bulk-mutating files) show the exact target list and ask the user to
@@ -52,8 +53,8 @@ upload protocol.
52
53
  hand-formatted `multipart/related` body with a JSON metadata part and a
53
54
  binary file part separated by a boundary string — easy to get wrong from
54
55
  curl. `gws drive +upload` does it correctly. **For everything else**
55
- (list, search, get, export, rename, move, trash, delete) the curl recipes
56
- below are equivalent and shorter — stay on those.
56
+ (get, export, rename, move, trash, delete) the curl recipes below are
57
+ equivalent and shorter — stay on those.
57
58
 
58
59
  ### Install
59
60
 
@@ -90,9 +91,7 @@ gws drive files create \
90
91
  ```
91
92
 
92
93
  Both exit non-zero with a structured JSON error on stderr if Google
93
- rejects the request — surface that verbatim. Uploads need the broader
94
- `drive` scope; on `403 insufficientPermissions` ask the user to
95
- re-install the connector with read+write checked.
94
+ rejects the request — surface that verbatim.
96
95
 
97
96
  ## Recipes
98
97
 
@@ -104,56 +103,9 @@ curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
104
103
  | jq '{user, quota: .storageQuota}'
105
104
  ```
106
105
 
107
- ### List recent files (last modified first)
108
-
109
- ```sh
110
- curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
111
- "https://www.googleapis.com/drive/v3/files?orderBy=modifiedTime%20desc&pageSize=20&fields=files(id,name,mimeType,modifiedTime,owners(emailAddress),webViewLink,parents)" \
112
- | jq '.files[] | {id, name, mimeType, modified: .modifiedTime, owner: .owners[0].emailAddress, webViewLink}'
113
- ```
114
-
115
- `pageSize` max is 1000; default is 100. Use `pageToken` from the
116
- response (`nextPageToken`) for follow-up pages.
117
-
118
- ### Search by name / fulltext
119
-
120
- ```sh
121
- # Exact-name fragments — note "name contains" supports tokens, not regex
122
- Q='name contains "季度复盘" and trashed = false'
123
- curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
124
- --get "https://www.googleapis.com/drive/v3/files" \
125
- --data-urlencode "q=$Q" \
126
- --data-urlencode 'fields=files(id,name,mimeType,modifiedTime,webViewLink,owners(emailAddress))' \
127
- --data-urlencode 'pageSize=20' \
128
- | jq '.files[] | {id, name, modified: .modifiedTime, owner: .owners[0].emailAddress}'
129
-
130
- # Full-text search (body + title)
131
- Q='fullText contains "OKR 2026Q2" and trashed = false'
132
- curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
133
- --get "https://www.googleapis.com/drive/v3/files" \
134
- --data-urlencode "q=$Q" \
135
- --data-urlencode 'fields=files(id,name,modifiedTime,webViewLink)' \
136
- | jq '.files[]'
137
- ```
138
-
139
- The `q` param uses [Drive's mini query language](https://developers.google.com/drive/api/guides/search-files):
140
- `name`, `fullText`, `mimeType`, `parents`, `'<email>' in owners`,
141
- `'<email>' in writers`, `modifiedTime > '2026-01-01T00:00:00'`,
142
- `sharedWithMe`, `trashed`, joined by `and` / `or` / `not`.
143
-
144
- ### List files shared with me
106
+ ### List children of a selected folder
145
107
 
146
- ```sh
147
- curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
148
- --get "https://www.googleapis.com/drive/v3/files" \
149
- --data-urlencode 'q=sharedWithMe and trashed = false' \
150
- --data-urlencode 'orderBy=sharedWithMeTime desc' \
151
- --data-urlencode 'fields=files(id,name,mimeType,sharedWithMeTime,owners(displayName,emailAddress))' \
152
- --data-urlencode 'pageSize=30' \
153
- | jq '.files[] | {name, sharedAt: .sharedWithMeTime, sharedBy: .owners[0]}'
154
- ```
155
-
156
- ### List children of a folder
108
+ Only use this after the user explicitly selected or provided the folder ID.
157
109
 
158
110
  ```sh
159
111
  FOLDER_ID='1A2B3CdEfGhIjKlMn'
@@ -234,28 +186,11 @@ curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
234
186
  | jq '.permissions[] | {who: (.emailAddress // .domain // .type), role}'
235
187
  ```
236
188
 
237
- ### Pagination boilerplate
238
-
239
- ```sh
240
- PAGE_TOKEN=''
241
- while : ; do
242
- RESP=$(curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
243
- --get "https://www.googleapis.com/drive/v3/files" \
244
- --data-urlencode 'q=trashed = false' \
245
- --data-urlencode 'fields=files(id,name),nextPageToken' \
246
- --data-urlencode 'pageSize=200' \
247
- ${PAGE_TOKEN:+--data-urlencode "pageToken=$PAGE_TOKEN"})
248
- echo "$RESP" | jq -c '.files[]'
249
- PAGE_TOKEN=$(echo "$RESP" | jq -r '.nextPageToken // empty')
250
- [ -z "$PAGE_TOKEN" ] && break
251
- done
252
- ```
253
-
254
189
  ## Write recipes
255
190
 
256
- These all need the broader `drive` scope. If the user only granted
257
- `drive.readonly` you'll get `403 insufficientPermissions` surface
258
- that and suggest re-installing with the read+write box checked.
191
+ These only work for files and folders available through `drive.file`.
192
+ If Google returns `403 insufficientPermissions`, surface the error and
193
+ ask the user to select/share the target file with the app.
259
194
  **Always echo the target name + path back to the user before
260
195
  trashing or bulk-moving anything.**
261
196
 
@@ -365,39 +300,14 @@ Prefer `trashed:true` over `DELETE` — `DELETE` is permanent and the
365
300
  user can't undo it. Only use `DELETE` when they explicitly say
366
301
  "permanently delete".
367
302
 
368
- ### Bulk "move every PDF in the root to /Documents/PDF" (confirmation pattern)
369
-
370
- ```sh
371
- # 1. List candidates and show the user before doing anything
372
- DST_FOLDER_ID='1XYZdocsPdfFolder'
373
- ROOT_ID='root'
374
-
375
- CANDS=$(curl -sS -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
376
- --get "https://www.googleapis.com/drive/v3/files" \
377
- --data-urlencode "q='$ROOT_ID' in parents and mimeType='application/pdf' and trashed=false" \
378
- --data-urlencode 'fields=files(id,name,webViewLink)' \
379
- | jq '.files')
380
- echo "$CANDS" | jq -r '.[] | "- \(.name)"'
381
-
382
- # 2. (after user confirms) actually move
383
- echo "$CANDS" | jq -r '.[] | .id' | while read FID; do
384
- curl -sS -X PATCH -H "Authorization: Bearer $GOOGLE_DRIVE_TOKEN" \
385
- --data '' \
386
- "https://www.googleapis.com/drive/v3/files/$FID?addParents=$DST_FOLDER_ID&removeParents=$ROOT_ID&fields=id,name,parents" \
387
- | jq -c '{id, name, parents}'
388
- done
389
- ```
390
-
391
303
  ## Common error codes
392
304
 
393
305
  | HTTP | meaning | what to tell the user |
394
306
  |---|---|---|
395
307
  | `401 UNAUTHENTICATED` | token expired / revoked | "Reconnect the Google Drive connector on the Connections page." |
396
- | `403 insufficientPermissions` | write scope missing | "This action needs the Drive read+write scope, but only `drive.readonly` was granted at install. Re-install the connector and check the read+write box." |
308
+ | `403 insufficientPermissions` | target not shared with app / broader Drive scope disabled | "This file isn't available to the app under the current `drive.file` permission. Select or share the exact file with the Google Drive connector, then try again." |
397
309
  | `403 userRateLimitExceeded` | quota | retry once after 5–10s; if it persists, tell the user. |
398
- | `404 notFound` | wrong file id OR file isn't visible to this account | double-check the id; if shared, use `sharedWithMe` query above. |
310
+ | `404 notFound` | wrong file id OR file isn't visible to this app | double-check the id; ask the user to select or share the file with the connector. |
399
311
  | `400 invalidQuery` | malformed `q` | print the `q` you sent + the error message back to the user. |
400
312
 
401
313
  Never log or echo `$GOOGLE_DRIVE_TOKEN` — treat it as a secret.
402
-
403
- Never log or echo `$GOOGLE_DRIVE_TOKEN` — treat it as a secret.