Fifteen draft posts and expanded sample links across docs - #311
Merged
Conversation
…replaced the old one The row for the three HTTP types sent readers to z2ui5_if_exit, which the same page deprecates in favor of z2ui5_if_ui5_exit in the same release - and the framework declares them on z2ui5_if_ui5_exit (z2ui5_if_exit only aliases them from src/99). The sentence under the exit rename still said the examples on this site were waiting for the release that brings the new name; 1.144.0 shipped on 2026-08-30 and every exit example here already implements it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…o side links land where they promise The "New to abapGit?" aside sent readers to the toolchain page, which never said how to install abapGit; it now links the official installation guide, and the toolchain page gained an "Installing abapGit" section so its own link is worth following. The note about deploying the frontend as an app of its own pointed at the contributor dev-server page; the page that documents the deployment to the UI5 ABAP repository is Fiori Launchpad. A short "Before You Start" list names what the three steps take for granted: abapGit, developer authorization plus a SICF node, a package, and a browser that reaches the UI5 CDN or a system that serves UI5 itself. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…codes every entity ABAP-Doc can write The intro above the generated block said the reference was taken at the release named in the nav bar and printed what an install has, "not what main already promises". The generator has read main since 2026-09-02 (frameworkRef in lib/release.mjs), and its own line under the marker said so; the prose around it did not. It now says the block is ahead of the newest release by design and where the next-release column is. Nothing between the markers changed - the block stays byte-identical to what the generator writes. The parser knew three XML entities, so an apostrophe in an ABAP-Doc line reached the page as `sap.tnt's`. It decodes all five and the numeric forms now, `&` last; a test pins it. The stale header comment in client-interface.mjs that still claimed "never main" follows release.mjs. `npm run generate:api` has to run once after this lands, together with the framework's doc-comment changes, to rewrite api.md and client-api.json. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
Three of the manual's sections opened on their first chapter and lied about it: Advanced Topics on a fifty-line page about one exit interface, Configuration on a page called Installation that holds no installation step, the Cookbook on the Cheat Sheet, whose first line tells the reader it is a checklist and not an introduction. The Device Capabilities group opened on a page with no ABAP on it at all. Advanced Topics and the Cookbook get an index page each - one row per group, what it covers, where it starts - and the section link opens it. The config comment that argued against a Cookbook overview stays, extended: the index is for discovery, the rows below it for lookup. Installation keeps its URL and says what it is: Deployment Scenarios, with the Quickstart named in its first line as the place the install itself is. The Device Capabilities landing page carries a runnable class that reads s_ui5 and s_device out of client->get( ) and shows every field, with a Run button. test/crumbs.test.mjs now distinguishes a section's own page - one crumb - from a chapter, which gets a longer trail. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
Two "paste this into your assistant" blocks existed - this page's, pointing at the site's llms.txt, and the framework README's, pointing at building-apps.md and the repository's llms.txt - and an assistant given one worked from half of what the other named. One block now, in both places: the three files, the shape of an app, the catalogue's machine-readable index at the playground (all three repositories, where SAMPLES.md was one), the linter, and the instruction to say so rather than invent. The page's figure for the corpus says "over 700" like the front door. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
All 36 articles closed on "Happy ABAPing! 🦖🦕🦣" - the sign-off of a LinkedIn post, under an article about authorization and CSRF as under the one about RTTS, and nothing else in the manual speaks like that. The line goes; the articles end on their own last sentence. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…re for the corpus Two pages called /get_started/ai "Building with AI" while its title is "Developing with AI". Fourteen pages linked their neighbours with relative paths (`../model/device_model.md`, `./message`) where the rest of the site writes `/cookbook/model/device_model` - all resolve today and every one is a move away from a broken link; they are root-absolute now. Four pages said "hundreds" of samples where the front door says "over 700"; one figure. Two `javascript` fences are `js` like the others. The view definition page's "the next section" is a link to Binding. The WebSocket page's "check the release notes for your system" says which release brought AMC/APC and where the samples-stack README states what its package needs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
link-samples.mjs read one catalogue and linked one repository: BLOB was
abap2UI5/samples, hardcoded, and the 668 samples of samples-controls and
samples-stack - every control port, every RAP, OData, draft, WebSocket and
launchpad sample - could not be named by the pages that explain exactly
them. Three pages named them by hand instead ("Demo apps 475-479 in the
samples repository", which is the wrong repository; two class names in
prose), which is the shape of reference that goes stale unwatched.
The class prefix decides the repository now. The samples repository is read
from its SAMPLES.md as before; the other two from their catalogue.json,
through lib/catalogue.mjs's homes and its fallback to the published copy
(resolveHome( ) and entriesByClass( ) are new there, pinned by tests). The
reverse `" @docs` check stays what it was for abap2UI5/samples; for the other
two, which carry no such line by their own convention, the class has to be in
the catalogue and, with a checkout at hand, in the tree. A row from another
repository says which one - and which package branch, for samples-stack -
because that is what the reader pulls. The block's intro names the catalogue
page all three are searchable on. The hand-written source links are held
against all three checkouts.
Twelve cookbook pages declare their samples with it: RAP, EML and draft
handling (the five RAP and five draft classes), OData, smart controls (the
whole package, where the prose said "475-479" and named the wrong
repository), WebSocket, statefulness and locks, cross-app navigation, audio,
barcode scanning, and logging - the last one an abap2UI5/samples class that
gets its `" @docs` line over there in the same change. CI checks the two
sibling repositories out with catalogue.json and src for it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…sion table, and step 12 folds the class it tests The hero had one outlined button. A developer arriving here had nothing to press that runs something in the next ten seconds - the bar names the playground and the example runs on the page, but neither is a call to action in the first screen, and a first screen without a primary action reads as a brochure. "Try it in the playground" is the accent button now, same tab like every way into the neighbouring site; "Learn more…" stays beside it for the reader the cards are written for. (A playground button was taken out of this hero once as the third copy of what the page offered twice; it is back on purpose, as the primary action - the two readers of this page want different first clicks.) The Lock page ended on its "Overview" - the table that says which of the eight strategies to pick. That is the first thing a reader needs, so it opens the page as "Which Strategy?"; every full class was already folded under its section. Step 12 printed the 238-line class under test in full before the 60-line test class the step is about. It is unchanged from Step 10, so it is folded now - one click to copy, and the tests come first. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…cles' order blog/teaser-posts.md says of itself that its sections stand in the order the articles are numbered and that a post moves here when an article moves there - and it was true of neither. Fifteen articles had no post (#16 to #26 as a block, #29, #30, #31 and #36), four posts had no article, and #15 was followed by #27. The sections stand in the numbering now, all 36; the four posts without an article wait under "Not yet published" and move up the day theirs lands; and the fifteen missing posts are drafted from the articles in the shape of the ones before them - plain text, a first line that says the whole thing, one "New article" line, a closing question - and say so in their heading, so nobody posts one unread. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…d reference decodes its apostrophes again The parser behind resources/api.md learnt all five XML entities on 2026-09-11, and the committed reference still carried the `'` it had rendered before that - so check:api-reference was red against its own parser until someone regenerated. Regenerated now; the only change in the page and the JSON is `sap.tnt's` reading `sap.tnt's`. Regenerating needed raw.githubusercontent.com, which not every machine can reach, and a branch that has not merged could not be rendered at all. A2UI5_HOME names a clone of the framework, and the three gates that resolve frameworkRef( ) - check:api-names, check:api-reference and generate:api - read the same ref out of it with `git show`, trying the remote's copy of the branch too. The working tree is deliberately not read: it is whichever branch the clone is on, and a gate's verdict must not depend on what a neighbouring checkout was doing. Both scripts now print where the interface came from, so an OK says what it verified against. Pinned by test/client-interface.test.mjs with a throwaway clone whose working tree has moved to a branch with a different interface. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
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.
Summary
This PR adds fifteen draft teaser posts to the publishing queue, expands sample repository support from one to three repositories, and links sample classes throughout the documentation. The changes enable the framework to reference samples from
samples-controlsandsamples-stackrepositories in addition to the primarysamplesrepository.Key Changes
Teaser Posts (
blog/teaser-posts.md)Sample Repository Support (
scripts/lib/catalogue.mjs,scripts/link-samples.mjs)z2ui5_cl_smp_app_*(samples),z2ui5_cl_smpc_*(samples-controls),z2ui5_cl_smps_*(samples-stack)resolveHome()function to locate sample repository checkoutscatalogue.jsonfrom samples-controls and samples-stack repositoriesDocumentation Sample Links
samples:frontmatter to 20+ cookbook and tutorial pages, linking to relevant sample classes across all three repositories/cookbook/and/advanced/sectionsAPI Reference and Testing
client-interface.mjsto properly convert XML entities (',",&,',') to plain text characterstest/client-interface.test.mjstest/catalogue.test.mjsto test the newresolveHome()functionConfiguration Updates
.github/workflows/check.ymlanddeploy.ymlto fetchcatalogue.jsonfrom samples-controls and samples-stackdocs/.vitepress/config.mjsto add index pages for cookbook and advanced sectionsAGENTS.mdto document the new sample linking workflowNotable Implementation Details
catalogue.jsonfiles in each repository, allowing samples to be updated independently without documentation changesresolveHome()function supports both explicit environment variables and conventional sibling checkout locations for local developmentsap.tnt'srendered incorrectlyhttps://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw