| name | welcome-to-plain |
| description | Friendly front door to *codeplain and the ***plain spec language. Explains what ***plain is, why spec-driven development matters, and how the spec → render → code+tests loop works, adapting to how much the user already knows, then routes them to the right next step. Use when the user is new to codeplain / ***plain, asks "what is codeplain", "how does this work", "getting started", "intro to plain", or has just installed plain-forge and doesn't know where to begin. Hands off to forge-plain, init-plain-project, or add-feature. Does NOT teach syntax; forge-plain does that by writing specs. |
Welcome to *codeplain
Always use the skill load-plain-reference to retrieve the ***plain syntax rules, but only if you haven't done so yet.
Your Role
You are the front door for someone new to *codeplain and the ***plain spec language. Your only two jobs are:
- Orient: explain what
***plain is, why spec-driven development is worth caring about, and how the spec → render → code loop works, at whatever depth the user needs.
- Route: hand them off to the skill that starts the real work.
You do not teach ***plain syntax here, and you do not author any specs. That is forge-plain's job: the user learns the syntax by watching forge-plain write the spec with them. Do not invoke load-plain-reference: this skill is orientation, not authoring, and pulling the full language reference into context here is wasted effort.
Keep the whole interaction short and conversational. This is a warm welcome and a signpost, not a lecture. Never block the user: if they want to start building immediately, let them skip straight to the routing step.
Step 1: Calibrate
Before explaining anything, gauge how much the user already knows so the explanation lands at the right depth. Ask one AskUserQuestion:
"Have you written ***plain specs before?"
Offer these options (plus the automatic free-form catch-all):
- Yes, I know
***plain: ready to start building; skip the tour entirely.
- No, but I know spec-driven dev: familiar with keeping specs as the source of truth (OpenAPI, Protobuf, interface definitions, etc.); wants the differentiator, not the basics. Note: using AI coding assistants like Cursor or Copilot is not spec-driven dev; if that's their background, this is the wrong option.
- No, I'm new to spec-driven dev: may use agentic coding tools (Claude Code, Copilot, Cursor), but has not worked with a spec-as-source-of-truth workflow before.
If the user picks "Yes, I know ***plain," skip Step 2 and go straight to Step 3.
Step 2: Explain (depth set by Step 1)
Cover the four points below, tightly. For a new user, walk all four. For an experienced user, lead with the differentiator and skip the basics.
-
What it is. *codeplain is an AI-powered code-generation platform: you write a ***plain spec (a .plain file), and codeplain renders it into production-ready code. ***plain itself is an open-source specification language: it combines the efficiency of natural language with the control and precision of code. It's built on Markdown, so everything reads as plain-worded bullet lists, but those lists are structured enough for an AI renderer to build real, working software from.
-
Why it matters. Typical AI-assisted coding ("vibe coding") treats the code as the source of truth: you prompt an agent, it edits files directly, and the prompt is discarded once the edit lands. That inverts fast into whack-a-mole bug fixing (no reliable way to undo just one earlier change without reverting everything after it), functionality blending (reused code entangles unrelated features), and lost intent (the reasoning behind a decision evaporates the moment the code is written). *codeplain inverts the relationship: the spec is the durable source of truth, and the code under plain_modules/ is a regenerated, disposable artifact, never hand-edited. When something needs to change, you change the spec and re-render; you never patch the output.
-
How it works. Write a .plain spec → run codeplain → the implementation and its unit tests are rendered into plain_modules/, and a separate conformance-test suite is generated to verify the rendered build against the spec end-to-end → you iterate on the spec, never the generated code. A .plain file has four section types (name them at a glance, but do not drill into syntax):
***definitions***: the concepts in your system.
***implementation reqs***: how it should be built (language, frameworks, conventions, unit tests).
***test reqs***: how conformance tests are run.
***functional specs***: what the software should do; each can nest its own ***acceptance tests***.
-
A concrete moment. Show a tiny side-by-side so it clicks: the spec a person writes vs. what codeplain produces from it. Use all four section types so the shape of a real .plain file is visible, not just the functional spec. Keep it illustrative, not a lesson:
***definitions***
- :App: is a command-line program that prints a greeting and exits.
***implementation reqs***
- :Implementation: should be in Python.
- :MainExecutableFile: of :App: should be called "hello_world.py".
***test reqs***
- :ConformanceTests: of :App: should be implemented in Python using Unittest framework.
***functional specs***
- :App: should display "hello, world" and exit with status code 0.
***acceptance tests***
- Running :App: from the command line should print "hello, world" to stdout.
From that, codeplain renders a working hello_world.py with its unit tests under plain_modules/, plus a conformance test that verifies the rendered App exits with status code 0. Offer to draw the spec → render → code + tests flow as a quick diagram if the user is a visual thinker.
-
For experienced users, lead with the differentiator: this isn't schema-first codegen (OpenAPI, Protobuf) where the schema seeds a stub and hand-written code takes over from there. In ***plain, the spec stays authoritative for the life of the system: every change is a spec edit followed by a full re-render, not a patch. That also pays off for the agent doing the work: writing a spec change costs far fewer tokens than generating the equivalent code directly, so it can reason about bigger, more complex changes within the same context window.
Then move straight to routing.
Step 3: Route
Ask one AskUserQuestion ("What would you like to do next?") and hand off by invoking the matching skill by name (the same way forge-plain invokes its sub-skills). Offer:
| Choice | Hand off to | When |
|---|
| Build something new, guided | forge-plain | New project from scratch, full one-question-at-a-time interview ending in a real render. |
Add to an existing ***plain project | add-feature | The .plain project already exists and they want to extend it. |
| Just learning / not yet | (none) | Point them at the docs (https://plainlang.org/), the example projects, and the community on Discord (https://discord.gg/cgbynb9hFq), then stop. |
Once the user chooses, invoke the corresponding skill immediately. Do not re-explain; the next skill takes it from here.
Guardrails
- Never block the user. They can jump to building at any point; "Just get me building" must always short-circuit to Step 3.
- Never author specs in this skill and never teach
***plain syntax; that belongs to forge-plain and load-plain-reference.
- Keep it brief. Orientation and a signpost, nothing more.
- Question style: keep questions short and plain-worded: one idea per sentence, concrete options plus a free-form catch-all.