Skip to content

refactor: caplets inspect, setup, and landing page cohesion#95

Merged
ian-pascoe merged 9 commits into
mainfrom
refactor/inspect-caplet-tool
May 30, 2026
Merged

refactor: caplets inspect, setup, and landing page cohesion#95
ian-pascoe merged 9 commits into
mainfrom
refactor/inspect-caplet-tool

Conversation

@ian-pascoe
Copy link
Copy Markdown
Contributor

@ian-pascoe ian-pascoe commented May 29, 2026

Summary by CodeRabbit

  • New Features

    • Landing page: proof-led activation, streamlined hero/quickstart with copyable commands, dark/light theme toggle, improved mobile nav and demo/proof strip
    • CLI: new setup command; caplet inspection command renamed to "inspect"
  • Documentation

    • README, benchmarks, and multiple design/plan docs updated to reflect progressive-disclosure flows and new operation names
  • Tests / Chores

    • Added campaign copy validation and CSS radius enforcement; various package/dev dependency bumps and build/config updates

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 29, 2026

Warning

Review limit reached

@ian-pascoe, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 25 minutes and 23 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 80cfaf5b-52a8-4fa5-89dd-9ae6b1553515

📥 Commits

Reviewing files that changed from the base of the PR and between 5f6c785 and aafd31c.

📒 Files selected for processing (1)
  • apps/landing/src/styles/global.css
📝 Walkthrough

Walkthrough

Landing page redesigned for proof-led activation with theme toggle and activation examples; the CLI adds a new setup command and renames the discovery operation from get_caplet → inspect across core runtime, handlers, and tests; added validation script, packaging/config updates, and a small commit automation change.

Changes

Caplets UX, CLI, and Setup

Layer / File(s) Summary
Landing page content, scripts, and components
apps/landing/src/pages/index.astro, apps/landing/src/components/HugeIcon.astro
Reworks hero, proof-strip, activation tabbed examples, copy buttons with accessible labels/live region, theme initialization/toggle, and trace-reactor autoplay/pause logic.
Global CSS redesign
apps/landing/src/styles/global.css
Adds light/dark tokens, shared radius variables, brand-icon, theme-toggle visuals, redesigned trace/reactor UI, proof-strip and activation styling, and extensive responsive adjustments.
Campaign copy validation
apps/landing/test/campaign-copy.check.mjs, apps/landing/package.json
Adds a campaign copy assertion script and campaign:check npm script; test enforces required/forbidden copy and forbids literal border-radius values (except 50%).
Formatter & project config
.oxfmtrc.json, package.json, apps/landing/astro.config.mjs
Adds Prettier Astro plugin and parser override, bumps dev deps and packageManager, and configures Vite dev server proxy for /__impeccable.
CLI: setup subcommand implementation
packages/core/src/cli/setup.ts, packages/core/src/cli.ts, packages/core/src/cli/commands.ts
Introduces caplets setup with supported integrations, dry-run, remote mode, output writing, command runner hook, menu formatter, and wiring into the CLI command registry and completion.
Operation rename: get_capletinspect (core/runtime)
packages/core/src/tools.ts, packages/core/src/remote-control/*, packages/core/src/generated-tool-input-schema.ts, packages/core/src/capability-description.ts, packages/core/src/result-content.ts
Replaces operation identifiers, updates handler branches and metadata types to recognize inspect for discovery/detail retrieval.
Tests updated for rename & setup
packages/core/test/*, packages/opencode/test/*, packages/pi/test/*, packages/cli/*
Updated completion, remote-control, native, registry, remote-dispatch, tools, and integration tests to exercise inspect; adds unit tests for cli setup.
Documentation, plans, and critiques
README.md, docs/*, .impeccable/critique/*, caplets/github/*
README and docs updated to use inspect naming and document caplets setup; new plan/spec/critique docs added; GitHub caplet example points to hosted MCP endpoint using GH_TOKEN.
Packaging and small automation changes
packages/*/package.json, scripts/commit-byterover-context.ts
Bumps select dev deps, adds prettier-plugin-astro, updates packageManager, and adds --no-verify to automated commit args with corresponding test updates.
Misc. config/docs updates
.gitignore, .changeset/*, .impeccable/*
Adds .impeccable/live to .gitignore and changeset noting the new caplets setup command and package bumps.

Sequence Diagram(s)

(Skipped — changes are broad and the review stack is best read as grouped checkpoints.)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

"🐰 I swapped a command and brushed the site bright,
Proof strips that glimmer in dark and in light,
A setup that guides with copy to run,
Inspect now hops in — the work's nearly done! 🥕"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'refactor: caplets inspect, setup, and landing page cohesion' accurately and specifically describes the main changes: renaming the get_caplet operation to inspect throughout the codebase, adding a new caplets setup CLI command, and restructuring the landing page with proof-led activation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/inspect-caplet-tool

@ian-pascoe ian-pascoe changed the title fix: tests refactor: caplets inspect, setup, and landing page cohesion May 29, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 29, 2026

🚀 Preview Deployed

Your changes have been deployed to a preview environment:

🌐 Landing Page: https://pr-95.preview.caplets.dev

Built from commit 0869452


🤖 This comment updates automatically with each push.

@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 29, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedprettier-plugin-astro@​0.14.19910010080100
Updatedastro@​6.3.8 ⏵ 6.4.298 +110088 +198 +1100

View full report

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 29, 2026

Greptile Summary

This PR renames the get-caplet/get_caplet operation to inspect across the entire CLI, remote-control, and tool layers, and adds a new caplets setup <integration> command that automates first-run wiring for Codex, Claude Code, OpenCode, Pi, and generic MCP clients. It also overhauls the landing page with a proof-led hero, dark/light theme toggle, copyable quickstart commands, and a remote-Caplets explainer, and migrates the GitHub caplet from a local Docker container to the hosted api.githubcopilot.com/mcp endpoint.

  • inspect rename: All CLI command names, operation strings, type unions, system-guidance text, and test assertions are updated consistently; no stale references were found.
  • caplets setup command (packages/core/src/cli/setup.ts): Defines integration-specific action sequences (plugin installs or file writes), supports --dry-run and --format json, and injects a SetupCommandRunner hook for testing. The writeFileSync call uses flag: \"wx\" (exclusive create) so re-running setup on an existing output path will throw a raw EEXIST error with no user guidance; execFileAsync is also invoked without a timeout.
  • GitHub caplet (caplets/github/CAPLET.md): Drops the Docker dependency in favour of the hosted HTTP MCP endpoint, simplifying the required env var from GITHUB_PERSONAL_ACCESS_TOKEN to GH_TOKEN.

Confidence Score: 5/5

Safe to merge — the rename is thorough and mechanically correct, and the new setup command is well-tested with an injectable runner abstraction.

The inspect rename touches every relevant layer (CLI, remote-control, tools, tests, guidance strings) and no stale get_caplet reference was found. The new caplets setup command introduces only minor observations around file-write UX and command runner timeout that do not affect correctness or data integrity.

packages/core/src/cli/setup.ts deserves a second look for the file-write and command-runner details described in the inline comments.

Important Files Changed

Filename Overview
packages/core/src/cli/setup.ts New caplets setup command; minor issues with flag: "wx" EEXIST UX, missing timeout on execFileAsync, and unused label field in plain-text output
packages/core/src/cli.ts Wires the new setup command and renames get-capletinspect throughout; changes look correct and consistent
packages/core/src/cli/commands.ts Adds setup to command registry and renames getCapletinspect; straightforward rename with no gaps
packages/core/src/tools.ts Renames get_caplet operation to inspect in the tool handler and validation; all paths updated
packages/core/src/remote-control/types.ts Renames get_caplet to inspect in RemoteCliCommand union type; consistent with rest of rename
caplets/github/CAPLET.md Switches GitHub caplet from Docker container to hosted MCP endpoint with bearer auth; migrates env var from GITHUB_PERSONAL_ACCESS_TOKEN to GH_TOKEN
apps/landing/test/campaign-copy.check.mjs New static check enforcing campaign copy, CSS border-radius tokens, and forbidden legacy text; checks for 87.9% consistent with benchmarks doc
apps/landing/src/pages/index.astro Major landing page redesign: proof-led hero, dark/light theme toggle, copyable commands, remote Caplets section, and example caplets tabs

Sequence Diagram

sequenceDiagram
    participant User
    participant CLI as caplets CLI
    participant Setup as cli/setup.ts
    participant Runner as SetupCommandRunner
    participant FS as File System

    User->>CLI: caplets setup codex
    CLI->>Setup: runSetup("codex", options)
    Setup->>Setup: parseSetupIntegrationId("codex")
    Setup->>Setup: setupDefinition(id, options)
    loop For each action
        alt "action.type === command"
            Setup->>Runner: runner(command, args)
            Runner-->>Setup: "{ stdout, stderr }"
        else "action.type === writeFile"
            Setup->>FS: mkdirSync + writeFileSync(flag:wx)
            FS-->>Setup: ok or EEXIST error
        end
    end
    Setup-->>CLI: SetupResult
    CLI-->>User: formatted output

    User->>CLI: caplets setup mcp-client --output ./config.json
    CLI->>Setup: "runSetup(mcp-client, { output })"
    Setup->>FS: "writeFileSync(path, content, { flag: wx })"
    alt File does not exist
        FS-->>User: success
    else File already exists
        FS-->>Setup: EEXIST
        Setup-->>User: CapletsError CONFIG_INVALID
    end
Loading

Fix All in Codex

Reviews (5): Last reviewed commit: "fix(landing): remove local dev config" | Re-trigger Greptile

Comment thread scripts/commit-byterover-context.ts
Comment thread README.md Outdated
Comment thread apps/landing/test/campaign-copy.check.mjs Outdated
Copy link
Copy Markdown
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: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/landing/src/styles/global.css`:
- Around line 207-215: Remove the deprecated CSS property by deleting the `clip:
rect(0 0 0 0);` declaration from the `.copy-status` rule and keep the existing
`clip-path: inset(50%)` (along with position, width, height, overflow,
white-space) so the element remains visually hidden while using the modern,
supported API.

In `@docs/specs/2026-05-29-landing-proof-led-activation-design.md`:
- Line 62: Replace the stale operation name get_caplet with the current name
inspect wherever it appears in the activation flow sequence (specifically the
listed path "get_caplet, search_tools, get_tool, call_tool") and update any
nearby prose or copy assertions that reference get_caplet to use inspect so the
spec and implementations remain consistent.

In `@README.md`:
- Line 46: Update the deterministic payload reduction sentence in the README to
match the committed benchmark numbers in docs/benchmarks/coding-agent.md and the
README's benchmark table: replace the "87.8%" value (and any related phrasing
about "106 flat tools became 3 top-level capabilities") with the exact
deterministic percentage and wording used in the benchmark report so the claim
is consistent; keep the reference to the call sequence (context7 -> inspect ->
search_tools -> get_tool -> call_tool) but ensure the numeric percent matches
the canonical report.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 37c56095-d19f-483b-8042-5223abc471fc

📥 Commits

Reviewing files that changed from the base of the PR and between 202ec96 and 6801fd6.

⛔ Files ignored due to path filters (43)
  • .brv/context-tree/curated/extracted/extracted_facts.md is excluded by !.brv/**
  • .brv/context-tree/curation/extracted/extracted_context.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/animation.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/apps_landing_src_pages_index_astro.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/border_usage.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/build.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/campaign_headline.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/caplets.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/caplets_try_it_in_60_seconds_path.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/card_grids.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/color_specification.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/color_strategy.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/color_usage.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/communication_assets.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/context_loading.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/core_line.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/design_md.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/easing.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/footer.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/glassmorphism.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/gradient_text.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/hero_metric_template.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/hero_section.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/hierarchy.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/impeccable_context_dir.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/line_length.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/loader_output.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/log.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/missing_design_md.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/missing_product_md.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/modal_usage.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/next_move.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/overall_content.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/pnpm.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/problem_section.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/product_md.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/punctuation.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/readme_md.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/theme_selection.md is excluded by !.brv/**
  • .brv/context-tree/facts/project/typecheck.md is excluded by !.brv/**
  • apps/landing/public/icon-header-dark.png is excluded by !**/*.png
  • apps/landing/public/icon-header-light.png is excluded by !**/*.png
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (35)
  • .impeccable/critique/2026-05-29T10-04-14Z__apps-landing-src-pages-index-astro.md
  • .oxfmtrc.json
  • README.md
  • apps/landing/package.json
  • apps/landing/src/pages/index.astro
  • apps/landing/src/styles/global.css
  • apps/landing/test/campaign-copy.check.mjs
  • docs/benchmarks/coding-agent.md
  • docs/plans/2026-05-29-caplets-growth-campaign.md
  • docs/plans/2026-05-29-landing-proof-led-activation.md
  • docs/specs/2026-05-29-landing-proof-led-activation-design.md
  • package.json
  • packages/benchmarks/lib/surface.ts
  • packages/core/src/capability-description.ts
  • packages/core/src/cli.ts
  • packages/core/src/cli/commands.ts
  • packages/core/src/cli/completion.ts
  • packages/core/src/generated-tool-input-schema.ts
  • packages/core/src/native/tools.ts
  • packages/core/src/remote-control/dispatch.ts
  • packages/core/src/remote-control/types.ts
  • packages/core/src/result-content.ts
  • packages/core/src/tools.ts
  • packages/core/test/cli-completion.test.ts
  • packages/core/test/cli-remote.test.ts
  • packages/core/test/cli.test.ts
  • packages/core/test/native-remote.test.ts
  • packages/core/test/native.test.ts
  • packages/core/test/registry.test.ts
  • packages/core/test/remote-control-dispatch.test.ts
  • packages/core/test/tools.test.ts
  • packages/opencode/test/opencode.test.ts
  • packages/pi/test/pi.test.ts
  • scripts/commit-byterover-context.test.ts
  • scripts/commit-byterover-context.ts

Comment thread apps/landing/src/styles/global.css
Comment thread docs/specs/2026-05-29-landing-proof-led-activation-design.md Outdated
Comment thread README.md Outdated
Copy link
Copy Markdown
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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/landing/astro.config.mjs`:
- Around line 13-22: Remove the developer-specific Vite server configuration:
delete the server block that defines allowedHosts and the proxy for
"/__impeccable" (including the target, changeOrigin, and rewrite) so these
hardcoded localtunnel and debug proxy settings are not committed; if you still
need them for local testing, move that server configuration into a local
override file (e.g., astro.config.local.mjs), reference the same keys (server,
allowedHosts, proxy, "/__impeccable", rewrite) when copying, and add that local
override to .gitignore so it is not checked into the repo.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 047a2088-dff0-450c-9cdb-f43cd93abe00

📥 Commits

Reviewing files that changed from the base of the PR and between 6801fd6 and fddd42b.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (26)
  • .changeset/quick-setup-cli.md
  • .gitignore
  • .impeccable/critique/2026-05-29T16-03-18Z__apps-landing-src-pages-index-astro.md
  • README.md
  • apps/landing/astro.config.mjs
  • apps/landing/package.json
  • apps/landing/src/components/HugeIcon.astro
  • apps/landing/src/pages/index.astro
  • apps/landing/src/styles/global.css
  • apps/landing/test/campaign-copy.check.mjs
  • caplets/github/CAPLET.md
  • caplets/github/README.md
  • docs/plans/2026-05-29-cli-integration-setup.md
  • package.json
  • packages/benchmarks/package.json
  • packages/cli/package.json
  • packages/core/package.json
  • packages/core/src/cli.ts
  • packages/core/src/cli/commands.ts
  • packages/core/src/cli/completion.ts
  • packages/core/src/cli/setup.ts
  • packages/core/test/cli-completion.test.ts
  • packages/core/test/cli.test.ts
  • packages/core/test/config.test.ts
  • packages/opencode/package.json
  • packages/pi/package.json
✅ Files skipped from review due to trivial changes (9)
  • .changeset/quick-setup-cli.md
  • packages/pi/package.json
  • packages/cli/package.json
  • packages/benchmarks/package.json
  • packages/core/package.json
  • .gitignore
  • packages/opencode/package.json
  • docs/plans/2026-05-29-cli-integration-setup.md
  • .impeccable/critique/2026-05-29T16-03-18Z__apps-landing-src-pages-index-astro.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/landing/package.json
  • packages/core/src/cli/commands.ts
  • apps/landing/src/pages/index.astro

Comment thread apps/landing/astro.config.mjs Outdated
Copy link
Copy Markdown
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

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/landing/src/styles/global.css`:
- Around line 350-354: Update the CSS rule for the .header-action-icon class to
use the lowercase keyword for the color value; change the color declaration in
.header-action-icon from currentColor to currentcolor so it conforms to
stylelint's expected casing.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: eb0c3c86-067c-4f45-b1bd-82ae2480b5a9

📥 Commits

Reviewing files that changed from the base of the PR and between fddd42b and 5f6c785.

📒 Files selected for processing (5)
  • README.md
  • apps/landing/src/pages/index.astro
  • apps/landing/src/styles/global.css
  • apps/landing/test/campaign-copy.check.mjs
  • docs/specs/2026-05-29-landing-proof-led-activation-design.md
✅ Files skipped from review due to trivial changes (1)
  • docs/specs/2026-05-29-landing-proof-led-activation-design.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/landing/test/campaign-copy.check.mjs
  • README.md
  • apps/landing/src/pages/index.astro

Comment thread apps/landing/src/styles/global.css
@ian-pascoe ian-pascoe merged commit 9d28137 into main May 30, 2026
7 checks passed
@ian-pascoe ian-pascoe deleted the refactor/inspect-caplet-tool branch May 30, 2026 12:15
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.

1 participant