Skip to content

Releases: plainlang/plain-forge

v1.1.0

Choose a tag to compare

@NejcS NejcS released this 02 Nov 14:32

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 convention tests/<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 new add-test-scenarios skill writes conformance scenarios together with the spec, and acceptance scenarios when you ask for them. add-acceptance-test is 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-healthcheck reports such a file as a warning and keeps PASS. (#37)
  • tests-folder in config.yaml. The parser and the renderer read test plain files only from the folders this key names; there is no default. The skills write tests-folder: tests whenever conformance tests are enabled, and plain-healthcheck fails a config that has conformance-tests-script without it. (#38)
  • plain-parser 0.2.0. npx plain-forge install and npx plain-forge update upgrade an older plain-parser, and the skills name 0.2.0 as the release they need. (#43)
  • Rules load on demand. load-plain-reference reads the ***plain rules when a skill needs them, not at launch. (#33)
  • render-spec from 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

Choose a tag to compare

@zanjonke zanjonke released this 02 Oct 10:01

New release πŸŽ‰

Hello everyone! We are releasing a new version of plain-forge - 1.0.23!

Run npx plain-forge update in your terminal to upgrade!

Fixes

  • Installation of plain-parser during "npx plain-forge install"

v1.0.22

Choose a tag to compare

@zanjonke zanjonke released this 30 Sep 07: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-codeplain and load-codeplain-reference skills have been removed. The installer no longer tells you to install the codeplain CLI.

  • pyro is the default renderer, and its render-spec skill ships in the package. At the end of forge-plain and add-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 install now installs plain-parser. It uses uv tool install and installs uv first if it's missing (astral's install.sh on Linux/macOS, install.ps1 on Windows). If this step fails, it prints the commands to run by hand, and the install itself still succeeds. Pass --skip-plain-parser to skip it.

  • plain-healthcheck validates specs with plain-parser check. It runs on every top module together with its import/requires chain, replacing codeplain --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-plain Phase 4 and add-feature both gate on this check before handing off to the renderer.

  • check-plain-env always checks for plain-parser and Python β‰₯ 3.11. It no longer looks for the codeplain CLI or CODEPLAIN_API_KEY.

  • init-config-file is renderer-neutral. config.yaml still configures test scripts, templates and output folders, but no longer contains codeplain CLI keys, logging settings or CODEPLAIN_API_KEY.

Fixes

  • Linked-resource paths are resolved the way the renderer actually resolves them. Paths are relative to the directory of the .plain file 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 in template-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.sh copies render-spec into the package on release, on next prereleases and in deploy.sh, checks that it's there and reports the pyro version.
  • The bundled-skill check now handles npm 12's new npm pack --json output 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

Choose a tag to compare

@zanjonke zanjonke released this 02 Sep 12:54

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

Choose a tag to compare

@zanjonke zanjonke released this 07 Aug 06:04

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 in plain_modules/<module>/tests β€” one folder per functional spec β€” replacing the top-level conformance_tests/ directory. Section ownership follows suit: :UnitTests: sit in code/, :ConformanceTests: in tests/.
  • Test scripts document the new argument contract. Unit-test and prepare-environment runners receive plain_modules/<module>/code; the conformance runner receives that plus plain_modules/<module>/tests/<functionality>.
  • requires modules copy <required_module>/code as their starting point.
  • Automated npm publishing. Publishing a GitHub Release tagged vX.Y.Z ships that version to npm via OIDC trusted publishing, with provenance attestations and no stored token. Pre-releases go out under the next dist-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 main and for release start / success / failure.
  • scripts/deploy.sh publishes a release from a workstation when Actions is unavailable, including Slack notifications and the Deployments record.

Fixes

  • Fixed npm test failing on Node 18 and 20 β€” node --test only expands glob patterns from Node 22, so the quoted test/**/*.test.mjs reached Node as a literal path. The script now passes a shell-expanded file list, honouring the declared engines: >=18.
  • Removed conformance-tests-folder from init-config-file: the option no longer exists in the codeplain CLI, so the skill was documenting a key the renderer rejects.
  • Re-synced AGENTS.md with CLAUDE.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 to permissions: {} with per-job opt-in, and every Slack step is guarded so the workflows run cleanly without the webhook secret.
  • main protected 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