WYRD/TOOLS

Tools / intentional / Configuration

Configuration

intentional keeps all of its state in one directory, .intentional/, at the workspace root:

PathPurpose
.intentional/config.ymlPackage inventory and release settings.
.intentional/intents/Pending change-intent Markdown files.

intentional init scans for supported manifests and writes both. There are no environment variables and no other config file. The only global command-line option is -C / --directory, which sets the workspace root (default .).

Configuration file

.intentional/config.yml uses kebab-case keys and rejects unknown keys. Its top-level shape is:

$schema: https://intentional.foo/schemas/config.yml
settings:
  global-tag: false
  internal-dependency-bump: patch
packages:
  sample-runtime:
    path: packages/runtime
    projections:
      - adapter: npm
        file: package.json
        mode: committed
      - adapter: pub
        file: pubspec.yaml
        mode: committed
    tag: "{id}@{version}"
  sample-application:
    path: packages/application
    projections:
      - adapter: npm
        file: package.json
        mode: committed
    depends-on: [sample-runtime]

Top-level keys

KeyRequiredDefaultMeaning
$schemaNoSchema URL for editor validation.
settingsNosee belowWorkspace-wide release behavior.
packagesYesLogical package inventory; at least one entry.

settings

KeyTypeDefaultMeaning
global-tagbooleanfalseAlso create a plain X.Y.Z tag for the release.
internal-dependency-bumpmajor | minor | patchpatchMinimum bump propagated to internal dependents. Cannot be none.

packages

packages is a map keyed by a stable package id. Ids may contain ASCII letters, digits, and the characters -, _, ., @, and /.

KeyRequiredDefaultMeaning
pathYesPackage directory relative to the workspace root. Must be relative and contain no ...
projectionsYesVersion projections; at least one.
tagNo{id}@{version}Tag template for this package.
depends-onNo[]Ids of internal packages this one depends on.

projections

Each projection maps one file to one version location.

KeyRequiredDefaultMeaning
adapterYesEcosystem or generic format adapter (see below).
fileYesFile relative to the package path.
modeYesHow the version is materialized.
pointerOnly for json / toml / yamlJSON Pointer or dotted key path to the version field.

Adapters:

  • Ecosystem-aware: npm, cargo, pub, python, msbuild, go. These know where the version lives and participate in internal dependency-range rewriting.
  • Generic: json, toml, yaml. These target an arbitrary field and require a pointer, such as /metadata/version.

Projection mode values:

ModeBehavior
committedapply writes the release version into the manifest.
injectedstamp writes the computed build version; apply leaves it alone.
noneNo manifest version is written. Go modules use this mode, since their version is carried by tags.

Tag templates

The tag template controls the Git tag written for a package. It must contain exactly one {version} placeholder and at most one {id} placeholder, and it must not prefix the version with v (intentional tags never use a v prefix). Resolved tag templates must be unique across packages, and must not collide with the plain {version} tag when global-tag is enabled.

Common forms:

  • {id}@{version} — the default, e.g. sample-runtime@1.4.0.
  • {version} — a single-package repository tagged with a plain SemVer value.

Intent files

Pending intents live in .intentional/intents/ as Markdown files. Each file’s name stem is its intent id; intentional add generates a memorable slug such as swift-otter-1a2b.md. A file has YAML frontmatter mapping package ids to bumps, followed by the changelog prose:

---
sample-runtime: minor
sample-application: patch
---

Add a user-visible capability.

Rules enforced when an intent is authored or read:

  • The frontmatter must reference at least one package.
  • Every referenced package id must exist in config.yml.
  • Each bump must be major, minor, or patch (never none).
  • The changelog message must not be empty.

Before 1.0.0, major advances 0.x.y to 0.(x+1).0, while minor and patch both advance it to 0.x.(y+1). Reaching 1.0.0 is a deliberate human act — tag 1.0.0 explicitly — after which strict SemVer rules apply.

Initializing configuration

intentional init scans the workspace (skipping .git, .intentional, node_modules, and target) and maps discovered manifests to adapters:

ManifestAdapterDefault mode
package.jsonnpmcommitted
Cargo.toml (package-bearing)cargocommitted
pubspec.yamlpubcommitted
pyproject.tomlpythoncommitted
*.csprojmsbuildcommitted
go.modgonone

Each discovered package gets the default {id}@{version} tag template. Edit the generated file to adjust ids, tag templates, projection modes, pointer values, and depends-on edges before your first release.