Skip to content

Developer Workflow

Overview

Codeberg is the single source of truth for project management. All work — features, bugs, chores, documentation — is tracked via issues and milestones. roadmap.yaml and feature pages are derived artifacts maintained by CI, never edited manually.

See ADR-023 for the architectural decision behind this workflow.

Getting Started

Repository: codeberg.org/weltenwanderer/weltenwanderer

Required tools:

ToolPurpose
fjForgejo CLI — issue and PR management
bunRuntime, package manager, test runner
gitVersion control with worktree support

Authentication:

Terminal window
fj auth login

Picking Up Work

  1. Check open milestones and pick an issue:
    Terminal window
    fj issue search
  2. Read the issue details and any attached plan:
    Terminal window
    fj issue view <N>
  3. Create a worktree for the issue:
    Terminal window
    git worktree add .claude/worktrees/<branch-name> -b <branch-name>
  4. If no plan is attached to the issue, create one before implementing.

Branch naming convention:

feature/<N>-<slug>
fix/<N>-<slug>
chore/<N>-<slug>

N is the issue number (no hash prefix). slug is lowercase kebab-case.

Making Changes

  1. Read the relevant allium specs in packages/*/specs/ and specs/ for behavioral requirements.
  2. Implement against the spec rules.
  3. Write tests (TDD: red, green, refactor).
  4. Verify locally:
    Terminal window
    bun test

Committing and PRs

Commit format — always reference the issue number:

type(scope): description (#N)

Examples:

  • feat(lsp): add semantic tokens (#42)
  • fix(validation): handle empty decide block (#57)
  • docs(guide): update CLI usage (#63)

Push and create a PR:

Terminal window
git push -u origin <branch-name>
fj pr create -aA

The PR body must include Closes #N so Forgejo auto-closes the issue on merge.

Merge strategy: Rebase + fast-forward only. No merge commits. Every commit on main references an issue.

Issue Templates

Four templates are available when creating issues on Codeberg:

TemplateRequired Field
Bug ReportWhat happened?
Feature RequestWhat becomes possible?
ChoreWhat and why?
DocumentationWhat’s missing, stale, or incorrect?

All templates include a privacy checkbox. Codeberg issues are public — do not include credentials, personal data, or internal paths.

Labels

Kind — what type of work:

LabelUse
Kind/FeatureRoadmap feature
Kind/BugDefect
Kind/EnhancementImprovement to existing feature
Kind/ChoreMaintenance, tooling, config
Kind/DocumentationDocs-only change
Kind/SecuritySecurity-related

Status — flow state:

LabelUse
Status/BlockedDependency not resolved
Status/DeferredParked deliberately (Backlog milestone)
Status/AbandonedStale, no activity (auto-closed after 21 days)
Status/Needs InfoWaiting on reporter (auto-closed after 30 days)

Priority — urgency:

LabelUse
Priority/CriticalDrop everything
Priority/HighNext up
Priority/MediumThis milestone
Priority/LowWhen time permits

Milestones

Milestones map to implementation phases and parallel tracks:

MilestoneState
Phase 1: LLM SkillClosed
Phase 2: Grammar & ParserClosed
Phase 3: Core ValidationClosed
Phase 4: Emmett GeneratorClosed
Phase 5: CLIOpen
Phase 6: Language ServerOpen
Mermaid Diagram GenerationOpen
BacklogOpen (no due date)

Every issue belongs to a milestone, including small bugs and chores.

Reporting Bugs or Gaps

When you discover something that needs attention:

  1. Create an issue on Codeberg using the appropriate template.
  2. Assign it to the relevant milestone.
  3. Apply Kind/* and Priority/* labels.

If working in a Claude Code session, the agent presents a dialog to create the issue via fj — approve or decline with one response.

CI/CD

On PR (pre-merge):

CheckBlocks merge?
bun testYes
Type check (tsc --noEmit)Yes
Commit format (issue reference #N)Yes
Merge strategy (rebaseable, ff-only)Yes
Blast radius analysisNo (informational PR comment)

Post-merge to main:

JobWhat it does
Status syncReads merged commit issue references, updates roadmap.yaml, regenerates feature pages
Planned marker cleanupScans docs for stale :::note[Planned] markers, opens PR to remove them
Release gateSemantic-release flow (unchanged)

Weekly:

JobWhat it does
Zombie patrolAuto-closes Status/Abandoned issues older than 21 days and Status/Needs Info issues older than 30 days