@genspark/cli 1.0.11 → 1.0.13

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 (46) hide show
  1. package/README.md +107 -133
  2. package/dist/config.d.ts +25 -3
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +54 -22
  5. package/dist/config.js.map +1 -1
  6. package/dist/index.js +94 -10
  7. package/dist/index.js.map +1 -1
  8. package/docs/skills.md +75 -7
  9. package/package.json +1 -1
  10. package/skills/gsk-audio-generation/SKILL.md +3 -3
  11. package/skills/gsk-audio-processing/SKILL.md +47 -0
  12. package/skills/gsk-batch-crawl-url-and-answer/SKILL.md +37 -0
  13. package/skills/gsk-claw-share-link/SKILL.md +39 -0
  14. package/skills/gsk-create-task/SKILL.md +1 -1
  15. package/skills/gsk-github/SKILL.md +52 -0
  16. package/skills/gsk-gmail/SKILL.md +70 -0
  17. package/skills/gsk-google-calendar/SKILL.md +50 -0
  18. package/skills/gsk-google-contacts/SKILL.md +51 -0
  19. package/skills/gsk-google-docs/SKILL.md +40 -0
  20. package/skills/gsk-google-drive/SKILL.md +47 -0
  21. package/skills/gsk-google-sheets/SKILL.md +45 -0
  22. package/skills/gsk-image-generation/SKILL.md +1 -1
  23. package/skills/gsk-meeting/SKILL.md +43 -0
  24. package/skills/gsk-microsoft-teams/SKILL.md +53 -0
  25. package/skills/gsk-notion/SKILL.md +39 -0
  26. package/skills/gsk-onedrive/SKILL.md +44 -0
  27. package/skills/gsk-outlook-calendar/SKILL.md +53 -0
  28. package/skills/gsk-outlook-contacts/SKILL.md +36 -0
  29. package/skills/gsk-outlook-email/SKILL.md +82 -0
  30. package/skills/gsk-salesforce/SKILL.md +38 -0
  31. package/skills/gsk-shared/SKILL.md +1 -1
  32. package/skills/gsk-sharepoint/SKILL.md +51 -0
  33. package/skills/gsk-slack/SKILL.md +46 -0
  34. package/skills/gsk-vd/SKILL.md +228 -0
  35. package/skills/gsk-video-generation/SKILL.md +6 -4
  36. package/skills/gsk-voice-cloning/SKILL.md +42 -0
  37. package/skills/gsk-youtube/SKILL.md +44 -0
  38. package/skills/gsk-calendar-create/SKILL.md +0 -42
  39. package/skills/gsk-calendar-list/SKILL.md +0 -36
  40. package/skills/gsk-email-list/SKILL.md +0 -38
  41. package/skills/gsk-email-read/SKILL.md +0 -36
  42. package/skills/gsk-email-search/SKILL.md +0 -39
  43. package/skills/gsk-email-send/SKILL.md +0 -64
  44. package/skills/gsk-meeting-get/SKILL.md +0 -34
  45. package/skills/gsk-meeting-list/SKILL.md +0 -34
  46. package/skills/gsk-meeting-search/SKILL.md +0 -39
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: gsk-onedrive
3
+ version: 1.0.0
4
+ description: 'OneDrive file operations. Actions: list, search, read.'
5
+ metadata:
6
+ category: general
7
+ requires:
8
+ bins:
9
+ - gsk
10
+ cliHelp: gsk onedrive --help
11
+ ---
12
+
13
+ # gsk-onedrive
14
+
15
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
16
+
17
+ OneDrive file operations. Actions: list, search, read.
18
+
19
+ ## Usage
20
+
21
+ ```bash
22
+ gsk onedrive [options]
23
+ ```
24
+
25
+ ## Flags
26
+
27
+ | Flag | Required | Description |
28
+ |------|----------|-------------|
29
+ | `<action>` (positional) | Yes | Action to perform. 'list': List files in a folder; 'search': Search files; 'read': Read and extract content from a file (string, one of: list, search, read) |
30
+ | `--onedrive_url` | No | [list] A OneDrive URL to list files from. Can be a sharing link, folder link, or any OneDrive URL. (string) |
31
+ | `--folder_id` | No | [list] The folder item ID to list contents of. Get folder IDs from previous onedrive_list_files or onedrive_search results. (string) |
32
+ | `--folder_path` | No | [list] The folder path relative to OneDrive root. Example: 'Documents/Projects' to list files in that subfolder. (string) |
33
+ | `--limit` | No | [list] Maximum number of items to return (1-200). Default: 50 (integer) |
34
+ | `--query` | No | [search] The search query string. **Query Behavior**: • Spaces = AND: 'project report' finds files with BOTH terms • OR operator: 'project OR report' finds files with EITHER term • Empty string: '*' lists all files • Wildcards: 'report*' finds files starting with 'report' • Examples: 'budget.xlsx', 'meeting OR conference', '*.pdf', 'project 2024' (string) |
35
+ | `--file_id` | No | [read] The ID of the file OR the OneDrive/SharePoint URL to read from OneDrive or SharePoint. Can be either a file ID (like '01W56PINYRO3...') or a full OneDrive/SharePoint URL (like 'https://domain-my.sharepoint.com/personal/user/Documents/file.pdf' or SharePoint driveItem IDs). For Teams attachments, use the 'file_id' value from Teams search results onedrive_file_params. (string) |
36
+ | `--question` | No | [read] The question to answer about the file content. (string) |
37
+
38
+ ## Local File Support
39
+
40
+ Parameters that accept URLs (`--onedrive_url`) also accept local file paths. The CLI automatically uploads local files before sending to the API.
41
+
42
+ ## See Also
43
+
44
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: gsk-outlook-calendar
3
+ version: 1.0.0
4
+ description: 'Outlook Calendar operations. Actions: list, create, delete.'
5
+ metadata:
6
+ category: general
7
+ requires:
8
+ bins:
9
+ - gsk
10
+ cliHelp: gsk outlook_calendar --help
11
+ ---
12
+
13
+ # gsk-outlook-calendar
14
+
15
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
16
+
17
+ Outlook Calendar operations. Actions: list, create, delete.
18
+
19
+ ## Usage
20
+
21
+ ```bash
22
+ gsk outlook_calendar [options]
23
+ ```
24
+
25
+ ## Flags
26
+
27
+ | Flag | Required | Description |
28
+ |------|----------|-------------|
29
+ | `<action>` (positional) | Yes | Action to perform. 'list': List upcoming calendar events; 'create': Create a new calendar event; 'delete': Delete a calendar event (string, one of: list, create, delete) |
30
+ | `--filter_query` | No | [list] Text to filter calendar events by subject. Empty for listing all events in the time range. (string) |
31
+ | `--time_min` | No | [list] Optional. Start time for the calendar view (ISO 8601 timestamp). Defaults to 30 days ago. (string) |
32
+ | `--time_max` | No | [list] Optional. End time for the calendar view (ISO 8601 timestamp). Defaults to 60 days from now. (string) |
33
+ | `--from_account` | No | [list] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [delete] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. (string) |
34
+ | `--summary` | No | [create] The title of the event (string) |
35
+ | `--location` | No | [create] The location of the event (string) |
36
+ | `--description` | No | [create] Description or details of the event. Supports restricted HTML formatting (safe subset rendered via Vue v-html): <a>, <b>, <strong>, <i>, <em>, <u>, <br>, <p>, <ul>, <ol>, <li>, <span>, <img>. Use for links, bold, italics, lists, line breaks, images. (string) |
37
+ | `--time_zone` | No | [create] Time zone for the event (e.g., 'GMT-07:00') (string) |
38
+ | `--time_zone_name` | No | [create] Time zone name for the event (e.g., 'America/Los_Angeles') (string) |
39
+ | `--start_time` | No | [create] Start time of the event in ISO 8601 format, must include correct timezone offset (e.g., 'yyyy-mm-ddThh:mm:ss+hh:mm') (string) |
40
+ | `--end_time` | No | [create] End time of the event in ISO 8601 format, must include correct timezone offset (e.g., 'yyyy-mm-ddThh:mm:ss-hh:mm') (string) |
41
+ | `--attendees` | No | [create] List of email addresses of attendees (array) |
42
+ | `--calendar_id` | No | [create] The calendar identifier. Use 'primary' for the user's primary calendar or provide a specific calendar email address (string) |
43
+ | `--event_id` | No | [create] The event identifier. If the request is to modify an existing event, provide the event_id of the event to be modified. If the request is to create a new event, leave this field empty. \| [delete] The Outlook Calendar event ID to delete (string) |
44
+ | `--recurrence` | No | [create] Recurrence pattern for the event (object) |
45
+ | `--send_notifications` | No | [create] Whether to send email notifications to attendees (boolean) |
46
+ | `--importance` | No | [create] Event importance (low, normal, high) (string) |
47
+ | `--sensitivity` | No | [create] Event sensitivity (normal, personal, private, confidential) (string) |
48
+ | `--show_as` | No | [create] Show as status (free, tentative, busy, oof, workingElsewhere, unknown) (string) |
49
+ | `--delete_series` | No | [delete] If true and the event is recurring, delete the entire series. If false, only delete the single instance. Default is false. (boolean, default: `False`) |
50
+
51
+ ## See Also
52
+
53
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: gsk-outlook-contacts
3
+ version: 1.0.0
4
+ description: 'Outlook Contacts operations. Actions: search.'
5
+ metadata:
6
+ category: general
7
+ requires:
8
+ bins:
9
+ - gsk
10
+ cliHelp: gsk outlook_contacts --help
11
+ ---
12
+
13
+ # gsk-outlook-contacts
14
+
15
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
16
+
17
+ Outlook Contacts operations. Actions: search.
18
+
19
+ ## Usage
20
+
21
+ ```bash
22
+ gsk outlook_contacts [options]
23
+ ```
24
+
25
+ ## Flags
26
+
27
+ | Flag | Required | Description |
28
+ |------|----------|-------------|
29
+ | `<action>` (positional) | Yes | Action to perform. 'search': Search Outlook contacts (string, one of: search) |
30
+ | `--query` | No | [search] Search query to find contacts. Searches across names, email addresses, phone numbers, and notes. (string) |
31
+ | `--limit` | No | [search] Maximum number of results to return (1-100). Default: 20 (integer) |
32
+ | `--account_id` | No | [search] Optional. The Outlook account ID to search (e.g., 'outlook-user@example.com'). If not provided, uses the default Outlook account. (string) |
33
+
34
+ ## See Also
35
+
36
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: gsk-outlook-email
3
+ version: 1.0.0
4
+ description: 'Outlook Email operations. Actions: search, read, send, reply, reply_draft,
5
+ forward, delete, archive, move, mark_as_read, add_category, remove_category, get_attachment,
6
+ group_list, group_search, group_read, group_reply.'
7
+ metadata:
8
+ category: general
9
+ requires:
10
+ bins:
11
+ - gsk
12
+ cliHelp: gsk outlook --help
13
+ ---
14
+
15
+ # gsk-outlook-email
16
+
17
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
18
+
19
+ Outlook Email operations. Actions: search, read, send, reply, reply_draft, forward, delete, archive, move, mark_as_read, add_category, remove_category, get_attachment, group_list, group_search, group_read, group_reply.
20
+
21
+ ## Usage
22
+
23
+ ```bash
24
+ gsk outlook [options]
25
+ ```
26
+
27
+ **Aliases:** `outlook`
28
+
29
+ ## Flags
30
+
31
+ | Flag | Required | Description |
32
+ |------|----------|-------------|
33
+ | `<action>` (positional) | Yes | Action to perform. 'search': Search emails by query; 'read': Read a specific email by ID; 'send': Compose and send an email; 'reply': Reply to an existing email; 'reply_draft': Create a reply draft without sending; 'forward': Forward an email to new recipients; 'delete': Delete an email; 'archive': Archive an email; 'move': Move an email to a different folder; 'mark_as_read': Mark an email as read or unread; 'add_category': Add a category to an email; 'remove_category': Remove a category from an email; 'get_attachment': Download an email attachment; 'group_list': List Microsoft 365 groups; 'group_search': Search group emails; 'group_read': Read a group email; 'group_reply': Reply to a group email (string, one of: search, read, send, reply, reply_draft, forward, delete, archive, move, mark_as_read, add_category, remove_category, get_attachment, group_list, group_search, group_read, group_reply) |
34
+ | `--queryString` | No | [search] The search query using KQL (Keyword Query Language). Examples:\n- Simple: 'project meeting'\n- From Sender: 'from:boss@example.com'\n- With Subject: 'subject:"Weekly Report"'\n- Unread Emails: 'isRead=false'\n- Has Attachments: 'hasAttachments=true'\n- Cc Recipient: 'cc:user@example.com'\n- Important: 'importance:high'\n- Complex: 'from:admin@co.com AND (subject:urgent OR body:critical)'\nNote: Use after_date/before_date params for date filtering (recommended), or use KQL syntax like 'received:2024-06-01..2024-06-30' in queryString. (string) |
35
+ | `--after_date` | No | [search] Filter emails received on or after this date (inclusive). Format: YYYY-MM-DD (e.g., '2024-01-01'). Works for both enterprise and personal accounts. (string) |
36
+ | `--before_date` | No | [search] Filter emails received before this date (exclusive). Format: YYYY-MM-DD (e.g., '2024-01-31'). Works for both enterprise and personal accounts. (string) |
37
+ | `--size` | No | [search] The number of results to return per page (default: 25, max: 1000). \| [group_search] The maximum number of results to return per group per page (default: 25). (integer, default: `25`) |
38
+ | `--from_offset` | No | [search] The starting offset for pagination (used to get the next page of results). (integer, default: `0`) |
39
+ | `--auto_paginate` | No | [search] If true, automatically fetches multiple pages until reaching max_total_results (default: 500). Returns ALL emails matching the query. \| [group_search] If true, automatically fetches multiple pages from each group until reaching max_total_results (default: 500). Returns ALL emails matching the query. (boolean) |
40
+ | `--max_total_results` | No | [search] Maximum total results to fetch when auto_paginate is true. Default: 500, Maximum: 500. \| [group_search] Maximum total results to fetch across all groups when auto_paginate is true. Default: 500, Maximum: 500. (integer) |
41
+ | `--folder` | No | [search] The mail folder to search in. Options:\n- 'inbox': Inbox folder (default)\n- 'junkemail' or 'spam': Junk/Spam folder\n- 'deleteditems' or 'trash': Deleted Items folder\n- 'drafts': Drafts folder\n- 'sentitems' or 'sent': Sent Items folder\n- 'archive': Archive folder\n- 'all': Search across all folders (uses Search API) (string) |
42
+ | `--search_mode` | No | [search] Search mode to use:\n- 'auto' (default): Automatically choose best method\n- 'kql': Use Microsoft Search API with full KQL syntax (enterprise only, supports 'isread:false from:john subject:meeting')\n- 'filter': Use $filter for property filtering (supports 'isRead eq false', works with folder parameter) (string, one of: auto, kql, filter) |
43
+ | `--from_account` | No | [search] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [read] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [send] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [reply] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [reply_draft] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [forward] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [delete] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [archive] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [move] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [mark_as_read] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [add_category] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [remove_category] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [get_attachment] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [group_list] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [group_search] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [group_read] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. \| [group_reply] Optional: Email address of the Outlook account to use. Use this when the user has multiple Outlook accounts connected. If not specified, uses the default Outlook account. (string) |
44
+ | `--id` | No | [read] The ID of the email to retrieve and read (string) |
45
+ | `--title` | No | [read] The title of the email to retrieve and read \| [group_read] The title of the email thread to retrieve. (string) |
46
+ | `--question` | No | [read] Question to answer guiding how to process the email content \| [group_read] Question to answer guiding how to process the email content (string) |
47
+ | `--download_attachments` | No | [read] Whether need to download attachments from the email to analysis (boolean) |
48
+ | `--aidrive_path` | No | [read] Path in AIDrive where attachments should be saved. Default is /outlook_attachments/ \| [get_attachment] The path in AIDrive to save the attachment. Default: /outlook_attachments/ (string) |
49
+ | `--to` | No | [send] A list of email addresses for primary recipients. At least one recipient is required. \| [reply] Optional: A list of email addresses for primary recipients. If not provided, defaults to the original sender. By default (reply_all=true), all original recipients are included in CC. \| [reply_draft] Optional: A list of email addresses for primary recipients. If not provided, defaults to the original sender. By default (reply_all), all original recipients are included in CC. \| [forward] A list of email addresses for primary recipients to forward the email to. \| [group_reply] Optional list of recipient email addresses to add as new participants. These recipients will be notified about the reply. (array) |
50
+ | `--subject` | No | [send] The email subject line. (string) |
51
+ | `--body` | No | [send] The email body content. **IMPORTANT**: The format MUST match the content_type parameter: - If content_type='text': Use plain text - If content_type='html': Use HTML format with tags like <h1>, <p>, <ul>, etc. **Note**: Email clients DO NOT support Markdown. Convert Markdown to HTML if needed. \| [reply] The reply message body. **IMPORTANT**: The format MUST match the content_type parameter: - If content_type='text': Use plain text - If content_type='html': Use HTML format with tags like <h1>, <p>, <ul>, etc. **Note**: Email clients DO NOT support Markdown. Convert Markdown to HTML if needed. \| [reply_draft] The reply content in HTML format. Use HTML tags for formatting (e.g., <br>, <b>, <i>). \| [forward] Optional: Additional message to include above the forwarded content. This is your personal note to recipients. (string) |
52
+ | `--cc` | No | [send] Optional: A list of email addresses for CC recipients. \| [reply] Optional: A list of email addresses for CC recipients. If not provided and 'reply_all' is true (default), includes original CC and TO recipients. If 'reply_all' is false, no CC recipients are added. \| [reply_draft] Optional: A list of email addresses for CC recipients. If not provided and 'reply_type' is 'reply_all' (default), includes original CC and TO recipients. If 'reply_type' is 'reply', no CC recipients are added. \| [forward] Optional: A list of email addresses for CC recipients. (array) |
53
+ | `--bcc` | No | [send] Optional: A list of email addresses for BCC recipients. \| [reply] Optional: A list of email addresses for BCC recipients. \| [reply_draft] Optional: A list of email addresses for BCC recipients. \| [forward] Optional: A list of email addresses for BCC recipients. (array) |
54
+ | `--from_mailbox` | No | [send] Optional: The email address to send from (e.g., team@company.com). If not specified, the email will be sent from the current user's mailbox. Requires 'Mail.Send.Shared' permission for shared/group mailboxes. \| [reply] Optional: The email address to send the reply from (e.g., team@genspark.ai). If not specified, the reply will be sent from the current user's mailbox. Requires 'Mail.Send.Shared' permission for shared/group mailboxes. \| [reply_draft] Optional: The email address to create the draft from (e.g., team@genspark.ai). If not specified, the draft will be created in the current user's mailbox. Requires 'Mail.Send.Shared' permission for shared/group mailboxes. \| [forward] Optional: The email address to send from (e.g., team@genspark.ai). If not specified, forwards from the current user's mailbox. Requires 'Mail.Send.Shared' permission for shared/group mailboxes. (string) |
55
+ | `--content_type` | No | [send] Content type of the body. Default: text/html (recommended) **CRITICAL**: body field format MUST match this parameter: - 'text/plain': body should be plain text - 'text/html': body MUST be valid HTML (not Markdown) Always convert Markdown to HTML before passing to this tool. \| [reply] Content type of the reply body. Default: text/html (recommended) **CRITICAL**: body field format MUST match this parameter: - 'text/plain': body should be plain text - 'text/html': body MUST be valid HTML (not Markdown) Always convert Markdown to HTML before passing to this tool. \| [forward] Content type of the body. Default: text/html \| [group_reply] The format of the content. Use 'text/plain' for plain text or 'text/html' for HTML content. Default is 'text/plain'. (string, one of: text/plain, text/html) |
56
+ | `--skip_confirmation` | No | [send] If true, skip user confirmation and send immediately. Default is false (require confirmation before sending). \| [reply] If true, skip user confirmation and send immediately. Default is false (require confirmation before sending). \| [forward] If true, skip user confirmation and send immediately. Default is false (require confirmation before sending). \| [delete] If true, skip user confirmation and delete immediately. Default is false (require confirmation before deleting). \| [move] If true, skip user confirmation and move immediately. Default is false (require confirmation before moving). (boolean, default: `False`) |
57
+ | `--auto_skip_confirmation` | No | [send] Set to true ONLY if the workflow step has [AUTO_SKIP_CONFIRMATION] marker. This indicates the node is configured to always skip confirmation. \| [reply] Set to true ONLY if the workflow step has [AUTO_SKIP_CONFIRMATION] marker. This indicates the node is configured to always skip confirmation. \| [forward] Set to true ONLY if the workflow step has [AUTO_SKIP_CONFIRMATION] marker. This indicates the node is configured to always skip confirmation. \| [delete] Set to true ONLY if the workflow step has [AUTO_SKIP_CONFIRMATION] marker. This indicates the node is configured to always skip confirmation. \| [move] Set to true ONLY if the workflow step has [AUTO_SKIP_CONFIRMATION] marker. This indicates the node is configured to always skip confirmation. (boolean, default: `False`) |
58
+ | `--message_id` | No | [reply] The Outlook message ID to reply to. \| [forward] The Outlook message ID to forward. \| [delete] The Outlook message ID to delete \| [archive] The Outlook message ID to archive \| [move] The Outlook message ID to move \| [mark_as_read] (Deprecated, use message_ids) A single Outlook message ID to mark \| [add_category] The Outlook message ID to add category to \| [remove_category] The Outlook message ID to remove category from \| [get_attachment] The Outlook message ID containing the attachment (string) |
59
+ | `--reply_all` | No | [reply] Optional: If true (default), reply to all original recipients (TO and CC). If false, reply only to the original sender. (boolean, default: `True`) |
60
+ | `--include_original` | No | [reply] Optional: Whether to include the original email content as a quote in the reply. Defaults to true. \| [reply_draft] Optional: Whether to include the original email content as a quote in the draft. Defaults to true. (boolean, default: `True`) |
61
+ | `--original_email_id` | No | [reply_draft] The ID of the original email to reply to. Required to create a proper reply draft with quoted content. (string) |
62
+ | `--reply_type` | No | [reply_draft] Type of reply: 'reply' sends only to the original sender, 'reply_all' sends to all recipients of the original email. Default: 'reply_all'. Used to determine default recipients if 'to'/'cc' are not provided. (string, one of: reply, reply_all) |
63
+ | `--include_attachments` | No | [forward] Whether to include original email attachments in the forward. Default: true (boolean, default: `True`) |
64
+ | `--permanent` | No | [delete] Whether to permanently delete the message. Default: false (move to Deleted Items) (boolean) |
65
+ | `--folder_name` | No | [move] The target folder name. Can be a well-known folder (inbox, drafts, sentitems, deleteditems, archive, junkemail, outbox) or a custom folder name. Custom folders will be created if they don't exist. (string) |
66
+ | `--create_if_not_exists` | No | [move] Whether to create the folder if it doesn't exist. Default: true (boolean) |
67
+ | `--message_ids` | No | [mark_as_read] The Outlook message ID(s) to mark. Can be a single ID string or an array of IDs. |
68
+ | `--is_read` | No | [mark_as_read] Set to true to mark as read, false to mark as unread. Default: true (boolean) |
69
+ | `--category_name` | No | [add_category] The category name to add. Common categories include: Red category, Orange category, Yellow category, Green category, Blue category, Purple category \| [remove_category] The category name to remove (string) |
70
+ | `--filename` | No | [get_attachment] The filename of the attachment to retrieve. Use '*' to get all attachments. (string) |
71
+ | `--save_to_aidrive` | No | [get_attachment] Whether to save the attachment to AIDrive. Default: true (boolean) |
72
+ | `--name_filter` | No | [group_list] Optional filter to search for groups by name or email. If provided, only groups matching this filter will be returned. (string) |
73
+ | `--group_id` | No | [group_search] The ID of a specific group to search within. If provided, group_name_filter is ignored. \| [group_read] The ID of the group. \| [group_reply] The ID of the M365 group. Available from trigger data as 'group_id' or 'emails[0].group_id'. (string) |
74
+ | `--group_name_filter` | No | [group_search] A search term to find groups by name (e.g., 'Marketing'). Used if group_id is not provided. (string) |
75
+ | `--query` | No | [group_search] The search query for email subjects. Use an empty string to get recent emails. (string) |
76
+ | `--thread_id` | No | [group_read] The ID of the email thread to retrieve. This is often the same as the conversationId. \| [group_reply] The ID of the email thread to reply to. Available from trigger data as 'thread_id' or 'emails[0].thread_id'. (string) |
77
+ | `--conversation_id` | No | [group_reply] The ID of the conversation. Available from trigger data as 'conversation_id' or 'emails[0].conversation_id'. (string) |
78
+ | `--content` | No | [group_reply] The reply content. Can be plain text or HTML. This will be posted as a new message in the group conversation. (string) |
79
+
80
+ ## See Also
81
+
82
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: gsk-salesforce
3
+ version: 1.0.0
4
+ description: 'Salesforce DX CLI (`sf`) operations in a pre-authenticated sandbox.
5
+ Actions: run (forwards any `sf` subcommand).'
6
+ metadata:
7
+ category: general
8
+ requires:
9
+ bins:
10
+ - gsk
11
+ cliHelp: gsk sf --help
12
+ ---
13
+
14
+ # gsk-salesforce
15
+
16
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
17
+
18
+ Salesforce DX CLI (`sf`) operations in a pre-authenticated sandbox. Actions: run (forwards any `sf` subcommand).
19
+
20
+ ## Usage
21
+
22
+ ```bash
23
+ gsk sf [options]
24
+ ```
25
+
26
+ **Aliases:** `sf`
27
+
28
+ ## Flags
29
+
30
+ | Flag | Required | Description |
31
+ |------|----------|-------------|
32
+ | `<action>` (positional) | Yes | Action to perform. 'run': Run an `sf` subcommand inside the pre-authenticated sandbox. Provide the subcommand and flags as you would type them after `sf`. (string, one of: run) |
33
+ | `--args` | No | [run] The `sf` subcommand and its arguments (everything after `sf`). Example: `data query --query "SELECT COUNT() FROM Account"`. (string) |
34
+ | `--timeout` | No | [run] Optional timeout in seconds. Default 120. Raise for long-running ops like bulk import. (integer, default: `120`) |
35
+
36
+ ## See Also
37
+
38
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -42,7 +42,7 @@ gsk me
42
42
  | `--base-url <url>` | `GSK_BASE_URL` | `https://www.genspark.ai` | API base URL |
43
43
  | `--project-id <id>` | `GSK_PROJECT_ID` | — | Project ID for access control |
44
44
  | `--debug` | — | `false` | Enable debug output |
45
- | `--timeout <ms>` | — | `300000` | Request timeout (5 min default) |
45
+ | `--timeout <ms>` | — | `1800000` | Request timeout (30 min default) |
46
46
  | `--output <format>` | — | `json` | Output format: `json` or `text` |
47
47
  | `--refresh` | — | — | Force refresh cached tool schemas |
48
48
 
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: gsk-sharepoint
3
+ version: 1.0.0
4
+ description: 'SharePoint site and file operations. Actions: list, search, read_content,
5
+ read_file.'
6
+ metadata:
7
+ category: general
8
+ requires:
9
+ bins:
10
+ - gsk
11
+ cliHelp: gsk sharepoint --help
12
+ ---
13
+
14
+ # gsk-sharepoint
15
+
16
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
17
+
18
+ SharePoint site and file operations. Actions: list, search, read_content, read_file.
19
+
20
+ ## Usage
21
+
22
+ ```bash
23
+ gsk sharepoint [options]
24
+ ```
25
+
26
+ ## Flags
27
+
28
+ | Flag | Required | Description |
29
+ |------|----------|-------------|
30
+ | `<action>` (positional) | Yes | Action to perform. 'list': List files in a site or library; 'search': Search across sites; 'read_content': Read content from a list item or page; 'read_file': Read and extract content from a file (string, one of: list, search, read_content, read_file) |
31
+ | `--sharepoint_url` | No | [list] A SharePoint URL to list files from. Can be a site URL, document library URL (AllItems.aspx), or a folder URL. Example: 'https://company.sharepoint.com/sites/TeamSite/Shared Documents/Forms/AllItems.aspx' (string) |
32
+ | `--site_id` | No | [list] The SharePoint site ID. Use this to list the default document library of a specific site. Get site IDs from sharepoint_search results. \| [read_content] Site ID from SharePoint search results siteInfo. Required for listItem content type. (string) |
33
+ | `--drive_id` | No | [list] The document library (drive) ID. Use this to list files in a specific document library. (string) |
34
+ | `--folder_id` | No | [list] The folder item ID within a drive. Use this with drive_id to navigate into subfolders. Get folder IDs from previous sharepoint_list_files results. (string) |
35
+ | `--limit` | No | [list] Maximum number of items to return (1-200). Default: 50 (integer) |
36
+ | `--query` | No | [search] The search query string using KQL syntax. **Query Behavior**: • Spaces = AND: 'project report' finds items with BOTH terms • OR operator: 'project OR report' finds items with EITHER term • Empty string: '*' returns all items • Mixed language: automatically optimized (e.g., '项目 project' → '项目 OR project') • Examples: 'budget 2024', 'meeting OR conference', 'from:john project', 'hasAttachment:true report' (string) |
37
+ | `--entity_types` | No | [search] Types of SharePoint content to search. Defaults to all types. (array, default: `['site', 'listItem', 'list', 'driveItem']`) |
38
+ | `--content_id` | No | [read_content] The ID of the SharePoint content to read. Can be a site ID, page ID, list ID, list item ID from SharePoint search results, or a SharePoint URL for direct file access. For Teams attachments, use the 'content_id' value from Teams search results onedrive_file_params. (string) |
39
+ | `--content_type` | No | [read_content] The type of SharePoint content to read. Use 'driveItem' for SharePoint files, 'listItem' for SharePoint pages/list items. (string, one of: site, page, list, listItem, driveItem) |
40
+ | `--question` | No | [read_content] The question to answer about the SharePoint content. \| [read_file] The question to answer about the file content. (string) |
41
+ | `--list_id` | No | [read_content] List ID from SharePoint search results siteInfo. Required for listItem content type. (string) |
42
+ | `--list_item_id` | No | [read_content] List item ID from SharePoint search results siteInfo. Required for listItem content type. (string) |
43
+ | `--file_id` | No | [read_file] The ID of the file OR the SharePoint URL to read from Microsoft OneDrive/SharePoint/Teams. Can be either a file ID (like '01W56PINYRO3...') or a full SharePoint URL (like 'https://domain.sharepoint.com/...'). (string) |
44
+
45
+ ## Local File Support
46
+
47
+ Parameters that accept URLs (`--sharepoint_url`) also accept local file paths. The CLI automatically uploads local files before sending to the API.
48
+
49
+ ## See Also
50
+
51
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: gsk-slack
3
+ version: 1.0.0
4
+ description: 'Slack messaging operations. Actions: send, search, lookup.'
5
+ metadata:
6
+ category: general
7
+ requires:
8
+ bins:
9
+ - gsk
10
+ cliHelp: gsk slack --help
11
+ ---
12
+
13
+ # gsk-slack
14
+
15
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` for auth, global flags, and security rules.
16
+
17
+ Slack messaging operations. Actions: send, search, lookup.
18
+
19
+ ## Usage
20
+
21
+ ```bash
22
+ gsk slack [options]
23
+ ```
24
+
25
+ ## Flags
26
+
27
+ | Flag | Required | Description |
28
+ |------|----------|-------------|
29
+ | `<action>` (positional) | Yes | Action to perform. 'send': Send a message to a channel or user; 'search': Search messages by keyword; 'lookup': Look up users, channels, or groups (string, one of: send, search, lookup) |
30
+ | `--message` | No | [send] The message content to send. Supports Slack markdown formatting. (string) |
31
+ | `--recipient` | No | [send] Optional recipient: 'self' (default), channel ID (e.g., 'C01234567'), or user ID (e.g., 'U01234567'). If not specified, sends to yourself. (string) |
32
+ | `--title` | No | [send] Optional title for the message. If provided, creates a rich formatted message with a header. (string) |
33
+ | `--fields` | No | [send] Optional array of field objects with 'title' and 'value' keys to create a structured message layout. (array) |
34
+ | `--thread_ts` | No | [send] Optional thread timestamp to reply in a thread. (string) |
35
+ | `--query` | No | [search] The search query. You can use modifiers like 'in:#channel', 'from:@user', 'has:link', 'before:yyyy-mm-dd'. (string) |
36
+ | `--count` | No | [search] The maximum number of messages to return. Default is 100. (integer) |
37
+ | `--sort` | No | [search] Sort order of results. 'score' for relevance or 'timestamp' for time. Default is 'score'. (string) |
38
+ | `--question` | No | [search] A specific question to answer based on the search results. (string) |
39
+ | `--lookup_type` | No | [lookup] What to look up: 'users' for team members, 'channels' for channels/conversations, 'all' for both. (string, one of: users, channels, all) |
40
+ | `--search_query` | No | [lookup] Optional search query to filter results by name. Case-insensitive partial match on name, display name, or real name. (string) |
41
+ | `--include_bots` | No | [lookup] Whether to include bot users in results. Default: false (boolean) |
42
+ | `--limit` | No | [lookup] Maximum number of results to return. Default: 50 (integer) |
43
+
44
+ ## See Also
45
+
46
+ - [gsk-shared](../gsk-shared/SKILL.md) — Authentication and global flags
@@ -0,0 +1,228 @@
1
+ ---
2
+ name: gsk-vd
3
+ version: 1.0.0
4
+ description: "Virtual Developer — drive a VD project (issues, VMs, templates, shell exec, GitHub) from the CLI / local OpenCode. Gated behind gk_vd_project_agent and requires vd_project_id to be configured."
5
+ metadata:
6
+ category: virtual-developer
7
+ requires:
8
+ bins:
9
+ - gsk
10
+ cliHelp: gsk vd --help
11
+ ---
12
+
13
+ # gsk-vd — Virtual Developer CLI
14
+
15
+ **PREREQUISITE:** Read `../gsk-shared/SKILL.md` first for auth, global flags, and output conventions.
16
+
17
+ `gsk vd <subcmd>` drives an existing Virtual Developer project end-to-end from a shell. It exposes the exact same 21 tools the Web UI's `VdProjectAgentChat` agent uses (`backend/virtual_developer/project_agent/agent.py`) — issue CRUD + dispatch, VM lifecycle (start/stop/create/delete/save_snapshot), on-VM shell exec, OpenCode session inspection, GitHub App auth, and VM template management.
18
+
19
+ Use this skill when you are **driving** an already-provisioned VD project as a CI-like agent (creating issues, dispatching work to VMs, inspecting PRs, running shell commands on the VM). **Do not** use it to create the VD project itself — that stays in the web UI.
20
+
21
+ ## Activation
22
+
23
+ `gsk vd` is hidden by default. It becomes available only when **both** conditions hold:
24
+
25
+ 1. **Server-side:** the user has the `gk_vd_project_agent` gatekeeper flag (closed beta).
26
+ 2. **Client-side:** a `vd_project_id` is configured — either in the gsk config file or via `GSK_VD_PROJECT_ID` env.
27
+
28
+ ### Enable via config file
29
+
30
+ Add to `~/.genspark-tool-cli/config.json`:
31
+
32
+ ```json
33
+ {
34
+ "api_key": "gsk-...",
35
+ "base_url": "http://localhost:8582",
36
+ "vd_project_id": "vd-proj-abc123"
37
+ }
38
+ ```
39
+
40
+ ### Enable via env var
41
+
42
+ ```bash
43
+ export GSK_VD_PROJECT_ID=vd-proj-abc123
44
+ ```
45
+
46
+ ### Use an alternate config profile
47
+
48
+ If you want to keep your default profile untouched (e.g. to drive a dev-backend VD project from the same machine that talks to prod for other gsk commands):
49
+
50
+ ```bash
51
+ # Point gsk at a separate config file — also affects where tools-cache.json lives
52
+ export GSK_CONFIG=/path/to/vd-profile/config.json
53
+ # or per-command
54
+ gsk --config /path/to/vd-profile/config.json vd list_vms
55
+ ```
56
+
57
+ Once activated, every `gsk vd <subcmd>` command auto-injects the resolved `vd_project_id` as the default for its `--vd_project_id` flag. You can still override per-call with `--vd_project_id <other-id>`.
58
+
59
+ ## Conventions
60
+
61
+ - All 21 commands accept `--vd_project_id <id>` but it is auto-defaulted from config; you rarely need to pass it.
62
+ - All commands return an NDJSON response with `{version, status, message, data, session_state}`. Tool-specific payload is under `data`.
63
+ - A tool that fails business-layer validation (wrong state, missing permission, not found) returns `status: "error"` with a human-readable `message`; this is **not** an infra error — inspect and retry with adjusted args.
64
+ - Long-running operations (template snapshot, VM provisioning) return immediately with a `"creating" | "provisioning"` status. Poll via the corresponding Get / List tool until the status changes.
65
+
66
+ ## Tool catalog
67
+
68
+ ### Project & issues
69
+
70
+ | Subcommand | Required flags | Purpose |
71
+ |---|---|---|
72
+ | `gsk vd get_project_overview` | — | Returns project metadata, repos, VMs (id + ready_state), and an `issues_summary` bucket count. Your first call in any workflow. |
73
+ | `gsk vd list_issues` | `[--status <state>]` | List issues. Without `--status` you get all; with it, filter to one of: `pending`, `working`, `wait_human`, `waiting_code_review`, `testing`, `pending_user_confirm`, `completed`, `failed`, `cancelled`. |
74
+ | `gsk vd get_issue_detail` | `--issue_id <id>` | Full issue record incl. `status`, `pr_url`, `assigned_vm_id`, `work_log` (state transitions with timestamps), `test_result`, `attempt_count`. |
75
+ | `gsk vd issue_action` | `--issue_id <id> --action <verb>` | Move an issue through its lifecycle. `action` ∈ `continue`, `cancel`, `run_tests`, `confirm_merge`, `reject_merge`, `submit_review`, `retry`. `--reason` is optional text recorded in the work log. |
76
+ | `gsk vd create_github_issue` | `--repo_id <id> --title <t> --body <md>` | Creates a new GitHub issue in the project's repo. The webhook handler will mirror it back as a VD issue shortly. Use after `get_project_overview` to read the `repo_id`. |
77
+ | `gsk vd dispatch_issues` | — | One-shot scheduler trigger: pops the oldest `pending` issue and assigns it to the first idle VM. Returns `assigned: [{issue_id, vm_id}]`. Useful when you want to "push" without waiting for the periodic scheduler. |
78
+
79
+ ### VMs
80
+
81
+ | Subcommand | Required flags | Purpose |
82
+ |---|---|---|
83
+ | `gsk vd list_vms` | — | List all VMs in the project with id, vm_name, ready_state, current_issue_id, public preview_url / domain. |
84
+ | `gsk vd get_vm_status` | `--vm_id <id>` | Same fields as `list_vms` but single VM, plus public_ip. |
85
+ | `gsk vd vm_action` | `--vm_id <id> --action <start\|stop>` | Start or stop a VM. These are synchronous (~10-60s). **Note:** other lifecycle actions (suspend/resume/save_snapshot/reset) are not exposed via this minimal wrapper — use the Web UI or direct API for those. |
86
+ | `gsk vd create_vm` | — | Provision a new VM with project defaults. `--vm_size <lite\|standard\|high>` picks the tier (default `standard`): `lite` = 2C/4G Standard_B2s (64GB), `standard` = 2C/8G Standard_B2ms (64GB), `high` = 4C/16G Standard_B4ms (128GB). Returns immediately with `vm_id` + `status: "provisioning"`. Poll `get_vm_status` until `ready_state == "ready"` (~3-5 min). |
87
+ | `gsk vd delete_vm` | `--vm_id <id>` | Delete a VM (soft delete; underlying Azure instance is also deleted). Confirm with user before calling. |
88
+ | `gsk vd update_vm_startup_script` | `--vm_id <id> --startup_script <shell>` | Overwrite the VM's `startup_script` field. Typically a `#!/bin/bash` script that attaches to a tmux session on SSH login. |
89
+ | `gsk vd reconfigure_vm` | `--vm_id <id>` | Re-run the full VM env setup: apt packages, opencode install, VS Code Remote profile, Caddy `:8443` reverse proxy, user SSH key, gsk token. **Use when a VM provisioned before a given config step existed is missing something** — e.g. preview URL at `:8443` returns CORS errors because Caddy was never configured. Idempotent. VM must be `ready` or `working`. Takes ~30-60s; briefly interrupts the preview URL during Caddy restart. Returns per-step status (`ok`/`failed`/`skipped`) for user-key and gsk-token injection. |
90
+ | `gsk vd resize_vm` | `--vm_id <id> --vm_size <lite\|standard\|high>` | Resize a VM to a different tier. VM must be `ready` or `suspended`. Runs deallocate → Azure SKU change → optional disk grow → start (if it was running). Takes ~60-120s. **Disk can only grow, not shrink** — down-resize keeps the existing disk size. |
91
+
92
+ ### Exec / sessions
93
+
94
+ | Subcommand | Required flags | Purpose |
95
+ |---|---|---|
96
+ | `gsk vd execute_command` | `--vm_id <id> --command <sh>` | Run a shell command on the VM via SSH. `--timeout <sec>` (default 30, max 120). Returns `{exit_code, stdout, stderr}`. VM must be `ready` (not `suspended`). |
97
+ | `gsk vd get_session_messages` | `--vm_id <id> [--session_id <sid>]` | Without `--session_id`: list OpenCode sessions on that VM. With it: fetch message transcript. |
98
+ | `gsk vd get_pr_info` | `--issue_id <id> [--include_diff]` | Fetch GitHub PR metadata (title, state, mergeable, review comments). `--include_diff` returns full diff (can be large). Issue must be past PR-creation phase. |
99
+
100
+ ### GitHub integration
101
+
102
+ | Subcommand | Required flags | Purpose |
103
+ |---|---|---|
104
+ | `gsk vd check_github_auth` | `--repo_id <id>` | Verify the VD GitHub App installation for this repo can still acquire an installation token. Returns `ok`, `repo_full_name`, `installation_id`, `expires_at`. Use this when a VM reports 401s from git/GitHub API. |
105
+ | `gsk vd refresh_vm_github_token` | `--vm_id <id> --repo_id <id>` | Re-issue a fresh installation token and inject it into the VM's `~/.netrc` / git credential helper. Run this if `check_github_auth` succeeds but the VM still sees auth errors (token expired inside VM). |
106
+ | `gsk vd get_repo_github_token` | `--repo_id <id>` | Issue a GitHub App installation token and **return it to the caller** (not a VM) so local `gh` / `git` can act on the repo — merge PRs, push, clone from your laptop. Token inherits the App's installed permissions (repo read+write) and expires in ~1h (GitHub API cap); re-call for a fresh one. **WARNING**: treat response `data.token` as a secret — don't log, paste, or persist. gsk-only; not exposed in the web agent to avoid leakage via chat replays. |
107
+
108
+ ### VM templates
109
+
110
+ | Subcommand | Required flags | Purpose |
111
+ |---|---|---|
112
+ | `gsk vd create_vm_template` | `--source_vm_id <id> --name <t>` | Snapshot a `ready` VM and register it as a reusable template. **Always confirm with the user before calling** — the snapshot runs 2-5 min in background. Returns `{template_id, status: "creating"}`. Poll `get_vm_template` until `status == "ready"`; `status == "failed"` surfaces the error in `error`. |
113
+ | `gsk vd list_vm_templates` | — | List all templates in the project with id, name, status, size (raw Azure SKU), vm_size (tier `lite`/`standard`/`high`), region, env_configured, ctime. |
114
+ | `gsk vd get_vm_template` | `--template_id <id>` | Full detail of a single template. |
115
+ | `gsk vd delete_vm_template` | `--template_id <id>` | Soft-delete a template. **Always confirm with the user first**. The underlying Azure snapshot is NOT deleted (resource-group cleanup only). |
116
+
117
+ ## Common workflows
118
+
119
+ ### Audit project health
120
+
121
+ ```bash
122
+ gsk vd get_project_overview
123
+ gsk vd list_issues --status failed
124
+ gsk vd list_issues --status waiting_code_review
125
+ gsk vd list_vms
126
+ ```
127
+
128
+ ### Push a pending issue to an idle VM
129
+
130
+ ```bash
131
+ # See what's pending
132
+ gsk vd list_issues --status pending
133
+ # See which VMs are idle (current_issue_id=null, ready_state=ready)
134
+ gsk vd list_vms
135
+ # Trigger scheduler once
136
+ gsk vd dispatch_issues
137
+ # Watch the assignment
138
+ gsk vd list_issues --status working
139
+ ```
140
+
141
+ ### Investigate a failing issue
142
+
143
+ ```bash
144
+ gsk vd get_issue_detail --issue_id <id> # status, work_log, test_result, pr_url
145
+ gsk vd get_pr_info --issue_id <id> # PR state + review comments
146
+ gsk vd get_session_messages --vm_id <vm_id> # list OpenCode sessions on that VM
147
+ gsk vd get_session_messages --vm_id <vm_id> --session_id <sid> # full transcript
148
+ ```
149
+
150
+ ### Fix a VM whose preview URL / opencode session won't load
151
+
152
+ Typical symptom: the Web UI shows CORS errors hitting
153
+ `https://<domain>:8443/opencode/...`, or the VM's dev preview is
154
+ unreachable from the browser. Root cause is usually that the VM was
155
+ provisioned before the Caddy `:8443` reverse-proxy step existed, so
156
+ `/etc/caddy/conf.d/vd-preview.caddy` is missing.
157
+
158
+ ```bash
159
+ # VM must be running (not suspended)
160
+ gsk vd get_vm_status --vm_id <id>
161
+ # Re-run all env setup; idempotent, ~30-60s.
162
+ gsk vd reconfigure_vm --vm_id <id>
163
+ # Retry the preview URL in the browser.
164
+ ```
165
+
166
+ ### Fix a VM whose GitHub token expired
167
+
168
+ ```bash
169
+ gsk vd check_github_auth --repo_id <repo> # server-side token still valid?
170
+ gsk vd refresh_vm_github_token --vm_id <vm> --repo_id <repo> # re-inject into VM
171
+ gsk vd execute_command --vm_id <vm> --command "cd /path/to/repo && git fetch"
172
+ ```
173
+
174
+ ### Merge a PR from your laptop (local `gh` without pre-existing auth)
175
+
176
+ Use when your local `gh` CLI has no access to a private repo owned by
177
+ the VD GitHub App. Mints a short-lived installation token for that
178
+ specific repo, authenticates `gh` with it, runs the merge, then the
179
+ token expires in ~1h on its own.
180
+
181
+ ```bash
182
+ # Mint a token and keep only the raw string in a shell variable
183
+ TOKEN=$(gsk vd get_repo_github_token --repo_id <repo_id> | jq -r '.data.token')
184
+
185
+ # Authenticate local gh with the token (reads from stdin)
186
+ echo "$TOKEN" | gh auth login --with-token --hostname github.com
187
+
188
+ # Now normal gh commands work against this repo
189
+ gh pr merge 123 --merge --repo owner/repo
190
+
191
+ # Token expires after ~1h; re-run `gsk vd get_repo_github_token` for a fresh one.
192
+ unset TOKEN
193
+ ```
194
+
195
+ **Safety**: the token is treated as a secret by the skill — don't
196
+ echo it to stdout, don't paste it into chat, don't write it to a
197
+ file on disk. The `jq -r '.data.token'` extraction keeps it in a
198
+ shell variable only.
199
+
200
+ ### Run a diagnostic command on a working VM
201
+
202
+ ```bash
203
+ # VM must be ready, not suspended
204
+ gsk vd get_vm_status --vm_id <id>
205
+ gsk vd execute_command --vm_id <id> --command "git status && tmux ls" --timeout 10
206
+ ```
207
+
208
+ ### Save a configured VM as a template
209
+
210
+ ```bash
211
+ # Always confirm with user first — takes 2-5 min in background
212
+ gsk vd create_vm_template --source_vm_id <ready-vm> --name "my-dev-env"
213
+ # Returns {template_id, status: "creating"}
214
+ # Poll:
215
+ gsk vd get_vm_template --template_id <tid>
216
+ # When status=="ready", snapshot_id is populated and it's usable in create_vm
217
+ ```
218
+
219
+ ## Safety rules
220
+
221
+ - **Confirm with the user before** calling `create_vm_template`, `delete_vm_template`, `delete_vm`, `vm_action --action stop`, `issue_action --action cancel/reject_merge/confirm_merge`, `update_vm_startup_script`, `create_github_issue`. These mutate state, produce user-visible side effects (PR merges, Azure resource churn, GitHub noise), or take minutes to complete.
222
+ - **Never `execute_command`** with destructive args (`rm -rf`, `git reset --hard`, `kill -9`) without an explicit ask. The VM holds user work-in-progress.
223
+ - **Before calling `refresh_vm_github_token`**, verify the VM is actually hitting 401s — do not rotate tokens pre-emptively; it invalidates any concurrent git operation on the VM.
224
+
225
+ ## See also
226
+
227
+ - `../gsk-shared/SKILL.md` — auth, output conventions, global flags.
228
+ - Web UI for the same functionality: `https://<host>/virtual-developer/project/<vd_project_id>` → Agent tab.