lore:
0.1.0-alpha.5 GitHub

Configuration

The .lore directory

Three things, all written by lore init and all yours to edit: the schema of note types, a template for each type, and the workflow the agent skills follow.

The schema

.lore/schema.yml at the repo root says where notes live, what to ignore, and which types of note exist. This is the default, with every option shown:

.lore/schema.yml
notes: docs
ignore: [test/fixtures/**]          # globs excluded everywhere
types:
  Spec:
    dir: docs/specs                 # notes here are Specs unless they say otherwise
    format: md                      # or org: what lore new writes
    fields:
      status: { enum: [draft, accepted, retired], required: true }
  Decision:
    dir: docs/decisions
    id: "{n:4}"                     # lore new numbers these 0001, 0002, ...
    summary: Decision               # the summary comes from the "## Decision" section
    fields:
      status: { enum: [proposed, accepted, superseded], required: true }
      supersedes: { link: Decision, many: true }
  Effort:
    dir: docs/efforts
    freeze: [specs]                 # fields lore freeze follows
    fields:
      specs: { link: Spec, many: true, required: true }
      status: { enum: [planned, active, done] }

Types

dir
Where lore new puts the type’s notes. A note in this directory is of this type unless its type field says otherwise.
format
md (the default) or org: the kind of file lore new writes.
id
Numbers new notes. {n:4} gives 0001, 0002; the number then works as a link.
summary
A heading whose first paragraph is the summary, instead of the note’s first paragraph.
freeze
Link fields lore freeze records versions for. A type with freeze is what lore next treats as an effort.
fields
The fields lore check and lore set enforce.

Fields

Each field can be required, limited to an enum, or a link to another type, optionally many. The first value of a status enum is the one lore new starts a note with.

Say your team wants an owner on every decision, and a Runbook type:

.lore/schema.yml (excerpt)
  Decision:
    dir: docs/decisions
    id: "{n:4}"
    summary: Decision
    fields:
      status: { enum: [proposed, accepted, superseded], required: true }
      supersedes: { link: Decision, many: true }
      owner: { required: true }
  Runbook:
    dir: docs/runbooks
    fields:
      status: { enum: [current, stale] }
      service: { link: Spec }

From then on, lore check reports any decision without an owner, and lore set refuses a runbook whose service is not a Spec:

~/app
lore check
docs/decisions/0001-hard-expiry.md:1: Decision needs 'owner'
docs/decisions/0002-rotating-refresh-tokens.md:1: Decision needs 'owner'
docs/decisions/0003-money-is-integer-cents.md:1: Decision needs 'owner'

8 notes, 2 citations: 3 problems
lore new Runbook "Restart auth"
created docs/runbooks/restart-auth.md
lore set runbook/restart-auth service=decision/0002
lore set: docs/runbooks/restart-auth.md: 'service' links to decision/0002-rotating-refresh-tokens, a Decision; expected a Spec
lore set runbook/restart-auth service=spec/auth
updated docs/runbooks/restart-auth.md
  service: "[[spec/auth]]"

Templates

lore new fills .lore/templates/<Type>.md, or .org for an Org type, replacing {{title}}, and adds the type and first status as fields. The default Decision template:

.lore/templates/Decision.md
# {{title}}

## Context

## Decision

## Consequences

A type with no template gets a note with just its title.

WORKFLOW.md

.lore/WORKFLOW.md is the project’s version of the flow. Every lore-* skill reads it first, and where it disagrees with the skill, it wins. Its Size section says what counts as small work, which skips the flow.

Without a schema

With no .lore/schema.yml, lore uses the git root and docs/, and still checks links, citations and anchors. It just has no types to check fields against, and lore next has no efforts to read.