feat(pi-planning): self-contained PI planning / overview view + dependency edges#58
Open
jurby wants to merge 2 commits into
Open
feat(pi-planning): self-contained PI planning / overview view + dependency edges#58jurby wants to merge 2 commits into
jurby wants to merge 2 commits into
Conversation
Add a script-first PI planning / overview view that renders the whole SAFe program picture (program board, PI objectives, ROAM, portfolio, WSJF, capacity) as a single self-contained, read-only HTML — no server, no Node, no network on the target machine. Much broader than /edpa:reports and complementary to it (reports = backward audit, this = forward program state). Architecture (Option B — bake + inject): the React app in tools/pi-planning is built once via vite-plugin-singlefile into a prebuilt bundle (plugin/edpa/assets/pi-bundle.html). pi_planning.py reads .edpa/, builds the versioned window.__EDPA__ snapshot, and injects it into the bundle placeholder -> .edpa/reports/pi-<PI>/pi-<PI>.html. The HTML is a read-only projection: mutations go through the edpa_* MCP write-tools + git, then re-render. - generator: plugin/edpa/scripts/pi_planning.py (generate_pi_board() is the single source for both the CLI and the MCP tool) - MCP tool: edpa_pi_board(pi?) generates the board and returns its path - command: /edpa:pi-planning [PI] [--open] - contract: tools/pi-planning/src/types/snapshot.ts (EDPA_SNAPSHOT_SCHEMA = 1) is the single source; api.ts resolves all reads from it and rejects writes; main.tsx refuses an unknown schema with a visible "regenerate" banner - distribution: project_setup.vendor_engine now also vendors assets/ (the bundle) so it runs with only Python on the target machine - generated board gitignored; MCP drift-guard tests updated for the new tool Verified on the repo's own .edpa/ (43 items, 9 people, 2 PIs, objectives): snapshot round-trips, the bundle renders offline. 106 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ram board Phase-0 dependency support so the PI planning program board can draw its dependency arrows. - MCP tool edpa_item_link_dep(item_id, depends_on_id, action=add|remove): validates both items exist, refuses a self-loop, and refuses an edge that would create a cycle (_dep_would_cycle DFS over the depends_on graph) - depends_on accepted by validate_syntax (Feature/Story/Epic/Defect optional) - 6 new write-tool tests; MCP drift-guards updated (17 tools) depends_on flows through the snapshot verbatim and the ProgramBoard already renders it — set a dependency, regenerate, the arrow appears. 614 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a self-contained, read-only PI planning / overview view to the EDPA plugin — a single portable
.html(program board, PI objectives, ROAM, portfolio, WSJF, capacity) that runs natively on any machine with the EDPA Python engine: no server, no Node, no network. Much broader than/edpa:reports, and complementary (reports = backward audit, this = forward program state).How (Option B — bake + inject)
The React app in
tools/pi-planningis built once viavite-plugin-singlefileinto a prebuilt bundle (plugin/edpa/assets/pi-bundle.html).pi_planning.pyreads.edpa/, builds the versionedwindow.__EDPA__snapshot, and injects it into the bundle →.edpa/reports/pi-<PI>/pi-<PI>.html. The HTML is a read-only projection: mutations go through theedpa_*MCP write-tools + git, then re-render (unidirectional / CQRS).Surface
plugin/edpa/scripts/pi_planning.py—generate_pi_board()is the single source for both CLI and MCPedpa_pi_board(pi?)→ generates and returns the path/edpa:pi-planning [PI] [--open]tools/pi-planning/src/types/snapshot.ts(EDPA_SNAPSHOT_SCHEMA = 1) — single source;api.tsreads it (writes reject);main.tsxrefuses an unknown schema with a visible "regenerate" bannerproject_setup.vendor_enginenow also vendorsassets/(the bundle)edpa_item_link_dep(item_id, depends_on_id, action)with existence + self-loop + cycle validation;depends_onaccepted by the validator; the ProgramBoard already renders the arrowsTests
614 tests pass (full non-E2E suite); MCP drift-guards updated to 17 tools; 6 new dependency tests.
Not in scope (follow-ups)
roam_statustransition, objectives-as-first-class write-tools🤖 Generated with Claude Code