@qvac/skills 0.1.6 → 0.1.8
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/bundled.js +10 -19
- package/hash.js +1 -1
- package/package.json +1 -1
- package/skills/asana/SKILL.md +15 -0
- package/skills/diagrams/SKILL.md +130 -40
- package/skills/excel/SKILL.md +18 -11
- package/skills/excel/references/edit.md +4 -0
- package/skills/gmail/SKILL.md +16 -32
- package/skills/gmail/operations.json +23 -0
- package/skills/google-calendar/SKILL.md +1 -2
- package/skills/google-docs/SKILL.md +1 -2
- package/skills/google-drive/SKILL.md +1 -2
- package/skills/google-sheets/SKILL.md +1 -2
- package/skills/diagrams/references/class.md +0 -29
- package/skills/diagrams/references/er.md +0 -27
- package/skills/diagrams/references/flowchart.md +0 -33
- package/skills/diagrams/references/gantt.md +0 -38
- package/skills/diagrams/references/mindmap.md +0 -35
- package/skills/diagrams/references/pie.md +0 -27
- package/skills/diagrams/references/sequence.md +0 -32
- package/skills/diagrams/references/state.md +0 -30
- package/skills/diagrams/references/timeline.md +0 -28
package/hash.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Autogenerated by scripts/build.mjs from skills/. Do not edit.
|
|
2
|
-
export const SKILLS_HASH = '
|
|
2
|
+
export const SKILLS_HASH = '0eb3f5d497a4b6b8'
|
package/package.json
CHANGED
package/skills/asana/SKILL.md
CHANGED
|
@@ -47,6 +47,21 @@ metadata:
|
|
|
47
47
|
"scopes": [],
|
|
48
48
|
"extraAuthParams": {
|
|
49
49
|
"resource": "https://mcp.asana.com/v2"
|
|
50
|
+
},
|
|
51
|
+
"verify": {
|
|
52
|
+
"url": "https://mcp.asana.com/v2/mcp",
|
|
53
|
+
"method": "POST",
|
|
54
|
+
"body": {
|
|
55
|
+
"jsonrpc": "2.0",
|
|
56
|
+
"id": 1,
|
|
57
|
+
"method": "initialize",
|
|
58
|
+
"params": {
|
|
59
|
+
"protocolVersion": "2025-03-26",
|
|
60
|
+
"capabilities": {},
|
|
61
|
+
"clientInfo": { "name": "qvac", "version": "1.0.0" }
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"reject": [{ "status": [401, 403], "error": "asana_not_mcp_app" }]
|
|
50
65
|
}
|
|
51
66
|
}
|
|
52
67
|
}
|
package/skills/diagrams/SKILL.md
CHANGED
|
@@ -3,6 +3,29 @@ name: diagrams
|
|
|
3
3
|
description: Draw diagrams in the chat - flowcharts, sequence, state and ER diagrams, Gantt charts, pie charts, mindmaps and timelines - written as Mermaid code blocks the app renders. Use when the user asks to draw, diagram, sketch, chart, plan, visualize, or map a process, flow, schedule, architecture, or relationship.
|
|
4
4
|
aliases: [diagram, mermaid, flowchart, mindmap]
|
|
5
5
|
platform: [darwin, linux, win32, ios, android]
|
|
6
|
+
version: 2
|
|
7
|
+
# Tuned on Qwen3.5-2B with an offline eval (33 prompts, mention + prose routes, reasoning on as the app
|
|
8
|
+
# runs it, 12k context, 180 s turn budget), judged by the app's own mermaid parser. QVAC-24436, QVAC-24502.
|
|
9
|
+
# A run passes when the diagram asked for parses and reaches the reply with no tool JSON beside it, or,
|
|
10
|
+
# for the three prompts that want a picture or a plot instead, when no diagram is drawn.
|
|
11
|
+
# v1: router + references/<type>.md, harness 0.2.8. 3 repeats: mention 54/99, prose 20/36, 29 skill calls
|
|
12
|
+
# per run - the 2B loops on the second load (hallucinated files, repeats) until the turn budget ends,
|
|
13
|
+
# and the app shows the raw call or "Diagram unavailable". 71-77% of drawn blocks parsed.
|
|
14
|
+
# v2: every recipe inline, nothing to load. Same harness, 3 repeats: mention 72/99, prose 31/36; 91-97%
|
|
15
|
+
# of drawn blocks parse; context 4156 / 4787 tokens against 5497 / 6317. Skill calls per run 23-35: the
|
|
16
|
+
# model still asks for a body it has, which @qvac/harness answers (a repeat load is acknowledged, not
|
|
17
|
+
# re-run; a misspelt file resolves to its nearest match). With those fixes, 3 repeats: 76/99 and 30/36,
|
|
18
|
+
# ~2 calls per run, context 4002 / 3771.
|
|
19
|
+
# Tried and dropped: the per-type size budgets from the reference files (12 nodes, 8 states, ...).
|
|
20
|
+
# They measured the same (79/99, 33/36 on harness main) but on a phone they cut a 40-node mind map to
|
|
21
|
+
# 10 nodes: the eval scores what parses, not what was left out. The state alias for a spaced name and
|
|
22
|
+
# the gantt `axisFormat` / `excludes weekends` headers from the same files stayed: one clause each.
|
|
23
|
+
# This text, harness main, 3 repeats: mention 84/99, prose 28/36; 93-96% of drawn blocks parse; context
|
|
24
|
+
# 3305 / 3730; ~2 skill calls per run; the ticket prompt 6 of 6.
|
|
25
|
+
# Not fixed. The three route-away prompts (a logo, a photo, a revenue plot) get a diagram 6-9 times
|
|
26
|
+
# in 9 on v2 against 4 in 9 on v1: a page that opens with "draw" draws. Four variants that reworded
|
|
27
|
+
# the "do not load" rule, or cut the recipes to 300 words, measured 25-55% against v1's 55% and were
|
|
28
|
+
# dropped.
|
|
6
29
|
---
|
|
7
30
|
|
|
8
31
|
# Diagrams
|
|
@@ -15,53 +38,120 @@ never call an image tool, and never deliver it as a PDF or image file.
|
|
|
15
38
|
|
|
16
39
|
Your reply STARTS with the fence. No preamble, no plan, no "I'll create a
|
|
17
40
|
diagram showing..." - never announce or describe a diagram instead of drawing
|
|
18
|
-
it. Decide the type silently,
|
|
19
|
-
fence, then add one short sentence saying what it shows - after the closing
|
|
41
|
+
it. Decide the type silently, pick its recipe below, write the code block, close
|
|
42
|
+
its fence, then add one short sentence saying what it shows - after the closing
|
|
20
43
|
fence, never inside it. A complete reply looks like this:
|
|
21
44
|
|
|
22
45
|
```mermaid
|
|
23
46
|
flowchart TD
|
|
24
|
-
A["
|
|
25
|
-
B -->|yes| C["
|
|
26
|
-
B -->|no| D["
|
|
47
|
+
A["First step"] --> B{"Condition?"}
|
|
48
|
+
B -->|yes| C["Second step"]
|
|
49
|
+
B -->|no| D["Other step"]
|
|
27
50
|
```
|
|
28
51
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
52
|
+
One sentence about what it shows. Copy the SHAPE of this block, never its
|
|
53
|
+
words - the labels come from what the user asked about.
|
|
54
|
+
|
|
55
|
+
## Pick the Type and Draw - Nothing to Load
|
|
56
|
+
|
|
57
|
+
Every recipe is here. Pick the row that fits the ask, copy its shape, draw.
|
|
58
|
+
Do not call any tool: the recipe you need is already on this page.
|
|
59
|
+
|
|
60
|
+
**Steps, a process, a pipeline, an org chart** - `flowchart TD` (top-down) or `flowchart LR`:
|
|
61
|
+
```mermaid
|
|
62
|
+
flowchart LR
|
|
63
|
+
A["Request"] --> B{"Valid?"}
|
|
64
|
+
B -->|yes| C["Process"]
|
|
65
|
+
B -->|no| D["Reject with error"]
|
|
66
|
+
```
|
|
67
|
+
Nodes `id["Label"]`, decisions `id{"Question?"}`, arrows always `-->` with `-->|yes|` labels. Ids never reused. Never lowercase `end` - write `"End"`.
|
|
68
|
+
|
|
69
|
+
**Who calls whom over time** - `sequenceDiagram`:
|
|
70
|
+
```mermaid
|
|
71
|
+
sequenceDiagram
|
|
72
|
+
participant App
|
|
73
|
+
participant Server
|
|
74
|
+
App->>Server: POST /login
|
|
75
|
+
Server-->>App: 200 with token
|
|
76
|
+
```
|
|
77
|
+
Declare every `participant` first. Call `A->>B: text`, reply `B-->>A: text`. Never `-->` here.
|
|
78
|
+
|
|
79
|
+
**Modes and transitions** - `stateDiagram-v2`:
|
|
80
|
+
```mermaid
|
|
81
|
+
stateDiagram-v2
|
|
82
|
+
[*] --> Idle
|
|
83
|
+
Idle --> Running : start
|
|
84
|
+
Running --> [*] : shutdown
|
|
85
|
+
```
|
|
86
|
+
`[*]` starts and ends. `From --> To : label`. State names are single words or `snake_case`; for a spaced name write `state "Waiting for input" as Waiting` once, then `Waiting`.
|
|
87
|
+
|
|
88
|
+
**Tables and relations** - `erDiagram`:
|
|
89
|
+
```mermaid
|
|
90
|
+
erDiagram
|
|
91
|
+
USER ||--o{ ORDER : "places"
|
|
92
|
+
ORDER ||--|{ LINE_ITEM : "contains"
|
|
93
|
+
```
|
|
94
|
+
Entities UPPER_CASE. `||--o{` one-to-many, `||--||` one-to-one. Label in plain quotes after the colon.
|
|
95
|
+
|
|
96
|
+
**Classes and inheritance** - `classDiagram`:
|
|
97
|
+
```mermaid
|
|
98
|
+
classDiagram
|
|
99
|
+
class Animal {
|
|
100
|
+
+String name
|
|
101
|
+
+speak()
|
|
102
|
+
}
|
|
103
|
+
Animal <|-- Dog
|
|
104
|
+
```
|
|
105
|
+
Members inside `class Name { }`. Inheritance `Parent <|-- Child`. No quotes on class names.
|
|
106
|
+
|
|
107
|
+
**A schedule with durations** - `gantt`:
|
|
108
|
+
```mermaid
|
|
109
|
+
gantt
|
|
110
|
+
title Delivery
|
|
111
|
+
dateFormat YYYY-MM-DD
|
|
112
|
+
section Planning
|
|
113
|
+
Requirements :a1, 2026-09-01, 5d
|
|
114
|
+
Design :a2, after a1, 7d
|
|
115
|
+
```
|
|
116
|
+
Headers are only `title`, `dateFormat`, `axisFormat`, `excludes weekends`, `section`. EVERY other line is `Name :id, start, duration`.
|
|
117
|
+
|
|
118
|
+
**Dated events in order** - `timeline`:
|
|
119
|
+
```mermaid
|
|
120
|
+
timeline
|
|
121
|
+
title Company history
|
|
122
|
+
2019 : Founded
|
|
123
|
+
2021 : First release
|
|
124
|
+
2024 : Series A
|
|
125
|
+
```
|
|
126
|
+
One `date : event` per line, indented under the title.
|
|
127
|
+
|
|
128
|
+
**Shares of a whole** - `pie`:
|
|
129
|
+
```mermaid
|
|
130
|
+
pie title Time spent
|
|
131
|
+
"Coding" : 60
|
|
132
|
+
"Review" : 25
|
|
133
|
+
"Meetings" : 15
|
|
134
|
+
```
|
|
135
|
+
Every slice is `"Label" : number` - quoted label, plain number, no `%`.
|
|
136
|
+
|
|
137
|
+
**A brainstorm or idea tree** - `mindmap`:
|
|
138
|
+
```mermaid
|
|
139
|
+
mindmap
|
|
140
|
+
root[Launch plan]
|
|
141
|
+
Marketing
|
|
142
|
+
Blog post
|
|
143
|
+
Engineering
|
|
144
|
+
Release build
|
|
145
|
+
```
|
|
146
|
+
`root[Topic]` once, then plain unquoted text, two more spaces per level. A second line at the root's depth fails.
|
|
147
|
+
|
|
148
|
+
Use `gitGraph` ONLY when the user names it. Never invent a keyword not shown above.
|
|
58
149
|
|
|
59
150
|
## Hard Rules (every type)
|
|
60
151
|
|
|
61
152
|
- One diagram per code block, and the fence language is exactly `mermaid`. The
|
|
62
|
-
first line inside the fence is
|
|
63
|
-
ONE block; use two only
|
|
64
|
-
detail. Never more than two.
|
|
153
|
+
first line inside the fence is a type keyword from the recipes above. Default to
|
|
154
|
+
ONE block; use two only for an overview plus one detail. Never more than two.
|
|
65
155
|
- Except in mindmaps, node ids are letters, digits, and underscores, starting
|
|
66
156
|
with a letter, never reused. Mindmap nodes have no ids.
|
|
67
157
|
- Except in mindmaps, every label with a space, punctuation, or brackets goes
|
|
@@ -93,8 +183,8 @@ diagram types, and never invent a keyword a recipe does not show.
|
|
|
93
183
|
## If the diagram fails
|
|
94
184
|
|
|
95
185
|
When a diagram cannot render, the app sends its parse error back to you once
|
|
96
|
-
on its own, and the user may send it again. Re-
|
|
97
|
-
by rewriting the ENTIRE code block, never a partial patch.
|
|
186
|
+
on its own, and the user may send it again. Re-read the type's recipe above and
|
|
187
|
+
fix by rewriting the ENTIRE code block, never a partial patch.
|
|
98
188
|
|
|
99
189
|
| Error contains | Fix |
|
|
100
190
|
| --- | --- |
|
|
@@ -103,5 +193,5 @@ by rewriting the ENTIRE code block, never a partial patch.
|
|
|
103
193
|
| `Expecting ...` at a flowchart or sequence label | Put the whole label in double quotes |
|
|
104
194
|
| `got 'end'` | Rename the node label to `"End"` |
|
|
105
195
|
| `Maximum text size` or edge limit | Shrink the diagram or split it in two |
|
|
106
|
-
| `No diagram type detected` | Start the fence with one type keyword from the
|
|
196
|
+
| `No diagram type detected` | Start the fence with one type keyword from the recipes above |
|
|
107
197
|
| `Duplicate id` | Give every node a fresh unique id |
|
package/skills/excel/SKILL.md
CHANGED
|
@@ -4,6 +4,10 @@ description: Create, edit, or read Excel spreadsheets (.xlsx) with openpyxl —
|
|
|
4
4
|
aliases: [xlsx, spreadsheet, workbook]
|
|
5
5
|
tools: [exec(python)]
|
|
6
6
|
platform: [darwin, linux, win32]
|
|
7
|
+
# Routing tuned on Qwen3.5-4B for QVAC-24106 ("@excel embed this image into a spreadsheet" after a
|
|
8
|
+
# generate_image turn). The bullet list sent 13/14 runs to edit.md, and 6/14 ended with no image in
|
|
9
|
+
# a workbook, most by asking the user to attach one. As a request -> file table: 5/5 to create.md and
|
|
10
|
+
# 5/5 embedded the image; "add a fourth row" to a workbook built in the chat still loads edit.md, 3/3.
|
|
7
11
|
metadata:
|
|
8
12
|
{
|
|
9
13
|
"openclaw":
|
|
@@ -32,17 +36,20 @@ copy its recipe and change the content:
|
|
|
32
36
|
Each load is a real `skill` tool call — printing the call as JSON or text in
|
|
33
37
|
your reply loads nothing.
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
Pick the file by whether an `.xlsx` is already in this chat:
|
|
40
|
+
|
|
41
|
+
| The request | Load |
|
|
42
|
+
| ----------------------------------------------------------------------------------- | ----------------------------------------------- |
|
|
43
|
+
| "make a spreadsheet of …", "embed this image into a spreadsheet" — no `.xlsx` yet | `references/create.md` |
|
|
44
|
+
| "add a row", "change B2", "add this image to my budget.xlsx" — an `.xlsx` is here | `references/edit.md` |
|
|
45
|
+
| "what is the total in this sheet?", "summarize this workbook" — the answer is a reply | `references/read.md` |
|
|
46
|
+
| "summarize this workbook into a new file" | `references/read.md` first, then create or edit |
|
|
47
|
+
|
|
48
|
+
Load it with the `skill` tool: `name: "excel"` and that `file`.
|
|
49
|
+
|
|
50
|
+
**An image this chat generated is already attached.** A `generate_image` result in
|
|
51
|
+
any earlier turn is the image "this image" means, and its `attachmentId` stages it.
|
|
52
|
+
Never ask the user to attach an image the conversation already has.
|
|
46
53
|
|
|
47
54
|
Never write the Python from memory. The recipes carry required patterns (the
|
|
48
55
|
fill-in template, staging rules, guard asserts) that fail in non-obvious ways
|
|
@@ -6,6 +6,10 @@ rows, columns, or sheets. Stage the workbook as an input, modify it, and save
|
|
|
6
6
|
under a **new** output name such as `revised.xlsx` — never overwrite the staged
|
|
7
7
|
input.
|
|
8
8
|
|
|
9
|
+
**No `.xlsx` in this chat means this is not an edit.** "Put this image in a
|
|
10
|
+
spreadsheet" with no workbook to open is a CREATE: load `references/create.md` and
|
|
11
|
+
build a new one. Never ask the user to attach a workbook they did not mention.
|
|
12
|
+
|
|
9
13
|
Macro-enabled files (`.xlsm`) can be staged as inputs and read, but this
|
|
10
14
|
runtime cannot deliver `.xlsm` back — macros never survive. Save the edit as
|
|
11
15
|
`.xlsx` and tell the user the macros were not preserved.
|
package/skills/gmail/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: gmail
|
|
3
3
|
description: Read, search, send, and manage Gmail messages and labels via the Gmail REST API.
|
|
4
4
|
aliases: [inbox, email+send, email+draft, email+reply, email+forward]
|
|
5
|
-
tools: [http_request, gmail_send, gmail_draft]
|
|
5
|
+
tools: [http_request, gmail_get, gmail_send, gmail_draft]
|
|
6
6
|
platform: [darwin, linux, win32]
|
|
7
7
|
credentials: [gmail_access_token]
|
|
8
8
|
allow_list: [https://gmail.googleapis.com/gmail/v1/users/me/]
|
|
@@ -23,7 +23,7 @@ metadata:
|
|
|
23
23
|
],
|
|
24
24
|
"configSteps": [
|
|
25
25
|
"[Open Google Cloud Console](https://console.cloud.google.com/flows/enableapi?apiid=gmail.googleapis.com) to enable the Gmail API",
|
|
26
|
-
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"
|
|
26
|
+
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"Web application\" as the type",
|
|
27
27
|
"[Open OAuth audience](https://console.cloud.google.com/auth/audience) and add your Google account as a test user"
|
|
28
28
|
],
|
|
29
29
|
"fields": [
|
|
@@ -43,7 +43,6 @@ metadata:
|
|
|
43
43
|
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
44
44
|
"tokenUrl": "https://oauth2.googleapis.com/token",
|
|
45
45
|
"tokenAuth": "secret-in-body",
|
|
46
|
-
"port": 18978,
|
|
47
46
|
"scopes": [
|
|
48
47
|
"https://www.googleapis.com/auth/gmail.modify"
|
|
49
48
|
],
|
|
@@ -61,7 +60,7 @@ metadata:
|
|
|
61
60
|
|
|
62
61
|
# Gmail
|
|
63
62
|
|
|
64
|
-
|
|
63
|
+
Read with `gmail_get`, send with `gmail_send`, draft with `gmail_draft`. `http_request` is only for list/search, labels and trash. The Gmail credential is attached automatically to every `gmail.googleapis.com` request — **never include an `auth` block**. Never run code.
|
|
65
64
|
|
|
66
65
|
## Prerequisites
|
|
67
66
|
|
|
@@ -76,11 +75,13 @@ set the `gmail_access_token` credential.
|
|
|
76
75
|
|
|
77
76
|
The host is `gmail.googleapis.com` — not `www.googleapis.com`. Send is at `/messages/send`, never `/send`.
|
|
78
77
|
|
|
79
|
-
##
|
|
78
|
+
## Read messages
|
|
80
79
|
|
|
81
|
-
|
|
80
|
+
1. List with `http_request`. Use `q` for Gmail search (`from:`, `subject:`, `is:unread`, `newer_than:7d`, `has:attachment`, `label:work`). Keep `maxResults` ≤ 10. The result is ids only.
|
|
81
|
+
2. Call `gmail_get` with each `id`. It returns `headers` (From, To, Subject, Date), `snippet` and, with `format: "full"`, `text`.
|
|
82
|
+
3. Answer from those fields. Never run code.
|
|
82
83
|
|
|
83
|
-
`
|
|
84
|
+
`http_request` to list:
|
|
84
85
|
|
|
85
86
|
```json
|
|
86
87
|
{
|
|
@@ -90,32 +91,15 @@ The host is `gmail.googleapis.com` — not `www.googleapis.com`. Send is at `/me
|
|
|
90
91
|
}
|
|
91
92
|
```
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
For lists and summaries always use `format=metadata` — it skips the body and is far cheaper than `full`.
|
|
94
|
+
`gmail_get` for each id:
|
|
96
95
|
|
|
97
96
|
```json
|
|
98
|
-
{
|
|
99
|
-
"url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{id}",
|
|
100
|
-
"method": "GET",
|
|
101
|
-
"query": {
|
|
102
|
-
"format": "metadata",
|
|
103
|
-
"metadataHeaders": "Subject,From,To,Date,Message-ID,References"
|
|
104
|
-
}
|
|
105
|
-
}
|
|
97
|
+
{ "id": "1a0c420faf8b68fe" }
|
|
106
98
|
```
|
|
107
99
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
Only when the user needs the content. The body is base64url-encoded in `payload.parts[].body.data` (or `payload.body.data`); decode it before presenting. Prefer the `text/plain` part over `text/html`.
|
|
100
|
+
Use `format: "full"` only when the user asks what a message says.
|
|
111
101
|
|
|
112
|
-
|
|
113
|
-
{
|
|
114
|
-
"url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{id}",
|
|
115
|
-
"method": "GET",
|
|
116
|
-
"query": { "format": "full" }
|
|
117
|
-
}
|
|
118
|
-
```
|
|
102
|
+
## Common Operations
|
|
119
103
|
|
|
120
104
|
### Send a message
|
|
121
105
|
|
|
@@ -141,7 +125,7 @@ Use `gmail_draft` with the same envelope as `gmail_send`.
|
|
|
141
125
|
|
|
142
126
|
A reply is `gmail_send` with the original's `threadId`, `inReplyTo`, and `references`. Without these Gmail starts a new thread.
|
|
143
127
|
|
|
144
|
-
1.
|
|
128
|
+
1. `gmail_get` the original; capture its `threadId` and its `Message-ID` and `References` headers.
|
|
145
129
|
2. Send with `to` <- original From (or Reply-To), `subject` <- `Re: ` + original (don't double-prefix), `inReplyTo` <- original Message-ID, `references` <- original References then that Message-ID. Keep angle brackets.
|
|
146
130
|
|
|
147
131
|
```json
|
|
@@ -178,15 +162,15 @@ System labels: `INBOX`, `UNREAD`, `STARRED`, `IMPORTANT`, `SPAM`, `TRASH`. Mark
|
|
|
178
162
|
|
|
179
163
|
## Output Policy
|
|
180
164
|
|
|
181
|
-
- Lists: up to 5 entries with subject, sender, and a human-readable date. Fetch
|
|
182
|
-
- Decode base64 message bodies before presenting; never include raw base64 blobs.
|
|
165
|
+
- Lists: up to 5 entries with subject, sender, and a human-readable date. Fetch `text` only when asked.
|
|
183
166
|
- Modify/trash: state the user-facing effect ("marked 3 messages as read"), not the label diff.
|
|
184
167
|
- Confirm destructive or outgoing actions (send, reply, trash) with the user first.
|
|
185
168
|
|
|
186
169
|
## Common Mistakes
|
|
187
170
|
|
|
188
171
|
- Using `www.googleapis.com` for Gmail, or building send/draft/reply through `http_request` instead of `gmail_send`/`gmail_draft`.
|
|
189
|
-
- Treating `messages.list` results as if they had subjects —
|
|
172
|
+
- Treating `messages.list` results as if they had subjects — call `gmail_get` for each id.
|
|
173
|
+
- Reading a message through `http_request` or code instead of `gmail_get`.
|
|
190
174
|
- Replying without `threadId` + `inReplyTo`/`references` — Gmail starts a new thread.
|
|
191
175
|
- Sending a placeholder (`<RECIPIENT_EMAIL>`, `recipient@example.com`) — the runtime refuses these.
|
|
192
176
|
- Inventing an address. The runtime refuses any recipient absent from the conversation and from earlier tool results; search Gmail or ask the user.
|
|
@@ -66,6 +66,29 @@
|
|
|
66
66
|
"url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts",
|
|
67
67
|
"builder": "gmail-draft"
|
|
68
68
|
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"tool": "gmail_get",
|
|
72
|
+
"description": "Read one Gmail message by id: sender, recipients, subject, date, snippet and, with format \"full\", the message text. Call it for each id that messages.list returned. Never read a message with http_request or code.",
|
|
73
|
+
"parameters": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"properties": {
|
|
76
|
+
"id": { "type": "string", "description": "Message id from messages.list" },
|
|
77
|
+
"format": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"enum": ["metadata", "full"],
|
|
80
|
+
"description": "metadata (default) for lists and summaries; full only when the user needs the message text"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"required": ["id"]
|
|
84
|
+
},
|
|
85
|
+
"request": {
|
|
86
|
+
"method": "GET",
|
|
87
|
+
"url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{id}",
|
|
88
|
+
"query": { "metadataHeaders": "Subject,From,To,Date,Message-ID,References" },
|
|
89
|
+
"builder": "gmail-get"
|
|
90
|
+
},
|
|
91
|
+
"response": { "decode": "gmail-message" }
|
|
69
92
|
}
|
|
70
93
|
]
|
|
71
94
|
}
|
|
@@ -23,7 +23,7 @@ metadata:
|
|
|
23
23
|
],
|
|
24
24
|
"configSteps": [
|
|
25
25
|
"[Open Google Cloud Console](https://console.cloud.google.com/flows/enableapi?apiid=calendar-json.googleapis.com) to enable the Google Calendar API",
|
|
26
|
-
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"
|
|
26
|
+
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"Web application\" as the type",
|
|
27
27
|
"[Open OAuth audience](https://console.cloud.google.com/auth/audience) and add your Google account as a test user"
|
|
28
28
|
],
|
|
29
29
|
"fields": [
|
|
@@ -43,7 +43,6 @@ metadata:
|
|
|
43
43
|
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
44
44
|
"tokenUrl": "https://oauth2.googleapis.com/token",
|
|
45
45
|
"tokenAuth": "secret-in-body",
|
|
46
|
-
"port": 18978,
|
|
47
46
|
"scopes": [
|
|
48
47
|
"https://www.googleapis.com/auth/calendar"
|
|
49
48
|
],
|
|
@@ -22,7 +22,7 @@ metadata:
|
|
|
22
22
|
],
|
|
23
23
|
"configSteps": [
|
|
24
24
|
"[Open Google Cloud Console](https://console.cloud.google.com/flows/enableapi?apiid=docs.googleapis.com,drive.googleapis.com) to enable the Google Docs API",
|
|
25
|
-
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"
|
|
25
|
+
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"Web application\" as the type",
|
|
26
26
|
"[Open OAuth audience](https://console.cloud.google.com/auth/audience) and add your Google account as a test user"
|
|
27
27
|
],
|
|
28
28
|
"fields": [
|
|
@@ -42,7 +42,6 @@ metadata:
|
|
|
42
42
|
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
43
43
|
"tokenUrl": "https://oauth2.googleapis.com/token",
|
|
44
44
|
"tokenAuth": "secret-in-body",
|
|
45
|
-
"port": 18978,
|
|
46
45
|
"scopes": [
|
|
47
46
|
"https://www.googleapis.com/auth/documents",
|
|
48
47
|
"https://www.googleapis.com/auth/drive"
|
|
@@ -22,7 +22,7 @@ metadata:
|
|
|
22
22
|
],
|
|
23
23
|
"configSteps": [
|
|
24
24
|
"[Open Google Cloud Console](https://console.cloud.google.com/flows/enableapi?apiid=drive.googleapis.com) to enable the Google Drive API",
|
|
25
|
-
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"
|
|
25
|
+
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"Web application\" as the type",
|
|
26
26
|
"[Open OAuth audience](https://console.cloud.google.com/auth/audience) and add your Google account as a test user"
|
|
27
27
|
],
|
|
28
28
|
"fields": [
|
|
@@ -42,7 +42,6 @@ metadata:
|
|
|
42
42
|
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
43
43
|
"tokenUrl": "https://oauth2.googleapis.com/token",
|
|
44
44
|
"tokenAuth": "secret-in-body",
|
|
45
|
-
"port": 18978,
|
|
46
45
|
"scopes": [
|
|
47
46
|
"https://www.googleapis.com/auth/drive"
|
|
48
47
|
],
|
|
@@ -23,7 +23,7 @@ metadata:
|
|
|
23
23
|
],
|
|
24
24
|
"configSteps": [
|
|
25
25
|
"[Open Google Cloud Console](https://console.cloud.google.com/flows/enableapi?apiid=sheets.googleapis.com,drive.googleapis.com) to enable the Google Sheets API",
|
|
26
|
-
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"
|
|
26
|
+
"[Open OAuth clients](https://console.cloud.google.com/auth/clients) to create an OAuth client — choose \"Web application\" as the type",
|
|
27
27
|
"[Open OAuth audience](https://console.cloud.google.com/auth/audience) and add your Google account as a test user"
|
|
28
28
|
],
|
|
29
29
|
"fields": [
|
|
@@ -43,7 +43,6 @@ metadata:
|
|
|
43
43
|
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
44
44
|
"tokenUrl": "https://oauth2.googleapis.com/token",
|
|
45
45
|
"tokenAuth": "secret-in-body",
|
|
46
|
-
"port": 18978,
|
|
47
46
|
"scopes": [
|
|
48
47
|
"https://www.googleapis.com/auth/spreadsheets",
|
|
49
48
|
"https://www.googleapis.com/auth/drive"
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Class Diagram
|
|
2
|
-
|
|
3
|
-
For code types: classes, their members, inheritance.
|
|
4
|
-
|
|
5
|
-
Budget: 7 classes.
|
|
6
|
-
|
|
7
|
-
```mermaid
|
|
8
|
-
classDiagram
|
|
9
|
-
class Animal {
|
|
10
|
-
+String name
|
|
11
|
-
+speak()
|
|
12
|
-
}
|
|
13
|
-
Animal <|-- Dog
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Rules:
|
|
17
|
-
|
|
18
|
-
- Members go inside `class Name { }`, one per line, `+` public and `-`
|
|
19
|
-
private, methods end with `()`.
|
|
20
|
-
- Inheritance is `Parent <|-- Child`; composition `Whole *-- Part`;
|
|
21
|
-
association `A --> B`.
|
|
22
|
-
- Class names are single tokens; no quotes, no `classDef` lines.
|
|
23
|
-
|
|
24
|
-
## Now draw
|
|
25
|
-
|
|
26
|
-
This recipe is all you need. Your next output is the reply itself: one fenced
|
|
27
|
-
Mermaid code block (fence language `mermaid`), then one sentence. Do not call
|
|
28
|
-
any tool - not `exec`, not `skill` again, not an image tool. A tool call here
|
|
29
|
-
means the diagram was never drawn.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# ER Diagram
|
|
2
|
-
|
|
3
|
-
For tables and their relations.
|
|
4
|
-
|
|
5
|
-
Budget: 8 entities.
|
|
6
|
-
|
|
7
|
-
```mermaid
|
|
8
|
-
erDiagram
|
|
9
|
-
USER ||--o{ ORDER : "places"
|
|
10
|
-
ORDER ||--|{ LINE_ITEM : "contains"
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Rules:
|
|
14
|
-
|
|
15
|
-
- Entities are UPPER_CASE single tokens.
|
|
16
|
-
- `||--o{` reads "one to zero-or-many"; `||--|{` "one to one-or-many";
|
|
17
|
-
`||--||` "one to one".
|
|
18
|
-
- The relationship label follows the colon in plain double quotes typed directly (no backslash in front).
|
|
19
|
-
- Attributes are optional; if used, list them inside `ENTITY { string name }`
|
|
20
|
-
blocks with one `type name` per line.
|
|
21
|
-
|
|
22
|
-
## Now draw
|
|
23
|
-
|
|
24
|
-
This recipe is all you need. Your next output is the reply itself: one fenced
|
|
25
|
-
Mermaid code block (fence language `mermaid`), then one sentence. Do not call
|
|
26
|
-
any tool - not `exec`, not `skill` again, not an image tool. A tool call here
|
|
27
|
-
means the diagram was never drawn.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Flowchart
|
|
2
|
-
|
|
3
|
-
For steps, decisions, processes, pipelines, and any "map this / structure
|
|
4
|
-
this" ask - also family trees, org charts, and reporting lines. `flowchart TD`
|
|
5
|
-
reads top-down; `flowchart LR` left-to-right for a pipeline.
|
|
6
|
-
|
|
7
|
-
Budget: 12 nodes and 16 edges. Over budget, simplify; if the detail is
|
|
8
|
-
essential, one overview block plus one detail block, never more.
|
|
9
|
-
|
|
10
|
-
```mermaid
|
|
11
|
-
flowchart LR
|
|
12
|
-
A["Request"] --> B{"Valid?"}
|
|
13
|
-
B -->|yes| C["Process"]
|
|
14
|
-
B -->|no| D["Reject with error"]
|
|
15
|
-
C --> E["Respond"]
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Rules:
|
|
19
|
-
|
|
20
|
-
- Nodes are `id["Label"]`; decisions are `id{"Question?"}` diamonds.
|
|
21
|
-
- Arrows are always `-->`; the label form is `-->|yes|`. Never `->>` here.
|
|
22
|
-
- Ids: letters, digits, underscores, starting with a letter, never reused.
|
|
23
|
-
- Every label goes in plain double quotes `"`, 40 characters or
|
|
24
|
-
fewer, `<br/>` for a line break. Never write lowercase `end` - use `"End"`.
|
|
25
|
-
- One node per person or concept, details inside its label; no separate nodes
|
|
26
|
-
for dates, roles, counts, or statuses.
|
|
27
|
-
|
|
28
|
-
## Now draw
|
|
29
|
-
|
|
30
|
-
This recipe is all you need. Your next output is the reply itself: one fenced
|
|
31
|
-
Mermaid code block (fence language `mermaid`), then one sentence. Do not call
|
|
32
|
-
any tool - not `exec`, not `skill` again, not an image tool. A tool call here
|
|
33
|
-
means the diagram was never drawn.
|