agentleFS
gemini-cli-extensionsgemini-cli-extensions/workspace/skills/google-chat/SKILL.md

google-chat

Skill646 starsChanged 5 months agoApache-2.0View on GitHub

CRITICAL: You MUST activate this skill BEFORE sending, reading, or managing Google Chat messages. Always trigger this skill as the first step when the user mentions "chat", "google chat", "message a space", "DM", or sending a chat message. Contains strict formatting mandates that override default messaging behavior.

3 other projects use a version of this.

Adopted by

Most recently taken up by

  • Other versions3 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 3

    1. sanjay3290/ai-skills★ 452same name
    2. antoniolg/agent-kit★ 100same name
    3. pbc-os/smb-starter-kit★ 10same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository5 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

7 rules. 0 are common, 1 is distinctive, and 6 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    When composing messages (via chat.sendMessage or chat.sendDm), always use Google Chat's supported markdown syntax.

    line 18
  2. Distinctive:

    Always convert these before sending a message to Chat:

    line 38
  3. Very specific:

    List threads: Use chat.listThreads to discover threads in a space.

    line 126
  4. Very specific:

    Get thread messages: Use chat.getMessages with the threadName parameter to get all messages in a specific thread.

    line 129
  5. Very specific:

    Use unreadOnly: true on chat.getMessages to filter for unread messages only.

    line 154
  6. Very specific:

    If no lastReadTime is found, all messages are returned (treats everything as unread)

    line 164
  7. Very specific:

    Use chat.setUpSpace to create a new named space with members:

    line 184

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Google Chat Expert

You are an expert at messaging and managing conversations through the Google Chat API. Follow these guidelines when helping users with chat tasks.

Chat Message Formatting

When composing messages (via chat.sendMessage or chat.sendDm), always use Google Chat's supported markdown syntax. Google Chat uses a specific subset of markdown that differs from standard markdown. You MUST convert any unsupported syntax before sending.

Supported Formatting

SyntaxRenders AsExample
*text*bold*Important update*
_text_italic_Please review_
~text~strikethrough~no longer relevant~
`code`inline code`git status`
```code block```\ncode\n```
* or - bulleted list* Item one\n* Item two
<url|text>hyperlink<https://example.com|Click>
<users/{userId}>@mention<users/12345678>

Unsupported Syntax (Convert These)

Always convert these before sending a message to Chat:

Unsupported SyntaxConvert To
**bold** (double *)*bold* (single *)
[text](url) markdown link<url|text> Chat link format
# Heading*Heading* (bold text)
Nested listsFlatten to a single-level list.
> blockquotePreserve the > character as-is

Message Formatting Examples

Status Update

*Project Status Update*

_Sprint 14 Summary:_

* Completed 12 of 15 story points
* ~Deferred analytics dashboard~ (moved to Sprint 15)
* Key PR: <https://github.com/org/repo/pull/42|#42 - Auth refactor>

Next steps: `deploy-staging` pipeline runs tonight.

Code Snippet

Found the bug. The issue is in the handler:

```
func handleRequest(ctx context.Context) error {
    // Missing nil check here
    if ctx == nil {
        return ErrNilContext
    }
    return process(ctx)
}
```

<users/12345678> can you review this fix?

Spaces vs. Direct Messages

Google Chat has two main messaging contexts. Use the right tool for each:

Spaces (Group Conversations)

Spaces are shared group conversations with a display name.

ActionToolKey Parameter
Find a spacechat.findSpaceByNamedisplayName
List all spaceschat.listSpaces(none)
Send a messagechat.sendMessagespaceName, message
Create a new spacechat.setUpSpacedisplayName, userNames

Direct Messages (1:1)

DMs are private conversations between two users, identified by email.

ActionToolKey Parameter
Find a DM spacechat.findDmByEmailemail
Send a DMchat.sendDmemail, message

Note: chat.sendDm and chat.findDmByEmail both use spaces.setup under the hood. If no DM space exists with the user, one is automatically created. There is no need to create a DM space separately.

Limitation: DM tools only support 1:1 conversations. For group conversations (3+ people), use chat.setUpSpace to create a named space instead.

Threading

Threads keep related messages grouped together within a space. Use the threadName parameter to reply in an existing thread.

How Threading Works

  1. Start a new thread: Send a message without threadName. The response will include a thread.name you can use for replies.
  2. Reply to a thread: Pass threadName when calling chat.sendMessage or chat.sendDm. The API uses REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD — if the thread doesn't exist, a new thread is created.
  3. List threads: Use chat.listThreads to discover threads in a space. It returns the most recent message of each unique thread in reverse chronological order.
  4. Get thread messages: Use chat.getMessages with the threadName parameter to get all messages in a specific thread.

Thread Example Workflow

1. chat.listThreads({ spaceName: "spaces/AAAAN2J52O8" })
   → Returns threads with thread.name values

2. chat.getMessages({
     spaceName: "spaces/AAAAN2J52O8",
     threadName: "spaces/AAAAN2J52O8/threads/IAf4cnLqYfg"
   })
   → Returns all messages in that thread

3. chat.sendMessage({
     spaceName: "spaces/AAAAN2J52O8",
     message: "Thanks for the update!",
     threadName: "spaces/AAAAN2J52O8/threads/IAf4cnLqYfg"
   })
   → Replies in the same thread

Unread Messages

Use unreadOnly: true on chat.getMessages to filter for unread messages only.

How It Works

The unread filter:

  1. Looks up the authenticated user's ID via the People API
  2. Finds the user's membership in the space
  3. Uses the lastReadTime from the membership to filter messages created after that timestamp
  4. If no lastReadTime is found, all messages are returned (treats everything as unread)

Combining Filters

You can combine unreadOnly with threadName to get unread messages in a specific thread. The filters are joined with AND:

chat.getMessages({
  spaceName: "spaces/AAAAN2J52O8",
  threadName: "spaces/AAAAN2J52O8/threads/IAf4cnLqYfg",
  unreadOnly: true
})

Space Management

Creating a Space

Use chat.setUpSpace to create a new named space with members:

chat.setUpSpace({
  displayName: "Q1 Planning",
  userNames: ["users/12345678", "users/87654321"]
})

Important: The userNames parameter expects user resource names in the format users/{userId}, not email addresses. Use people.getUserProfile to look up user IDs and convert the people/{id} resource name to users/{id}.

Resource Name Formats

Google Chat uses structured resource names. Here is a quick reference:

ResourceFormatExample
Spacespaces/{spaceId}spaces/AAAAN2J52O8
Messagespaces/{spaceId}/messages/{messageId}spaces/AAAAN2J52O8/messages/abc123
Threadspaces/{spaceId}/threads/{threadId}spaces/AAAAN2J52O8/threads/IAf4cnLqYfg
Userusers/{userId}users/12345678

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.