Repository navigation
Releases: plainlang/plain-forge
Release list
v1.1.0
New release π
Hello everyone! We are releasing a new version of plain-forge - 1.1.0!
Run npx plain-forge update in your terminal to upgrade. The update also upgrades plain-parser to 0.2.0, which this release needs.
New features & improvements
- Explicit test scenarios. A functionality is a
# <func-id>heading followed by free text. Its tests live in a test plain file, by conventiontests/<module>/<func-id>.plain, with a***conformance tests***section for the expected use and an***acceptance tests***section for the use that is not expected. The renderer generates one test per scenario and nothing else. The newadd-test-scenariosskill writes conformance scenarios together with the spec, and acceptance scenarios when you ask for them.add-acceptance-testis gone. (#32) - A test plain file may be empty. When conformance tests are enabled, every functionality needs a test plain file, but the file may hold no scenario yet. An empty conformance section carries the comment
> add conformance test scenarios here.plain-healthcheckreports such a file as a warning and keepsPASS. (#37) tests-folderinconfig.yaml. The parser and the renderer read test plain files only from the folders this key names; there is no default. The skills writetests-folder: testswhenever conformance tests are enabled, andplain-healthcheckfails a config that hasconformance-tests-scriptwithout it. (#38)- plain-parser 0.2.0.
npx plain-forge installandnpx plain-forge updateupgrade an older plain-parser, and the skills name 0.2.0 as the release they need. (#43) - Rules load on demand.
load-plain-referencereads the ***plain rules when a skill needs them, not at launch. (#33) render-specfrom pyro 0.5.0. The bundled renderer skill reads the test plain files, renders one test per scenario and invents none. (plainlang/pyro#47)
Breaking change. Specs in the previous syntax, with - bullets as functional specs and nested ***acceptance tests***, are no longer read. plain-parser 0.2.0 reports them as not supported, and there is no migration skill. Rewrite them with the new skills.
Internal improvements
- Dependabot keeps the npm dependencies current; TypeScript 7 and newer type definitions. (#31, #35, #36, #39, #40)
- CI and release notices go to Slack through the bot token. (#34)
Full Changelog: v1.0.23...v1.1.0
v1.0.23
v1.0.22
New release π
Hello everyone! We are releasing a new version of plain-forge - 1.0.22!
Run npx plain-forge update in your terminal to upgrade!
New features & improvements
-
plain-forge no longer depends on one particular renderer. Skills, rules and docs now say "the renderer" instead of codeplain. The codeplain-only
run-codeplainandload-codeplain-referenceskills have been removed. The installer no longer tells you to install the codeplain CLI. -
pyro is the default renderer, and its
render-specskill ships in the package. At the end offorge-plainandadd-feature, the agent asks whether to render with pyro. If the skill isn't available, it points you to pyro's install docs. This release bundles pyro v0.4.0. -
plain-forge installnow installs plain-parser. It usesuv tool installand installs uv first if it's missing (astral'sinstall.shon Linux/macOS,install.ps1on Windows). If this step fails, it prints the commands to run by hand, and the install itself still succeeds. Pass--skip-plain-parserto skip it. -
plain-healthcheckvalidates specs withplain-parser check. It runs on every top module together with itsimport/requireschain, replacingcodeplain --dry-run. It then checks what the parser can't judge: section ownership, bullets, and the contents of linked resources. If plain-parser is missing, the healthcheck fails.forge-plainPhase 4 andadd-featureboth gate on this check before handing off to the renderer. -
check-plain-envalways checks for plain-parser and Python β₯ 3.11. It no longer looks for the codeplain CLI orCODEPLAIN_API_KEY. -
init-config-fileis renderer-neutral.config.yamlstill configures test scripts, templates and output folders, but no longer contains codeplain CLI keys, logging settings orCODEPLAIN_API_KEY.
Fixes
- Linked-resource paths are resolved the way the renderer actually resolves them. Paths are relative to the directory of the
.plainfile passed to the renderer, not the current working directory. This also applies to links inside imported and required modules. Paths that don't resolve there are looked up intemplate-dir, then in the renderer's built-in template library. So a render gives the same result from any working directory. (#25)
Internal improvements
- pyro is vendored as a git submodule at
vendor/pyro, pinned to v0.4.0.scripts/bundle-pyro.shcopiesrender-specinto the package on release, onnextprereleases and indeploy.sh, checks that it's there and reports the pyro version. - The bundled-skill check now handles npm 12's new
npm pack --jsonoutput format. - A new CI job runs the real install on Linux, macOS and Windows and checks that plain-parser can validate a spec.
- Removed the
presentations/deck and the codeplain npm keyword.
v1.0.21
New release π
Hello everyone! We are releasing a new version of plain-forge - 1.0.21!
Run npx plain-forge update in your terminal to upgrade!
New features & improvements
-
check-forge-version β a new skill that finds every plain-forge install (project and global, all agent layouts), compares each against npm's latest, and reports PASS / FAIL / WARN with the exact update command. It never changes anything. --json and --offline supported.
-
Stale installs now warn loudly, at the right moment. load-plain-reference runs the check before loading any rule, and a non-current install leads with "ACTION REQUIRED" rather than a neutral aside β specs written against superseded rules may not match what the current codeplain renderer expects. You can still choose to continue.
-
resolve-section-ownership β a new skill that moves misplaced facts to the section that owns them (where the renderer will actually read them, instead of silently ignoring them). The counterpart to break-down-func-spec, which splits specs that are merely too large.
-
Conciseness rules. New concise-specs.md plus two worked BAD β GOOD example banks: cut the obvious, no rationale or meta-commentary, no unverifiable adjectives or hedging. Required detail always wins.
-
module-structure.md β one rule for the whole file: skeleton, frontmatter, section order, module kinds, and a section-ownership table. Also documents that .plain files are processed with Liquid before parsing, so variables, filters, conditionals and loops work in any section.
-
Phase 1 now accepts technology-free implementation reqs β retry policy, idempotency, data-format rules. Naming a language, framework or storage engine still makes it a Phase 2 answer.
-
requires semantics documented properly. The build chain is a tree: accumulated code is copied forward, ancestors' functional specs are visible transitively, exported_concepts are not. Diamond joins are prohibited β all requires entries must sit on one ancestor path.
-
Bullet continuation is a convention, not a fabricated rule. One statement per line, nested - for clarifications, never a break for width β and the rules now say plainly what the renderer enforces versus what it merely tolerates.
-
Integrations record provider behavior instead of specifying it β quirks and doc divergences go in resources/-notes.md, not into a spec. Probe fixtures and doc snapshots are no longer required; the OpenAPI file is the artifact of record and conformance stays live.
-
Clearer test types β the table now says which tests are generated for you (unit, conformance) and which you author (acceptance).
Fixes
- The canonical implementation-req example taught the opposite of its own rule: :Implementation: is the whole codebase, so a req about one behavior must name the component it constrains.
- The URL/folder rule claimed enforcement that doesn't exist β a bare URL in prose passes validation and reaches the renderer verbatim, which is exactly why it's unsafe as a reference.
- The stale-version report no longer breaks mid-sentence, and counts are pluralized.
- Assorted factual corrections across the rules: what requires passes on, required-concepts.md, linked-resources.md, a typo in test-reqs.md, and Liquid-vs-import confusion throughout. Added rationale for the 200-LOC limit.
Internal improvements
- Repo references moved to the plainlang GitHub org.
- Node β₯ 22 required; CI tests on 22 and 24, on the same Node as the publish.
- Every merge to main publishes a prerelease to npm's next tag β latest is untouched. Slack notified on publish.
- New RELEASING.md; workflow actions pinned to SHAs with Dependabot.
v1.0.20
New features & improvements
- New codeplain output layout throughout the rules and skills. Generated code and unit tests now live in
plain_modules/<module>/code, and conformance tests inplain_modules/<module>/testsβ one folder per functional spec β replacing the top-levelconformance_tests/directory. Section ownership follows suit::UnitTests:sit incode/,:ConformanceTests:intests/. - Test scripts document the new argument contract. Unit-test and prepare-environment runners receive
plain_modules/<module>/code; the conformance runner receives that plusplain_modules/<module>/tests/<functionality>. requiresmodules copy<required_module>/codeas their starting point.- Automated npm publishing. Publishing a GitHub Release tagged
vX.Y.Zships that version to npm via OIDC trusted publishing, with provenance attestations and no stored token. Pre-releases go out under thenextdist-tag. - CI on every pull request, running the suite across Node 18, 20 and 22, and required before a PR can merge to
main. - Slack notifications for merges to
mainand for release start / success / failure. scripts/deploy.shpublishes a release from a workstation when Actions is unavailable, including Slack notifications and the Deployments record.
Fixes
- Fixed
npm testfailing on Node 18 and 20 βnode --testonly expands glob patterns from Node 22, so the quotedtest/**/*.test.mjsreached Node as a literal path. The script now passes a shell-expanded file list, honouring the declaredengines: >=18. - Removed
conformance-tests-folderfrominit-config-file: the option no longer exists in the codeplain CLI, so the skill was documenting a key the renderer rejects. - Re-synced
AGENTS.mdwithCLAUDE.md, which had drifted and still carried the broken test command.
Internal improvements
- Three workflows under
.github/workflows/:ci.yml(PR tests),pr-notify.yml(merge notifications),publish.yml(release-triggered npm publish). All default topermissions: {}with per-job opt-in, and every Slack step is guarded so the workflows run cleanly without the webhook secret. mainprotected by required status checks; force pushes and branch deletion disabled.- Releases are recorded under Deployments β npm, from both the workflow and the local script.
- Added a technical onboarding presentation under
presentations/.
Full Changelog: v1.0.19...v1.0.20