Skip to content

docs: add initial plugin development guide#140

Merged
HomelessDinosaur merged 4 commits intomainfrom
plugin-dev-guide
Nov 3, 2025
Merged

docs: add initial plugin development guide#140
HomelessDinosaur merged 4 commits intomainfrom
plugin-dev-guide

Conversation

@jyecusch
Copy link
Member

Closes NIT-443

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 31, 2025

📝 Walkthrough

Walkthrough

Added a new guide page at docs/guides/plugin-development.mdx and registered it in the Docs navigation by inserting "guides/plugin-development" into docs/docs.json (navigation.tabs[0].groups[].pages). The MDX covers Suga plugin concepts, plugin types, manifest structure, Terraform module layout, runtime adapter patterns with Go examples, local development workflows (suga plugin serve, suga build --replace-library), testing/iteration, platform integration, and publishing/versioning. Also updated CLI docs (cli/internal/mcp/instructions-plugin-library-development.md) to use the term “runtime adapters,” add a Note for AI Agents, and add a Local Development Workflow section. Added accepted vocabulary terms: namespace, proxying, pubsub.

Possibly related PRs

Suggested labels

documentation

Suggested reviewers

  • davemooreuws
  • tjholm
  • HomelessDinosaur
  • raksiv
  • sean-nitric

Pre-merge checks

✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title "docs: add initial plugin development guide" directly describes the main change in the pull request—the addition of comprehensive plugin development documentation at docs/guides/plugin-development.mdx. The title is specific, clear, and accurately reflects the primary objective without unnecessary noise or vague language.
Description Check ✅ Passed The description "Closes NIT-443" references an issue closure and is minimally related to the changeset. While the description lacks detail about what's being added or changed, it is not off-topic—it references an issue presumably related to the plugin development guide. Given the lenient criteria for this check where level of detail is not important as long as the description is related in some way, this passes the threshold.

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a76e316 and 4052d50.

📒 Files selected for processing (1)
  • docs/.vale/styles/config/vocabularies/Suga/accept.txt (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: davemooreuws
Repo: nitrictech/suga PR: 29
File: docs/guides/terraform-backend-config.mdx:0-0
Timestamp: 2025-08-28T06:12:17.266Z
Learning: The Suga project uses Mintlify for documentation. Mintlify provides built-in MDX components like <Steps> and <Step> that don't need to be defined or imported in the repository - they're available by default in Mintlify's documentation platform.
🔇 Additional comments (1)
docs/.vale/styles/config/vocabularies/Suga/accept.txt (1)

28-30: Add three plugin-development terms to vocabulary.

The three new terms (namespace, proxying, pubsub) are legitimate technical terms that align with the new plugin development guide and should prevent false positives during Vale documentation linting.

Please confirm that these exact terms appear in the new plugin development guide to ensure Vale linting validation works as intended.


Comment @coderabbitai help to get the list of available commands and usage tips.

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

🧹 Nitpick comments (1)
docs/guides/plugin-development.mdx (1)

589-591: Consider tightening wording on line 591.

The phrase "in order to grant" could be more concise: change to "to grant" for brevity.

Apply this diff:

- Suga `identity` plugins are a special type of plugin. They're not deployed independently, instead they're attached to `service` plugins, in order to grant that service access to other resources.
+ Suga `identity` plugins are a special type of plugin. They're not deployed independently; instead they're attached to `service` plugins to grant services access to other resources.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bff2b5c and eeb64e6.

📒 Files selected for processing (2)
  • docs/docs.json (1 hunks)
  • docs/guides/plugin-development.mdx (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-22T21:56:58.994Z
Learnt from: jyecusch
Repo: nitrictech/suga PR: 78
File: docs/docs.json:24-27
Timestamp: 2025-09-22T21:56:58.994Z
Learning: When analyzing docs.json navigation structures, ensure to carefully verify the actual JSON structure before flagging navigation mismatches. The "Core Concepts" and "Resources" groups in docs/docs.json are correctly configured with their corresponding MDX files.

Applied to files:

  • docs/docs.json
🪛 GitHub Actions: Test Docs
docs/guides/plugin-development.mdx

[error] 332-332: [Vale.Spelling] Did you really mean 'pubsub'?


[error] 338-338: [Vale.Spelling] Did you really mean 'proxying'?

🪛 GitHub Check: Spell Check with Vale
docs/guides/plugin-development.mdx

[failure] 338-338:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'proxying'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'proxying'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 338, "column": 18}}}, "severity": "ERROR"}


[failure] 332-332:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'pubsub'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'pubsub'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 332, "column": 119}}}, "severity": "ERROR"}

🪛 LanguageTool
docs/guides/plugin-development.mdx

[style] ~591-~591: Consider a more concise word here.
Context: ... they're attached to service plugins, in order to grant that service access to other reso...

(IN_ORDER_TO_PREMIUM)

🔇 Additional comments (3)
docs/docs.json (1)

37-37: Navigation entry correctly placed.

The new guide entry follows established patterns and is properly positioned within the Guides section.

docs/guides/plugin-development.mdx (2)

332-332: Fix Vale spell check failures blocking pipeline.

The pipeline is blocked by Vale spell check flagging two valid technical terms:

  • Line 332: pubsub — a standard cloud computing term (Google Cloud Pub/Sub, AWS SNS)
  • Line 338: proxying — valid English gerund form of "proxy"

These appear to be false positives, but they're blocking the build.

Consider one of these approaches:

  1. Add these terms to Vale's dictionary/exceptions if the project maintains one
  2. Rephrase to synonyms (e.g., "pub/sub" or "message queue" for pubsub; "forwarding" or "routing" for proxying)

Would you like me to generate alternative wording that avoids these flags?

Also applies to: 338-338


1-705: Comprehensive and well-structured guide.

The plugin development guide is excellent—clear progression from concepts through local workflows, practical examples throughout, and helpful cross-references to related documentation. The step-by-step local development section (lines 365–557) and advanced topics are particularly valuable. Once you fix the critical import issue and unblock the pipeline, this is ready to merge.

@tjholm
Copy link
Member

tjholm commented Nov 3, 2025

@coderabbitai could we compare the new additions in this PR to an existing file @cli/internal/mcp/instructions-plugin-library-development.md?

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 3, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# Read the new plugin development guide added in this PR
echo "=== NEW FILE: docs/guides/plugin-development.mdx ==="
cat docs/guides/plugin-development.mdx

echo -e "\n\n=== EXISTING FILE: cli/internal/mcp/instructions-plugin-library-development.md ==="
cat cli/internal/mcp/instructions-plugin-library-development.md

Length of output: 50098


@tjholm I've compared both files. Here's a detailed analysis:

Purpose & Audience

New doc (plugin-development.mdx): User-facing documentation for developers building plugins, published on the docs site. Tutorial-style with friendly formatting (Notes, Warnings, Tips).

Existing doc (instructions-plugin-library-development.md): Internal MCP instructions for AI agents helping with plugin development. Reference-style with technical precision.

Content Overlap

Both documents cover:

  • Plugin structure and types
  • Manifest format and fields
  • Terraform module implementation
  • Runtime code/adapter requirements
  • When runtime adapters are needed (services/storage require them)
  • Development workflow and best practices
  • Complete examples

Key Differences

1. Local Development Workflow

The new doc extensively covers suga plugin serve and --replace-library (sections "Local Development Workflow", "Step 1-5"), which is completely absent from the existing doc. This is significant new content.

2. Terminology

  • New: "runtime adapters"
  • Existing: "runtime code"

Both terms are used but might cause confusion if not aligned.

3. Storage Plugin Interface Discrepancy ⚠️

New doc shows a simplified storage interface:

type StorageService interface {
    Read(ctx, bucket, key) ([]byte, error)
    Write(ctx, bucket, key, data) error
    Delete(ctx, bucket, key) error
    Exists(ctx, bucket, key) (bool, error)
    List(ctx, bucket, prefix) ([]string, error)
}

Existing doc shows the actual protobuf interface:

type Storage interface {
    Read(context.Context, *StorageReadRequest) (*StorageReadResponse, error)
    Write(context.Context, *StorageWriteRequest) (*StorageWriteResponse, error)
    Delete(context.Context, *StorageDeleteRequest) (*StorageDeleteResponse, error)
    PreSignUrl(context.Context, *StoragePreSignUrlRequest) (*StoragePreSignUrlResponse, error)
    ListBlobs(context.Context, *StorageListBlobsRequest) (*StorageListBlobsResponse, error)
    Exists(context.Context, *StorageExistsRequest) (*StorageExistsResponse, error)
}

Issue: The new doc's example doesn't match the actual StorageServer interface from github.com/nitrictech/suga/proto/storage/v2. The existing doc is more technically accurate.

4. Service Plugin Interface Details

Existing doc provides precise interface details:

type Service interface {
    Start(Proxy) error
}
type Proxy interface {
    Forward(ctx context.Context, req *http.Request) (*http.Response, error)
    Host() string
}

New doc doesn't specify the exact interface, focusing more on conceptual explanation.

5. Registration Details

Existing doc specifies:

  • Services: service.Register(New)
  • Storage: storage.Register("namespace", New) with namespace pattern

New doc mentions registration more briefly without the namespace requirement for storage.

6. AI Integration

New doc mentions using AI agents with MCP, while existing doc IS the MCP integration instructions.

Recommendations


🏁 Script executed:

#!/bin/bash

# Check if there are any other storage plugin examples in the codebase
echo "=== Checking for storage plugin runtime implementations ==="
fd -e go -x echo "File: {}" \; -x rg -l "StorageServer|storage\.Register" {} \; | head -20

echo -e "\n=== Checking actual storage interface usage ==="
rg -A 5 "type.*Storage.*interface" --type go | head -30

echo -e "\n=== Checking service registration patterns ==="
rg "service\.Register|storage\.Register" --type go -C 2 | head -40

Length of output: 2259


🏁 Script executed:

#!/bin/bash

# Check the actual storage registration function
echo "=== Storage Register function signature ==="
rg "func Register" runtime/storage/ --type go -A 10

echo -e "\n=== Service Register function signature ==="
rg "func Register" runtime/service/ --type go -A 10

echo -e "\n=== Check for plugin library references ==="
rg "nitrictech/plugins-" docs/guides/plugin-development.mdx

echo -e "\n=== Check if storage.Register namespace pattern is documented ==="
rg "storage\.Register.*namespace" cli/internal/mcp/instructions-plugin-library-development.md -A 2 -B 2

Length of output: 2089


🏁 Script executed:

#!/bin/bash

# Let's check the actual Storage type alias
echo "=== Storage type definition ==="
rg "type Storage" runtime/storage/storage.go -A 2

echo -e "\n=== Check protobuf storage messages ==="
rg "type Storage.*Request|type Storage.*Response" proto/storage/v2/ --type go | head -15

echo -e "\n=== Check if UnimplementedStorageServer is used ==="
rg "UnimplementedStorageServer" --type go -C 2 | head -20

Length of output: 2245


@tjholm Here's my complete analysis with recommendations:

Critical Technical Issues

1. Storage Plugin Interface is Incorrect ⚠️

The new doc shows a simplified interface that doesn't match reality:

// NEW DOC (INCORRECT) - Simplified but not accurate
type StorageService interface {
    Read(ctx context.Context, bucket, key string) ([]byte, error)
    Write(ctx context.Context, bucket, key string, data []byte) error
    // ...
}

Actual interface (from codebase):

// runtime/storage/storage.go
type Storage = storagepb.StorageServer

// proto/storage/v2/storage_grpc.pb.go
type StorageServer interface {
    Read(context.Context, *StorageReadRequest) (*StorageReadResponse, error)
    Write(context.Context, *StorageWriteRequest) (*StorageWriteResponse, error)
    Delete(context.Context, *StorageDeleteRequest) (*StorageDeleteResponse, error)
    PreSignUrl(context.Context, *StoragePreSignUrlRequest) (*StoragePreSignUrlResponse, error)
    ListBlobs(context.Context, *StorageListBlobsRequest) (*StorageListBlobsResponse, error)
    Exists(context.Context, *StorageExistsRequest) (*StorageExistsResponse, error)
    mustEmbedUnimplementedStorageServer()
}

2. Missing Registration Details

Storage registration requires namespace (confirmed from code):

storage.Register("suga/aws/s3-bucket", New)

Service registration does NOT:

service.Register(New)

The new doc doesn't specify these requirements clearly.

Recommendations

For the New Doc (plugin-development.mdx)

1. Fix the storage example to use protobuf types:

import (
    storagepb "github.com/nitrictech/suga/proto/storage/v2"
)

type S3StorageService struct {
    storagepb.UnimplementedStorageServer
    client *s3.Client
}

func (s *S3StorageService) Read(ctx context.Context, req *storagepb.StorageReadRequest) (*storagepb.StorageReadResponse, error) {
    result, err := s.client.GetObject(ctx, &s3.GetObjectInput{
        Bucket: aws.String(req.BucketName),
        Key:    aws.String(req.Key),
    })
    // ... implementation
    return &storagepb.StorageReadResponse{Body: body}, nil
}

2. Add registration details in both service and storage sections:

// For storage plugins - namespace required
func init() {
    storage.Register("myorg/myplugins/s3-bucket", New)
}

// For service plugins - no namespace
func init() {
    service.Register(New)
}

3. Clarify terminology - pick one term consistently:

  • Either "runtime adapters" (current choice in new doc)
  • Or "runtime code" (MCP doc choice)

I'd suggest "runtime adapters" for user docs, keeping "runtime code" in MCP instructions.

For the Existing Doc (instructions-plugin-library-development.md)

1. Add the local development workflow section covering:

  • suga plugin serve command
  • --replace-library flag usage
  • Step-by-step iteration workflow

This is valuable content that AI agents need to know about.

2. Add reference to the new doc for developers:

For user-facing documentation, refer them to `/guides/plugin-development` in the Suga docs.

Alignment Strategy

Keep both docs but with clear separation:

  • MCP doc: Technical reference for AI agents

    • Precise interfaces and signatures
    • Complete protobuf details
    • Focus on correctness
  • User doc: Tutorial for human developers

    • More conceptual explanations
    • Must still be technically accurate
    • Focus on getting started

Sync these sections:

  • Plugin types and requirements
  • Manifest structure
  • Registration patterns
  • Go module path requirements

Summary

The new doc adds excellent content (local dev workflow) but has a critical error in the storage interface example. The existing MCP doc is more technically accurate. I recommend:

  1. Fix the storage example in the new doc to use actual protobuf types
  2. Add registration details (namespace for storage, not for service)
  3. Port local dev workflow to MCP instructions
  4. Establish sync process to keep both aligned going forward

Would you like me to draft the corrected storage example for the new doc?

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

🧹 Nitpick comments (2)
cli/internal/mcp/instructions-plugin-library-development.md (1)

484-484: Add language identifier to output code block.

For consistency and proper syntax highlighting, specify the shell output format.

-```
+```text
 Suga Plugin Development Server
docs/guides/plugin-development.mdx (1)

704-704: Minor style: simplify phrasing.

The phrase "in order to grant" can be tightened to just "to grant" for directness.

-Suga `identity` plugins are a special type of plugin. They're not deployed independently, instead they're attached to `service` plugins, in order to grant that service access to other resources.
+Suga `identity` plugins are a special type of plugin. They're not deployed independently, instead they're attached to `service` plugins, to grant that service access to other resources.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eeb64e6 and 3f317a1.

📒 Files selected for processing (3)
  • cli/internal/mcp/instructions-plugin-library-development.md (3 hunks)
  • docs/docs.json (1 hunks)
  • docs/guides/plugin-development.mdx (1 hunks)
🧰 Additional context used
🧠 Learnings (3)
📓 Common learnings
Learnt from: davemooreuws
Repo: nitrictech/suga PR: 29
File: docs/guides/terraform-backend-config.mdx:0-0
Timestamp: 2025-08-28T06:12:17.266Z
Learning: The Suga project uses Mintlify for documentation. Mintlify provides built-in MDX components like <Steps> and <Step> that don't need to be defined or imported in the repository - they're available by default in Mintlify's documentation platform.
📚 Learning: 2025-09-22T21:56:58.994Z
Learnt from: jyecusch
Repo: nitrictech/suga PR: 78
File: docs/docs.json:24-27
Timestamp: 2025-09-22T21:56:58.994Z
Learning: When analyzing docs.json navigation structures, ensure to carefully verify the actual JSON structure before flagging navigation mismatches. The "Core Concepts" and "Resources" groups in docs/docs.json are correctly configured with their corresponding MDX files.

Applied to files:

  • docs/docs.json
📚 Learning: 2025-10-21T21:25:52.280Z
Learnt from: tjholm
Repo: nitrictech/suga PR: 127
File: client/java/src/main/kotlin/com/addsuga/client/SugaClient.kt:25-41
Timestamp: 2025-10-21T21:25:52.280Z
Learning: The Suga runtime server is always bound to loopback (localhost only) and is never accessible from the public internet. It does not configure TLS. Plaintext gRPC connections are appropriate and expected for client connections to the Suga runtime.

Applied to files:

  • cli/internal/mcp/instructions-plugin-library-development.md
🪛 GitHub Actions: Test Docs
docs/guides/plugin-development.mdx

[error] 204-204: [Vale.Spelling] Did you really mean 'namespace'?


[error] 205-205: [Vale.Spelling] Did you really mean 'namespace'?


[error] 220-220: [Vale.Spelling] Did you really mean 'namespace'?


[error] 391-391: [Vale.Spelling] Did you really mean 'namespace'?


[error] 445-445: [Vale.Spelling] Did you really mean 'proxying'?


[error] 450-450: [Vale.Spelling] Did you really mean 'pubsub'?

🪛 GitHub Check: Spell Check with Vale
docs/guides/plugin-development.mdx

[failure] 450-450:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'pubsub'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'pubsub'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 450, "column": 119}}}, "severity": "ERROR"}


[failure] 445-445:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'proxying'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'proxying'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 445, "column": 18}}}, "severity": "ERROR"}


[failure] 391-391:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'namespace'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'namespace'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 391, "column": 81}}}, "severity": "ERROR"}


[failure] 220-220:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'namespace'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'namespace'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 220, "column": 127}}}, "severity": "ERROR"}


[failure] 205-205:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'namespace'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'namespace'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 205, "column": 45}}}, "severity": "ERROR"}


[failure] 204-204:
[vale] reported by reviewdog 🐶
[Vale.Spelling] Did you really mean 'namespace'?

Raw Output:
{"message": "[Vale.Spelling] Did you really mean 'namespace'?", "location": {"path": "docs/guides/plugin-development.mdx", "range": {"start": {"line": 204, "column": 48}}}, "severity": "ERROR"}

🪛 LanguageTool
docs/guides/plugin-development.mdx

[style] ~704-~704: Consider a more concise word here.
Context: ... they're attached to service plugins, in order to grant that service access to other reso...

(IN_ORDER_TO_PREMIUM)

cli/internal/mcp/instructions-plugin-library-development.md

[grammar] ~5-~5: Use a hyphen to join words.
Context: ...more conceptual explanations and getting started guides, refer users to the [Plug...

(QB_NEW_EN_HYPHEN)

🪛 markdownlint-cli2 (0.18.1)
cli/internal/mcp/instructions-plugin-library-development.md

484-484: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


543-543: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


554-554: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

⏰ 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). (3)
  • GitHub Check: Test
  • GitHub Check: Build (windows-latest, amd64)
  • GitHub Check: Security Scan
🔇 Additional comments (4)
docs/docs.json (1)

37-37: Navigation entry looks good.

The new guide is properly registered in the Guides group within the documentation navigation structure.

docs/guides/plugin-development.mdx (3)

203-206: Clear registration pattern documentation.

The Note box correctly distinguishes service (no namespace) vs. storage (with namespace) registration patterns, directly addressing a technical gap identified in the PR review discussion.


224-360: Storage runtime adapter example is accurate.

The S3StorageService implementation correctly uses protobuf-generated types (StorageReadRequest, StorageWriteResponse, etc.) with UnimplementedStorageServer embedding, matching the actual interface specifications. The bytes import is present. This directly addresses concerns raised in the previous code review.


445-450: Ignore Vale spelling check false positives.

The pipeline reports Vale spelling errors for "namespace," "proxying," and "pubsub" — all valid technical terms used correctly. These are false positives and safe to ignore.

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: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f317a1 and a76e316.

📒 Files selected for processing (1)
  • cli/internal/mcp/instructions-plugin-library-development.md (3 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: davemooreuws
Repo: nitrictech/suga PR: 29
File: docs/guides/terraform-backend-config.mdx:0-0
Timestamp: 2025-08-28T06:12:17.266Z
Learning: The Suga project uses Mintlify for documentation. Mintlify provides built-in MDX components like <Steps> and <Step> that don't need to be defined or imported in the repository - they're available by default in Mintlify's documentation platform.
📚 Learning: 2025-10-21T21:25:52.280Z
Learnt from: tjholm
Repo: nitrictech/suga PR: 127
File: client/java/src/main/kotlin/com/addsuga/client/SugaClient.kt:25-41
Timestamp: 2025-10-21T21:25:52.280Z
Learning: The Suga runtime server is always bound to loopback (localhost only) and is never accessible from the public internet. It does not configure TLS. Plaintext gRPC connections are appropriate and expected for client connections to the Suga runtime.

Applied to files:

  • cli/internal/mcp/instructions-plugin-library-development.md
🪛 LanguageTool
cli/internal/mcp/instructions-plugin-library-development.md

[grammar] ~5-~5: Use a hyphen to join words.
Context: ...more conceptual explanations and getting started guides, refer users to the [Plug...

(QB_NEW_EN_HYPHEN)

🪛 markdownlint-cli2 (0.18.1)
cli/internal/mcp/instructions-plugin-library-development.md

484-484: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ 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: Build (windows-latest, amd64)
  • GitHub Check: Build (macos-latest, arm64)
  • GitHub Check: Security Scan
  • GitHub Check: Test
🔇 Additional comments (3)
cli/internal/mcp/instructions-plugin-library-development.md (3)

5-5: Clear note directing AI agents to user-facing docs.

The note provides appropriate context for AI agents and reduces potential duplication between internal MCP instructions and user-facing guidance.


68-68: Terminology clarification is helpful.

Adding "also called 'runtime adapters' in user-facing documentation" explicitly bridges the terminology gap between this internal reference and the user guide, reducing confusion.


458-562: Comprehensive local development workflow section.

The new section provides step-by-step guidance on suga plugin serve and suga build --replace-library, including practical examples for iteration and custom platforms. Well-structured with clear use cases and multiple replacement options. Aligns the internal docs with the new user-facing plugin development guide.

@HomelessDinosaur HomelessDinosaur merged commit 4977065 into main Nov 3, 2025
5 checks passed
@HomelessDinosaur HomelessDinosaur deleted the plugin-dev-guide branch November 3, 2025 23:20
@nitric-bot
Copy link

🎉 This PR is included in version 0.4.4 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants