Skip to content

feat: generate docs from cli#3646

Merged
chronark merged 72 commits intomainfrom
generate-docs-from-cli
Aug 8, 2025
Merged

feat: generate docs from cli#3646
chronark merged 72 commits intomainfrom
generate-docs-from-cli

Conversation

@ogzhanolguncu
Copy link
Contributor

@ogzhanolguncu ogzhanolguncu commented Jul 22, 2025

What does this PR do?

Motivation

Keeping CLI docs in sync with actual commands is really hard, and things slip through all the time. As your CLI grows and changes, documentation gets stale without anyone noticing. This PR fixes that by auto-generating docs straight from the CLI code using Go templates.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • Chore (refactoring code, technical debt, workflow improvements)
  • Enhancement (small improvements)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How should this be tested?

  • Go to ./apps/engineering
  • Run pnpm run generate-docs
  • Run pnpm run dev
  • Go to http://localhost:3000/docs/architecture/services/deploy and verify that CLI descriptions, flags are reflected properly.

Checklist

Required

  • Filled out the "How to test" section in this PR
  • Read Contributing Guide
  • Self-reviewed my own code
  • Commented on my code in hard-to-understand areas
  • Ran pnpm build
  • Ran pnpm fmt
  • Checked for warnings, there are none
  • Removed all console.logs
  • Merged the latest changes from main onto my branch with git pull origin main
  • My changes don't cause any responsiveness issues

Appreciated

  • If a UI change was made: Added a screen recording or screenshots to this PR
  • Updated the Unkey Docs if changes were necessary

Summary by CodeRabbit

  • New Features

    • Introduced automated generation of CLI documentation with a new script and enhanced CLI command metadata extraction for MDX output.
    • Added detailed, user-friendly documentation for CLI commands: deploy, healthcheck, quotacheck, run (api and ctrl), and version (get, list, rollback).
    • Enhanced CLI command help descriptions with structured usage, examples, and flag details.
  • Documentation

    • Expanded CLI documentation structure and navigation metadata to include the new CLI section and pages.
    • Improved formatting and clarity in README and existing docs.
    • Enabled use of interactive UI components (Tabs, Tab, Banner) within MDX documentation.
  • Chores

    • Added npm script and supporting shell script to automate CLI documentation generation.
    • Minor housekeeping in Makefile and JSON config files.

ogzhanolguncu and others added 30 commits July 14, 2025 13:43
This commit adds config generation and running deploy command using the
defined parameters in that file
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🔭 Outside diff range comments (5)
go/cmd/quotacheck/main.go (1)

91-99: Avoid panics inside the quota-scanning loop

A panic aborts the whole run and loses progress. Return the error (to bubble up) or log it and continue with the next workspace.

-			usedVerifications, err := ch.GetBillableVerifications(ctx, e.Workspace.ID, year, int(month))
-			if err != nil {
-				panic(err)
-			}
+			usedVerifications, err := ch.GetBillableVerifications(ctx, e.Workspace.ID, year, int(month))
+			if err != nil {
+				logger.Error("failed to fetch verifications", "id", e.Workspace.ID, "err", err)
+				continue
+			}
@@
-					err = sendSlackNotification(slackWebhookURL, e, usage)
-					if err != nil {
-						panic(err)
-					}
+					if err := sendSlackNotification(slackWebhookURL, e, usage); err != nil {
+						logger.Error("slack notification failed", "id", e.Workspace.ID, "err", err)
+					}

Also applies to: 107-113

apps/engineering/content/docs/architecture/services/run/api/index.mdx (1)

15-40: Minor formatting / grammar polish

A few flag descriptions are missing articles (“Enable colored log output” → “Enable colored log output”, etc.) and there are double spaces after periods.
Not blocking, but consider running the doc through markdownlint or similar before publishing.

apps/engineering/content/docs/architecture/services/run/ctrl/index.mdx (1)

15-32: Nit: required-flag emphasis is inconsistent

Some required flags are bold-marked, others aren’t (--auth-token is effectively required in secure deployments but not bold). Aligning the convention improves clarity for readers.

apps/engineering/content/docs/architecture/services/deploy/index.mdx (1)

91-108: Docs table: consider grouping flags logically

The flat alphabetical list mixes user-facing and internal flags (e.g. --control-plane-url, --auth-token).
Grouping them (“General”, “Build”, “Registry”, “Control-plane”) or adding a note clarifying internal flags would help users focus on the common path.

go/cmd/version/main.go (1)

128-135: Confirmation prompt is non-functional – rollback proceeds without user consent

fmt.Printf writes the prompt but no input is read, so the rollback executes immediately unless --force is set, defeating the safety measure.

-        if !force {
-            fmt.Printf("⚠ Are you sure you want to rollback %s to version %s? [y/N] ", hostname, versionID)
-            // Read user confirmation
-        }
+        if !force {
+            fmt.Printf("⚠ Are you sure you want to rollback %s to version %s? [y/N] ", hostname, versionID)
+            var answer string
+            if _, err := fmt.Scanln(&answer); err != nil {
+                return fmt.Errorf("failed to read confirmation: %w", err)
+            }
+            answer = strings.TrimSpace(strings.ToLower(answer))
+            if answer != "y" && answer != "yes" {
+                fmt.Println("Rollback aborted.")
+                return nil
+            }
+        }

Additional imports required:

import (
    "strings"
)

Failing to address this constitutes a potentially destructive UX bug.

♻️ Duplicate comments (11)
go/pkg/cli/docs.go (3)

210-210: Use correct string splitting function.

strings.SplitSeq doesn't exist in the standard library. Use strings.Split instead.

-lines := strings.SplitSeq(matches[1], "\n")
+lines := strings.Split(matches[1], "\n")

212-229: Fix iteration over string split result.

The range over strings.Split returns index and value, not just the line.

-for line := range lines {
+for _, line := range lines {

325-339: Add missing flag types to prevent "unknown" in documentation.

The type detection is missing several flag types that might be used in the CLI.

 switch flag.(type) {
 case *StringFlag:
     return "string"
 case *BoolFlag:
     return "boolean"
 case *IntFlag:
     return "integer"
 case *FloatFlag:
     return "float"
 case *StringSliceFlag:
     return "string[]"
+case *DurationFlag:
+    return "duration"
+case *Int64Flag:
+    return "int64"
+case *Uint64Flag:
+    return "uint64"
 default:
     return "unknown"
 }
apps/engineering/content/docs/architecture/services/version/get/index.mdx (1)

9-11: Include full command in syntax block

The syntax block should include the parent command so the snippet is meaningful when copied out of context.

 ```bash
-get [flags]
+unkey version get [flags]

</blockquote></details>
<details>
<summary>apps/engineering/content/docs/architecture/services/version/list/index.mdx (2)</summary><blockquote>

`13-15`: **Syntax block lacks command name**

The syntax block should include the full command path for clarity.



```diff
 ```bash
-list [flags]
+unkey version list [flags]

---

`53-54`: **Table defaults: clarify "—" vs explicit value**

The dash "-" under "Default" column may be misinterpreted as a literal dash value.



```diff
-| `--branch` | Filter by branch name | string |- |- |
-| `--status` | Filter by status (pending, building, active, failed) | string |- |- |
+| `--branch` | Filter by branch name | string | None | - |
+| `--status` | Filter by status (pending, building, active, failed) | string | None | - |
apps/engineering/content/docs/architecture/services/version/index.mdx (1)

7-8: Trim double spaces and finish sentences

Minor style fixes improve rendered markdown.

-Versions are immutable snapshots of your code, configuration, and infrastructure settings. Each version represents a specific deployment state that can be rolled back to at any time.
+Versions are immutable snapshots of your code, configuration, and infrastructure settings. Each version represents a specific deployment state that can be rolled back to at any time.

-- get: Get details about a specific version
-- list: List all versions with optional filtering
-- rollback: Rollback to a previous version
+- get: Get details about a specific version.
+- list: List all versions with optional filtering.
+- rollback: Rollback to a previous version.

-- `version rollback` - Rollback to a previous version
+- `version rollback` - Rollback to a previous version.

Also applies to: 11-13, 18-18

apps/engineering/content/docs/architecture/services/run/index.mdx (1)

11-12: Consistent punctuation & spacing

Add periods at the end of service descriptions for consistency.

-- api: The main API server for validating and managing API keys
-- ctrl: The control plane service for managing infrastructure and deployments
+- api: The main API server for validating and managing API keys.
+- ctrl: The control plane service for managing infrastructure and deployments.

-- `run ctrl` - Run the Unkey control plane service for managing infrastructure and services
+- `run ctrl` - Run the Unkey control plane service for managing infrastructure and services.

Also applies to: 16-16

go/cmd/healthcheck/main.go (1)

37-41: HTTP request still performed without timeout – CLI can hang indefinitely

A previous review already pointed this out; nothing has changed. Instantiate an http.Client{Timeout: …} (or, better, use http.NewRequestWithContext(ctx, …) so the call respects the CLI’s context) instead of http.Get.

-	res, err := http.Get(url)
+	client := &http.Client{Timeout: 10 * time.Second}
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
+	if err != nil {
+		return fmt.Errorf("failed to build request: %w", err)
+	}
+	res, err := client.Do(req)
apps/engineering/content/docs/architecture/services/version/rollback/index.mdx (1)

13-15: Prefix the syntax block with the parent command

Matches the convention used elsewhere and makes the snippet self-contained.

-```bash
-rollback [flags]
-```
+```bash
+unkey version rollback [flags]
+```
apps/engineering/content/docs/architecture/services/quotacheck/index.mdx (1)

43-45: Clarify “no default” values in the table

Using - can be misread. Writing None (or leaving the cell empty) communicates intent more clearly.

-| `--clickhouse-url` **(required)** | URL for the ClickHouse database | string |- |`CLICKHOUSE_URL` |
-| `--database-dsn` **(required)** | DSN for the primary database | string |- |`DATABASE_DSN` |
-| `--slack-webhook-url` | Slack webhook URL to send notifications | string |- |`SLACK_WEBHOOK_URL` |
+| `--clickhouse-url` **(required)** | URL for the ClickHouse database | string | None | `CLICKHOUSE_URL` |
+| `--database-dsn` **(required)** | DSN for the primary database | string | None | `DATABASE_DSN` |
+| `--slack-webhook-url` | Slack webhook URL to send notifications | string | None | `SLACK_WEBHOOK_URL` |
📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b0a7cb3 and 1682029.

📒 Files selected for processing (16)
  • apps/engineering/content/docs/architecture/services/deploy/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/healthcheck/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/quotacheck/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/run/api/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/run/ctrl/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/run/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/version/get/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/version/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/version/list/index.mdx (1 hunks)
  • apps/engineering/content/docs/architecture/services/version/rollback/index.mdx (1 hunks)
  • go/cmd/deploy/main.go (1 hunks)
  • go/cmd/healthcheck/main.go (1 hunks)
  • go/cmd/quotacheck/main.go (1 hunks)
  • go/cmd/run/main.go (1 hunks)
  • go/cmd/version/main.go (4 hunks)
  • go/pkg/cli/docs.go (1 hunks)
🧰 Additional context used
🪛 LanguageTool
apps/engineering/content/docs/architecture/services/version/list/index.mdx

[grammar] ~5-~5: There might be a mistake here.
Context: ...t project with support for filtering by branch, status, and limiting results. ## Filtering Op...

(QB_NEW_EN_OTHER)


[grammar] ~5-~5: Use correct spacing
Context: ...ltering by branch, status, and limiting results. ## Filtering Options Use flags to filter r...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...us, and limiting results. ## Filtering Options Use flags to filter results by branch na...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: There might be a mistake here.
Context: ... Use flags to filter results by branch name, status, or limit the number of results returne...

(QB_NEW_EN_OTHER)


[grammar] ~9-~9: Use prepositions correctly
Context: ... filter results by branch name, status, or limit the number of results returned. F...

(QB_NEW_EN_OTHER_ERROR_IDS_7)


[grammar] ~9-~9: Use correct spacing
Context: ...lters can be combined for more specific queries. ## Command Syntax bash list [flags] ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ... for more specific queries. ## Command Syntax bash list [flags] ## Examples ### List all versions ```bash...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~19-~19: There might be a mistake here.
Context: ... [flags] ## Examples ### List all versions bash unkey version list ### List versions from main branch bash ...

(QB_NEW_EN_OTHER)


[grammar] ~25-~25: There might be a problem here.
Context: ...ersion list ### List versions from main branch bash unkey version list --branch main ### List only active versions bash unkey...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~31-~31: There might be a mistake here.
Context: ...--branch main ### List only active versions bash unkey version list --status active ### List last 5 versions bash unkey vers...

(QB_NEW_EN_OTHER)


[grammar] ~37-~37: Use articles correctly
Context: ...sion list --status active ### List last 5 versions bash unkey version list ...

(QB_NEW_EN_OTHER_ERROR_IDS_11)


[grammar] ~37-~37: There might be a mistake here.
Context: ...st --status active ### List last 5 versions bash unkey version list --limit 5 ### Combine filters bash unkey version l...

(QB_NEW_EN_OTHER)


[grammar] ~43-~43: There might be a problem here.
Context: ...version list --limit 5 ### Combine filters bash unkey version list --branch main --status active --limit 3 ``` ## Flags | Flag | Description | Type | Default | ...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~55-~55: There might be a problem here.
Context: ...--limit | Number of versions to show | integer |10` |- |

(QB_NEW_EN_MERGED_MATCH)

apps/engineering/content/docs/architecture/services/run/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...y services in development or production environments. This command starts different Unkey micr...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ... independently and runs as a standalone process. ## Available Services - api: The main API ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ... as a standalone process. ## Available Services - api: The main API server for validating ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~12-~12: Use correct spacing
Context: ...service for managing infrastructure and deployments ## Quick Reference - run api - Run the Un...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~14-~14: Use correct spacing
Context: ...nfrastructure and deployments ## Quick Reference - run api - Run the Unkey API server for validating...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~15-~15: There might be a mistake here.
Context: ... server for validating and managing API keys - run ctrl - Run the Unkey control plane service fo...

(QB_NEW_EN_OTHER)


[grammar] ~16-~16: Use a period to end declarative sentences
Context: ...service for managing infrastructure and services

(QB_NEW_EN_OTHER_ERROR_IDS_25)

apps/engineering/content/docs/architecture/services/version/get/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ..., branch, creation time, and associated hostnames. ## Command Syntax bash get [flags] ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ..., and associated hostnames. ## Command Syntax bash get [flags] ## Examples ### Get details for a specific...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~15-~15: There might be a mistake here.
Context: ...xamples ### Get details for a specific version bash unkey version get v_abc123def456 ### Get details for another version ```bash...

(QB_NEW_EN_OTHER)


[grammar] ~21-~21: There might be a mistake here.
Context: ...def456 ### Get details for another version bash unkey version get v_def456ghi789 ```

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/architecture/services/quotacheck/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...ceeded quotas and optionally send Slack notifications. This command monitors quota usage by que...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...omatically send notifications via Slack webhook. ## Configuration The command requires Clic...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ...optional but recommended for production monitoring. ## Command Syntax ```bash quotacheck [flag...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~13-~13: Use correct spacing
Context: ... for production monitoring. ## Command Syntax bash quotacheck [flags] ## Examples ### Check quotas without notif...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~21-~21: There might be a mistake here.
Context: ... ## Examples ### Check quotas without notifications bash unkey quotacheck --clickhouse-url clickhouse://localhost:9000 --database-dsn postgres://user:pass@localhost/db ### Check quotas with Slack notifications `...

(QB_NEW_EN_OTHER)


[grammar] ~27-~27: There might be a mistake here.
Context: ...ost/db ### Check quotas with Slack notifications bash unkey quotacheck --clickhouse-url clickhouse://localhost:9000 --database-dsn postgres://user:pass@localhost/db --slack-webhook-url https://hooks.slack.com/services/... ### Using environment variables bash CLI...

(QB_NEW_EN_OTHER)


[grammar] ~33-~33: Use correct spacing
Context: ...services/... ### Using environment variables bash CLICKHOUSE_URL=... DATABASE_DSN=... SLACK_WEBHOOK_URL=... unkey quotacheck ``` ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~45-~45: There might be a mistake here.
Context: ...k URL to send notifications | string |- |SLACK_WEBHOOK_URL |

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/architecture/services/version/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...eate, list, and manage versions of your API. Versions are immutable snapshots of your...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...state that can be rolled back to at any time. ## Available Commands - get: Get details a...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ...lled back to at any time. ## Available Commands - get: Get details about a specific versio...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: There might be a mistake here.
Context: ...ds - get: Get details about a specific version - list: List all versions with optional fi...

(QB_NEW_EN_OTHER)


[grammar] ~12-~12: There might be a problem here.
Context: ...- list: List all versions with optional filtering - rollback: Rollback to a previous version ## Quick Referen...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~13-~13: There might be a mistake here.
Context: ...ring - rollback: Rollback to a previous version ## Quick Reference - version get - Get de...

(QB_NEW_EN_OTHER)


[grammar] ~15-~15: Use correct spacing
Context: ...ollback to a previous version ## Quick Reference - version get - Get details about a version - `version ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~16-~16: Use hyphens correctly
Context: ...e - version get - Get details about a version - version list - List versions with optional filtering ...

(QB_NEW_EN_OTHER_ERROR_IDS_29)


[grammar] ~17-~17: Use hyphens correctly
Context: ...ion list- List versions with optional filtering -version rollback` - Rollback to a previous version

(QB_NEW_EN_OTHER_ERROR_IDS_29)


[grammar] ~18-~18: There might be a mistake here.
Context: ...tional filtering - version rollback - Rollback to a previous version

(QB_NEW_EN_OTHER)


[grammar] ~18-~18: Use a period to end declarative sentences
Context: ...sion rollback` - Rollback to a previous version

(QB_NEW_EN_OTHER_ERROR_IDS_25)

apps/engineering/content/docs/architecture/services/version/rollback/index.mdx

[grammar] ~4-~4: Use the right verb tense
Context: ...n: "Rollback to a previous version" --- Rollback a hostname to a previous version. This ...

(QB_NEW_EN_OTHER_ERROR_IDS_13)


[grammar] ~5-~5: Use correct spacing
Context: ...current version to the specified target version. ## Warning This operation affects live tra...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ...ip the confirmation prompt in automated environments. ## Command Syntax ```bash rollback [flags]...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ... in automated environments. ## Command Syntax bash rollback [flags] ## Examples ### Rollback with confirmation...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~19-~19: Use correct spacing
Context: ...xamples ### Rollback with confirmation prompt bash unkey version rollback my-api.unkey.app v_abc123def456 ### Rollback without confirmation for automa...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~25-~25: Use correct spacing
Context: ... ### Rollback without confirmation for automation bash unkey version rollback my-api.unkey.app v_abc123def456 --force ### Rollback staging environment ```bash un...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~31-~31: Use correct spacing
Context: ...ef456 --force ### Rollback staging environment bash unkey version rollback staging-api.unkey.app v_def456ghi789 ``` ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~41-~41: There might be a mistake here.
Context: ...tion prompt for automated deployments | boolean |false |- |

(QB_NEW_EN_OTHER)


[grammar] ~41-~41: Use hyphens correctly
Context: ...utomated deployments | boolean |false |- |

(QB_NEW_EN_OTHER_ERROR_IDS_29)

apps/engineering/content/docs/architecture/services/healthcheck/index.mdx

[grammar] ~5-~5: There might be a problem here.
Context: ...de 0 if the server returns a 200 status code, otherwise exits with code 1. ## Use Cases This ...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~5-~5: Use correct spacing
Context: ... status code, otherwise exits with code 1. ## Use Cases This is useful for health mon...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...e, otherwise exits with code 1. ## Use Cases This is useful for health monitoring in ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ...h probes, and infrastructure monitoring scripts. ## Command Syntax ```bash healthcheck [fla...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ...ructure monitoring scripts. ## Command Syntax bash healthcheck [flags] ## Examples ### Check if a service is heal...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~19-~19: There might be a mistake here.
Context: ... ## Examples ### Check if a service is healthy bash unkey healthcheck https://api.unkey.dev/health ### Check local service ```bash unkey healt...

(QB_NEW_EN_OTHER)


[grammar] ~25-~25: There might be a mistake here.
Context: ...i.unkey.dev/health ### Check local service bash unkey healthcheck http://localhost:8080/health ### Use in monitoring script bash unkey ...

(QB_NEW_EN_OTHER)


[grammar] ~31-~31: There might be a mistake here.
Context: ...:8080/health ### Use in monitoring script bash unkey healthcheck https://example.com/api/status || echo 'Service is down!' ```

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/architecture/services/run/ctrl/index.mdx

[grammar] ~5-~5: There might be a mistake here.
Context: ...service for managing infrastructure and services ## Command Syntax bash ctrl [flags] ...

(QB_NEW_EN_OTHER)


[grammar] ~7-~7: Use correct spacing
Context: ...infrastructure and services ## Command Syntax bash ctrl [flags] ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~17-~17: Insert the missing word
Context: ...ne server to listen on. Default: 8080 | integer |8080 |UNKEY_HTTP_PORT | | `--color...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~18-~18: Insert the missing word
Context: ...ble colored log output. Default: true | boolean |true |UNKEY_LOGS_COLOR | | `--plat...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~21-~21: Insert the missing word
Context: ...logging and routing. Default: unknown | string |"unknown" |AWS_REGION | | `--insta...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~26-~26: Insert the missing word
Context: ...hen --otel is provided. Default: 0.25 | float |0.25 |`UNKEY_OTEL_TRACE_SAMPLING_RAT...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~31-~31: Insert the missing word
Context: ...ault: /var/lib/spire/agent/agent.sock | string |"/var/lib/spire/agent/agent.sock" |`U...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~31-~31: There might be a mistake here.
Context: ...g |"/var/lib/spire/agent/agent.sock" |UNKEY_SPIFFE_SOCKET_PATH |

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/architecture/services/run/api/index.mdx

[grammar] ~5-~5: There might be a mistake here.
Context: ... server for validating and managing API keys ## Command Syntax bash api [flags] ...

(QB_NEW_EN_OTHER)


[grammar] ~7-~7: Use correct spacing
Context: ...ating and managing API keys ## Command Syntax bash api [flags] ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~17-~17: Insert the missing word
Context: ...PI server to listen on. Default: 7070 | integer |7070 |UNKEY_HTTP_PORT | | `--color...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~18-~18: Insert the missing word
Context: ...ble colored log output. Default: true | boolean |true |UNKEY_LOGS_COLOR | | `--test...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~19-~19: There might be a mistake here.
Context: ... Enable test mode. WARNING: Potentially unsafe, may trust client inputs blindly. Defaul...

(QB_NEW_EN_OTHER)


[grammar] ~19-~19: Insert the missing word
Context: ...client inputs blindly. Default: false | boolean |false |UNKEY_TEST_MODE | | `--plat...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~22-~22: Insert the missing word
Context: ...logging and routing. Default: unknown | string |"unknown" |AWS_REGION | | `--insta...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~29-~29: Insert the missing word
Context: ...hen --otel is provided. Default: 0.25 | float |0.25 |`UNKEY_OTEL_TRACE_SAMPLING_RATE...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~39-~39: There might be a mistake here.
Context: ...ired when proxy is enabled. | string |- |UNKEY_CHPROXY_AUTH_TOKEN |

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/architecture/services/deploy/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...sion of your application, or initialize configuration. The deploy command handles the complete ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...eployment process with real-time status updates. ## Initialization Mode Use --init to creat...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ...time status updates. ## Initialization Mode Use --init to create a configuration tem...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ...ents simpler and more consistent across environments. ## Deployment Process 1. Load configuratio...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~13-~13: Use correct spacing
Context: ...ent across environments. ## Deployment Process 1. Load configuration from unkey.json or fl...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~15-~15: There might be a mistake here.
Context: .... Load configuration from unkey.json or flags 2. Build Docker image from your application...

(QB_NEW_EN_OTHER)


[grammar] ~16-~16: Use articles correctly
Context: ...ation from unkey.json or flags 2. Build Docker image from your application 3. Push i...

(QB_NEW_EN_OTHER_ERROR_IDS_11)


[grammar] ~16-~16: There might be a mistake here.
Context: ...r flags 2. Build Docker image from your application 3. Push image to container registry 4. Crea...

(QB_NEW_EN_OTHER)


[grammar] ~17-~17: Use articles correctly
Context: ...r image from your application 3. Push image to container registry 4. Create deploym...

(QB_NEW_EN_OTHER_ERROR_IDS_11)


[grammar] ~17-~17: There might be a problem here.
Context: ...rom your application 3. Push image to container registry 4. Create deployment version on Unkey platf...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~18-~18: Use articles correctly
Context: ...h image to container registry 4. Create deployment version on Unkey platform 5. Monitor de...

(QB_NEW_EN_OTHER_ERROR_IDS_11)


[grammar] ~18-~18: There might be a problem here.
Context: ...egistry 4. Create deployment version on Unkey platform 5. Monitor deployment status until active ...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~19-~19: There might be a mistake here.
Context: ...form 5. Monitor deployment status until active ## Command Syntax ```bash deploy [flags] `...

(QB_NEW_EN_OTHER)


[grammar] ~21-~21: Use correct spacing
Context: ...loyment status until active ## Command Syntax bash deploy [flags] ## Examples ### Initialize new project con...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~29-~29: There might be a mistake here.
Context: ...## Examples ### Initialize new project configuration bash unkey deploy --init ### Initialize with custom location ```bash...

(QB_NEW_EN_OTHER)


[grammar] ~35-~35: There might be a mistake here.
Context: ... --init ### Initialize with custom location bash unkey deploy --init --config=./my-project ``` ### Force overwrite existing configuration ...

(QB_NEW_EN_OTHER)


[grammar] ~41-~41: There might be a mistake here.
Context: ...oject ### Force overwrite existing configuration bash unkey deploy --init --force ``` ### Standard deployment (uses ./unkey.json) ...

(QB_NEW_EN_OTHER)


[grammar] ~47-~47: Use correct spacing
Context: ...orce ### Standard deployment (uses ./unkey.json) bash unkey deploy ``` ### Deploy from specific config directory `...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~53-~53: There might be a mistake here.
Context: ...oy ### Deploy from specific config directory bash unkey deploy --config=./production ### Override workspace from config file ...

(QB_NEW_EN_OTHER)


[grammar] ~59-~59: Use correct spacing
Context: ... ### Override workspace from config file bash unkey deploy --workspace-id=ws_production_123 ### Deploy with custom build context bas...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~65-~65: There might be a mistake here.
Context: ...n_123 ### Deploy with custom build context bash unkey deploy --context=./api ``` ### Local development (build only, no push) ...

(QB_NEW_EN_OTHER)


[grammar] ~71-~71: Use correct spacing
Context: ... ### Local development (build only, no push) bash unkey deploy --skip-push ### Deploy pre-built image ```bash unkey de...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~77-~77: There might be a mistake here.
Context: ...y --skip-push ### Deploy pre-built image bash unkey deploy --docker-image=ghcr.io/user/app:v1.0.0 ### Verbose output for debugging bash un...

(QB_NEW_EN_OTHER)


[grammar] ~83-~83: Use correct spacing
Context: .../app:v1.0.0 ### Verbose output for debugging bash unkey deploy --verbose ``` ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)

🪛 golangci-lint (2.2.2)
go/cmd/deploy/main.go

124-124: cli.Command is missing fields Version, Commands, Aliases

(exhaustruct)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: Test Go API Local / Test
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Build / Build
  • GitHub Check: Test Packages / Test
🔇 Additional comments (4)
go/pkg/cli/docs.go (1)

310-311: Confirmed: getDefaultValue and getEnvVar exist on Command
Both methods are implemented in go/pkg/cli/help.go (see lines 197–212 for getEnvVar and 215–239 for getDefaultValue), so the references in docs.go are valid.

go/cmd/run/main.go (1)

28-33: exhaustruct warning – initialise all struct fields or suppress

The linter hint says Version / Aliases are missing.
If those fields are intentionally omitted, add a //nolint:exhaustruct comment on the line; otherwise populate them to silence CI.

go/cmd/deploy/main.go (1)

124-154: cli.Command literal still misses Version / Aliases → CI warning

golangci-lint’s exhaustruct check complains here as well.
Either:

  1. Provide the fields:
Aliases: []string{"dp"},
Version: version.String(),
  1. Or suppress:
//nolint:exhaustruct
var Cmd = &cli.Command{ … }
go/cmd/version/main.go (1)

15-22: Improved top-level help description looks solid

The extended explanation adds valuable context for end-users without altering runtime behaviour.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1682029 and caa6742.

📒 Files selected for processing (1)
  • apps/engineering/content/docs/architecture/services/healthcheck/index.mdx (1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#2825
File: apps/dashboard/app/(app)/logs-v2/hooks/use-bookmarked-filters.ts:0-0
Timestamp: 2025-01-30T20:51:44.359Z
Learning: The user (ogzhanolguncu) prefers to handle refactoring suggestions in separate PRs to maintain focus in the current PR.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.
Learnt from: mcstepp
PR: unkeyed/unkey#3662
File: apps/dashboard/lib/trpc/routers/deployment/getOpenApiDiff.ts:110-147
Timestamp: 2025-07-25T19:11:00.208Z
Learning: In apps/dashboard/lib/trpc/routers/deployment/getOpenApiDiff.ts, the user mcstepp prefers to keep mock data fallbacks in POC/demonstration code for simplicity, even if it wouldn't be production-ready. This aligns with the PR being work-in-progress for demonstration purposes.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3297
File: apps/dashboard/lib/trpc/routers/authorization/roles/query.ts:210-323
Timestamp: 2025-06-04T20:13:12.060Z
Learning: The user ogzhanolguncu prefers explicit, duplicated code over abstracted helper functions when it improves readability, even if it means some duplication in filter building functions in the authorization roles query module.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3480
File: apps/dashboard/app/new-2/hooks/use-workspace-step.tsx:47-79
Timestamp: 2025-07-09T11:35:51.724Z
Learning: In the Unkey codebase, ogzhanolguncu prefers to keep invariant checks that throw errors for cases that shouldn't happen in normal operation (like null workspace ID checks), rather than adding graceful error handling code for edge cases that would only occur if someone tampers with the actual flow.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3375
File: apps/dashboard/app/(app)/settings/root-keys/components/table/hooks/use-root-keys-list-query.ts:0-0
Timestamp: 2025-06-25T20:32:10.471Z
Learning: In the Unkey codebase, ogzhanolguncu prefers strict validation with fail-fast error handling. When validation errors occur that shouldn't happen in normal operation (like invalid operators), throwing errors to crash the page is preferred over graceful error handling or console logging.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3499
File: apps/dashboard/app/new/hooks/use-workspace-step.tsx:19-26
Timestamp: 2025-07-11T13:00:05.416Z
Learning: In the Unkey codebase, ogzhanolguncu prefers to keep commented code for planned future features (like slug-based workspaces) rather than removing it, as it serves as a reference for upcoming implementation.
apps/engineering/content/docs/architecture/services/healthcheck/index.mdx (7)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:32-36
Timestamp: 2025-04-22T17:33:28.162Z
Learning: In the Unkey dashboard UI for delete protection, the button/link to initiate the process is labeled "Disable Delete Protection" while the confirmation button is labeled "Disable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:21-24
Timestamp: 2025-04-22T17:34:04.438Z
Learning: In the Unkey dashboard UI for enabling delete protection, the button/link to initiate the process is labeled "Enable Delete Protection" while the confirmation button is labeled "Enable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: chronark
PR: #3617
File: go/apps/api/openapi/openapi.yaml:3309-3312
Timestamp: 2025-07-16T17:51:57.297Z
Learning: In the Unkey API OpenAPI schema, the permissions query regex for the verifyKey endpoint intentionally allows all whitespace characters (including tabs and newlines) via \s. Do not flag this as an error in future reviews.

Learnt from: mcstepp
PR: #3242
File: apps/dashboard/app/(app)/apis/[apiId]/api-id-navbar.tsx:47-50
Timestamp: 2025-05-15T15:57:02.128Z
Learning: When reviewing code for Unkey, prefer using Boolean() over the double negation (!!) operator for boolean coercion, as their linter rules favor this pattern.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{env,sh,yaml,yml,json,conf,ini} : All environment variables MUST follow the format UNKEY_<SERVICE_NAME>_VARNAME.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: Build / Build
  • GitHub Check: Test Go API Local / Test
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Test Packages / Test
  • GitHub Check: autofix
  • GitHub Check: Analyze (javascript-typescript)

@chronark
Copy link
Collaborator

CleanShot 2025-07-28 at 13 24 03@2x I don't really dig it
  1. Very verbose sidebar names, why do we add "Command" everywhere?
  2. missing the full command, it should say unkey run api
    3.+4 is duplicate
  3. It's a table, not super nice, but it's fine for the sake of not spending too much time on this

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 21

🔭 Outside diff range comments (2)
apps/engineering/content/docs/cli/index.mdx (1)

5-5: Add a short introduction to avoid an empty page body

Right now the page renders only front-matter; the body is empty.
Add 1-2 sentences that explain what the CLI is, link to installation, and reference the command list so users don’t land on a blank screen.

 ---
 title: "CLI"
 description: "Single binary for everything"
 ---
+
+The **Unkey CLI** is the central entry-point for interacting with the platform.  
+Use the sidebar or the list below to explore individual commands.
apps/engineering/package.json (1)

24-41: Duplicate tailwindcss entry with diverging versions

tailwindcss appears in both dependencies (^3.4.3) and devDependencies (^3.4.10).
This installs two copies and bloats node_modules; resolve to a single entry with the newer version.

-    "tailwindcss": "^3.4.3",
...
-    "tailwindcss": "^3.4.10",
+    "tailwindcss": "^3.4.10",
♻️ Duplicate comments (4)
apps/engineering/package.json (1)

6-6: Script still not cross-platform – see earlier feedback
The raw POSIX path breaks on Windows shells. This was already mentioned; consider prefixing with bash.

apps/engineering/scripts/generate-cli-docs.sh (3)

37-38: Quote the variable to avoid word splitting and globbing

Same issue flagged previously: $cmd should be quoted.

-if ../../go/unkey $cmd mdx >"$DOCS_DIR/$cmd/index.mdx" 2>/dev/null; then
+if ../../go/unkey "$cmd" mdx >"$DOCS_DIR/$cmd/index.mdx" 2>/dev/null; then

47-49: Quote variable in subshell invocation

Repeat of the quoting issue:

-help_output=$(../../go/unkey $cmd --help 2>/dev/null)
+help_output=$(../../go/unkey "$cmd" --help 2>/dev/null)

57-58: Quote both $cmd and $subcmd

-if ../../go/unkey $cmd $subcmd mdx >"$DOCS_DIR/$cmd/$subcmd/index.mdx" 2>/dev/null; then
+if ../../go/unkey "$cmd" "$subcmd" mdx >"$DOCS_DIR/$cmd/$subcmd/index.mdx" 2>/dev/null; then
📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between caa6742 and 5860eea.

📒 Files selected for processing (15)
  • apps/engineering/content/docs/cli/deploy/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/healthcheck/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/meta.json (1 hunks)
  • apps/engineering/content/docs/cli/quotacheck/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/run/api/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/run/ctrl/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/run/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/get/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/list/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/rollback/index.mdx (1 hunks)
  • apps/engineering/content/docs/meta.json (1 hunks)
  • apps/engineering/package.json (1 hunks)
  • apps/engineering/scripts/generate-cli-docs.sh (1 hunks)
🧰 Additional context used
🧠 Learnings (9)
📓 Common learnings
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#2825
File: apps/dashboard/app/(app)/logs-v2/hooks/use-bookmarked-filters.ts:0-0
Timestamp: 2025-01-30T20:51:44.359Z
Learning: The user (ogzhanolguncu) prefers to handle refactoring suggestions in separate PRs to maintain focus in the current PR.
Learnt from: mcstepp
PR: unkeyed/unkey#3662
File: apps/dashboard/lib/trpc/routers/deployment/getOpenApiDiff.ts:110-147
Timestamp: 2025-07-25T19:11:00.208Z
Learning: In apps/dashboard/lib/trpc/routers/deployment/getOpenApiDiff.ts, the user mcstepp prefers to keep mock data fallbacks in POC/demonstration code for simplicity, even if it wouldn't be production-ready. This aligns with the PR being work-in-progress for demonstration purposes.
Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.
Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Update relevant anchors when modifying associated code.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3297
File: apps/dashboard/lib/trpc/routers/authorization/roles/query.ts:210-323
Timestamp: 2025-06-04T20:13:12.060Z
Learning: The user ogzhanolguncu prefers explicit, duplicated code over abstracted helper functions when it improves readability, even if it means some duplication in filter building functions in the authorization roles query module.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3480
File: apps/dashboard/app/new-2/hooks/use-workspace-step.tsx:47-79
Timestamp: 2025-07-09T11:35:51.724Z
Learning: In the Unkey codebase, ogzhanolguncu prefers to keep invariant checks that throw errors for cases that shouldn't happen in normal operation (like null workspace ID checks), rather than adding graceful error handling code for edge cases that would only occur if someone tampers with the actual flow.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3375
File: apps/dashboard/app/(app)/settings/root-keys/components/table/hooks/use-root-keys-list-query.ts:0-0
Timestamp: 2025-06-25T20:32:10.471Z
Learning: In the Unkey codebase, ogzhanolguncu prefers strict validation with fail-fast error handling. When validation errors occur that shouldn't happen in normal operation (like invalid operators), throwing errors to crash the page is preferred over graceful error handling or console logging.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3499
File: apps/dashboard/app/new/hooks/use-workspace-step.tsx:19-26
Timestamp: 2025-07-11T13:00:05.416Z
Learning: In the Unkey codebase, ogzhanolguncu prefers to keep commented code for planned future features (like slug-based workspaces) rather than removing it, as it serves as a reference for upcoming implementation.
apps/engineering/content/docs/cli/index.mdx (1)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

apps/engineering/content/docs/cli/meta.json (2)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Do not remove AIDEV-*s without explicit human instruction.

apps/engineering/content/docs/cli/run/index.mdx (1)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

apps/engineering/content/docs/cli/run/ctrl/index.mdx (1)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

apps/engineering/package.json (3)

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Do not remove AIDEV-*s without explicit human instruction.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

apps/engineering/content/docs/cli/run/api/index.mdx (1)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

apps/engineering/content/docs/cli/deploy/index.mdx (4)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/deploy/*/docs/** : Documentation should be placed in <service>/docs.

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/deploy.go:153-158
Timestamp: 2025-07-16T09:18:45.379Z
Learning: In the go/cmd/cli/commands/deploy/ CLI codebase, ogzhanolguncu prefers to allow deployment to continue even when Docker push fails (around lines 153-158 in deploy.go) because the team is working locally and needs this behavior for local development workflows where registry access might not be available.

Learnt from: mcstepp
PR: #3662
File: apps/dashboard/lib/trpc/routers/deployment/list.ts:11-11
Timestamp: 2025-07-25T19:09:43.284Z
Learning: In apps/dashboard/lib/trpc/routers/deployment/list.ts, the listDeployments procedure intentionally queries the versions table rather than a deployments table. The user mcstepp indicated that renaming the table would require a database migration, which was deferred for the current PR focused on UI features.

apps/engineering/scripts/generate-cli-docs.sh (6)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Do not remove AIDEV-*s without explicit human instruction.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Update relevant anchors when modifying associated code.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/deploy/{assetmanagerd,billaged,builderd,metald}/**/Makefile : Use make build to test that the binary builds.

🪛 LanguageTool
apps/engineering/content/docs/cli/run/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...y services in development or production environments. This command starts different Unkey micr...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ... independently and runs as a standalone process. ## Available Services - api: The main API ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ... as a standalone process. ## Available Services - api: The main API server for validating ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~12-~12: Use correct spacing
Context: ...service for managing infrastructure and deployments ## Quick Reference - run api - Run the Un...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~14-~14: Use correct spacing
Context: ...nfrastructure and deployments ## Quick Reference - run api - Run the Unkey API server for validating...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~15-~15: There might be a mistake here.
Context: ... server for validating and managing API keys - run ctrl - Run the Unkey control plane service fo...

(QB_NEW_EN_OTHER)


[grammar] ~16-~16: Use a period to end declarative sentences
Context: ...service for managing infrastructure and services

(QB_NEW_EN_OTHER_ERROR_IDS_25)

apps/engineering/content/docs/cli/quotacheck/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...ceeded quotas and optionally send Slack notifications. This command monitors quota usage by que...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...omatically send notifications via Slack webhook. ## Configuration The command requires Clic...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ...optional but recommended for production monitoring. ## Command Syntax ```bash quotacheck [flag...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~13-~13: Use correct spacing
Context: ... for production monitoring. ## Command Syntax bash quotacheck [flags] ## Examples ### Check quotas without notif...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~21-~21: There might be a mistake here.
Context: ... ## Examples ### Check quotas without notifications bash unkey quotacheck --clickhouse-url clickhouse://localhost:9000 --database-dsn postgres://user:pass@localhost/db ### Check quotas with Slack notifications `...

(QB_NEW_EN_OTHER)


[grammar] ~27-~27: There might be a mistake here.
Context: ...ost/db ### Check quotas with Slack notifications bash unkey quotacheck --clickhouse-url clickhouse://localhost:9000 --database-dsn postgres://user:pass@localhost/db --slack-webhook-url https://hooks.slack.com/services/... ### Using environment variables bash CLI...

(QB_NEW_EN_OTHER)


[grammar] ~33-~33: Use correct spacing
Context: ...services/... ### Using environment variables bash CLICKHOUSE_URL=... DATABASE_DSN=... SLACK_WEBHOOK_URL=... unkey quotacheck ``` ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~45-~45: There might be a mistake here.
Context: ...k URL to send notifications | string |- |SLACK_WEBHOOK_URL |

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/cli/version/get/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ..., branch, creation time, and associated hostnames. ## Command Syntax bash get [flags] ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ..., and associated hostnames. ## Command Syntax bash get [flags] ## Examples ### Get details for a specific...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~15-~15: There might be a mistake here.
Context: ...xamples ### Get details for a specific version bash unkey version get v_abc123def456 ### Get details for another version ```bash...

(QB_NEW_EN_OTHER)


[grammar] ~21-~21: There might be a mistake here.
Context: ...def456 ### Get details for another version bash unkey version get v_def456ghi789 ```

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/cli/version/rollback/index.mdx

[grammar] ~4-~4: Use the right verb tense
Context: ...n: "Rollback to a previous version" --- Rollback a hostname to a previous version. This ...

(QB_NEW_EN_OTHER_ERROR_IDS_13)


[grammar] ~5-~5: Use correct spacing
Context: ...current version to the specified target version. ## Warning This operation affects live tra...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ...ip the confirmation prompt in automated environments. ## Command Syntax ```bash rollback [flags]...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: Use correct spacing
Context: ... in automated environments. ## Command Syntax bash rollback [flags] ## Examples ### Rollback with confirmation...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~19-~19: Use correct spacing
Context: ...xamples ### Rollback with confirmation prompt bash unkey version rollback my-api.unkey.app v_abc123def456 ### Rollback without confirmation for automa...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~25-~25: Use correct spacing
Context: ... ### Rollback without confirmation for automation bash unkey version rollback my-api.unkey.app v_abc123def456 --force ### Rollback staging environment ```bash un...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~31-~31: Use correct spacing
Context: ...ef456 --force ### Rollback staging environment bash unkey version rollback staging-api.unkey.app v_def456ghi789 ``` ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~41-~41: There might be a mistake here.
Context: ...tion prompt for automated deployments | boolean |false |- |

(QB_NEW_EN_OTHER)


[grammar] ~41-~41: Use hyphens correctly
Context: ...utomated deployments | boolean |false |- |

(QB_NEW_EN_OTHER_ERROR_IDS_29)

apps/engineering/content/docs/cli/run/ctrl/index.mdx

[grammar] ~5-~5: There might be a mistake here.
Context: ...service for managing infrastructure and services ## Command Syntax bash ctrl [flags] ...

(QB_NEW_EN_OTHER)


[grammar] ~7-~7: Use correct spacing
Context: ...infrastructure and services ## Command Syntax bash ctrl [flags] ## Flags | Flag | Description | Type | Def...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~17-~17: Insert the missing word
Context: ...ne server to listen on. Default: 8080 | integer |8080 |UNKEY_HTTP_PORT | | `--color...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~18-~18: Insert the missing word
Context: ...ble colored log output. Default: true | boolean |true |UNKEY_LOGS_COLOR | | `--plat...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~21-~21: Insert the missing word
Context: ...logging and routing. Default: unknown | string |"unknown" |AWS_REGION | | `--insta...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~26-~26: Insert the missing word
Context: ...hen --otel is provided. Default: 0.25 | float |0.25 |`UNKEY_OTEL_TRACE_SAMPLING_RAT...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~31-~31: Insert the missing word
Context: ...ault: /var/lib/spire/agent/agent.sock | string |"/var/lib/spire/agent/agent.sock" |`U...

(QB_NEW_EN_OTHER_ERROR_IDS_32)


[grammar] ~31-~31: There might be a mistake here.
Context: ...g |"/var/lib/spire/agent/agent.sock" |UNKEY_SPIFFE_SOCKET_PATH |

(QB_NEW_EN_OTHER)

🪛 Shellcheck (0.10.0)
apps/engineering/scripts/generate-cli-docs.sh

[info] 37-37: Double quote to prevent globbing and word splitting.

(SC2086)


[info] 47-47: Double quote to prevent globbing and word splitting.

(SC2086)


[info] 57-57: Double quote to prevent globbing and word splitting.

(SC2086)


[info] 57-57: Double quote to prevent globbing and word splitting.

(SC2086)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Build / Build
  • GitHub Check: Test Go API Local / Test
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Test Packages / Test
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (5)
apps/engineering/content/docs/meta.json (1)

8-11: Confirm navigation order

"cli" is injected between "releases" and "architecture".
If the menu is meant to stay alphabetically sorted (current items mostly are), consider moving "cli" after "company" or update the other entries for consistency.
Otherwise, mark the intended ordering rule somewhere to prevent future shuffle PRs.

apps/engineering/content/docs/cli/meta.json (1)

5-5: Sidebar will not surface sub-commands

Only the five top-level commands are listed. Generated pages such as run/api or version/list will be hidden unless they have their own nested meta.json.
Verify that the docs generator emits per-command meta.json files or append them here so that every page is reachable from the sidebar.

apps/engineering/content/docs/cli/version/rollback/index.mdx (1)

37-41: Document additional flags / env-vars

Only --force is listed, yet the command accepts at least the standard --help, and may expose other inherited flags (e.g., --output). Add them or explicitly state that --force is the only command-specific flag to avoid confusion.

apps/engineering/content/docs/cli/deploy/index.mdx (2)

24-26: Syntax block missing positional args

As with the rollback doc, the required config directory or workspace args (if any) are not visible here. Confirm whether none are required; otherwise include them.


93-108: Environment variable omission policy

Per past learning, temporary env vars (e.g., UNKEY_DOCKER_REGISTRY) are intentionally hidden. Verify that listing UNKEY_REGISTRY here aligns with that policy and won’t create churn.

@ogzhanolguncu
Copy link
Contributor Author

image @chronark would you prefer that over plain table?

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (14)
apps/engineering/package.json (1)

6-6: Windows compatibility concern already raised.

This matches the previous review feedback about POSIX-style path compatibility on Windows hosts.

apps/engineering/content/docs/cli/version/get/index.mdx (1)

5-5: Redundant adjective already flagged.

The word "comprehensive" was already identified as unnecessary in previous review feedback.

apps/engineering/content/docs/cli/healthcheck/index.mdx (1)

5-5: Replace “validates” with the more precise “verifies”.

Keeps wording consistent with other docs and removes the ambiguous term “validates”.

-This command sends an HTTP GET request to the specified URL and validates the response.
+This command sends an HTTP GET request to the specified URL and verifies that the response status is 200.
apps/engineering/content/docs/cli/version/list/index.mdx (1)

19-23: Clarify that this example uses no filters.

-### List all versions
+### List all versions (no filters)
apps/engineering/content/docs/cli/version/rollback/index.mdx (2)

5-9: Use imperative “Roll back” and stress immediate traffic switch.

-Rollback a hostname to a previous version. This operation will switch traffic from the current version to the specified target version.
+Roll back a hostname to a previous version. Live traffic is immediately switched to the specified target version.

13-15: Show required positional arguments in the syntax block.

-unkey version rollback [flags]
+unkey version rollback <hostname> <version> [flags]

Without the positional placeholders, users may assume everything is flag-driven, leading to execution errors.

apps/engineering/content/docs/cli/deploy/index.mdx (2)

11-11: Highlight filenames with back-ticks for consistency.

-Use --init to create a configuration template file. This generates an unkey.json file with your project settings,
+Use `--init` to create a configuration template file. This generates an `unkey.json` file with your project settings,

Apply the same back-tick treatment to “unkey.json” in the numbered list below.

Also applies to: 15-15


7-8: Tone: drop “real-time status updates”.

Still reads like marketing copy; prefer neutral, factual phrasing.

-...and manages the deployment process with real-time status updates.
+...and manages the deployment process while streaming status information.
go/pkg/cli/docs_template.go (1)

22-24: String concatenation approach is acceptable for template literals.

While the string concatenation with backticks reduces readability slightly, it's a reasonable approach for embedding code blocks in Go string literals. The templates are not frequently modified, so the slight readability trade-off is acceptable for the functionality gain.

Also applies to: 84-86, 96-98

go/pkg/cli/docs_handler.go (2)

32-33: Bounds check needed for slice operation.

The slicing operation could panic if there are fewer than 2 arguments. This needs a safety check.


59-61: Redundant nil check should be removed.

The nil check for c is redundant as it's already checked at line 23 in the calling method.

go/pkg/cli/docs.go (3)

212-212: Use correct string splitting function.

strings.SplitSeq doesn't exist in the standard library. Use strings.Split instead.

-lines := strings.SplitSeq(matches[1], "\n")
+lines := strings.Split(matches[1], "\n")

214-231: Fix iteration over string split result.

The range over strings.Split returns index and value, not just the line.

-for line := range lines {
+for _, line := range lines {

336-349: Add missing flag types to prevent "unknown" in documentation.

The type detection is missing several flag types that might be used in the CLI.

 switch flag.(type) {
 case *StringFlag:
     return "string"
 case *BoolFlag:
     return "boolean"
 case *IntFlag:
     return "integer"
 case *FloatFlag:
     return "float"
 case *StringSliceFlag:
     return "string[]"
+case *DurationFlag:
+    return "duration"
+case *Int64Flag:
+    return "int64"
+case *Uint64Flag:
+    return "uint64"
 default:
     return "unknown"
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5860eea and f36af39.

📒 Files selected for processing (16)
  • apps/engineering/app/docs/[[...slug]]/page.tsx (2 hunks)
  • apps/engineering/content/docs/cli/deploy/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/healthcheck/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/quotacheck/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/run/api/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/run/ctrl/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/run/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/get/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/list/index.mdx (1 hunks)
  • apps/engineering/content/docs/cli/version/rollback/index.mdx (1 hunks)
  • apps/engineering/package.json (1 hunks)
  • go/pkg/cli/command.go (3 hunks)
  • go/pkg/cli/docs.go (1 hunks)
  • go/pkg/cli/docs_handler.go (1 hunks)
  • go/pkg/cli/docs_template.go (1 hunks)
🧰 Additional context used
🧠 Learnings (16)
📓 Common learnings
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#2825
File: apps/dashboard/app/(app)/logs-v2/hooks/use-bookmarked-filters.ts:0-0
Timestamp: 2025-01-30T20:51:44.359Z
Learning: The user (ogzhanolguncu) prefers to handle refactoring suggestions in separate PRs to maintain focus in the current PR.
Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Update relevant anchors when modifying associated code.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3297
File: apps/dashboard/lib/trpc/routers/authorization/roles/query.ts:210-323
Timestamp: 2025-06-04T20:13:12.060Z
Learning: The user ogzhanolguncu prefers explicit, duplicated code over abstracted helper functions when it improves readability, even if it means some duplication in filter building functions in the authorization roles query module.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3480
File: apps/dashboard/app/new-2/hooks/use-workspace-step.tsx:47-79
Timestamp: 2025-07-09T11:35:51.724Z
Learning: In the Unkey codebase, ogzhanolguncu prefers to keep invariant checks that throw errors for cases that shouldn't happen in normal operation (like null workspace ID checks), rather than adding graceful error handling code for edge cases that would only occur if someone tampers with the actual flow.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3375
File: apps/dashboard/app/(app)/settings/root-keys/components/table/hooks/use-root-keys-list-query.ts:0-0
Timestamp: 2025-06-25T20:32:10.471Z
Learning: In the Unkey codebase, ogzhanolguncu prefers strict validation with fail-fast error handling. When validation errors occur that shouldn't happen in normal operation (like invalid operators), throwing errors to crash the page is preferred over graceful error handling or console logging.
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3499
File: apps/dashboard/app/new/hooks/use-workspace-step.tsx:19-26
Timestamp: 2025-07-11T13:00:05.416Z
Learning: In the Unkey codebase, ogzhanolguncu prefers to keep commented code for planned future features (like slug-based workspaces) rather than removing it, as it serves as a reference for upcoming implementation.
apps/engineering/content/docs/cli/version/index.mdx (1)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

apps/engineering/content/docs/cli/version/list/index.mdx (5)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: chronark
PR: #2143
File: apps/dashboard/app/(app)/logs/components/log-details/components/log-footer.tsx:58-61
Timestamp: 2024-12-03T14:21:19.543Z
Learning: For the "Outcome" field in the LogFooter component (apps/dashboard/app/(app)/logs/components/log-details/components/log-footer.tsx), default to "N/A" instead of "VALID" when handling null values to avoid confusing customers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

Learnt from: mcstepp
PR: #3662
File: apps/dashboard/lib/trpc/routers/deployment/list.ts:11-11
Timestamp: 2025-07-25T19:09:43.284Z
Learning: In apps/dashboard/lib/trpc/routers/deployment/list.ts, the listDeployments procedure intentionally queries the versions table rather than a deployments table. The user mcstepp indicated that renaming the table would require a database migration, which was deferred for the current PR focused on UI features.

apps/engineering/app/docs/[[...slug]]/page.tsx (4)

Learnt from: MichaelUnkey
PR: #3439
File: apps/engineering/content/design/components/dialogs/dialog-container.mdx:103-111
Timestamp: 2025-07-08T12:47:17.841Z
Learning: In component documentation files (e.g., .mdx files in apps/engineering/content/design/components/), the Accessibility section is included in the standard template and should not be removed from component documentation.

Learnt from: perkinsjr
PR: #3439
File: apps/engineering/source.config.ts:22-24
Timestamp: 2025-07-07T17:56:55.010Z
Learning: In fumadocs-mdx configuration using defineConfig, remark plugins should be configured within an mdxOptions object, not directly at the top level of the config. The correct structure is:

export default defineConfig({
  mdxOptions: {
    remarkPlugins: [myPlugin],
  },
});

This is the standard pattern for MDX configurations and is documented in the official fumadocs documentation.

Learnt from: MichaelUnkey
PR: #3425
File: apps/engineering/content/design/components/filter/control-cloud.examples.tsx:73-83
Timestamp: 2025-07-02T14:13:01.711Z
Learning: In apps/engineering/content/design/components/, when the RenderComponentWithSnippet component does not render code snippets correctly, use the customCodeSnippet prop to manually provide the correct JSX code as a string. This manual approach is necessary due to technical limitations in the automatic rendering mechanism.

Learnt from: perkinsjr
PR: #3439
File: apps/engineering/source.config.ts:22-24
Timestamp: 2025-07-07T17:56:55.010Z
Learning: In fumadocs-mdx configuration, remark plugins should be configured within an mdxOptions object, not directly at the top level of the config. The correct structure is:

export default defineConfig({
  mdxOptions: {
    remarkPlugins: [myPlugin],
  },
});
apps/engineering/content/docs/cli/version/rollback/index.mdx (2)

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:32-36
Timestamp: 2025-04-22T17:33:28.162Z
Learning: In the Unkey dashboard UI for delete protection, the button/link to initiate the process is labeled "Disable Delete Protection" while the confirmation button is labeled "Disable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

apps/engineering/content/docs/cli/version/get/index.mdx (1)

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

apps/engineering/package.json (3)

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Do not remove AIDEV-*s without explicit human instruction.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

apps/engineering/content/docs/cli/run/ctrl/index.mdx (3)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

apps/engineering/content/docs/cli/run/api/index.mdx (10)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:32-36
Timestamp: 2025-04-22T17:33:28.162Z
Learning: In the Unkey dashboard UI for delete protection, the button/link to initiate the process is labeled "Disable Delete Protection" while the confirmation button is labeled "Disable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:21-24
Timestamp: 2025-04-22T17:34:04.438Z
Learning: In the Unkey dashboard UI for enabling delete protection, the button/link to initiate the process is labeled "Enable Delete Protection" while the confirmation button is labeled "Enable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: Flo4604
PR: #3421
File: go/apps/api/openapi/openapi.yaml:196-200
Timestamp: 2025-07-03T05:58:10.699Z
Learning: In the Unkey codebase, OpenAPI 3.1 is used, which allows sibling keys (such as description) alongside $ref in schema objects. Do not flag this as an error in future reviews.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

Learnt from: ogzhanolguncu
PR: #3321
File: apps/dashboard/lib/trpc/routers/authorization/roles/keys/schema-with-helpers.ts:5-8
Timestamp: 2025-06-18T12:28:10.449Z
Learning: In the unkey dashboard application, API validation for pagination limits is controlled at the UI level rather than requiring additional server-side validation, as the APIs are internal and protected by UI logic.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{env,sh,yaml,yml,json,conf,ini} : All environment variables MUST follow the format UNKEY_<SERVICE_NAME>_VARNAME.

Learnt from: Flo4604
PR: #2955
File: go/apps/api/routes/v2_identities_create_identity/handler.go:162-202
Timestamp: 2025-03-19T09:25:59.751Z
Learning: In the Unkey codebase, input validation for API endpoints is primarily handled through OpenAPI schema validation, which occurs before requests reach the handler code. For example, in the identities.createIdentity endpoint, minimum values for ratelimit duration and limit are defined in the OpenAPI schema rather than duplicating these checks in the handler.

Learnt from: chronark
PR: #3560
File: go/apps/api/routes/v2_keys_create_key/handler.go:353-466
Timestamp: 2025-07-15T14:25:05.608Z
Learning: In the Unkey codebase, input validation for API endpoints is handled at the OpenAPI schema layer, which validates request fields like permission slugs (pattern: "^[a-zA-Z0-9_]+$", length: 1-100 characters) before requests reach the handler code. This validation occurs during the zen.BindBody call in handlers.

apps/engineering/content/docs/cli/quotacheck/index.mdx (2)

Learnt from: chronark
PR: #3161
File: go/pkg/clickhouse/schema/databases/001_verifications/002_raw_key_verifications_v1.sql:31-33
Timestamp: 2025-04-22T14:40:51.459Z
Learning: The ClickHouse table schemas in the codebase mirror the production environment and cannot be modified directly in PRs without careful migration planning.

Learnt from: chronark
PR: #2143
File: apps/dashboard/app/(app)/logs/components/log-details/components/log-footer.tsx:58-61
Timestamp: 2024-12-03T14:21:19.543Z
Learning: For the "Outcome" field in the LogFooter component (apps/dashboard/app/(app)/logs/components/log-details/components/log-footer.tsx), default to "N/A" instead of "VALID" when handling null values to avoid confusing customers.

apps/engineering/content/docs/cli/run/index.mdx (6)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:21-24
Timestamp: 2025-04-22T17:34:04.438Z
Learning: In the Unkey dashboard UI for enabling delete protection, the button/link to initiate the process is labeled "Enable Delete Protection" while the confirmation button is labeled "Enable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:32-36
Timestamp: 2025-04-22T17:33:28.162Z
Learning: In the Unkey dashboard UI for delete protection, the button/link to initiate the process is labeled "Disable Delete Protection" while the confirmation button is labeled "Disable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: Flo4604
PR: #3421
File: go/apps/api/openapi/openapi.yaml:196-200
Timestamp: 2025-07-03T05:58:10.699Z
Learning: In the Unkey codebase, OpenAPI 3.1 is used, which allows sibling keys (such as description) alongside $ref in schema objects. Do not flag this as an error in future reviews.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

apps/engineering/content/docs/cli/deploy/index.mdx (14)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/deploy/*/docs/** : Documentation should be placed in <service>/docs.

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/deploy.go:153-158
Timestamp: 2025-07-16T09:18:45.379Z
Learning: In the go/cmd/cli/commands/deploy/ CLI codebase, ogzhanolguncu prefers to allow deployment to continue even when Docker push fails (around lines 153-158 in deploy.go) because the team is working locally and needs this behavior for local development workflows where registry access might not be available.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

Learnt from: mcstepp
PR: #3662
File: apps/dashboard/lib/trpc/routers/deployment/list.ts:11-11
Timestamp: 2025-07-25T19:09:43.284Z
Learning: In apps/dashboard/lib/trpc/routers/deployment/list.ts, the listDeployments procedure intentionally queries the versions table rather than a deployments table. The user mcstepp indicated that renaming the table would require a database migration, which was deferred for the current PR focused on UI features.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: mcstepp
PR: #3662
File: apps/dashboard/lib/trpc/routers/deployment/getOpenApiDiff.ts:110-147
Timestamp: 2025-07-25T19:11:00.208Z
Learning: In apps/dashboard/lib/trpc/routers/deployment/getOpenApiDiff.ts, the user mcstepp prefers to keep mock data fallbacks in POC/demonstration code for simplicity, even if it wouldn't be production-ready. This aligns with the PR being work-in-progress for demonstration purposes.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:32-36
Timestamp: 2025-04-22T17:33:28.162Z
Learning: In the Unkey dashboard UI for delete protection, the button/link to initiate the process is labeled "Disable Delete Protection" while the confirmation button is labeled "Disable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: MichaelUnkey
PR: #3173
File: apps/docs/security/delete-protection.mdx:21-24
Timestamp: 2025-04-22T17:34:04.438Z
Learning: In the Unkey dashboard UI for enabling delete protection, the button/link to initiate the process is labeled "Enable Delete Protection" while the confirmation button is labeled "Enable API Delete Protection". The documentation should maintain these different labels to match the actual UI.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Do not remove AIDEV-*s without explicit human instruction.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Update relevant anchors when modifying associated code.

Learnt from: mcstepp
PR: #3242
File: apps/dashboard/app/(app)/apis/[apiId]/api-id-navbar.tsx:47-50
Timestamp: 2025-05-15T15:57:02.128Z
Learning: When reviewing code for Unkey, prefer using Boolean() over the double negation (!!) operator for boolean coercion, as their linter rules favor this pattern.

Learnt from: chronark
PR: #3617
File: go/apps/api/openapi/openapi.yaml:3309-3312
Timestamp: 2025-07-16T17:51:57.297Z
Learning: In the Unkey API OpenAPI schema, the permissions query regex for the verifyKey endpoint intentionally allows all whitespace characters (including tabs and newlines) via \s. Do not flag this as an error in future reviews.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : All text, ASCII, and code files MUST end with a newline.

go/pkg/cli/command.go (1)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/deploy.go:71-73
Timestamp: 2025-07-15T15:11:30.840Z
Learning: In the go/cmd/cli/commands/deploy/ CLI codebase, ogzhanolguncu uses a UI-layer error handling pattern where errors are displayed through ui.PrintError() and ui.PrintErrorDetails(), followed by returning nil to indicate the error has been handled at the UI level, rather than propagating errors up the call stack.

go/pkg/cli/docs_template.go (3)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

go/pkg/cli/docs_handler.go (3)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/deploy/*/docs/** : Documentation should be placed in <service>/docs.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/deploy//cmd/ : Service binary code should be in <service>/cmd/<service | command>.

go/pkg/cli/docs.go (5)

Learnt from: ogzhanolguncu
PR: #3564
File: go/cmd/cli/commands/deploy/flags.go:17-20
Timestamp: 2025-07-15T14:45:18.920Z
Learning: In the go/cmd/cli/commands/deploy/ directory, ogzhanolguncu prefers to keep potentially temporary features (like UNKEY_DOCKER_REGISTRY environment variable) undocumented in help text if they might be deleted in the future, to avoid documentation churn.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Make sure to add relevant anchor comments whenever a file or piece of code is too complex, very important, confusing, or could have a bug.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/deploy/*/docs/** : Documentation should be placed in <service>/docs.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Use AIDEV-NOTE:, AIDEV-TODO:, AIDEV-BUSINESS_RULE:, or AIDEV-QUESTION: (all-caps prefix) as anchor comments aimed at AI and developers.

Learnt from: CR
PR: unkeyed/unkey#0
File: go/deploy/CLAUDE.md:0-0
Timestamp: 2025-07-21T18:05:58.236Z
Learning: Applies to go/deploy/**/*.{go,js,ts,tsx,py,sh,md,txt,json,yaml,yml,ini,env,conf,html,css,scss,xml,c,h,cpp,java,rb,rs,php,pl,sql} : Do not remove AIDEV-*s without explicit human instruction.

🧬 Code Graph Analysis (1)
go/pkg/cli/docs.go (2)
go/pkg/cli/command.go (2)
  • Command (23-39)
  • Action (20-20)
go/pkg/cli/flag.go (9)
  • String (331-363)
  • EnvVar (252-267)
  • Required (234-249)
  • Flag (18-25)
  • StringFlag (56-60)
  • BoolFlag (82-86)
  • IntFlag (122-126)
  • FloatFlag (154-158)
  • StringSliceFlag (186-190)
🪛 LanguageTool
apps/engineering/content/docs/cli/version/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...eate, list, and manage versions of your API. Versions are immutable snapshots of your...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...state that can be rolled back to at any time. ## Available Commands - get: Get details a...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~11-~11: There might be a mistake here.
Context: ...ds - get: Get details about a specific version - list: List all versions with optional fi...

(QB_NEW_EN_OTHER)


[grammar] ~12-~12: There might be a problem here.
Context: ...- list: List all versions with optional filtering - rollback: Rollback to a previous version ## Command Synta...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~13-~13: There might be a mistake here.
Context: ...ring - rollback: Rollback to a previous version ## Command Syntax ```bash unkey version ``...

(QB_NEW_EN_OTHER)


[grammar] ~15-~15: Use correct spacing
Context: ...lback to a previous version ## Command Syntax bash unkey version ## Quick Reference - unkey version get - ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~21-~21: Use correct spacing
Context: ...ax bash unkey version ## Quick Reference - unkey version get - Get details about a version - `unkey ve...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~22-~22: Use hyphens correctly
Context: ...nkey version get- Get details about a version -unkey version list` - List versions with optional filtering ...

(QB_NEW_EN_OTHER_ERROR_IDS_29)


[grammar] ~23-~23: Use hyphens correctly
Context: ...ion list- List versions with optional filtering -unkey version rollback` - Rollback to a previous version

(QB_NEW_EN_OTHER_ERROR_IDS_29)


[grammar] ~24-~24: There might be a mistake here.
Context: ... filtering - unkey version rollback - Rollback to a previous version

(QB_NEW_EN_OTHER)


[grammar] ~24-~24: Use a period to end declarative sentences
Context: ...sion rollback` - Rollback to a previous version

(QB_NEW_EN_OTHER_ERROR_IDS_25)

apps/engineering/content/docs/cli/version/list/index.mdx

[grammar] ~5-~5: There might be a mistake here.
Context: ...t project with support for filtering by branch, status, and limiting results. ## Filtering Op...

(QB_NEW_EN_OTHER)


[grammar] ~5-~5: Use correct spacing
Context: ...ltering by branch, status, and limiting results. ## Filtering Options Use flags to filter r...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ...us, and limiting results. ## Filtering Options Use flags to filter results by branch na...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: There might be a mistake here.
Context: ... Use flags to filter results by branch name, status, or limit the number of results returne...

(QB_NEW_EN_OTHER)


[grammar] ~9-~9: Use prepositions correctly
Context: ... filter results by branch name, status, or limit the number of results returned. F...

(QB_NEW_EN_OTHER_ERROR_IDS_7)


[grammar] ~9-~9: Use correct spacing
Context: ...lters can be combined for more specific queries. ## Command Syntax ```bash unkey version li...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~17-~17: Use correct spacing
Context: ...bash unkey version list [flags] ## Examples ### List all versions bash unkey version...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~19-~19: There might be a mistake here.
Context: ... [flags] ## Examples ### List all versions bash unkey version list ### List versions from main branch bash ...

(QB_NEW_EN_OTHER)


[grammar] ~25-~25: There might be a problem here.
Context: ...ersion list ### List versions from main branch bash unkey version list --branch main ### List only active versions bash unkey...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~31-~31: There might be a mistake here.
Context: ...--branch main ### List only active versions bash unkey version list --status active ### List last 5 versions bash unkey vers...

(QB_NEW_EN_OTHER)


[grammar] ~43-~43: There might be a problem here.
Context: ...version list --limit 5 ### Combine filters bash unkey version list --branch main --status active --limit 3 ``` ## Flags Filter by branch name - Type: string <Callout type...

(QB_NEW_EN_MERGED_MATCH)


[grammar] ~54-~54: Use correct spacing
Context: ...ch"> Filter by branch name - Type: string Filter by status (pending, building, active, failed) - Type: string <Callout type...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~60-~60: Use correct spacing
Context: ... building, active, failed) - Type: string Number of versions to show - Type: integer - Default: 10 </Ca...

(QB_NEW_EN_OTHER_ERROR_IDS_5)

apps/engineering/content/docs/cli/version/rollback/index.mdx

[grammar] ~4-~4: Use the right verb tense
Context: ...n: "Rollback to a previous version" --- Rollback a hostname to a previous version. This ...

(QB_NEW_EN_OTHER_ERROR_IDS_13)


[grammar] ~5-~5: Use correct spacing
Context: ...current version to the specified target version. ## Warning This operation affects live tra...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~9-~9: Use correct spacing
Context: ...ip the confirmation prompt in automated environments. ## Command Syntax ```bash unkey version ro...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~17-~17: Use correct spacing
Context: ... unkey version rollback [flags] ## Examples ### Rollback with confirmation prompt ba...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~19-~19: Use correct spacing
Context: ...xamples ### Rollback with confirmation prompt bash unkey version rollback my-api.unkey.app v_abc123def456 ### Rollback without confirmation for automa...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~25-~25: Use correct spacing
Context: ... ### Rollback without confirmation for automation bash unkey version rollback my-api.unkey.app v_abc123def456 --force ### Rollback staging environment ```bash un...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~31-~31: Use correct spacing
Context: ...ef456 --force ### Rollback staging environment bash unkey version rollback staging-api.unkey.app v_def456ghi789 ``` ## Flags <Callout type="info" title="--for...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~43-~43: Use correct spacing
Context: ...ed deployments - Type: boolean - Default: false

(QB_NEW_EN_OTHER_ERROR_IDS_5)

apps/engineering/content/docs/cli/version/get/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ..., branch, creation time, and associated hostnames. ## Command Syntax ```bash unkey version ge...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~13-~13: Use correct spacing
Context: ...ntax bash unkey version get ## Examples ### Get details for a specific version ```b...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~15-~15: There might be a mistake here.
Context: ...xamples ### Get details for a specific version bash unkey version get v_abc123def456 ### Get details for another version ```bash...

(QB_NEW_EN_OTHER)


[grammar] ~21-~21: There might be a mistake here.
Context: ...def456 ### Get details for another version bash unkey version get v_def456ghi789 ```

(QB_NEW_EN_OTHER)

apps/engineering/content/docs/cli/run/index.mdx

[grammar] ~5-~5: Use correct spacing
Context: ...y services in development or production environments. This command starts different Unkey micr...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~7-~7: Use correct spacing
Context: ... independently and runs as a standalone process. ## Available Services - api: The main API ...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~12-~12: Use correct spacing
Context: ...service for managing infrastructure and deployments ## Command Syntax bash unkey run #...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~20-~20: Use correct spacing
Context: ...Syntax bash unkey run ## Quick Reference - unkey run api - Run the Unkey API server for validating...

(QB_NEW_EN_OTHER_ERROR_IDS_5)


[grammar] ~21-~21: There might be a mistake here.
Context: ... server for validating and managing API keys - unkey run ctrl - Run the Unkey control plane service fo...

(QB_NEW_EN_OTHER)


[grammar] ~22-~22: Use a period to end declarative sentences
Context: ...service for managing infrastructure and services

(QB_NEW_EN_OTHER_ERROR_IDS_25)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Test Go API Local / Test
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Test Agent Local / test_agent_local
  • GitHub Check: Build / Build
🔇 Additional comments (20)
apps/engineering/app/docs/[[...slug]]/page.tsx (1)

2-3: LGTM! Clean integration of UI components for CLI docs.

The addition of Banner, Tab, and Tabs components to the MDX renderer enables the generated CLI documentation to use rich interactive elements. The implementation correctly follows fumadocs patterns and integrates well with the existing component structure.

Also applies to: 36-43

apps/engineering/content/docs/cli/version/get/index.mdx (1)

17-25: Well-structured examples with realistic version IDs.

The examples demonstrate proper usage with version ID formats that follow the expected pattern (v_ prefix with alphanumeric identifiers). This provides clear guidance for users on how to invoke the command with actual version identifiers.

apps/engineering/content/docs/cli/version/index.mdx (2)

5-8: Clear explanation of version concept.

The description effectively explains versions as "immutable snapshots" representing specific deployment states. This conceptual foundation helps users understand the purpose and behavior of version management commands.


22-24: Quick reference commands correctly include full CLI path.

The commands now properly show the complete invocation (unkey version get, etc.) which makes them copy-pastable and eliminates ambiguity, addressing previous feedback.

apps/engineering/content/docs/cli/run/index.mdx (2)

5-8: Clear explanation of microservices architecture.

The documentation effectively explains that each service runs as a standalone process and can be configured independently. This helps users understand the modular nature of the Unkey infrastructure.


21-22: Quick reference commands properly formatted.

The commands correctly show the full CLI invocation (unkey run api, unkey run ctrl) making them copy-pastable and consistent with other documentation pages, addressing previous feedback.

apps/engineering/content/docs/cli/run/ctrl/index.mdx (1)

1-186: Generated documentation looks comprehensive and well-structured.

The auto-generated MDX documentation for the ctrl command provides comprehensive coverage of all flags with proper typing, defaults, and environment variables. The use of Callout components creates a clean, structured presentation that's easy to navigate.

The required flags are properly marked and the Banner warning appropriately alerts users about mandatory configuration.

go/pkg/cli/command.go (3)

1-2: Good package documentation addition.

The package-level comment clearly describes the CLI framework's capabilities and scope, improving code discoverability and understanding.


33-33: Appropriate field addition for MDX generation.

The unexported commandPath field properly supports the MDX documentation generation feature while maintaining encapsulation.


188-191: Clean integration of MDX generation handling.

The early MDX generation check in the Run method follows a clean pattern - handle special cases first, then proceed with normal parsing. The boolean return pattern allows for early exit when MDX is generated.

apps/engineering/content/docs/cli/run/api/index.mdx (1)

1-186: Comprehensive API command documentation with good flag coverage.

The auto-generated documentation thoroughly covers all API server configuration options with proper categorization and formatting. The structure is consistent with other CLI documentation files, and the Callout components provide clear, scannable information about each flag.

The warning banner appropriately alerts users about required flags, and environment variable mappings are clearly documented for all options.

go/pkg/cli/docs_template.go (2)

4-61: Parent command template structure is well-designed.

The template properly handles conditional frontmatter generation, includes appropriate warnings for required flags, and provides a clean quick reference section for subcommands. The use of template functions like hasItems enables clean conditional rendering.


64-132: Leaf command template provides comprehensive documentation structure.

The template includes all necessary sections for leaf commands: frontmatter, description handling with duplication avoidance, command syntax, examples, and detailed flag documentation. The conditional logic properly handles edge cases like missing descriptions.

go/pkg/cli/docs_handler.go (4)

12-15: Well-defined error variables for structured error handling.

The exported error variables follow Go conventions and provide clear error categorization for different failure modes in the MDX generation process.


19-55: MDX generation handling logic is well-structured.

The method properly detects MDX requests, extracts command paths, locates target commands, and generates appropriate output. The error handling is comprehensive and the frontmatter generation adds valuable metadata.


58-87: Command tree traversal logic is correct and robust.

The recursive approach properly handles command path resolution with appropriate nil checks and name matching. The logic correctly skips root command names when needed and traverses the command hierarchy.


90-122: Frontmatter generation handles edge cases appropriately.

The method provides sensible defaults for missing information, uses proper title casing, and generates meaningful metadata for the documentation system.

go/pkg/cli/docs.go (2)

26-63: Well-structured error handling and template execution.

The GenerateMDX method demonstrates good practices:

  • Proper nil checking
  • Error wrapping with context
  • Clear error variable definitions
  • Appropriate template selection based on command type

320-321: Ignore missing method implementations issue

Both getDefaultValue and getEnvVar are already defined on Command in go/pkg/cli/help.go, so there’s no compilation error.

• go/pkg/cli/help.go: lines 197–212 implement getEnvVar
• go/pkg/cli/help.go: lines 215–239 implement getDefaultValue

Likely an incorrect or invalid review comment.

apps/engineering/content/docs/cli/quotacheck/index.mdx (1)

5-8: Good intro – concise and task-focused.

Clear, actionable wording and no jargon. Nice job keeping it short while still explaining the context.

Comment on lines +39 to +41
<Banner type="warn">
Some flags are required for this command to work properly.
</Banner>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Banner is too vague – list the actual required flags.

Stating “Some flags are required” forces the reader to hunt for which ones. Spell them out directly to improve scannability.

-<Banner type="warn">
-Some flags are required for this command to work properly.
-</Banner>
+<Banner type="warn" title="Required flags">
+The following flags must be provided: `--clickhouse-url` and `--database-dsn`.
+</Banner>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Banner type="warn">
Some flags are required for this command to work properly.
</Banner>
<Banner type="warn" title="Required flags">
The following flags must be provided: `--clickhouse-url` and `--database-dsn`.
</Banner>
🤖 Prompt for AI Agents
In apps/engineering/content/docs/cli/quotacheck/index.mdx around lines 39 to 41,
the warning banner is too vague by stating only that some flags are required.
Replace the generic message with a clear list of the actual required flags for
the command to improve clarity and help users quickly identify what is needed
without searching elsewhere.

@chronark chronark merged commit 258772f into main Aug 8, 2025
19 of 20 checks passed
@chronark chronark deleted the generate-docs-from-cli branch August 8, 2025 12:13
@graphite-app
Copy link

graphite-app bot commented Aug 8, 2025

SpongeBob gif. SpongeBob pretends to crank his fist like a jack-in-the-box, and his thumb rises and pops out for a thumbs up. He then gestures to his thumb like 'eh? What do you think?' (Added via Giphy)

@graphite-app
Copy link

graphite-app bot commented Aug 8, 2025

Graphite Automations

"Post a GIF when PR approved" took an action on this PR • (08/08/25)

1 gif was posted to this PR based on Andreas Thomas's automation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants