Skip to content

Releases: technomaton/edpa

v1.20.3

14 May 10:26

Choose a tag to compare

1.20.3 — 2026-05-14

chore: drop SKILL.md metadata block (plugin.json is single source of truth)

  • All 7 plugin/skills/*/SKILL.md files lost the metadata: block
    (author, version, domain, phase, standard, pattern). None
    of these fields were consumed by EDPA scripts or by the Claude Code
    Agent Skill loader; plugin.json holds canonical author/version/license.
    Removes drift risk (per-skill version: 1.0.0 was stale against
    plugin 1.20.x) and cleans up the false standard: AgentSkills v1.0
    label.
  • plugin/README.md — softened "AgentSkills v1.0 frontmatter" claim to
    "Claude Code Agent Skill frontmatter — portable Markdown + YAML".
  • web/src/pages/{,en/}presentation/{index,kashealth}.astro — risk
    table cell rewritten from "AgentSkills standard: 26+ platforms,
    convert.sh" to a more accurate "Markdown + YAML frontmatter —
    portable beyond Claude Code".
  • No functional change. Top-level frontmatter retained: name,
    user-invocable, description, license, compatibility,
    allowed-tools (and disable-model-invocation on autocalib).

v1.20.2

14 May 10:01

Choose a tag to compare

1.20.2 — 2026-05-14

docs: surface auto_update_engine opt-out

  • plugin/edpa/templates/edpa.yaml.tmpl — commented-out
    auto_update_engine: false block right after governance: with
    rationale (local engine patches / strict-mutation environments).
    Visible to every user the moment they open their .edpa/config/edpa.yaml.
  • plugin/skills/edpa-setup/SKILL.md — new paragraph after the
    "Vendor engine" step describing the v1.20.1+ SessionStart auto-vendor
    and the opt-out flag.
  • Fix stale /edpa:edpa-setup reference in setup SKILL.md → /edpa:setup
    (slash paths now match the post-1.19.5 namespace).

v1.20.1

14 May 09:29

Choose a tag to compare

1.20.1 — 2026-05-14

feat(plugin): auto-vendor engine on SessionStart

New SessionStart hook update_engine.sh compares the bundled plugin
version against the project's .edpa/engine/VERSION and re-vendors
scripts/, schemas/, templates/ when they diverge. No more manual
/edpa:setup re-run after /plugin update.

Fast path: single file compare returns in <50ms when versions match.

Skip conditions:

  • CLAUDE_PLUGIN_ROOT unset (hook invoked outside Claude Code)
  • cwd has no .edpa/engine/ (not an EDPA project / pre-setup)
  • VERSIONs match
  • .edpa/config/edpa.yaml has auto_update_engine: false

Legacy .yaml backlog detector: when the auto-vendor runs (or on
warm-path), the hook scans .edpa/backlog/**/*.yaml and prints a
one-line warning pointing at migrate_backlog_yaml_to_md.py. Sync/
engine silently ignore stale .yaml items in v1.20.0+, so this catches
the regression that would otherwise wipe the GH project on the next
sync push.

Migration script moved from tools/ to plugin/edpa/scripts/ so
install.sh vendors it automatically — users always have a working
migrate command at .edpa/engine/scripts/migrate_backlog_yaml_to_md.py.

Tests: +10 test_update_engine_hook.py covering all skip paths, the
update path, opt-out, legacy-yaml warning, and walking up to find
.edpa/engine/ from a subdirectory.

v1.19.6

14 May 06:29

Choose a tag to compare

1.19.6 — 2026-05-14

fix(sync): preserve YAML block scalars on pull (ruamel round-trip)

sync pull and conflict resolution were corrupting backlog YAML files with
multiline fields (description, acceptance_criteria, refinement_notes,
notes): yaml.dump() rewrote > folded block scalars into single-quoted
flow scalars, mangled indentation of lists, and added spurious trailing newlines.

Root cause: load_yaml (PyYAML safe_load) discards formatting metadata;
save_yaml (yaml.dump) emits whatever PyYAML thinks looks right.

Fix: new update_yaml_field(path, field, value) uses ruamel.yaml round-trip
(preserves block scalars, quotes, list style) to update a single field in-place.
Both write-back sites switched to it (pull at line ~1125, conflict-resolve at
~2228). Falls back to load_yaml+save_yaml if ruamel is unavailable.
ruamel.yaml>=0.18 was already in requirements.txt.

v1.19.5

14 May 06:27

Choose a tag to compare

1.19.5 — 2026-05-14

fix(plugin): remove duplicate commands, fix /sync-people namespace

  • Removed 5 commands that duplicated skills (add, sync, setup, reports, calibrate)
    — they caused /add, /sync etc. to appear alongside /edpa:add, /edpa:sync
  • plugin.json commands[] now contains only close-iteration and board
    (skills without a skill counterpart)
  • Fixed stale paths in close-iteration.md and board.md:
    .claude/edpa/scripts/.edpa/engine/scripts/
  • edpa-sync-people/SKILL.md: changed name: sync-peoplename: edpa:sync-people
    so it registers as /edpa:sync-people instead of bare /sync-people

v1.19.4

14 May 06:19

Choose a tag to compare

1.19.4 — 2026-05-14

fix: keep governance.methodology in sync with engine version

  • edpa.yaml.tmpl — updated hardcoded 1.17.0 to current version; bump_version.py
    now includes it in literal replacements (✓ 1 replacement(s))
  • install.sh — on engine update (when .edpa/config/edpa.yaml already exists),
    rewrites governance.methodology to the newly installed version via inline Python;
    handles both quoted and unquoted YAML values

v1.19.3 — sync push: description/acceptance_criteria/notes → GH issue body

14 May 06:11

Choose a tag to compare

feat(sync): GH issue body now reflects YAML content fields

sync push syncs description, acceptance_criteria, refinement_notes, and notes from .edpa/backlog/*.yaml to the GitHub issue body. Idempotent — uses SHA-256 hash stored in issue_map.yaml to skip unchanged bodies.

Output example

Updating 4 issue bodies:
  S-17   body  [ok]
  E-1    body  [ok]
  ...

Markdown format

  • description## Description block
  • acceptance_criteria (list) → ## Acceptance Criteria with - [ ] … checkboxes
  • refinement_notes## Refinement Notes
  • notes## Notes
  • Metadata line (type, JS, assignee, iteration) at top

Changes

  • _format_issue_body(item) — new renderer
  • _body_hash(body) — SHA-256[:16] for dedup
  • gh_update_issue_body()gh issue edit --body
  • collect_items_flat — passes content fields through
  • gh_create_issue — uses rich body on first create
  • cmd_push — body sync pass with hash-based dedup

v1.19.2 — Fix engine version detection + docstring path

13 May 20:01

Choose a tag to compare

Fixes

1. "EDPA unknown" in reports

get_version() was finding plugin.json only in the EDPA dev repo, not in installed target projects. Added .edpa/engine/VERSION (written by install.sh) as a fallback:

# new fallback — installed project: .edpa/engine/VERSION
version_file = Path(__file__).parent.parent / "VERSION"

2. Stale docstring path → wrong --edpa-root

engine.py usage block showed the old .claude/edpa/scripts/engine.py path. When Claude invoked the engine from the edpa-engine skill, it adapted the path but sometimes got --edpa-root . instead of --edpa-root .edpa. Updated to canonical installed path:

python3 .edpa/engine/scripts/engine.py --edpa-root .edpa --iteration PI-2026-1.3

v1.19.1 — Fix Issue Type assignment in GH-first /edpa:add

13 May 19:25

Choose a tag to compare

Fix: Issue Type assignment in GH-first backlog.py add

gh issue create was passing the item type (Epic, Initiative, …) as --label, which always fails unless that exact label exists in the target repo. GitHub Issue Types are org-level GraphQL objects, not repository labels.

Changes in plugin/edpa/scripts/backlog.py

  • _gh_create_issue — removed --label <type> from the gh issue create call
  • _gh_set_issue_type (new) — sets the Issue Type via GraphQL after issue creation; non-fatal (prints a warning if org Issue Types are not configured)
  • cmd_add — calls _gh_set_issue_type immediately after a successful GH issue create

Before / After

# Before
GH issue creation failed: could not add label: 'Epic' not found
Falling back to local-first.

# After
Issue #6 → E-6
Issue Type: Epic  ✓
Added to Project #55  ✓

v1.19.0

13 May 18:28

Choose a tag to compare

/edpa:add — GH-first backlog item creation

Eliminates multi-user ID collision during AI-assisted PI planning.

Multiple people (or AI agents) running backlog.py add simultaneously produce the same sequential ID — causing merge conflicts. GitHub issue numbers are an atomic server-side counter, so ID suffix = GH issue number → no collision possible.

/edpa:add Story "Implementovat login" --parent F-1 --js 5
  → gh issue create → #42
  → ID: S-42  (collision-free, server-assigned)
  → added to GitHub Project #55
  → .edpa/backlog/stories/S-42.yaml created
  → git commit feat(S-42): Implementovat login

--local flag for offline / pre-setup fallback (sequential scan, old behaviour).

Removed: .github/ISSUE_TEMPLATE/

epic.md, feature.md, story.md deleted — stale (old S-XXX ID scheme, label-based instead of org-level Issue Types) and no consumer in skill-first teams.