Releases: technomaton/edpa
v1.20.3
1.20.3 — 2026-05-14
chore: drop SKILL.md metadata block (plugin.json is single source of truth)
- All 7
plugin/skills/*/SKILL.mdfiles lost themetadata: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.jsonholds canonical author/version/license.
Removes drift risk (per-skillversion: 1.0.0was stale against
plugin1.20.x) and cleans up the falsestandard: 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(anddisable-model-invocationon autocalib).
v1.20.2
1.20.2 — 2026-05-14
docs: surface auto_update_engine opt-out
plugin/edpa/templates/edpa.yaml.tmpl— commented-out
auto_update_engine: falseblock right aftergovernance: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-setupreference in setup SKILL.md →/edpa:setup
(slash paths now match the post-1.19.5 namespace).
v1.20.1
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_ROOTunset (hook invoked outside Claude Code)- cwd has no
.edpa/engine/(not an EDPA project / pre-setup) - VERSIONs match
.edpa/config/edpa.yamlhasauto_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
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
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,/syncetc. to appear alongside/edpa:add,/edpa:sync plugin.json commands[]now contains onlyclose-iterationandboard
(skills without a skill counterpart)- Fixed stale paths in
close-iteration.mdandboard.md:
.claude/edpa/scripts/→.edpa/engine/scripts/ edpa-sync-people/SKILL.md: changedname: sync-people→name: edpa:sync-people
so it registers as/edpa:sync-peopleinstead of bare/sync-people
v1.19.4
1.19.4 — 2026-05-14
fix: keep governance.methodology in sync with engine version
edpa.yaml.tmpl— updated hardcoded1.17.0to current version;bump_version.py
now includes it in literal replacements (✓ 1 replacement(s))install.sh— on engine update (when.edpa/config/edpa.yamlalready exists),
rewritesgovernance.methodologyto 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
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→## Descriptionblockacceptance_criteria(list) →## Acceptance Criteriawith- [ ] …checkboxesrefinement_notes→## Refinement Notesnotes→## Notes- Metadata line (type, JS, assignee, iteration) at top
Changes
_format_issue_body(item)— new renderer_body_hash(body)— SHA-256[:16] for dedupgh_update_issue_body()—gh issue edit --bodycollect_items_flat— passes content fields throughgh_create_issue— uses rich body on first createcmd_push— body sync pass with hash-based dedup
v1.19.2 — Fix engine version detection + docstring path
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
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 thegh issue createcall_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_typeimmediately 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
/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.