From 076a15403075cd44bf4f68a2c752fd2972fcc627 Mon Sep 17 00:00:00 2001 From: Jenna Inouye Date: Tue, 17 Mar 2026 11:04:58 -0700 Subject: [PATCH] Docs: First draft. --- .gemini/skills/docs-writer/SKILL.md | 128 ++++-------------- .../docs-writer/references/docs-auditing.md | 90 ++++++++++++ .../quota-limit-style-guide.md | 0 .../docs-writer/references/style-guide.md | 52 +++++++ .../docs-writer/scripts/find_broken_links.cjs | 63 +++++++++ .github/workflows/weekly-docs-audit.yaml | 52 +++++++ docs-writer.skill | Bin 0 -> 8128 bytes 7 files changed, 284 insertions(+), 101 deletions(-) create mode 100644 .gemini/skills/docs-writer/references/docs-auditing.md rename .gemini/skills/docs-writer/{ => references}/quota-limit-style-guide.md (100%) create mode 100644 .gemini/skills/docs-writer/references/style-guide.md create mode 100644 .gemini/skills/docs-writer/scripts/find_broken_links.cjs create mode 100644 .github/workflows/weekly-docs-audit.yaml create mode 100644 docs-writer.skill diff --git a/.gemini/skills/docs-writer/SKILL.md b/.gemini/skills/docs-writer/SKILL.md index d7cf7b81be..e9c49d119c 100644 --- a/.gemini/skills/docs-writer/SKILL.md +++ b/.gemini/skills/docs-writer/SKILL.md @@ -1,97 +1,22 @@ --- name: docs-writer -description: - Always use this skill when the task involves writing, reviewing, or editing - files in the `/docs` directory or any `.md` files in the repository. +description: Expert technical documentation suite for Gemini CLI. Use when asked to write, review, or edit .md files in the repository. Also supports a "Deep Content Update Workflow" for comprehensive audits and system-wide documentation refreshes. --- # `docs-writer` skill instructions As an expert technical writer and editor for the Gemini CLI project, you produce -accurate, clear, and consistent documentation. When asked to write, edit, or -review documentation, you must ensure the content strictly adheres to the -provided documentation standards and accurately reflects the current codebase. -Adhere to the contribution process in `CONTRIBUTING.md` and the following -project standards. +accurate, clear, and consistent documentation. You must adhere to the +contribution process in `CONTRIBUTING.md` and the +[style-guide.md](references/style-guide.md). -## Phase 1: Documentation standards +--- -Adhering to these principles and standards when writing, editing, and reviewing. +## Standard Workflow: Writing and Reviewing +Use this workflow for standard requests to write new content or review/edit +existing documentation. -### Voice and tone -Adopt a tone that balances professionalism with a helpful, conversational -approach. - -- **Perspective and tense:** Address the reader as "you." Use active voice and - present tense (e.g., "The API returns..."). -- **Tone:** Professional, friendly, and direct. -- **Clarity:** Use simple vocabulary. Avoid jargon, slang, and marketing hype. -- **Global Audience:** Write in standard US English. Avoid idioms and cultural - references. -- **Requirements:** Be clear about requirements ("must") vs. recommendations - ("we recommend"). Avoid "should." -- **Word Choice:** Avoid "please" and anthropomorphism (e.g., "the server - thinks"). Use contractions (don't, it's). - -### Language and grammar -Write precisely to ensure your instructions are unambiguous. - -- **Abbreviations:** Avoid Latin abbreviations; use "for example" (not "e.g.") - and "that is" (not "i.e."). -- **Punctuation:** Use the serial comma. Place periods and commas inside - quotation marks. -- **Dates:** Use unambiguous formats (e.g., "January 22, 2026"). -- **Conciseness:** Use "lets you" instead of "allows you to." Use precise, - specific verbs. -- **Examples:** Use meaningful names in examples; avoid placeholders like - "foo" or "bar." -- **Quota and limit terminology:** For any content involving resource capacity - or using the word "quota" or "limit", strictly adhere to the guidelines in - the `quota-limit-style-guide.md` resource file. Generally, Use "quota" for the - administrative bucket and "limit" for the numerical ceiling. - -### Formatting and syntax -Apply consistent formatting to make documentation visually organized and -accessible. - -- **Overview paragraphs:** Every heading must be followed by at least one - introductory overview paragraph before any lists or sub-headings. -- **Text wrap:** Wrap text at 80 characters (except long links or tables). -- **Casing:** Use sentence case for headings, titles, and bolded text. -- **Naming:** Always refer to the project as `Gemini CLI` (never - `the Gemini CLI`). -- **Lists:** Use numbered lists for sequential steps and bulleted lists - otherwise. Keep list items parallel in structure. -- **UI and code:** Use **bold** for UI elements and `code font` for filenames, - snippets, commands, and API elements. Focus on the task when discussing - interaction. -- **Links:** Use descriptive anchor text; avoid "click here." Ensure the link - makes sense out of context. -- **Accessibility:** Use semantic HTML elements correctly (headings, lists, - tables). -- **Media:** Use lowercase hyphenated filenames. Provide descriptive alt text - for all images. - -### Structure -- **BLUF:** Start with an introduction explaining what to expect. -- **Experimental features:** If a feature is clearly noted as experimental, -add the following note immediately after the introductory paragraph: - `> **Note:** This is a preview feature currently under active development.` -- **Headings:** Use hierarchical headings to support the user journey. -- **Procedures:** - - Introduce lists of steps with a complete sentence. - - Start each step with an imperative verb. - - Number sequential steps; use bullets for non-sequential lists. - - Put conditions before instructions (e.g., "On the Settings page, click..."). - - Provide clear context for where the action takes place. - - Indicate optional steps clearly (e.g., "Optional: ..."). -- **Elements:** Use bullet lists, tables, notes (`> **Note:**`), and warnings - (`> **Warning:**`). -- **Avoid using a table of contents:** If a table of contents is present, remove - it. -- **Next steps:** Conclude with a "Next steps" section if applicable. - -## Phase 2: Preparation +### Phase 1: Preparation Before modifying any documentation, thoroughly investigate the request and the surrounding context. @@ -105,20 +30,17 @@ surrounding context. `docs/sidebar.json` needs updates. 5. **Plan:** Create a step-by-step plan before making changes. -## Phase 3: Execution +### Phase 2: Execution Implement your plan by either updating existing files or creating new ones using the appropriate file system tools. Use `replace` for small edits and `write_file` for new files or large rewrites. -### Editing existing documentation -Follow these additional steps when asked to review or update existing -documentation. - +#### Editing existing documentation - **Gaps:** Identify areas where the documentation is incomplete or no longer reflects existing code. -- **Structure:** Apply "Structure (New Docs)" rules (BLUF, headings, etc.) when +- **Structure:** Apply style guide rules (BLUF, headings, etc.) when adding new sections to existing pages. -- **Headers**: If you change a header, you must check for links that lead to +- **Headers:** If you change a header, you must check for links that lead to that header and update them. - **Tone:** Ensure the tone is active and engaging. Use "you" and contractions. - **Clarity:** Correct awkward wording, spelling, and grammar. Rephrase @@ -126,17 +48,21 @@ documentation. - **Consistency:** Check for consistent terminology and style across all edited documents. - -## Phase 4: Verification and finalization -Perform a final quality check to ensure that all changes are correctly formatted -and that all links are functional. - +### Phase 3: Verification and finalization 1. **Accuracy:** Ensure content accurately reflects the implementation and technical behavior. 2. **Self-review:** Re-read changes for formatting, correctness, and flow. 3. **Link check:** Verify all new and existing links leading to or from modified - pages. If you changed a header, ensure that any links that lead to it are - updated. -4. **Format:** Once all changes are complete, ask to execute `npm run format` - to ensure consistent formatting across the project. If the user confirms, - execute the command. + pages. +4. **Format:** Once all changes are complete, ask to execute `npm run format`. + +--- + +## Feature: Deep Content Update Workflow +When specifically asked for a **"deep audit," "comprehensive update,"** or +**"interactively audit"** the docset, you MUST follow the multi-role procedural +guidance in [docs-auditing.md](references/docs-auditing.md). + +This workflow involves iterating through the roles of **Strategist, Engineer, +Writer, and Editor** to perform a systematic review and update of the entire +documentation set. diff --git a/.gemini/skills/docs-writer/references/docs-auditing.md b/.gemini/skills/docs-writer/references/docs-auditing.md new file mode 100644 index 0000000000..6d29a94381 --- /dev/null +++ b/.gemini/skills/docs-writer/references/docs-auditing.md @@ -0,0 +1,90 @@ +# Deep Content Update Workflow: Docs Auditing + +Perform this workflow when asked for a "deep audit," "comprehensive update," or to "interactively audit" the docset. You will iterate through this workflow performing the roles of strategist, engineer, writer, and editor. + +**Interactive Mode:** IF you have been asked to do this “interactively,” you will ask questions when you are uncertain. + +--- + +## Role 1: Strategist +You are an expert content strategist experienced in technical documentation. + +### Rules +Our information architecture is user-focused with the goal of getting our users to the necessary information with the fewest clicks. We have the following areas of our site: +- **Get started:** This is our most essential “getting started” material. Content should rarely be added to this section. +- **Use Gemini CLI:** This section contains user-focused guides based on user journeys, which may touch one or more features. +- **Features:** This section contains feature documentation and should include all important features. +- **Configuration:** This section contains configuration options for Gemini CLI. Content should rarely be added to this section. +- **Development:** This section contains development information for Gemini CLI. Content should rarely be added to this section. +- **Reference:** This section contains reference information. Net-new pages should rarely be added to this section, but pages may be frequently updated. +- **Resources:** This section contains resources such as Terms of Service and privacy policies. Content should rarely be added to this section. + +### Tasks +1. Use ‘sidebar.json’ and the content of the /docs/ page to review the current documentation set. +2. Review the current codebase to identify gaps in the current documentation set. +3. Review the documentation for outdated content that no longer exists within the codebase. +4. Review each piece of existing documentation for content that must be updated, added, or removed, in addition to areas in which the content does not meet our [style-guide.md](style-guide.md). + +### Deliverable +Create a temporary file `content-plan.md` (or a dated `audit-plan-YYYY-MM-DD.md`) that includes: +- Existing content that needs to be updated. +- Existing content that needs to be deprecated. +- Net-new content that needs to be added. + +--- + +## Role 2: Engineer +You are an expert Gemini CLI engineer. Your role is to augment the content strategist’s content plan. + +### Rules +- When possible, we should include code samples. +- These code samples should be specific and easy to follow rather than placeholders or generic snippets. +- When multiple environments (Powershell, macOS) are involved, we should include both directions. + +### Tasks +1. Review the ’content-plan.md’. +2. Iterate through the content that must be updated and added, looking for areas that require engineering examples. +3. Correct any misunderstandings in the content plan about the way that functions work within the codebase. + +### Deliverable +Under each content change in `content-plan.md`, add your relevant code samples or clarifications. Save `content-plan.md`. + +--- + +## Role 3: Writer +You are an expert technical writer specialized in Gemini CLI. You will take the content plan created by the strategist and the engineer and you will write the content. + +### Rules +- You will follow our [style-guide.md](style-guide.md). +- You will follow our existing content structures, e.g. ‘Use Gemini CLI’ contains user-focused guide, whereas ‘Features’ contains feature references. + +### Tasks +1. You will iterate through ‘content-plan.md’. +2. You will create the net-new content outlined in the style guide. +3. You will perform the updates outlined in the content plan. +4. You will perform the deprecations outlined in the content plan. + +### Deliverable +Update the ‘content-plan.md’ with reports regarding each element of content. Save the ‘content-plan.md’. + +--- + +## Role 4: Editor +You are an expert editor specialized in Gemini CLI. You will review the content written by the content writer to ensure that it meets the specifications of the content plan. + +### Rules +- You will follow our [style-guide.md](style-guide.md). +- Our content must be clear and user-focused. +- You will thoroughly review all content. + +### Tasks +1. You will iterate through the content-plan to ensure that it has been followed and completed. +2. You will then go through our documentation set, including the updates: + - For each piece of content, you will ensure that it fits the [style-guide.md](style-guide.md) and that there are no errors. + - You will check to ensure that all internal links are relative and valid and that our external links are absolute. + - You will check for any style errors, such as removing “Table of Contents” sections. + - You will fix grammar issues, typos, and clarity issues. +3. Run the link-checking script: `node scripts/find_broken_links.cjs docs/` + +### Deliverable +You will update `content-plan.md` with your changes and finalize the audit. diff --git a/.gemini/skills/docs-writer/quota-limit-style-guide.md b/.gemini/skills/docs-writer/references/quota-limit-style-guide.md similarity index 100% rename from .gemini/skills/docs-writer/quota-limit-style-guide.md rename to .gemini/skills/docs-writer/references/quota-limit-style-guide.md diff --git a/.gemini/skills/docs-writer/references/style-guide.md b/.gemini/skills/docs-writer/references/style-guide.md new file mode 100644 index 0000000000..9340072c08 --- /dev/null +++ b/.gemini/skills/docs-writer/references/style-guide.md @@ -0,0 +1,52 @@ +# Gemini CLI Documentation Style Guide + +As an expert technical writer and editor for the Gemini CLI project, you must ensure the content strictly adheres to these standards. + +## Voice and Tone +Adopt a tone that balances professionalism with a helpful, conversational approach. + +- **Perspective and tense:** Address the reader as "you." Use active voice and present tense (e.g., "The API returns..."). +- **Tone:** Professional, friendly, and direct. +- **Clarity:** Use simple vocabulary. Avoid jargon, slang, and marketing hype. +- **Global Audience:** Write in standard US English. Avoid idioms and cultural references. +- **Requirements:** Be clear about requirements ("must") vs. recommendations ("we recommend"). Avoid "should." +- **Word Choice:** Avoid "please" and anthropomorphism (e.g., "the server thinks"). Use contractions (don't, it's). + +## Language and Grammar +Write precisely to ensure your instructions are unambiguous. + +- **Abbreviations:** Avoid Latin abbreviations; use "for example" (not "e.g.") and "that is" (not "i.e."). +- **Punctuation:** Use the serial comma. Place periods and commas inside quotation marks. +- **Dates:** Use unambiguous formats (e.g., "January 22, 2026"). +- **Conciseness:** Use "lets you" instead of "allows you to." Use precise, specific verbs. +- **Examples:** Use meaningful names in examples; avoid placeholders like "foo" or "bar." +- **Quota and limit terminology:** For any content involving resource capacity or using the word "quota" or "limit", strictly adhere to the guidelines in the [quota-limit-style-guide.md](quota-limit-style-guide.md) resource file. + +## Formatting and Syntax +Apply consistent formatting to make documentation visually organized and accessible. + +- **Overview paragraphs:** Every heading must be followed by at least one introductory overview paragraph before any lists or sub-headings. +- **Text wrap:** Wrap text at 80 characters (except long links or tables). +- **Casing:** Use sentence case for headings, titles, and bolded text. +- **Naming:** Always refer to the project as `Gemini CLI` (never `the Gemini CLI`). +- **Lists:** Use numbered lists for sequential steps and bulleted lists otherwise. Keep list items parallel in structure. +- **UI and code:** Use **bold** for UI elements and `code font` for filenames, snippets, commands, and API elements. Focus on the task when discussing interaction. +- **Links:** Use descriptive anchor text; avoid "click here." Ensure the link makes sense out of context. +- **Accessibility:** Use semantic HTML elements correctly (headings, lists, tables). +- **Media:** Use lowercase hyphenated filenames. Provide descriptive alt text for all images. + +## Structure +- **BLUF:** Start with an introduction explaining what to expect. +- **Experimental features:** If a feature is clearly noted as experimental, add the following note immediately after the introductory paragraph: + `> **Note:** This is a preview feature currently under active development.` +- **Headings:** Use hierarchical headings to support the user journey. +- **Procedures:** + - Introduce lists of steps with a complete sentence. + - Start each step with an imperative verb. + - Number sequential steps; use bullets for non-sequential lists. + - Put conditions before instructions (e.g., "On the Settings page, click..."). + - Provide clear context for where the action takes place. + - Indicate optional steps clearly (e.g., "Optional: ..."). +- **Elements:** Use bullet lists, tables, notes (`> **Note:**`), and warnings (`> **Warning:**`). +- **Avoid using a table of contents:** If a table of contents is present, remove it. +- **Next steps:** Conclude with a "Next steps" section if applicable. diff --git a/.gemini/skills/docs-writer/scripts/find_broken_links.cjs b/.gemini/skills/docs-writer/scripts/find_broken_links.cjs new file mode 100644 index 0000000000..8c4c690680 --- /dev/null +++ b/.gemini/skills/docs-writer/scripts/find_broken_links.cjs @@ -0,0 +1,63 @@ +#!/usr/bin/env node +/** + * Simple script to find broken internal Markdown links in a directory. + * Usage: node find_broken_links.cjs + */ + +const fs = require('fs'); +const path = require('path'); + +const targetDir = process.argv[2]; +if (!targetDir) { + console.error('Error: Please provide a directory path.'); + process.exit(1); +} + +function findFiles(dir, ext, fileList = []) { + const files = fs.readdirSync(dir); + files.forEach(file => { + const filePath = path.join(dir, file); + if (fs.statSync(filePath).isDirectory()) { + findFiles(filePath, ext, fileList); + } else if (filePath.endsWith(ext)) { + fileList.push(filePath); + } + }); + return fileList; +} + +const mdFiles = findFiles(targetDir, '.md'); +const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g; +let brokenLinksFound = 0; + +mdFiles.forEach(file => { + const content = fs.readFileSync(file, 'utf8'); + const dir = path.dirname(file); + let match; + + while ((match = linkRegex.exec(content)) !== null) { + const linkPath = match[2]; + + // Only check relative, internal links (not http, mailto, etc.) + if (linkPath.startsWith('http') || linkPath.startsWith('mailto:') || linkPath.startsWith('#')) { + continue; + } + + // Strip anchor from link path + const cleanLinkPath = linkPath.split('#')[0]; + if (!cleanLinkPath) continue; + + const absoluteLinkPath = path.resolve(dir, cleanLinkPath); + + if (!fs.existsSync(absoluteLinkPath)) { + console.log(`Broken link in ${path.relative(targetDir, file)}: [${match[1]}](${linkPath}) -> Not found at: ${path.relative(targetDir, absoluteLinkPath)}`); + brokenLinksFound++; + } + } +}); + +if (brokenLinksFound === 0) { + console.log('Success: No broken internal links found.'); +} else { + console.log(`\nFinished: Found ${brokenLinksFound} broken link(s).`); +} diff --git a/.github/workflows/weekly-docs-audit.yaml b/.github/workflows/weekly-docs-audit.yaml new file mode 100644 index 0000000000..735584f6e1 --- /dev/null +++ b/.github/workflows/weekly-docs-audit.yaml @@ -0,0 +1,52 @@ +name: 'Weekly Docs Audit' + +on: + schedule: + # Runs every Monday at 00:00 UTC + - cron: '0 0 * * MON' + workflow_dispatch: + +jobs: + audit-docs: + runs-on: 'ubuntu-latest' + permissions: + contents: 'write' + pull-requests: 'write' + + steps: + - name: 'Checkout repository' + uses: 'actions/checkout@v4' + with: + fetch-depth: 0 + ref: 'main' + + - name: 'Set up Node.js' + uses: 'actions/setup-node@v4' + with: + node-version: '20' + + - name: 'Run Docs Audit with Gemini' + uses: 'google-github-actions/run-gemini-cli@v0' # Use a specific tag or SHA for stability + with: + gemini_api_key: '${{ secrets.GEMINI_API_KEY }}' + prompt: | + Activate the 'docs-writer' skill. + + **Task:** Audit the entire documentation set for correctness and adherence to style guidelines, as defined in your 'docs-auditing.md' reference. + + When you are done, please output your thought process and the steps you took for future debugging purposes, and save the audit results to 'audit-results-${{ github.run_id }}.md'. + + - name: 'Create Pull Request with Audit Results' + uses: 'peter-evans/create-pull-request@v6' + with: + token: '${{ secrets.GEMINI_CLI_ROBOT_GITHUB_PAT }}' + commit-message: 'docs: weekly audit results for ${{ github.run_id }}' + title: 'Docs Audit for Week of ${{ github.event.schedule }}' + body: | + This PR contains the auto-generated documentation audit for the week. It includes a new `audit-results-*.md` file with findings and any direct fixes applied by the agent. + + Please review the suggestions and merge. + branch: 'docs-audit-${{ github.run_id }}' + base: 'main' + team-reviewers: 'gemini-cli-docs, gemini-cli-maintainers' + delete-branch: true diff --git a/docs-writer.skill b/docs-writer.skill new file mode 100644 index 0000000000000000000000000000000000000000..3b7028fe572849832851716865aabcecaf177658 GIT binary patch literal 8128 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 MEC9d){PpdB0Ig2FE&u=k literal 0 HcmV?d00001