Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
},
"plugins": [
{
"name": "cust-devplatform-plugin",
"name": "ext-devplatform-plugin",
"source": "./",
"description": "A friendly companion for getting an app running on the Intility Developer Platform. Helps you create a cluster, deploy a containerized app, expose it on a URL, and update it later — without needing prior Kubernetes experience."
}
Expand Down
6 changes: 3 additions & 3 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "cust-devplatform-plugin",
"name": "ext-devplatform-plugin",
"displayName": "Intility Developer Platform",
"version": "0.1.0",
"description": "A friendly companion for getting an app running on the Intility Developer Platform. Helps you create a cluster, deploy a containerized app, expose it on a URL, and update it later — without needing prior Kubernetes experience.",
"author": {
"name": "Intility",
"email": "devinfra@intility.no"
},
"homepage": "https://github.com/intility/cust-devplatform-plugin",
"repository": "https://github.com/intility/cust-devplatform-plugin",
"homepage": "https://github.com/intility/ext-devplatform-plugin",
"repository": "https://github.com/intility/ext-devplatform-plugin",
"license": "MIT",
"keywords": ["intility", "kubernetes", "openshift", "beginner", "deploy"]
}
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Guidance for AI coding agents (and humans) working on this repository.

## What this is

A Claude Code plugin: eight markdown skills that guide a customer from zero to a running, exposed app on the Intility Developer Platform. There is no application code — the "source" is SKILL.md prompts, YAML/JSON manifests, and reference docs.
A Claude Code plugin: eight markdown skills that guide an external user from zero to a running, exposed app on the Intility Developer Platform. There is no application code — the "source" is SKILL.md prompts, YAML/JSON manifests, and reference docs.

## Layout

Expand Down
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Thanks for helping make the Developer Platform plugin better. It's an early alph

## Found a bug? Have a wish?

Open an [issue](https://github.com/intility/cust-devplatform-plugin/issues). Include what you asked Claude to do, what it tried (the failing command is the best clue), and the cluster name if relevant.
Open an [issue](https://github.com/intility/ext-devplatform-plugin/issues). Include what you asked Claude to do, what it tried (the failing command is the best clue), and the cluster name if relevant.

## Making changes

Expand All @@ -18,8 +18,8 @@ Open an [issue](https://github.com/intility/cust-devplatform-plugin/issues). Inc
3. To try your changes live, add your local checkout as a marketplace in Claude Code:

```
/plugin marketplace add /path/to/cust-devplatform-plugin
/plugin install cust-devplatform-plugin@intility
/plugin marketplace add /path/to/ext-devplatform-plugin
/plugin install ext-devplatform-plugin@intility
```

4. Open a PR against `main`. The `validate` check must pass before merging.
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@



> ⚠️ **Early alpha.** This is the first cut of customer-facing skills for the Intility Developer Platform. Skill names, prompts, defaults, and behaviours will change as we learn. Don't depend on it for anything critical yet — but please [open an issue](https://github.com/intility/cust-devplatform-plugin/issues) when something feels off, surprises you, or could be clearer. That feedback is the whole point of an alpha.
> ⚠️ **Early alpha.** This is the first cut of external-facing skills for the Intility Developer Platform. Skill names, prompts, defaults, and behaviours will change as we learn. Don't depend on it for anything critical yet — but please [open an issue](https://github.com/intility/ext-devplatform-plugin/issues) when something feels off, surprises you, or could be clearer. That feedback is the whole point of an alpha.


## Features
Expand All @@ -22,8 +22,8 @@
**1. Install this plugin**

```bash
/plugin marketplace add intility/cust-devplatform-plugin
/plugin install cust-devplatform-plugin@intility
/plugin marketplace add intility/ext-devplatform-plugin
/plugin install ext-devplatform-plugin@intility
```

**2. Tell Claude what you want**
Expand Down Expand Up @@ -96,7 +96,7 @@ A few things that aren't obvious up front:

## Found a bug? Have a wish?

Open an issue: **[github.com/intility/cust-devplatform-plugin/issues](https://github.com/intility/cust-devplatform-plugin/issues)**
Open an issue: **[github.com/intility/ext-devplatform-plugin/issues](https://github.com/intility/ext-devplatform-plugin/issues)**

Helpful to include:

Expand Down
2 changes: 1 addition & 1 deletion skills/create-cluster/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: create-cluster
description: Creates a single cluster on the Intility Developer Platform for a customer. Use when the user asks to "create a cluster", "get me a cluster", "set up a cluster", or is being routed here by the getting-started skill. Creates ONE cluster with sensible defaults unless the user explicitly asks for more, since this plugin assumes a many-apps-on-one-cluster model.
description: Creates a single cluster on the Intility Developer Platform for an external user. Use when the user asks to "create a cluster", "get me a cluster", "set up a cluster", or is being routed here by the getting-started skill. Creates ONE cluster with sensible defaults unless the user explicitly asks for more, since this plugin assumes a many-apps-on-one-cluster model.
allowed-tools:
- AskUserQuestion
- Bash(indev account show)
Expand Down
10 changes: 5 additions & 5 deletions skills/expose-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ End state: `curl http://<hostname>/` returns a non-error status code.

## Background (one paragraph, share with the user as needed)

The platform runs **Envoy Gateway**. Two pre-built gateways are typically available: `internal` (only reachable from inside the customer's network) and `public` (open to the internet). You don't create gateways — you just create an HTTPRoute that points at one. TLS is handled for you, so HTTPRoutes use plain HTTP on port 80; users still get HTTPS at the URL.
The platform runs **Envoy Gateway**. Two pre-built gateways are typically available: `internal` (only reachable from inside the organization's own network) and `public` (open to the internet). You don't create gateways — you just create an HTTPRoute that points at one. TLS is handled for you, so HTTPRoutes use plain HTTP on port 80; users still get HTTPS at the URL.

The domain each gateway uses is the customer's own — not hardcoded in this skill. We read it from the gateway's listener config.
The domain each gateway uses is the organization's own — not hardcoded in this skill. We read it from the gateway's listener config.

## Step 0 — Confirm access

Expand All @@ -48,7 +48,7 @@ oc get gateways -n envoy-gateway-system

Look at the `PROGRAMMED` column. Only offer gateways that show `True`. If no gateway is programmed, stop and tell the user to reach out to the Developer Platform Admins via their collaboration channel (samhandlingskanal) — the cluster isn't ready for ingress.

For each programmed gateway, read its listener hostname template — that's the customer's domain. The pattern is usually a wildcard like `*.apps.example.com`:
For each programmed gateway, read its listener hostname template — that's the organization's domain. The pattern is usually a wildcard like `*.apps.example.com`:

```bash
oc get gateway <gateway-name> -n envoy-gateway-system \
Expand Down Expand Up @@ -79,7 +79,7 @@ Putting an app on the public gateway means anyone on the internet can hit it. Mo
```
Q: "Just to confirm — putting this on the public gateway means anyone on the internet can reach it. Are you sure?"
Options:
- "Yes, this is meant to be public (e.g. marketing site, public API, customer-facing app)"
- "Yes, this is meant to be public (e.g. marketing site, public API, user-facing app)"
- "No, switch to internal" — go back and use the internal gateway instead
```

Expand Down Expand Up @@ -182,7 +182,7 @@ curl -s -o /dev/null -w "%{http_code}\n" http://<hostname>/

- `200`–`399` → working
- `502` / `503` → route is attached but the pod isn't responding. Check `oc get pods -n <namespace>` — is it `Running`? Are the ports right (`Service.targetPort` should match the container port)?
- Timeout on the `internal` gateway from a remote machine → likely a network reachability issue. The internal hostname may only resolve from inside the customer's network or via VPN. Ask: "Are you connected to the network this cluster is normally reached from?"
- Timeout on the `internal` gateway from a remote machine → likely a network reachability issue. The internal hostname may only resolve from inside the organization's network or via VPN. Ask: "Are you connected to the network this cluster is normally reached from?"

## Step 8 — Report

Expand Down
4 changes: 2 additions & 2 deletions skills/expose-app/references/httproute-templates.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ Substitute the `*` with the app's subdomain (default: the app name).

| Gateway | Reachable from |
|---|---|
| `internal` | Only the customer's internal network (the safe default for almost every app) |
| `internal` | Only the organization's internal network (the safe default for almost every app) |
| `public` | Anywhere on the internet — only when the app is meant to be public-facing |

The actual domain (`example.com` above) is the customer's own; this skill never assumes a specific domain.
The actual domain (`example.com` above) is the organization's own; this skill never assumes a specific domain.

---

Expand Down
2 changes: 1 addition & 1 deletion skills/expose-app/references/usage-examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ You: Yes
[curl http://shop.apps.example.com/ → 200]

Your app is live at: http://shop.apps.example.com/
(Gateway: internal — only reachable on the customer network)
(Gateway: internal — only reachable on your organization's network)
```

---
Expand Down
2 changes: 1 addition & 1 deletion skills/login/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ If `oc whoami` returns their username and `oc get nodes` lists nodes (any status
- **`oc whoami` says "Unauthorized"**: token didn't get saved — re-run login
- **`oc get nodes` says "Forbidden"**: the account was created but no roles attached yet. Tell the user to check with their cluster owner or reach out to the Developer Platform Admins via their collaboration channel (samhandlingskanal).

Do not go further down the troubleshooting tree than this. Customers should escalate; they shouldn't be debugging RBAC.
Do not go further down the troubleshooting tree than this. External users should escalate; they shouldn't be debugging RBAC.

## Quick reference

Expand Down
4 changes: 2 additions & 2 deletions skills/status/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Apps:
┌─ myapp (namespace: myapp)
│ image: ghcr.io/me/myapp:v2
│ status: 1/1 running
│ URL: http://myapp.apps.example.com (internal — only reachable on the customer network)
│ URL: http://myapp.apps.example.com (internal — only reachable on your organization's network)
┌─ api (namespace: api)
│ image: ghcr.io/me/api:latest
Expand All @@ -97,7 +97,7 @@ Status notation:
- No httproute for a namespace → say "not exposed"

For the gateway label, derive it from the parentRef name:
- `internal` → `(internal — only reachable on the customer network)`
- `internal` → `(internal — only reachable on your organization's network)`
- `public` → `(public — reachable from the open internet)` — flag this visually so the user notices, e.g. with a `⚠` prefix or by underlining it

If you see a `public` route the user may have set up earlier and forgotten about, mention it explicitly at the end of the report: "FYI, `<app>` is on the public gateway — make sure that's still intended."
Expand Down