@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/hash.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Autogenerated by scripts/build.mjs from skills/. Do not edit.
2
- export const SKILLS_HASH = 'ba65671970b03d38'
2
+ export const SKILLS_HASH = '0eb3f5d497a4b6b8'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qvac/skills",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Skills for the QV.AC app — the SKILL.md tree plus a content-addressed bundle of it.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -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
  }
@@ -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, load its recipe, write the code block, close its
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["User sends a message"] --> B{"Needs a tool?"}
25
- B -->|yes| C["Run the tool"]
26
- B -->|no| D["Answer directly"]
47
+ A["First step"] --> B{"Condition?"}
48
+ B -->|yes| C["Second step"]
49
+ B -->|no| D["Other step"]
27
50
  ```
28
51
 
29
- Flow of a message through the assistant.
30
-
31
- ## Pick the Type, Then Load Its Recipe
32
-
33
- Each type's syntax lives in its own reference file, named by the Mermaid
34
- keyword. Pick the type from the ask, then call the `skill` tool with
35
- `name: "diagrams"` and `file: "references/<type>.md"` in the SAME turn you
36
- draw, BEFORE writing the fence - even when you drew another diagram earlier in
37
- this chat. Copy the recipe's syntax exactly; a diagram written from memory is
38
- the usual cause of a parse error. Each load is a real `skill` tool call -
39
- printing the call as JSON or text in your reply loads nothing. After the load,
40
- reply with the fenced block directly: no further tool calls of any kind.
41
-
42
- | The ask | Type | File |
43
- | ---------------------------------------------------- | ------------------- | --------------------------- |
44
- | steps, decisions, a process, "map / structure this" | `flowchart TD` | `references/flowchart.md` |
45
- | a pipeline left to right | `flowchart LR` | `references/flowchart.md` |
46
- | a family tree, org chart, reporting lines | `flowchart TD` | `references/flowchart.md` |
47
- | who calls whom over time, requests and replies | `sequenceDiagram` | `references/sequence.md` |
48
- | modes and transitions | `stateDiagram-v2` | `references/state.md` |
49
- | tables and their relations | `erDiagram` | `references/er.md` |
50
- | code types, classes, inheritance | `classDiagram` | `references/class.md` |
51
- | a schedule or plan with durations | `gantt` | `references/gantt.md` |
52
- | dated events in order | `timeline` | `references/timeline.md` |
53
- | shares of a whole, percentages | `pie` | `references/pie.md` |
54
- | a brainstorm, idea tree, "mindmap" | `mindmap` | `references/mindmap.md` |
55
-
56
- Use `gitGraph` ONLY when the user names it. Never use experimental or beta
57
- diagram types, and never invent a keyword a recipe does not show.
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 the type keyword from the table. Default to
63
- ONE block; use two only when the recipe's budget forces an overview plus one
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-load the type's recipe and fix
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 table |
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 |
@@ -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
- - **Creating a new workbook** (no existing file involved, including one that embeds
36
- an image): call the `skill` tool with `name: "excel"` and
37
- `file: "references/create.md"`.
38
- - **Editing an attached workbook** (change cells, add/insert/delete rows, columns or
39
- sheets, or embed an image into one that already exists): call the `skill` tool with
40
- `name: "excel"` and `file: "references/edit.md"`.
41
- - **Answering from an attached workbook** (a summary, a question answered,
42
- values pulled into the chat — the deliverable is your reply, not a file): call
43
- the `skill` tool with `name: "excel"` and `file: "references/read.md"`.
44
- - **Read then build** (e.g. "summarize this workbook into a new file"): load
45
- `references/read.md` and the create or edit file — the read call runs first.
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.
@@ -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 \"Desktop app\" as the type",
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
- Use `gmail_send` to send, `gmail_draft` to draft, and `http_request` for everything else (list, search, get, labels, trash). The Gmail credential is attached automatically to every `gmail.googleapis.com` request — **never include an `auth` block**.
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
- ## Common Operations
78
+ ## Read messages
80
79
 
81
- ### List or search messages
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
- `messages.list` returns `{id, threadId}` pairs only — no subjects, no snippets. To summarize you need a follow-up `messages.get` per id. Use `q` for Gmail search syntax (`from:`, `subject:`, `is:unread`, `newer_than:7d`, `has:attachment`, `label:work`). Keep `maxResults` ≤ 10.
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
- ### Get a message (metadata)
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
- ### Get a message (full body)
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
- ```json
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. Get the original with `format=metadata` and headers `Message-ID,References,Subject,From,Reply-To`; capture its `threadId`.
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 full bodies only when asked.
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 — they need a follow-up `messages.get`.
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 \"Desktop app\" as the type",
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 \"Desktop app\" as the type",
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 \"Desktop app\" as the type",
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 \"Desktop app\" as the type",
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.