Skip to content

Build every floorplan view with z2ui5_cl_ai_xml, add CI and an AGENTS.md - #5

Merged
oblomov-dev merged 4 commits into
mainfrom
claude/abap2ui5-ai-friendliness-31rklk
Aug 2, 2026
Merged

oblomov-dev merged 4 commits into
mainfrom
claude/abap2ui5-ai-friendliness-31rklk

Conversation

@oblomov-dev

Copy link
Copy Markdown
Member

Part of a cross-repo pass on making the abap2UI5 ecosystem workable for AI agents. This repo had no CI, no tests and no documented way to verify anything — an agent (or a human) could not tell whether a change even compiles.

⚠️ Breaking for subclasses

All seven classes move off the frozen fluent builder z2ui5_cl_xml_view to the generic z2ui5_cl_ai_xml (open/leaf/a/shut/stringify). The render hooks that take a builder handle — io_page, io_table, io_columns, io_cells, io_op, io_actions, io_parent, io_container — are now typed TYPE REF TO z2ui5_cl_ai_xml. Parameter names and the set of hooks are unchanged, so a redefining subclass only has to switch to the four verbs. The README escape-hatch example shows the new form and the change is called out there.

The point is not style: the abap2UI5-linter only reconstructs ai_xml views, so until now nothing could check this repo's UI at all. It can now — the property gate plus a real headless XMLView.create over every view the floorplans build, including the parts built inside the render hooks.

Translation is 1:1: same controls, attributes, order, events and bindings. Details worth knowing:

  • property names are the real UI5 camelCase ones the old builder mapped internally (showNavButton, growingThreshold, …)
  • abap_bool expressions go through z2ui5_cl_ai_xml=>as_bool( )
  • the obsolete _bind_edit( ) calls became _bind( )
  • the root mvc:View keeps the displayBlock="true" height="100%" the old factory( ) stamped on it; the popup fragments keep their core:FragmentDefinition root
  • sap.uxap.ObjectPageSubSection showTitle="false" is kept (it is @since 1.77), so the linter floor in abap2ui5lint.jsonc is 1.77 — the only post-1.71 member in the repo. The floor stays at the minimum on purpose: a floor above what the code uses stops the gate from reporting members missing on the systems users run.

Verification, where there was none

  • .github/workflows/check.yml runs abaplint and the abap2UI5-linter on every push and PR.
  • abaplint.jsonc's errorNamespace moves from . to ^Z: the wrapper deliberately reads CDS annotations through on-prem DDIC APIs (cl_dd_ddl_annotation_service, DDSTRUCOBJNAME) that the steampunk-2305 dependency does not ship, so every such reference was a false "not found" error (16 issues). With ^Z the own namespace stays fully checked and the repo lints clean at 0 issues.
  • abap2ui5lint.jsonc pins the view-gate settings; .gitattributes pins LF after a CRLF import once broke the .asddls round-trip.

Current state: abaplint 0 issues (23 files), abap2UI5-linter 7 files 0 failing with the render gate on (2 accessibility hints, left as they were).

AGENTS.md

New: the verification commands, the on-prem target platform (with an explicit "do not modernize RTTI to XCO or swap the annotation API"), the PROTECTED escape-hatch methods as a public contract, abapGit conventions, and what the view gate can and cannot see here.

Two corrections while writing it: the README promised a core class z2ui5_cl_fp_list_report that was added upstream and removed again days later, and the README had no "Validate" section at all.

Best merged after abap2UI5-linter#6 — the CI job uses that action from main, and the reconstruction fixes there are what make these views checkable.


Generated by Claude Code

claude added 4 commits August 2, 2026 14:33
The repo had no CI, no tests and no documented verification step - an
agent could not tell whether a change compiles. abaplint now runs on every
push and PR; locally the same single command gates a change. The config's
errorNamespace moves from . to ^Z: the wrapper deliberately reads CDS
annotations via on-prem DDIC APIs (cl_dd_ddl_annotation_service,
DDSTRUCOBJNAME) that the steampunk-2305 dependency does not ship, and with
. every such reference was a false 'not found' error (16 issues); ^Z keeps
the own namespace fully checked and now lints clean at 0 issues.

AGENTS.md documents the verify command, the on-prem target platform (no
RTTI-to-XCO or annotation-API 'modernization'), the PROTECTED escape-hatch
methods as public API, the abapGit serialization rules, and that the
ecosystem's AI tooling (abap2UI5-linter, ai-mcp) cannot see this repo
because it builds on z2ui5_cl_xml_view. .gitattributes pins LF line
endings after a CRLF import once broke the .asddls round-trip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GXEXigpuJbj1qBc4mK2c4R
All seven classes move off the frozen fluent builder z2ui5_cl_xml_view to
the generic builder z2ui5_cl_ai_xml (open/leaf/a/shut/stringify). The point
is not style: the abap2UI5-linter only reconstructs ai_xml views, so until
now nothing could check this repo's UI at all. It can now - the property
gate plus a real headless XMLView.create run over every view the floorplans
build, including the parts built inside the render hooks.

BREAKING for subclasses: the render hooks that take a builder handle
(io_page, io_table, io_columns, io_cells, io_op, io_actions, io_parent,
io_container) are now typed TYPE REF TO z2ui5_cl_ai_xml. Parameter names
and the set of hooks are unchanged, so a redefining subclass only has to
switch to the four verbs. The README escape-hatch example shows the new
form and the change is called out there.

Translation is 1:1: same controls, attributes, order, events and bindings.
Notable details: property names are now the real UI5 camelCase ones the old
builder mapped internally (showNavButton, growingThreshold, ...); abap_bool
expressions go through z2ui5_cl_ai_xml=>as_bool( ); the obsolete
_bind_edit( ) calls became _bind( ); the root mvc:View keeps the
displayBlock=true height=100% that the old factory( ) stamped on it,
and the popup fragments keep their core:FragmentDefinition root.

Also added: abap2ui5lint.jsonc with the repo's linter settings and a
view_lint CI job next to abaplint. AGENTS.md rewritten where it said this
repo is outside the AI tooling, and now records what the view gate can and
cannot see here.

Verified: abaplint 0 issues (23 files), abap2UI5-linter 7 files 0 failing
with the render gate on (2 accessibility hints left as they were).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GXEXigpuJbj1qBc4mK2c4R
…ot exist

The breaking-change note referenced a Validate section the README did not
have. Added it with both offline gates. Also: z2ui5_cl_fp_list_report was
added to the core and removed again days later, so the README pointed
readers at a class that is not there - now stated as such.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GXEXigpuJbj1qBc4mK2c4R
… floor to 1.77

The migration dropped sap.uxap.ObjectPageSubSection showTitle="false"
because it is @SInCE 1.77 and the repo's linter floor was 1.71 - a
deviation from the 1:1 translation. The attribute is back and the floor
moves to 1.77, which is exactly what the code needs: it is the only
post-1.71 member in the whole repo. The floor stays at the minimum on
purpose - a floor above what is used stops the gate from reporting
members that are missing on the systems users run.

Verified: abaplint 0 issues, view gate 7 files 0 failing (render on).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GXEXigpuJbj1qBc4mK2c4R
@oblomov-dev
oblomov-dev merged commit a5fa6f2 into main Aug 2, 2026
3 of 4 checks passed
@oblomov-dev
oblomov-dev deleted the claude/abap2ui5-ai-friendliness-31rklk branch August 2, 2026 17:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants