mercury-agent 0.5.0 → 0.5.2

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.
Files changed (125) hide show
  1. package/README.md +452 -451
  2. package/container/Dockerfile +127 -127
  3. package/container/Dockerfile.base +109 -109
  4. package/container/Dockerfile.power +17 -17
  5. package/container/agent-package.json +8 -8
  6. package/container/build.sh +54 -54
  7. package/docs/ROADMAP.md +3 -4
  8. package/docs/archive/summarization/2026-07-02-recent-dev-summary.md +71 -0
  9. package/docs/auth/dashboard.md +28 -28
  10. package/docs/auth/overview.md +109 -109
  11. package/docs/auth/whatsapp.md +173 -173
  12. package/docs/authoring-profiles.md +174 -174
  13. package/docs/configuration.md +54 -54
  14. package/docs/container-lifecycle.md +349 -349
  15. package/docs/{bugs/bwrap-privileged-linux-docker.md → debug/major/2026-07-02-bwrap-privileged-linux-docker.md} +21 -1
  16. package/docs/{bugs/e2big-prompt-delivery-fix.md → debug/major/2026-07-02-e2big-prompt-delivery-fix.md} +27 -1
  17. package/docs/{bugs/registry-pull-no-local-fallback.md → debug/major/2026-07-02-registry-pull-no-local-fallback.md} +27 -1
  18. package/docs/debug/summarization/2026-07-02-common-bug-patterns.md +72 -0
  19. package/docs/deployment.md +199 -199
  20. package/docs/extensions.md +375 -375
  21. package/docs/graceful-shutdown.md +62 -62
  22. package/docs/kb-distillation.md +77 -77
  23. package/docs/media/overview.md +140 -140
  24. package/docs/media/whatsapp.md +171 -171
  25. package/docs/memory.md +137 -137
  26. package/docs/permissions.md +217 -217
  27. package/docs/pipeline.md +228 -228
  28. package/docs/prd-chat-memory.md +76 -76
  29. package/docs/prd-config-load.md +82 -82
  30. package/docs/rate-limiting.md +229 -229
  31. package/docs/runbooks/publish-checklist.md +9 -1
  32. package/docs/scheduler.md +288 -288
  33. package/docs/setup-discord.md +100 -100
  34. package/docs/setup-slack.md +119 -119
  35. package/docs/setup-whatsapp.md +94 -94
  36. package/docs/subagents.md +166 -166
  37. package/docs/web-search.md +62 -62
  38. package/examples/extensions/README.md +12 -12
  39. package/examples/extensions/charts/index.ts +13 -13
  40. package/examples/extensions/charts/skill/SKILL.md +98 -98
  41. package/examples/extensions/gws/README.md +52 -52
  42. package/examples/extensions/gws/skill/SKILL.md +57 -57
  43. package/examples/extensions/gws/skill/references/calendar.md +101 -101
  44. package/examples/extensions/gws/skill/references/docs.md +65 -65
  45. package/examples/extensions/gws/skill/references/drive.md +79 -79
  46. package/examples/extensions/gws/skill/references/gmail.md +85 -85
  47. package/examples/extensions/gws/skill/references/sheets.md +60 -60
  48. package/examples/extensions/napkin/skill/SKILL.md +728 -728
  49. package/examples/extensions/pdf/skill/LICENSE.txt +30 -30
  50. package/examples/extensions/pdf/skill/SKILL.md +314 -314
  51. package/examples/extensions/pdf/skill/forms.md +294 -294
  52. package/examples/extensions/pdf/skill/reference.md +611 -611
  53. package/examples/extensions/pdf/skill/scripts/check_bounding_boxes.py +65 -65
  54. package/examples/extensions/pdf/skill/scripts/check_fillable_fields.py +11 -11
  55. package/examples/extensions/pdf/skill/scripts/convert_pdf_to_images.py +33 -33
  56. package/examples/extensions/pdf/skill/scripts/create_validation_image.py +37 -37
  57. package/examples/extensions/pdf/skill/scripts/extract_form_field_info.py +122 -122
  58. package/examples/extensions/pdf/skill/scripts/extract_form_structure.py +115 -115
  59. package/examples/extensions/pdf/skill/scripts/fill_fillable_fields.py +98 -98
  60. package/examples/extensions/pdf/skill/scripts/fill_pdf_form_with_annotations.py +107 -107
  61. package/examples/extensions/permission-guard/index.ts +65 -65
  62. package/examples/extensions/pinchtab/skill/SKILL.md +224 -224
  63. package/examples/extensions/pinchtab/skill/TRUST.md +69 -69
  64. package/examples/extensions/pinchtab/skill/references/api.md +297 -297
  65. package/examples/extensions/pinchtab/skill/references/env.md +45 -45
  66. package/examples/extensions/pinchtab/skill/references/profiles.md +107 -107
  67. package/examples/extensions/tradestation/host/refresh.ts +102 -102
  68. package/examples/extensions/tradestation/index.ts +153 -153
  69. package/examples/extensions/tradestation/skill/SKILL.md +67 -67
  70. package/examples/extensions/voice-synth/index.ts +94 -94
  71. package/examples/extensions/voice-synth/skill/SKILL.md +38 -38
  72. package/examples/extensions/voice-transcribe/requirements.txt +8 -8
  73. package/examples/extensions/voice-transcribe/scripts/transcribe.py +179 -179
  74. package/examples/extensions/voice-transcribe/skill/SKILL.md +53 -53
  75. package/examples/extensions/yahoo-mail/cli/package.json +13 -13
  76. package/examples/extensions/yahoo-mail/skill/SKILL.md +78 -78
  77. package/package.json +106 -106
  78. package/resources/agents/explore.md +50 -50
  79. package/resources/agents/worker.md +24 -24
  80. package/resources/connection-env-vars.json +25 -25
  81. package/resources/pi-extensions/subagent/agents.ts +126 -126
  82. package/resources/pi-extensions/subagent/index.ts +964 -964
  83. package/resources/profiles/coding/AGENTS.md +43 -43
  84. package/resources/profiles/coding/mercury-profile.yaml +15 -15
  85. package/resources/profiles/general/AGENTS.md +31 -31
  86. package/resources/profiles/general/mercury-profile.yaml +15 -15
  87. package/resources/profiles/research/AGENTS.md +40 -40
  88. package/resources/profiles/research/mercury-profile.yaml +15 -15
  89. package/resources/skills/config/SKILL.md +25 -25
  90. package/resources/skills/context/SKILL.md +33 -33
  91. package/resources/skills/conversation-recap/SKILL.md +19 -19
  92. package/resources/skills/mutes/SKILL.md +31 -31
  93. package/resources/skills/permissions/SKILL.md +19 -19
  94. package/resources/skills/preferences/SKILL.md +31 -31
  95. package/resources/skills/recall/SKILL.md +24 -24
  96. package/resources/skills/roles/SKILL.md +18 -18
  97. package/resources/skills/spaces/SKILL.md +18 -18
  98. package/resources/skills/tasks/SKILL.md +45 -45
  99. package/resources/templates/AGENTS.md +157 -157
  100. package/resources/templates/env.template +38 -38
  101. package/resources/templates/mercury.example.yaml +99 -99
  102. package/src/agent/container-entry.ts +1 -1
  103. package/src/agent/container-runner.ts +1345 -1346
  104. package/src/cli/mercury.ts +39 -7
  105. package/src/cli/mrctl.ts +636 -636
  106. package/src/config-file.ts +540 -540
  107. package/src/config.ts +339 -339
  108. package/src/core/api.ts +125 -125
  109. package/src/core/caller-token.ts +101 -101
  110. package/src/core/permissions.ts +228 -228
  111. package/src/core/profiles.ts +271 -271
  112. package/src/core/routes/capability.ts +70 -70
  113. package/src/core/routes/index.ts +15 -15
  114. package/src/core/runtime.ts +1530 -1530
  115. package/src/dashboard/index.html +729 -729
  116. package/src/extensions/api.ts +273 -273
  117. package/src/extensions/loader.ts +286 -286
  118. package/src/extensions/types.ts +517 -517
  119. package/src/main.ts +605 -605
  120. package/docs/pending-updates/applicative-profiles.md +0 -15
  121. package/docs/pending-updates/caller-bound-capability-token.md +0 -15
  122. package/docs/pending-updates/dm-auto-space.md +0 -15
  123. /package/docs/archive/{2026-07-01-applicative-profiles.md → applicative-profiles/2026-07-01-applicative-profiles.md} +0 -0
  124. /package/docs/archive/{2026-07-01-caller-bound-capability-token.md → applicative-profiles/2026-07-01-caller-bound-capability-token.md} +0 -0
  125. /package/docs/archive/{2026-07-01-dm-auto-space.md → applicative-profiles/2026-07-01-dm-auto-space.md} +0 -0
@@ -1,65 +1,65 @@
1
- # Docs Reference
2
-
3
- Use `gws docs` for reading and writing Google Docs.
4
-
5
- ## Read a document
6
-
7
- First find the document ID from Drive:
8
-
9
- ```bash
10
- # Find document by name
11
- gws drive files list --params '{"q":"name contains '\''Meeting Notes'\'' and mimeType = '\''application/vnd.google-apps.document'\''","pageSize":5}'
12
- ```
13
-
14
- Then export its content as plain text:
15
-
16
- ```bash
17
- gws drive files export --params '{"fileId":"<DOC_ID>","mimeType":"text/plain"}' --output /tmp/doc.txt
18
- cat /tmp/doc.txt
19
- ```
20
-
21
- ## Summarize a document
22
-
23
- Read the document with the export method above, then summarize the content in plain language. Never paste the raw text export as-is — always translate into a concise summary.
24
-
25
- ## Append text to a document
26
-
27
- ```bash
28
- gws docs +write --document <DOC_ID> --text 'New paragraph to append.'
29
- ```
30
-
31
- Text is inserted at the end of the document body. For multiline content, use `$'...'` shell quoting:
32
-
33
- ```bash
34
- gws docs +write --document <DOC_ID> --text $'Line one.\nLine two.'
35
- ```
36
-
37
- ## Read document metadata
38
-
39
- ```bash
40
- gws docs documents get --params '{"documentId":"<DOC_ID>"}'
41
- ```
42
-
43
- Useful fields: `title`, `body.content` (structured content). For plain reading, prefer the Drive export approach above.
44
-
45
- ## Raw API fallback
46
-
47
- ```bash
48
- gws docs --help # list all subcommands
49
- gws docs documents --help
50
- ```
51
-
52
- For rich formatting (headings, bold, tables), use the raw `documents.batchUpdate` API:
53
-
54
- ```bash
55
- gws docs documents batchUpdate \
56
- --params '{"documentId":"<DOC_ID>"}' \
57
- --json '{"requests":[{"insertText":{"location":{"index":1},"text":"Hello\n"}}]}'
58
- ```
59
-
60
- ## Output format rules
61
-
62
- - Document found: say "I found your doc — [title]"
63
- - Summary: present as a plain paragraph or bullet list of key points
64
- - Append confirmation: "Added your text to '[document title]'"
65
- - Never show document IDs, revision IDs, or raw JSON content structures
1
+ # Docs Reference
2
+
3
+ Use `gws docs` for reading and writing Google Docs.
4
+
5
+ ## Read a document
6
+
7
+ First find the document ID from Drive:
8
+
9
+ ```bash
10
+ # Find document by name
11
+ gws drive files list --params '{"q":"name contains '\''Meeting Notes'\'' and mimeType = '\''application/vnd.google-apps.document'\''","pageSize":5}'
12
+ ```
13
+
14
+ Then export its content as plain text:
15
+
16
+ ```bash
17
+ gws drive files export --params '{"fileId":"<DOC_ID>","mimeType":"text/plain"}' --output /tmp/doc.txt
18
+ cat /tmp/doc.txt
19
+ ```
20
+
21
+ ## Summarize a document
22
+
23
+ Read the document with the export method above, then summarize the content in plain language. Never paste the raw text export as-is — always translate into a concise summary.
24
+
25
+ ## Append text to a document
26
+
27
+ ```bash
28
+ gws docs +write --document <DOC_ID> --text 'New paragraph to append.'
29
+ ```
30
+
31
+ Text is inserted at the end of the document body. For multiline content, use `$'...'` shell quoting:
32
+
33
+ ```bash
34
+ gws docs +write --document <DOC_ID> --text $'Line one.\nLine two.'
35
+ ```
36
+
37
+ ## Read document metadata
38
+
39
+ ```bash
40
+ gws docs documents get --params '{"documentId":"<DOC_ID>"}'
41
+ ```
42
+
43
+ Useful fields: `title`, `body.content` (structured content). For plain reading, prefer the Drive export approach above.
44
+
45
+ ## Raw API fallback
46
+
47
+ ```bash
48
+ gws docs --help # list all subcommands
49
+ gws docs documents --help
50
+ ```
51
+
52
+ For rich formatting (headings, bold, tables), use the raw `documents.batchUpdate` API:
53
+
54
+ ```bash
55
+ gws docs documents batchUpdate \
56
+ --params '{"documentId":"<DOC_ID>"}' \
57
+ --json '{"requests":[{"insertText":{"location":{"index":1},"text":"Hello\n"}}]}'
58
+ ```
59
+
60
+ ## Output format rules
61
+
62
+ - Document found: say "I found your doc — [title]"
63
+ - Summary: present as a plain paragraph or bullet list of key points
64
+ - Append confirmation: "Added your text to '[document title]'"
65
+ - Never show document IDs, revision IDs, or raw JSON content structures
@@ -1,79 +1,79 @@
1
- # Drive Reference
2
-
3
- Use `gws drive` for all Google Drive operations.
4
-
5
- ## List files in root (My Drive)
6
-
7
- ```bash
8
- gws drive files list --params '{"pageSize":20}'
9
- ```
10
-
11
- Response fields to use: `name`, `mimeType`, `modifiedTime`. Never show `id` to the user — keep it for follow-up commands.
12
-
13
- ## List files in a specific folder
14
-
15
- First get the folder ID from a `files list` call (store internally):
16
-
17
- ```bash
18
- # Find folder by name
19
- gws drive files list --params '{"q":"name = '\''Reports'\'' and mimeType = '\''application/vnd.google-apps.folder'\''","pageSize":5}'
20
-
21
- # List files inside the folder
22
- gws drive files list --params '{"q":"'\''<FOLDER_ID>'\'' in parents","pageSize":20}'
23
- ```
24
-
25
- ## Search by name
26
-
27
- ```bash
28
- gws drive files list --params '{"q":"name contains '\''budget'\''","pageSize":10}'
29
- ```
30
-
31
- ## Upload a file
32
-
33
- ```bash
34
- # Upload to root
35
- gws drive +upload ./report.pdf
36
-
37
- # Upload to a specific folder
38
- gws drive +upload ./report.pdf --parent <FOLDER_ID>
39
-
40
- # Upload with a custom name
41
- gws drive +upload ./data.csv --name 'Sales Data Q1.csv'
42
- ```
43
-
44
- ## Create a folder
45
-
46
- ```bash
47
- gws drive files create --json '{"name":"New Folder","mimeType":"application/vnd.google-apps.folder"}'
48
-
49
- # Inside an existing folder
50
- gws drive files create --json '{"name":"Sub Folder","mimeType":"application/vnd.google-apps.folder","parents":["<PARENT_FOLDER_ID>"]}'
51
- ```
52
-
53
- ## Move a file to a folder
54
-
55
- ```bash
56
- gws drive files update --params '{"fileId":"<FILE_ID>","addParents":"<FOLDER_ID>","removeParents":"root"}'
57
- ```
58
-
59
- ## Download a file
60
-
61
- ```bash
62
- gws drive files download --params '{"fileId":"<FILE_ID>"}' --output ./downloaded-file.pdf
63
-
64
- # Export a Google Doc as plain text
65
- gws drive files export --params '{"fileId":"<DOC_ID>","mimeType":"text/plain"}' --output ./doc.txt
66
- ```
67
-
68
- ## Raw API fallback
69
-
70
- ```bash
71
- gws drive files --help # list all files subcommands
72
- ```
73
-
74
- ## Output format rules
75
-
76
- - List files as: "1. Budget 2026 (Google Sheets) — modified 3 days ago"
77
- - Translate MIME types: `application/vnd.google-apps.document` → "Google Doc", `application/vnd.google-apps.spreadsheet` → "spreadsheet", `application/vnd.google-apps.folder` → "folder", `application/pdf` → "PDF"
78
- - Never show `fileId`, `parents`, or any other ID field
79
- - Upload confirmation: "Uploaded report.pdf to your Drive" (or "to the Reports folder" if parent specified)
1
+ # Drive Reference
2
+
3
+ Use `gws drive` for all Google Drive operations.
4
+
5
+ ## List files in root (My Drive)
6
+
7
+ ```bash
8
+ gws drive files list --params '{"pageSize":20}'
9
+ ```
10
+
11
+ Response fields to use: `name`, `mimeType`, `modifiedTime`. Never show `id` to the user — keep it for follow-up commands.
12
+
13
+ ## List files in a specific folder
14
+
15
+ First get the folder ID from a `files list` call (store internally):
16
+
17
+ ```bash
18
+ # Find folder by name
19
+ gws drive files list --params '{"q":"name = '\''Reports'\'' and mimeType = '\''application/vnd.google-apps.folder'\''","pageSize":5}'
20
+
21
+ # List files inside the folder
22
+ gws drive files list --params '{"q":"'\''<FOLDER_ID>'\'' in parents","pageSize":20}'
23
+ ```
24
+
25
+ ## Search by name
26
+
27
+ ```bash
28
+ gws drive files list --params '{"q":"name contains '\''budget'\''","pageSize":10}'
29
+ ```
30
+
31
+ ## Upload a file
32
+
33
+ ```bash
34
+ # Upload to root
35
+ gws drive +upload ./report.pdf
36
+
37
+ # Upload to a specific folder
38
+ gws drive +upload ./report.pdf --parent <FOLDER_ID>
39
+
40
+ # Upload with a custom name
41
+ gws drive +upload ./data.csv --name 'Sales Data Q1.csv'
42
+ ```
43
+
44
+ ## Create a folder
45
+
46
+ ```bash
47
+ gws drive files create --json '{"name":"New Folder","mimeType":"application/vnd.google-apps.folder"}'
48
+
49
+ # Inside an existing folder
50
+ gws drive files create --json '{"name":"Sub Folder","mimeType":"application/vnd.google-apps.folder","parents":["<PARENT_FOLDER_ID>"]}'
51
+ ```
52
+
53
+ ## Move a file to a folder
54
+
55
+ ```bash
56
+ gws drive files update --params '{"fileId":"<FILE_ID>","addParents":"<FOLDER_ID>","removeParents":"root"}'
57
+ ```
58
+
59
+ ## Download a file
60
+
61
+ ```bash
62
+ gws drive files download --params '{"fileId":"<FILE_ID>"}' --output ./downloaded-file.pdf
63
+
64
+ # Export a Google Doc as plain text
65
+ gws drive files export --params '{"fileId":"<DOC_ID>","mimeType":"text/plain"}' --output ./doc.txt
66
+ ```
67
+
68
+ ## Raw API fallback
69
+
70
+ ```bash
71
+ gws drive files --help # list all files subcommands
72
+ ```
73
+
74
+ ## Output format rules
75
+
76
+ - List files as: "1. Budget 2026 (Google Sheets) — modified 3 days ago"
77
+ - Translate MIME types: `application/vnd.google-apps.document` → "Google Doc", `application/vnd.google-apps.spreadsheet` → "spreadsheet", `application/vnd.google-apps.folder` → "folder", `application/pdf` → "PDF"
78
+ - Never show `fileId`, `parents`, or any other ID field
79
+ - Upload confirmation: "Uploaded report.pdf to your Drive" (or "to the Reports folder" if parent specified)
@@ -1,85 +1,85 @@
1
- # Gmail Reference
2
-
3
- Use `gws gmail` for all email operations. All helpers are read-only except `+send`, `+reply`, `+reply-all`, and `+forward`.
4
-
5
- ## Triage inbox
6
-
7
- ```bash
8
- # Show unread messages (default: 20)
9
- gws gmail +triage
10
-
11
- # Limit count or filter by search query
12
- gws gmail +triage --max 10
13
- gws gmail +triage --query 'from:boss@example.com'
14
- gws gmail +triage --query 'is:unread subject:invoice'
15
- ```
16
-
17
- Output fields: sender, subject, date. Never show `messageId`, `threadId`, or `labelIds`.
18
-
19
- ## Read a message
20
-
21
- First get the message ID from `+triage` output (use internally only — never show it to the user).
22
-
23
- ```bash
24
- gws gmail +read --id <MESSAGE_ID>
25
- gws gmail +read --id <MESSAGE_ID> --headers # includes From, To, Subject, Date
26
- ```
27
-
28
- Present: sender name, subject, date, and a plain-text summary of the body.
29
-
30
- ## Send a new email
31
-
32
- ```bash
33
- gws gmail +send --to alice@example.com --subject 'Hello' --body 'Hi Alice!'
34
-
35
- # With CC / BCC
36
- gws gmail +send --to alice@example.com --subject 'Report' --body 'See attached' \
37
- --cc bob@example.com --bcc charlie@example.com
38
-
39
- # With attachment
40
- gws gmail +send --to alice@example.com --subject 'Report' --body 'Attached.' -a report.pdf
41
-
42
- # Save as draft first, then confirm with user before sending
43
- gws gmail +send --to alice@example.com --subject 'Hello' --body 'Hi!' --draft
44
- ```
45
-
46
- Always confirm recipient and subject with the user before sending.
47
-
48
- ## Reply to a message
49
-
50
- ```bash
51
- gws gmail +reply --message-id <MESSAGE_ID> --body 'Thanks, got it!'
52
-
53
- # Reply-all
54
- gws gmail +reply-all --message-id <MESSAGE_ID> --body 'Noted — will follow up.'
55
- ```
56
-
57
- Handles threading (In-Reply-To, References) automatically.
58
-
59
- ## Forward a message
60
-
61
- ```bash
62
- gws gmail +forward --message-id <MESSAGE_ID> --to dave@example.com
63
- gws gmail +forward --message-id <MESSAGE_ID> --to dave@example.com --body 'FYI see below'
64
- ```
65
-
66
- ## Raw API fallback
67
-
68
- ```bash
69
- # List messages with custom query
70
- gws gmail users messages list --params '{"userId":"me","q":"is:unread","maxResults":10}'
71
-
72
- # Get message metadata
73
- gws gmail users messages get --params '{"userId":"me","id":"<MESSAGE_ID>","format":"metadata"}'
74
-
75
- # Modify labels (e.g. archive = remove INBOX label)
76
- gws gmail users messages modify --params '{"userId":"me","id":"<MESSAGE_ID>"}' \
77
- --json '{"removeLabelIds":["INBOX"]}'
78
- ```
79
-
80
- ## Output format rules
81
-
82
- - Show sender name and subject; never show `messageId`, `threadId`, or `labelIds`
83
- - Present a triage summary as a numbered list: "1. From Alice — Re: Invoice (2 hours ago)"
84
- - For send/reply confirmations: "Sent to Alice — subject: Hello"
85
- - Errors: say "I couldn't send the email" — never show HTTP status codes or API error objects
1
+ # Gmail Reference
2
+
3
+ Use `gws gmail` for all email operations. All helpers are read-only except `+send`, `+reply`, `+reply-all`, and `+forward`.
4
+
5
+ ## Triage inbox
6
+
7
+ ```bash
8
+ # Show unread messages (default: 20)
9
+ gws gmail +triage
10
+
11
+ # Limit count or filter by search query
12
+ gws gmail +triage --max 10
13
+ gws gmail +triage --query 'from:boss@example.com'
14
+ gws gmail +triage --query 'is:unread subject:invoice'
15
+ ```
16
+
17
+ Output fields: sender, subject, date. Never show `messageId`, `threadId`, or `labelIds`.
18
+
19
+ ## Read a message
20
+
21
+ First get the message ID from `+triage` output (use internally only — never show it to the user).
22
+
23
+ ```bash
24
+ gws gmail +read --id <MESSAGE_ID>
25
+ gws gmail +read --id <MESSAGE_ID> --headers # includes From, To, Subject, Date
26
+ ```
27
+
28
+ Present: sender name, subject, date, and a plain-text summary of the body.
29
+
30
+ ## Send a new email
31
+
32
+ ```bash
33
+ gws gmail +send --to alice@example.com --subject 'Hello' --body 'Hi Alice!'
34
+
35
+ # With CC / BCC
36
+ gws gmail +send --to alice@example.com --subject 'Report' --body 'See attached' \
37
+ --cc bob@example.com --bcc charlie@example.com
38
+
39
+ # With attachment
40
+ gws gmail +send --to alice@example.com --subject 'Report' --body 'Attached.' -a report.pdf
41
+
42
+ # Save as draft first, then confirm with user before sending
43
+ gws gmail +send --to alice@example.com --subject 'Hello' --body 'Hi!' --draft
44
+ ```
45
+
46
+ Always confirm recipient and subject with the user before sending.
47
+
48
+ ## Reply to a message
49
+
50
+ ```bash
51
+ gws gmail +reply --message-id <MESSAGE_ID> --body 'Thanks, got it!'
52
+
53
+ # Reply-all
54
+ gws gmail +reply-all --message-id <MESSAGE_ID> --body 'Noted — will follow up.'
55
+ ```
56
+
57
+ Handles threading (In-Reply-To, References) automatically.
58
+
59
+ ## Forward a message
60
+
61
+ ```bash
62
+ gws gmail +forward --message-id <MESSAGE_ID> --to dave@example.com
63
+ gws gmail +forward --message-id <MESSAGE_ID> --to dave@example.com --body 'FYI see below'
64
+ ```
65
+
66
+ ## Raw API fallback
67
+
68
+ ```bash
69
+ # List messages with custom query
70
+ gws gmail users messages list --params '{"userId":"me","q":"is:unread","maxResults":10}'
71
+
72
+ # Get message metadata
73
+ gws gmail users messages get --params '{"userId":"me","id":"<MESSAGE_ID>","format":"metadata"}'
74
+
75
+ # Modify labels (e.g. archive = remove INBOX label)
76
+ gws gmail users messages modify --params '{"userId":"me","id":"<MESSAGE_ID>"}' \
77
+ --json '{"removeLabelIds":["INBOX"]}'
78
+ ```
79
+
80
+ ## Output format rules
81
+
82
+ - Show sender name and subject; never show `messageId`, `threadId`, or `labelIds`
83
+ - Present a triage summary as a numbered list: "1. From Alice — Re: Invoice (2 hours ago)"
84
+ - For send/reply confirmations: "Sent to Alice — subject: Hello"
85
+ - Errors: say "I couldn't send the email" — never show HTTP status codes or API error objects
@@ -1,60 +1,60 @@
1
- # Sheets Reference
2
-
3
- Use `gws sheets` for reading and writing Google Sheets.
4
-
5
- ## Read values from a spreadsheet
6
-
7
- First find the spreadsheet ID from Drive (store internally — never show to user):
8
-
9
- ```bash
10
- # Find spreadsheet by name
11
- gws drive files list --params '{"q":"name contains '\''Budget'\'' and mimeType = '\''application/vnd.google-apps.spreadsheet'\''","pageSize":5}'
12
- ```
13
-
14
- Then read a range:
15
-
16
- ```bash
17
- # Read a named range or A1 notation
18
- gws sheets +read --spreadsheet <SPREADSHEET_ID> --range 'Sheet1!A1:D10'
19
-
20
- # Read an entire sheet (by tab name)
21
- gws sheets +read --spreadsheet <SPREADSHEET_ID> --range Sheet1
22
- ```
23
-
24
- Present the data as a plain summary or a simple list — not as a raw JSON array.
25
-
26
- ## Append a row
27
-
28
- ```bash
29
- # Simple comma-separated values (single row)
30
- gws sheets +append --spreadsheet <SPREADSHEET_ID> --values 'Alice,100,true'
31
-
32
- # Multiple rows (JSON array of arrays)
33
- gws sheets +append --spreadsheet <SPREADSHEET_ID> \
34
- --json-values '[["Alice","100","true"],["Bob","200","false"]]'
35
- ```
36
-
37
- Values are appended after the last row that contains data.
38
-
39
- ## Read all data and summarize
40
-
41
- ```bash
42
- gws sheets +read --spreadsheet <SPREADSHEET_ID> --range Sheet1 --format table
43
- ```
44
-
45
- Parse the table output to provide a plain-language summary (e.g. "The sheet has 42 rows. The highest value in column B is 250.").
46
-
47
- ## Raw API fallback
48
-
49
- ```bash
50
- gws sheets spreadsheets get --params '{"spreadsheetId":"<SPREADSHEET_ID>"}' # metadata + sheet names
51
- gws sheets spreadsheets values get --params '{"spreadsheetId":"<SPREADSHEET_ID>","range":"Sheet1!A1:Z100"}'
52
- gws sheets --help # list all subcommands
53
- ```
54
-
55
- ## Output format rules
56
-
57
- - Read results: present as a short prose summary or a simple list — never paste raw JSON arrays
58
- - Append confirmation: "Added a row to '[spreadsheet name]'"
59
- - Never show spreadsheet IDs, sheet GIDs, or raw cell object structures
60
- - If the range is empty, say "That range appears to be empty"
1
+ # Sheets Reference
2
+
3
+ Use `gws sheets` for reading and writing Google Sheets.
4
+
5
+ ## Read values from a spreadsheet
6
+
7
+ First find the spreadsheet ID from Drive (store internally — never show to user):
8
+
9
+ ```bash
10
+ # Find spreadsheet by name
11
+ gws drive files list --params '{"q":"name contains '\''Budget'\'' and mimeType = '\''application/vnd.google-apps.spreadsheet'\''","pageSize":5}'
12
+ ```
13
+
14
+ Then read a range:
15
+
16
+ ```bash
17
+ # Read a named range or A1 notation
18
+ gws sheets +read --spreadsheet <SPREADSHEET_ID> --range 'Sheet1!A1:D10'
19
+
20
+ # Read an entire sheet (by tab name)
21
+ gws sheets +read --spreadsheet <SPREADSHEET_ID> --range Sheet1
22
+ ```
23
+
24
+ Present the data as a plain summary or a simple list — not as a raw JSON array.
25
+
26
+ ## Append a row
27
+
28
+ ```bash
29
+ # Simple comma-separated values (single row)
30
+ gws sheets +append --spreadsheet <SPREADSHEET_ID> --values 'Alice,100,true'
31
+
32
+ # Multiple rows (JSON array of arrays)
33
+ gws sheets +append --spreadsheet <SPREADSHEET_ID> \
34
+ --json-values '[["Alice","100","true"],["Bob","200","false"]]'
35
+ ```
36
+
37
+ Values are appended after the last row that contains data.
38
+
39
+ ## Read all data and summarize
40
+
41
+ ```bash
42
+ gws sheets +read --spreadsheet <SPREADSHEET_ID> --range Sheet1 --format table
43
+ ```
44
+
45
+ Parse the table output to provide a plain-language summary (e.g. "The sheet has 42 rows. The highest value in column B is 250.").
46
+
47
+ ## Raw API fallback
48
+
49
+ ```bash
50
+ gws sheets spreadsheets get --params '{"spreadsheetId":"<SPREADSHEET_ID>"}' # metadata + sheet names
51
+ gws sheets spreadsheets values get --params '{"spreadsheetId":"<SPREADSHEET_ID>","range":"Sheet1!A1:Z100"}'
52
+ gws sheets --help # list all subcommands
53
+ ```
54
+
55
+ ## Output format rules
56
+
57
+ - Read results: present as a short prose summary or a simple list — never paste raw JSON arrays
58
+ - Append confirmation: "Added a row to '[spreadsheet name]'"
59
+ - Never show spreadsheet IDs, sheet GIDs, or raw cell object structures
60
+ - If the range is empty, say "That range appears to be empty"