Branch: refs/heads/okf-data-migrations Home: https://github.com/xwiki/xwiki-dev-llm Commit: 5b249e2945e686ca1c1dc7d3ae06d48bb124a277 https://github.com/xwiki/xwiki-dev-llm/commit/5b249e2945e686ca1c1dc7d3ae06d4... Author: Vincent Massol <[email protected]> Date: 2026-08-23 (Sun, 23 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/testing/strategy.md Log Message: ----------- [Misc] Record that an AllIT container class takes a bare @UITest * Add a durable rule to okf/testing/strategy.md: the Docker framework merges the @UITest configuration of the container class and of every nested class (walking each nested class's superclass chain), so properties/extraJARs declared on an individual *IT class already apply when it runs nested, and repeating a conflicting scalar aborts the run. * Update the OKF map entry and the file summary accordingly. * Bump the plugin version to 1.1.8. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 271185ea0c47110cab81c75d5cea7246ee02065d https://github.com/xwiki/xwiki-dev-llm/commit/271185ea0c47110cab81c75d5cea72... Author: Vincent Massol <[email protected]> Date: 2026-08-23 (Sun, 23 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/testing/strategy.md Log Message: ----------- [Misc] Record that an AllIT container class takes a bare @UITest Commit: be1e8474c958a2b17a688ec61884e5c3b64630b8 https://github.com/xwiki/xwiki-dev-llm/commit/be1e8474c958a2b17a688ec61884e5... Author: Vincent Massol <[email protected]> Date: 2026-08-25 (Tue, 25 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-build/SKILL.md Log Message: ----------- [Misc] Drop xmvn's JDK-discovery internals from the build skill * Following review feedback on PR #68: how xmvn locates JDKs is implementation detail that rots as the tool improves, so the guidance now states only the contract — use xmvn when available, otherwise pick the JDK yourself — plus the symptom to recover from if xmvn did not switch the JDK. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 6a8a47b767d04c3fc69570986d42ed1de7259998 https://github.com/xwiki/xwiki-dev-llm/commit/6a8a47b767d04c3fc69570986d42ed... Author: Vincent Massol <[email protected]> Date: 2026-08-26 (Wed, 26 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/sonarqube/index.md Log Message: ----------- [Misc] Narrow the S5993 SonarQube denylist entry to non-internal packages Co-Authored-By: Vincent Massol <[email protected]> Commit: 4d05de2e792e32692fa81c51b3636250d89149c7 https://github.com/xwiki/xwiki-dev-llm/commit/4d05de2e792e32692fa81c51b36362... Author: Vincent Massol <[email protected]> Date: 2026-08-26 (Wed, 26 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/sonarqube/index.md Log Message: ----------- [Misc] Narrow the S5993 SonarQube denylist entry to non-internal packages Commit: 3bbd58260400aa800e61f424b42ce4e2a43d5ebe https://github.com/xwiki/xwiki-dev-llm/commit/3bbd58260400aa800e61f424b42ce4... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/sonarqube/dead-code-rules.md Log Message: ----------- [Misc] Correct the S1130 "src/main is a permanent drop" rule to non-private * The drop line for java:S1130 is the member's visibility, not the source root: a private src/main method cannot be overridden and cannot be called from outside its file, exactly like the private test helpers the same entry already carves out. * Also records the unreachable-catch cascade and the bucketing trap (Sonar attributes the issue to the throws line, which is often a continuation line with no modifier on it). Co-Authored-By: Vincent Massol <[email protected]> Commit: 64cdf8f6019ab7aa0eedb411e2efa47e4a28e6d5 https://github.com/xwiki/xwiki-dev-llm/commit/64cdf8f6019ab7aa0eedb411e2efa4... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/sonarqube/dead-code-rules.md Log Message: ----------- [Misc] Correct the S1130 "src/main is a permanent drop" rule to non-private Commit: 707cdb63c1c72152a80abdc5954bd9f606d7e18d https://github.com/xwiki/xwiki-dev-llm/commit/707cdb63c1c72152a80abdc5954bd9... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/sonarqube/constant-and-resource-rules.md M xwiki/okf/sonarqube/dead-code-rules.md M xwiki/okf/sonarqube/index.md M xwiki/okf/sonarqube/modernization-rules.md M xwiki/okf/sonarqube/simplification-rules.md M xwiki/okf/sonarqube/syntax-rules.md M xwiki/okf/sonarqube/test-code-rules.md Log Message: ----------- [Misc] Drop the duplicated rule-key lists and stale anecdotes from the sonarqube OKF * Collapse the rule-key lists to one authoritative copy: sonarqube/index.md's rule map. The three other copies had all drifted — okf/index.md's per-family bullets were missing 24 of the 69 keys (test-code-rules advertised 4 of 9, simplification 12 of 21), and each family file's frontmatter summary and "S1116 · S1124 · …" subtitle line were missing 14 between them. A stale list makes a rule read as undocumented and the fix get applied past the trap the file exists to describe. The summaries now describe the traps instead of enumerating keys, which is what a family file is chosen on. * Remove the "used to be on the denylist" notes for S3252 and S6355 and the same framing on S3252's own section. The current placement already says it, and okf/conventions/code-comments.md rules out justifying by history. * Generalise six one-off batch statistics (site counts, "18 of the 22", "one site in six") that sonarqube/index.md's own policy excludes as volatile. The durable signal — near-zero drops, near-100% drops, permanent drop — is kept. * Delete the S8924 "not yet established" note; its actionable half is already step 1 of that same list. * Verified before the edit that all 69 documented keys and the 33 denylist keys are still present and status=READY in SonarCloud's Java ruleset for the xwiki org, so nothing here documents a retired rule. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: c4388f99cf42edcd47d6e9235de7525c0a421a19 https://github.com/xwiki/xwiki-dev-llm/commit/c4388f99cf42edcd47d6e9235de752... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/testing/strategy.md M xwiki/skills/xwiki-review/SKILL.md M xwiki/skills/xwiki-test-guidelines/SKILL.md Log Message: ----------- [Misc] Record that a functional test is a scenario with a single fixture * Add the scenario rule to okf/testing/strategy.md: a *IT pays a wiki start, a browser start and a page load per navigation, so the number of fixtures drives its runtime, not the number of assertions. Write as few @Test methods as the scenario allows, extend an existing method or *IT rather than rebuilding the same fixture, and note that @Order fixes execution order without sharing a fixture so it is not a substitute. Sourced from the dev wiki's functional-testing best practices, which the plugin only linked and never stated. * Add the matching procedural bullet to the xwiki-test-guidelines skill, so the rule applies when writing a test and not only when reviewing one. * Add the check to the xwiki-review Tests angle: a new @Test method or *IT class that rebuilds a fixture an existing one already builds is a finding. * Update the strategy summary and the OKF map entry, and bump the plugin version. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 63d3343a254b846586abcdc75652f160c676698a https://github.com/xwiki/xwiki-dev-llm/commit/63d3343a254b846586abcdc75652f1... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M xwiki/okf/index.md M xwiki/okf/testing/strategy.md M xwiki/skills/xwiki-test-guidelines/SKILL.md Log Message: ----------- [Misc] Pivot the scenario rule from method count to duplicate fixtures * Restated the rule as "no two @Test methods build the same fixture" instead of "as few methods as possible, one if you can". The defect the rule targets is a second method paying for a fixture an existing one already builds, not method count in itself, and the previous wording read as a push towards a single method however long it grew. * Added the counterweight: a method nobody can follow end to end, or one whose failure no longer says which behaviour broke, has been merged too far. A distinct fixture justifies a distinct method, a merely distinct assertion does not. * Mirrored the change in the xwiki-test-guidelines bullet, the strategy summary and the OKF map. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: f2679a39ede9629ffd5aea87e0587668cc8fd8fc https://github.com/xwiki/xwiki-dev-llm/commit/f2679a39ede9629ffd5aea87e05876... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/testing/strategy.md M xwiki/skills/xwiki-review/SKILL.md M xwiki/skills/xwiki-test-guidelines/SKILL.md Log Message: ----------- [Misc] Record that a functional test is a scenario with a single fixture Commit: bf16d86babdc4865bb99fc5e41f1061f9127684f https://github.com/xwiki/xwiki-dev-llm/commit/bf16d86babdc4865bb99fc5e41f106... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/servers/index.md M xwiki/okf/sonarqube/index.md M xwiki/okf/sonarqube/verification.md M xwiki/skills/xwiki-fix-sonarqube-issue/SKILL.md Log Message: ----------- [Misc] Record that rewriting a flagged line re-dates the other findings on it * okf/sonarqube/verification.md: a mechanical fix can turn the master quality gate red without introducing a defect, because the gate only measures new code and SonarCloud re-dates a finding it can no longer match after a rewrite. Also record that javabugs:* findings are computed server-side, so no local build confirms one gone, and how to read the analyzer's own dataflow path. * skills/xwiki-fix-sonarqube-issue: check what else the lines being rewritten already carry, before committing to a candidate. * okf/sonarqube/index.md: add the one mechanical javabugs:S2259 shape (a nullable-parameter default helper fed the default constant by its own overload), and drop the two pool-size claims from that bullet, which the same file says are deliberately absent because they are volatile. * okf/servers/index.md: the SonarCloud read API needs no token for the public xwiki org, and the MCP has no quality-gate tool. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 04f75c2c644ef5ad0878d693350cdc8e9645b07d https://github.com/xwiki/xwiki-dev-llm/commit/04f75c2c644ef5ad0878d693350cdc... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/servers/index.md M xwiki/okf/sonarqube/index.md M xwiki/okf/sonarqube/verification.md M xwiki/skills/xwiki-fix-sonarqube-issue/SKILL.md Log Message: ----------- [Misc] Record that rewriting a flagged line re-dates the other findings on it Commit: 5834089626fdc9f6bed9b5e52b856cd1511d311d https://github.com/xwiki/xwiki-dev-llm/commit/5834089626fdc9f6bed9b5e52b856c... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/sonarqube/verification.md M xwiki/skills/xwiki-pull-request/SKILL.md Log Message: ----------- [Misc] Run a SonarCloud PR analysis on every PR that changes Java * skills/xwiki-pull-request: run a SonarCloud PR analysis on any PR that changes Java, not only on a Sonar cleanup. It applies the same quality gate as the branch and is the only pre-merge check for the rules computed server-side. Measured on xwiki-commons: about two minutes, with no tests, no quality profile and no coverage. * okf/sonarqube/verification.md: correct what the previous change said about confirming a javabugs finding. A local build still proves nothing, but a PR analysis confirms it before merge, so the next analysis of the branch is not the only confirmation. Also record that a re-dated finding reaches the PR report only when the rewrite broke issue matching there too. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: ca7908ed4e683f55b01314e14fd56d865b65a3db https://github.com/xwiki/xwiki-dev-llm/commit/ca7908ed4e683f55b01314e14fd56d... Author: Vincent Massol <[email protected]> Date: 2026-08-27 (Thu, 27 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/sonarqube/verification.md M xwiki/skills/xwiki-pull-request/SKILL.md Log Message: ----------- [Misc] Run a SonarCloud PR analysis on every PR that changes Java Commit: b5d68f9ab6ae56660f970bf7a5b961634f7a6f17 https://github.com/xwiki/xwiki-dev-llm/commit/b5d68f9ab6ae56660f970bf7a5b961... Author: Vincent Massol <[email protected]> Date: 2026-08-28 (Fri, 28 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/conventions/documentation.md M xwiki/okf/index.md M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md M xwiki/skills/xwiki-doc-writing/SKILL.md M xwiki/skills/xwiki-doc-writing/tools/README.md M xwiki/skills/xwiki-doc-writing/tools/docpages.py M xwiki/skills/xwiki-doc-writing/tools/xwikidoc.py M xwiki/skills/xwiki-rest-api/SKILL.md Log Message: ----------- [Misc] Record the xwiki.org Cloudflare User-Agent block and the doc-tooling traps found while migrating a release-notes doc * okf/servers/index.md: record that www.xwiki.org and extensions.xwiki.org sit behind Cloudflare, which answers 403 to a browser-like User-Agent (and to none at all) on /xwiki/rest — only a curl-style UA passes. The trap was documented for ci.xwiki.org only, so a script written against the doc site hit a 403 that reads as an auth failure. Verified live: browser UA 403, curl UA 200. * okf/servers/jenkins.md: cross-link the two homes of the same Cloudflare trap and cut its section from twelve lines to six — it stated one rule three times. * skills/xwiki-rest-api/SKILL.md: add the same rule as one bullet where the curl commands get written. The skill's /xwiki/rest prefix and nested-space path rules already covered the rest of what the session needed, so nothing was duplicated there. * okf/conventions/documentation.md, skills/xwiki-doc-writing/SKILL.md: the naming checker applies the page-name rules to attachment names too, stop-word removal included — change-in-release-note.png was rejected for change-release-note.png. The OKF said "attachment names follow the page-name rules" without saying the checker enforces it, so the rule read as advisory. * skills/xwiki-doc-writing/tools/docpages.py: lint's "attachment referenced but not declared" check ran on the raw content, so a reference="..." inside a {{code}} block was mistaken for a real attachment reference. Run it on strip_verbatim(content), as the other content checks already do. * skills/xwiki-doc-writing/tools/README.md: never scroll to reach content below the fold — agent-browser screenshot <element> ignores the scroll offset and captures the document region matching the element's viewport rect, silently saving the wrong part of the page. Enlarge the viewport instead. * skills/xwiki-doc-writing/tools/README.md, xwikidoc.py: correct the User-Agent note, which said only that a request with no UA is rejected — a browser UA is rejected too, which is the counter-intuitive half. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: fd564dc38661de2d1dc796f92e1b08f7d74d7c7d https://github.com/xwiki/xwiki-dev-llm/commit/fd564dc38661de2d1dc796f92e1b08... Author: Vincent Massol <[email protected]> Date: 2026-08-28 (Fri, 28 Aug 2026) Changed paths: M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md Log Message: ----------- [Misc] Give the Cloudflare User-Agent block a single home * State the rule once, in okf/servers/index.md, as a farm-wide rule covering the doc sites and ci.xwiki.org alike. * Cut okf/servers/jenkins.md down to the ci-specific consequence and a cross-reference, instead of restating the mechanism a second time. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 983d9b8a5f11ab37b61dfaf89fd21991a9c328d4 https://github.com/xwiki/xwiki-dev-llm/commit/983d9b8a5f11ab37b61dfaf89fd219... Author: Vincent Massol <[email protected]> Date: 2026-08-28 (Fri, 28 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/conventions/documentation.md M xwiki/okf/index.md M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md M xwiki/skills/xwiki-doc-writing/SKILL.md M xwiki/skills/xwiki-doc-writing/tools/README.md M xwiki/skills/xwiki-doc-writing/tools/docpages.py M xwiki/skills/xwiki-doc-writing/tools/xwikidoc.py M xwiki/skills/xwiki-rest-api/SKILL.md Log Message: ----------- [Misc] Record the xwiki.org Cloudflare User-Agent block and the doc-tooling traps found while migrating a release-notes doc Commit: 698dc68b2224c0a40fe4781d19e0256ef04dc436 https://github.com/xwiki/xwiki-dev-llm/commit/698dc68b2224c0a40fe4781d19e025... Author: Vincent Massol <[email protected]> Date: 2026-08-29 (Sat, 29 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-doc-convert/SKILL.md A xwiki/skills/xwiki-doc-convert/references/conversion-plan.md Log Message: ----------- [Misc] Run a documentation conversion as a resumable plan of one-session tasks * Add xwiki/skills/xwiki-doc-convert/references/conversion-plan.md: the on-disk plan layout (conversion/PLAN.md, tasks/, source/), the PLAN.md and task-file templates, the standard task set, the resume protocol and the checkpoint rules * Make xwiki-doc-convert plan first and execute one task per session, so a conversion that does not fit in one context window survives across sessions * Persist the legacy source and an inventory of its atomic material to conversion/source/, since the final "nothing lost" audit runs long after the original page has been stripped * Decompose from the inventories rather than the raw legacy text, and reuse a single Change Request recorded in PLAN.md * Bump the plugin version to 1.1.17 Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 730649738e3c43c74508944685ee1bbc82e09f2e https://github.com/xwiki/xwiki-dev-llm/commit/730649738e3c43c74508944685ee1b... Author: Vincent Massol <[email protected]> Date: 2026-08-29 (Sat, 29 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-doc-convert/SKILL.md A xwiki/skills/xwiki-doc-convert/references/conversion-plan.md Log Message: ----------- [Misc] Run a documentation conversion as a resumable plan of one-session tasks Commit: 3ce1455232b8bdd0a8d52b9fa8235728b566bb1b https://github.com/xwiki/xwiki-dev-llm/commit/3ce1455232b8bdd0a8d52b9fa82357... Author: Vincent Massol <[email protected]> Date: 2026-08-29 (Sat, 29 Aug 2026) Changed paths: M xwiki/okf/conventions/documentation-migration.md M xwiki/okf/index.md M xwiki/skills/xwiki-doc-convert/SKILL.md M xwiki/skills/xwiki-doc-convert/references/conversion-plan.md Log Message: ----------- [Misc] Publish a documentation conversion once, at the end, instead of page by page * xwiki.org is public and a conversion runs for weeks, so a page saved the moment it is drafted is live with red links to the siblings and hubs that do not exist yet, usually under a missing parent, carrying any defect until someone happens to look. Observed on a real conversion in flight. * Make the `page-*` tasks preparation tasks: they draft into `pages.py`, capture screenshots and lint offline, and no longer call `docpages.py save`. * Add a single `publish` task at the end of the standard task set. It saves the whole set in one pass, parents before children, then runs `verify` and absorbs the live doc checker's findings. * Say that a Change Request stays the preferred vehicle and why, and that choosing to save direct changes nothing about the timing. * Spell out the two consequences for the drafting tasks: the offline lint becomes their only gate, so what the live checker would have caught has to move into it; and the publish task reads back what it wrote rather than assuming the syntax rendered. * Record the rule in the OKF, in documentation-migration, so it survives the skill. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 9eb910a33ece54a7d9534efc3411067f18809b07 https://github.com/xwiki/xwiki-dev-llm/commit/9eb910a33ece54a7d9534efc341106... Author: Vincent Massol <[email protected]> Date: 2026-08-29 (Sat, 29 Aug 2026) Changed paths: M xwiki/okf/conventions/documentation-migration.md M xwiki/okf/index.md M xwiki/skills/xwiki-doc-convert/SKILL.md M xwiki/skills/xwiki-doc-convert/references/conversion-plan.md Log Message: ----------- [Misc] Run a documentation conversion as a resumable plan, and publish it only at the end Commit: cc0d76f4947c9747309aefac69d66ce483b28613 https://github.com/xwiki/xwiki-dev-llm/commit/cc0d76f4947c9747309aefac69d66c... Author: Vincent Massol <[email protected]> Date: 2026-08-29 (Sat, 29 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/instructions/xwiki-org.md M xwiki/scripts/inject-org-instructions.mjs M xwiki/skills/xwiki-doc-convert/SKILL.md M xwiki/skills/xwiki-doc-convert/references/conversion-plan.md M xwiki/skills/xwiki-doc-writing/tools/README.md Log Message: ----------- [Misc] Put every cross-session work file in one work directory * Plans, handoffs, extracted source, drafts and notes were being written to the repo root, the system temp directory and the home directory, so they were neither findable later nor cleanable. * Add a "Work files" rule to the org-wide conventions: state that outlives a session goes under $XWIKI_LLM_WORK (default ~/.xwiki-llm/work), one <work>/<repo>/<date>-<slug>/ directory per piece of work. Session-only files stay in the host's own scratch directory. * Have the SessionStart hook append the resolved absolute path, which the model cannot compute itself. Nothing is created up front, so a session that writes no work file leaves no trace, and mkdir -p at first use also repairs a directory the developer has deleted. * Derive the working directory in xwiki-doc-convert and xwiki-doc-writing instead of asking the developer for it on every conversion. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 16338678f1eb8af156826df4fad4f82d45ea075a https://github.com/xwiki/xwiki-dev-llm/commit/16338678f1eb8af156826df4fad4f8... Author: Vincent Massol <[email protected]> Date: 2026-08-29 (Sat, 29 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/instructions/xwiki-org.md M xwiki/scripts/inject-org-instructions.mjs M xwiki/skills/xwiki-doc-convert/SKILL.md M xwiki/skills/xwiki-doc-convert/references/conversion-plan.md M xwiki/skills/xwiki-doc-writing/tools/README.md Log Message: ----------- [Misc] Put every cross-session work file in one work directory Commit: 15a42edfd245c821b23da319ddc2aa001acde2fc https://github.com/xwiki/xwiki-dev-llm/commit/15a42edfd245c821b23da319ddc2aa... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/servers/jira.md M xwiki/skills/xwiki-pull-request/SKILL.md Log Message: ----------- [Misc] Show the visible result of a change in the PR and on the JIRA issue * Widen the "Screenshots & Video" rule of the xwiki-pull-request skill: a screenshot is not only for a defect being fixed. Whenever the change has a visible result — a new feature, an improvement or a fix — show it, so that a reviewer can judge the result without building the branch, with a "before" as well when the issue reports a regression. The same image goes on the JIRA issue, where it serves whoever reads the issue or writes the release note later. * Record the attachment mechanics in okf/servers/jira.md, where the other JIRA access facts live: attaching is REST-only since jira-cli has no attach command, Atlassian requires the X-Atlassian-Token: no-check header, and the returned attachment URL is also what a PR body has to reference, gh being unable to upload an image. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 97e9acc9e357de45caeafbd8ac57b8f96e500575 https://github.com/xwiki/xwiki-dev-llm/commit/97e9acc9e357de45caeafbd8ac57b8... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/index.md M xwiki/okf/servers/jira.md M xwiki/skills/xwiki-pull-request/SKILL.md Log Message: ----------- [Misc] Show the visible result of a change in the PR and on the JIRA issue Commit: 3a39634b4fde1d85b77d61746b5ebc0b079d995d https://github.com/xwiki/xwiki-dev-llm/commit/3a39634b4fde1d85b77d61746b5ebc... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M README.md M xwiki/skills/xwiki-fix-sonarqube-issue/SKILL.md Log Message: ----------- Don't mark a SonarCloud issue Accepted when a PR fixes it * SonarCloud closes such an issue as FIXED by itself at the next branch analysis after the merge, so the transition buys nothing and hides a real defect from the quality gate if the PR never lands. * Reserve the falsepositive/accept transitions for findings the code keeps as they are. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 236b759489bda9d271bfd663a747dd9255908fe2 https://github.com/xwiki/xwiki-dev-llm/commit/236b759489bda9d271bfd663a747dd... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M README.md M xwiki/skills/xwiki-fix-sonarqube-issue/SKILL.md Log Message: ----------- [Misc] Don't mark a SonarCloud issue Accepted when a PR fixes it Commit: d763630e4e3892977e29a56f43f21b3288ca6c52 https://github.com/xwiki/xwiki-dev-llm/commit/d763630e4e3892977e29a56f43f21b... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-doc-convert/SKILL.md M xwiki/skills/xwiki-doc-convert/references/conversion-plan.md M xwiki/skills/xwiki-doc-writing/tools/README.md A xwiki/skills/xwiki-doc-writing/tools/docplan.py M xwiki/skills/xwiki-doc-writing/tools/docshot.sh Log Message: ----------- [Misc] Cut the per-session cost of a documentation conversion Measured across the 58 past sessions that converted or wrote xwiki.org documentation (the LaTeX, Release Notes and AntiSpam conversions): 1.44B billed context tokens, of which 96-99% is cache reads — a session costs roughly turns x context, so the levers are fewer turns and a smaller context. 22% of all those tokens were spent re-orienting before the first authoring action of the session, and ~17% on the screenshot shoot/look/adjust loop. * Add `docplan.py` to the doc-writing tools: `status` prints a conversion's whole orientation in one call — the current task's full brief, the Setup answers, the recent Decisions and Open questions, and what comes next — replacing PLAN.md read by hand in five to thirteen `sed` chunks per session (76 KB re-read, against a 19 KB digest). `start` / `done` / `block` write the status and the Outcome to both PLAN.md's row and the task file, which is also the pair that otherwise drifts apart. Decisions and Open questions are trimmed to their most recent *whole* entries with a count of what was dropped: a real plan accumulates tens of thousands of characters of them, and the recent ones are the ones a session would otherwise re-litigate. * Make `docshot.sh` run `checkredbox.py` on the shot it just took whenever a box selector was given, and fail if the box is broken. A capture now reports its own verdict, so there is never a reason to open the PNG to find out whether it worked — an image read into a session stays in context for every later turn, which is what turns a screenshot into a shoot/look/adjust loop. `CHECK=0` opts out; a shot with no box is skipped. * Point the `xwiki-doc-convert` resume protocol at `docplan.py` in both the skill and the plan reference, and add the three habits that decide whether a task fits in one session: one call rather than a conversation for anything mechanical, never open a screenshot to check a capture, and read the inventory rather than the raw legacy source. * Add a rule to keep Decisions and Open questions to entries that still bind a future session, since the digest shows the recent ones and a decision buried under fifty later ones is one a session will not see. Version bumped 1.2.1 -> 1.3.0 (minor — the skills now depend on a newly shipped tool). Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 7c94843af4a7c4bd9360d022682bfd9b9eea1c55 https://github.com/xwiki/xwiki-dev-llm/commit/7c94843af4a7c4bd9360d022682bfd... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-doc-convert/SKILL.md M xwiki/skills/xwiki-doc-convert/references/conversion-plan.md M xwiki/skills/xwiki-doc-writing/tools/README.md A xwiki/skills/xwiki-doc-writing/tools/docplan.py M xwiki/skills/xwiki-doc-writing/tools/docshot.sh Log Message: ----------- [Misc] Cut the per-session cost of a documentation conversion Commit: e9378ecfb25eb341ef1950d2b1d16f2b41da7fe5 https://github.com/xwiki/xwiki-dev-llm/commit/e9378ecfb25eb341ef1950d2b1d16f... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/conventions/frontend.md M xwiki/okf/index.md Log Message: ----------- [Misc] Document how a stylesheet extension reads the colour theme * Record in okf/conventions/frontend.md that CSS ships as a Skin Extension, and that reading colour-theme values from one needs contentType LESS: $theme is not bound in wiki-page Velocity, so a parse=1 SSX that reaches for it compiles and silently emits only its fallbacks. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 8ed7f4c90785cd13f7745da5f961bbb445644417 https://github.com/xwiki/xwiki-dev-llm/commit/8ed7f4c90785cd13f7745da5f961bb... Author: Vincent Massol <[email protected]> Date: 2026-08-30 (Sun, 30 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/okf/conventions/frontend.md M xwiki/okf/index.md Log Message: ----------- [Misc] Document how a stylesheet extension reads the colour theme Commit: 777f8c82bedb7c99b00e424aecfbe397f349ce39 https://github.com/xwiki/xwiki-dev-llm/commit/777f8c82bedb7c99b00e424aecfbe3... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/.mcp.json M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md Log Message: ----------- [Misc] Add a Develocity MCP server * Add the `develocity` MCP server to all three host manifests, pointing at ge.xwiki.org, XWiki's Develocity instance: build failures with stack traces, test outcomes and flaky-test history, build timings, cache effectiveness and build-to-build diffs. * Configure it as a remote streamable-HTTP server on every host, so nothing runs locally: Claude Code and opencode interpolate the access key into an Authorization header, while Kimi Code uses its bearerTokenEnvVar field, which reads the token from the environment rather than the config. * Read the key from DEVELOCITY_MCP_ACCESS_KEY rather than DEVELOCITY_ACCESS_KEY. The two hold the same Develocity access key but cannot hold the same value: the Maven and Gradle extensions require DEVELOCITY_ACCESS_KEY to be host-scoped (`ge.xwiki.org=<key>`, so a key cannot be sent to a server it was not issued for), whereas a Bearer header needs the bare key. A separate name lets a developer authenticate both their local build and the MCP server. * Leave the key optional: unset, Claude Code and Kimi Code skip the server. Develocity validates the key on every request including tool listing, so a keyless server would error each session instead of degrading to read-only, as the discourse one does. * Record the server in okf/servers/index.md, whose map still described ge.xwiki.org as having no MCP, and point okf/servers/jenkins.md at it for why a build failed, Jenkins remaining the authority on whether it did. * Bump the plugin version to 1.4.0 (minor: a capability change). Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 20383936600743b4b2e5dcd126fddbe341177a17 https://github.com/xwiki/xwiki-dev-llm/commit/20383936600743b4b2e5dcd126fddb... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/.mcp.json M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md Log Message: ----------- [Misc] Add a Develocity MCP server Commit: efa6436d29d0b3506c598ab1aea267c5712631fd https://github.com/xwiki/xwiki-dev-llm/commit/efa6436d29d0b3506c598ab1aea267... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.mcp.json M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md Log Message: ----------- [Misc] Point the Develocity MCP server at community.develocity.cloud * ge.xwiki.org has been decommissioned: it still resolves in DNS (to a Gradle-hosted ELB) but resets the connection at the TLS handshake, so the develocity MCP server failed to load with ECONNRESET and exposed no tools. * Update the endpoint to https://community.develocity.cloud/mcp in the three MCP configurations (Claude Code, Kimi Code, opencode). * Update the OKF server map and Jenkins page, and the README setup steps: the access-keys page is now /settings/access-keys, and the host-scoped key prefix the Maven/Gradle extensions need is community.develocity.cloud=. * Record that this is Gradle's shared community instance, so XWiki's build scans are scoped by the project ID xwiki from .mvn/develocity.xml. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 5a33efc139d461c2f3d8b950b3d8369593c87386 https://github.com/xwiki/xwiki-dev-llm/commit/5a33efc139d461c2f3d8b950b3d836... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json Log Message: ----------- [Misc] Bump the plugin version to 1.4.1 * The previous commit changes files under xwiki/, so installed plugins only pull it once the version increases (validate.mjs invariant 6). * Bump all five manifest locations in lockstep: the marketplace metadata and its xwiki plugin entry, the Claude plugin.json, kimi.plugin.json, and the opencode.jsonc version comment. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 073d3fa1d73ab8dcbc7ef905fe4da1b918af35a7 https://github.com/xwiki/xwiki-dev-llm/commit/073d3fa1d73ab8dcbc7ef905fe4da1... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/.mcp.json M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md Log Message: ----------- [Misc] Point the Develocity MCP server at community.develocity.cloud Commit: 1088b62d92f299c8b4642945ffa49eb1d8ce327c https://github.com/xwiki/xwiki-dev-llm/commit/1088b62d92f299c8b4642945ffa49e... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-doc-writing/tools/README.md M xwiki/skills/xwiki-doc-writing/tools/docpages.py Log Message: ----------- [Misc] Catch a wiki macro halved by an f-string in a docpages page set * A `{{macro}}` written inside an f-string field of a `pages.py` arrives in the value as `{macro}`: Python treats `{{` as an escaped literal brace. The page then renders the macro as literal text, and nothing reports it — the doc checker creates no violation object and the rendered page has no error box, so the defect reaches a live page looking like prose. * Worse, the halving hits lines the author never meant to touch: a field converted to an f-string for one interpolation silently corrupts every existing macro in it. * Add the check to `lint`: a `{/` not preceded by a brace, or a `/}` not followed by one, is a halved macro and is invalid XWiki syntax anywhere outside the verbatim blocks `strip_verbatim` already blanks. * Note it in the tools README's `lint` list, beside the other traps that produce a plausible-looking page rather than an error. * Bump the plugin version so installed plugins pull the change. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 79dd0e576832460af55e1a0efac8520f14402403 https://github.com/xwiki/xwiki-dev-llm/commit/79dd0e576832460af55e1a0efac852... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/skills/xwiki-doc-writing/tools/README.md M xwiki/skills/xwiki-doc-writing/tools/docpages.py Log Message: ----------- [Misc] Catch a wiki macro halved by an f-string in a docpages page set Commit: af5589c0f04afbd38067da7591e9ce80d6b490f6 https://github.com/xwiki/xwiki-dev-llm/commit/af5589c0f04afbd38067da7591e9ce... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/instructions/xwiki-org.md A xwiki/okf/architecture/wiki-application-data.md M xwiki/okf/conventions/frontend.md M xwiki/okf/index.md M xwiki/skills/xwiki-review/SKILL.md Log Message: ----------- [Misc] Add an OKF topic for stored data in a wiki application * New `okf/architecture/wiki-application-data.md`. Three traps that a review of a real XClass+wiki-page application hit, none of which had an OKF home: - A list property that is neither `multiSelect` nor large storage is stored as a `StringProperty` (`ListClass.newProperty`) in `xwikistrings.XWS_VALUE`, a VARCHAR, so HQL/XWQL range filters on it compare text. Single-character codes sort as intended, which is what hides it until values differ in length. - A generated `Entry001` name derived from the pages that already exist races for the whole editing session, because the page appears only on save. - A wiki-page migration is idempotent for free if it drops the object it matched on; what it still needs is a completion count. Plus the entry-template trap: a template missing the marker class its queries use produces entries invisible to every query. * Grounded in platform source (`ListClass`, `xwiki.hbm.xml`), verified rather than extrapolated from the one application reviewed. * Cross-reference `[[performance]]` for bounding the migration instead of restating its pagination rule, so the batching rule keeps one home. * `okf/conventions/frontend.md`: the WCAG 2.2 AA bullet stated the commitment but no operational rule, so add the three traps for markup emitted from a wiki page — naming a control (a `<dt>` term and a prompt in `value` are not names, and a prompt in `value` also submits as data), `[[image:]]` alt text defaulting to the filename, and `col-xs-*` not being a responsive layout. Accessibility already lives here, so this extends that entry rather than adding a second home. * `skills/xwiki-review`: stop the accessibility brief asserting a WCAG version of its own. It claimed the OKF had no accessibility topic and named WCAG 2.1, while `frontend.md` has covered accessibility at 2.2 — so a reviewer was being told to cite criteria against a standard the project does not hold. It now reads the level from `frontend.md` and is told never to state it from memory, which is what keeps it from drifting again on the next re-commit. * `skills/xwiki-review`: the data & migration angle claimed the stored-data rules had no OKF home, which this commit makes false, and its routing fired only on `*.hbm.xml`, migrator classes, Solr schema and store code — so it could never run on a XAR-only extension, the very place the new topic applies. Add the XClass / generated-name / wiki-page-migration trigger and cite the new file; narrow the remaining skill-owned marker to Java store and mapping changes. * Describe both OKF changes in `okf/index.md`; add the topic name only to the always-on map in `instructions/xwiki-org.md` (+1 line, routing only). * Bump the plugin version so installed plugins pull the change. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 2cbc3577e39832532172c606a224d9d2dfe54b15 https://github.com/xwiki/xwiki-dev-llm/commit/2cbc3577e39832532172c606a224d9... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/instructions/xwiki-org.md A xwiki/okf/architecture/wiki-application-data.md M xwiki/okf/conventions/frontend.md M xwiki/okf/index.md M xwiki/skills/xwiki-review/SKILL.md Log Message: ----------- [Misc] Add an OKF topic for stored data in a wiki application Commit: c029e81967fa776c09cd9ba318ee08bcdf2b5b0f https://github.com/xwiki/xwiki-dev-llm/commit/c029e81967fa776c09cd9ba318ee08... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/instructions/xwiki-org.md M xwiki/okf/index.md A xwiki/okf/testing/running-docker-its.md A xwiki/scripts/xwiki-it-slot.mjs M xwiki/skills/xwiki-build/SKILL.md Log Message: ----------- [Misc] Cap concurrent Docker IT runs and record how to run them on a developer machine Running -Pdocker,integration-tests is a machine-wide operation, and nothing serialised it: several agents in sibling worktrees launching one at the same time starve the Docker daemon, which surfaces as a failure in beforeAll that reads like a product bug. * Add scripts/xwiki-it-slot.mjs, a wrapper capping concurrent functional-test runs (2 by default, --max N or XWIKI_LLM_IT_SLOTS). Slots are claimed atomically, released however the command ends, and reclaimed when their holder died; --status names the current holders. * Add okf/testing/running-docker-its.md: how the browser container reaches XWiki under each servlet engine (host-gateway /etc/hosts entry versus the xwikiweb alias over Docker DNS), why the two configurations therefore exercise different networking and when the containerised one is mandatory, the setup-failure symptom table, and what several agents on one machine contend for. * Rework the Docker IT section of xwiki-build around it: pre-flight, the never-stop-an-instance rule, the engine choice, the slot wrapper, and the rule that a beforeAll failure is never evidence about the change under test. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: d54c4766637b8f40c6cd0666a3dcbbec516bdd77 https://github.com/xwiki/xwiki-dev-llm/commit/d54c4766637b8f40c6cd0666a3dcbb... Author: Vincent Massol <[email protected]> Date: 2026-08-31 (Mon, 31 Aug 2026) Changed paths: M .claude-plugin/marketplace.json M README.md M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json M xwiki/instructions/xwiki-org.md M xwiki/okf/index.md A xwiki/okf/testing/running-docker-its.md A xwiki/scripts/xwiki-it-slot.mjs M xwiki/skills/xwiki-build/SKILL.md Log Message: ----------- [Misc] Cap concurrent Docker IT runs and record how to run them on a developer machine Commit: 7808c17ff57e1545de5548c55732c2960ab3caf4 https://github.com/xwiki/xwiki-dev-llm/commit/7808c17ff57e1545de5548c55732c2... Author: Vincent Massol <[email protected]> Date: 2026-09-01 (Tue, 01 Sep 2026) Changed paths: A .github/workflows/release.yml M CLAUDE.md M README.md A scripts/release.mjs M scripts/validate.mjs M xwiki/skills/xwiki-knowledge/SKILL.md Log Message: ----------- [Misc] Cut the plugin release on master instead of bumping the version in every PR * Add scripts/release.mjs: the only thing that writes a version field. It sets all five (marketplace metadata + plugin entry, plugin.json, kimi.plugin.json, the opencode.jsonc comment), commits "[Misc] Release X.Y.Z" and tags vX.Y.Z. The tag is how the next run knows what already shipped; before the first tag it falls back to the commit that introduced the current version, so the bootstrap needs no manual step. It exits having done nothing when no file under xwiki/ changed. * Derive the segment rather than ask for it, since the rule was already mechanical: minor when the capability inventory changes between the last release and HEAD (a skill, an MCP server, a hook or an opencode plugin added or removed), patch for anything else under xwiki/, major never derived. A "Release-Bump: minor|major" commit trailer overrides it for a change whose significance the file list cannot show — unlike a version field, two branches never conflict on a commit message. * Invert validate.mjs invariant 6: a branch must now NOT change any version field, compared base -> working tree so a stray bump is caught before it is even committed. Skipped on master, where release.mjs legitimately moves it. Invariant 3 (the five agree) is unchanged; the extraction of the five fields is parameterised by a reader so both invariants read the same thing. * Add .github/workflows/release.yml, running release.mjs --push on every push to master that touches xwiki/, plus workflow_dispatch with an explicit segment, serialised by a release concurrency group. * Flip the xwiki-knowledge EXTEND flow from "bump all five fields" to "never touch the version", and document the release in CLAUDE.md and README.md. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: c768ac3c736c8dae120e331febeb837735bc78e8 https://github.com/xwiki/xwiki-dev-llm/commit/c768ac3c736c8dae120e331febeb83... Author: Vincent Massol <[email protected]> Date: 2026-09-01 (Tue, 01 Sep 2026) Changed paths: A .github/workflows/release.yml M CLAUDE.md M README.md A scripts/release.mjs M scripts/validate.mjs M xwiki/skills/xwiki-knowledge/SKILL.md Log Message: ----------- [Misc] Cut the plugin release on master instead of bumping the version in every PR Commit: 422a726b2d2ee7845a020061204615a481ed7a04 https://github.com/xwiki/xwiki-dev-llm/commit/422a726b2d2ee7845a020061204615... Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: 2026-09-01 (Tue, 01 Sep 2026) Changed paths: M .claude-plugin/marketplace.json M kimi.plugin.json M opencode.jsonc M xwiki/.claude-plugin/plugin.json Log Message: ----------- [Misc] Release 1.5.1 * content edits only (no capability added or removed) Commit: 322aaacea57d486e7d2e5b4924e31305a6cdf099 https://github.com/xwiki/xwiki-dev-llm/commit/322aaacea57d486e7d2e5b4924e313... Author: Vincent Massol <[email protected]> Date: 2026-09-01 (Tue, 01 Sep 2026) Changed paths: M scripts/validate.mjs Log Message: ----------- [Misc] Compare a branch's plugin version against its merge base, not master's tip * Invariant 6 asked whether the branch's version differed from origin/master's tip, which answers the wrong question now that master keeps releasing while a branch is open: a branch that forked at 1.1.7 and never touched a version field still differs from a master that has reached 1.5.1, so every long-lived PR was told to revert a bump it never made. Compare against the merge base instead, which is what "did this branch change the version?" actually means. * Name the merge base and its version in the failure message, so the fix is unambiguous on a branch whose fork point is far behind. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Commit: 8b7f693ae14f6866b429cd980624897a36803ba0 https://github.com/xwiki/xwiki-dev-llm/commit/8b7f693ae14f6866b429cd98062489... Author: Vincent Massol <[email protected]> Date: 2026-09-01 (Tue, 01 Sep 2026) Changed paths: M scripts/validate.mjs Log Message: ----------- [Misc] Compare a branch's plugin version against its merge base, not master's tip Commit: ead72f824502f34e2c05a7ae847b0451a83876d5 https://github.com/xwiki/xwiki-dev-llm/commit/ead72f824502f34e2c05a7ae847b04... Author: Vincent Massol <[email protected]> Date: 2026-09-01 (Tue, 01 Sep 2026) Changed paths: M .claude-plugin/marketplace.json A .github/workflows/release.yml M CLAUDE.md M README.md M kimi.plugin.json M opencode.jsonc A scripts/release.mjs M scripts/validate.mjs M xwiki/.claude-plugin/plugin.json M xwiki/.mcp.json M xwiki/instructions/xwiki-org.md A xwiki/okf/architecture/wiki-application-data.md M xwiki/okf/conventions/documentation-migration.md M xwiki/okf/conventions/documentation.md M xwiki/okf/conventions/frontend.md M xwiki/okf/index.md M xwiki/okf/servers/index.md M xwiki/okf/servers/jenkins.md M xwiki/okf/servers/jira.md M xwiki/okf/sonarqube/constant-and-resource-rules.md M xwiki/okf/sonarqube/dead-code-rules.md M xwiki/okf/sonarqube/index.md M xwiki/okf/sonarqube/modernization-rules.md M xwiki/okf/sonarqube/simplification-rules.md M xwiki/okf/sonarqube/syntax-rules.md M xwiki/okf/sonarqube/test-code-rules.md M xwiki/okf/sonarqube/verification.md A xwiki/okf/testing/running-docker-its.md M xwiki/okf/testing/strategy.md M xwiki/scripts/inject-org-instructions.mjs A xwiki/scripts/xwiki-it-slot.mjs M xwiki/skills/xwiki-build/SKILL.md M xwiki/skills/xwiki-doc-convert/SKILL.md A xwiki/skills/xwiki-doc-convert/references/conversion-plan.md M xwiki/skills/xwiki-doc-writing/SKILL.md M xwiki/skills/xwiki-doc-writing/tools/README.md M xwiki/skills/xwiki-doc-writing/tools/docpages.py A xwiki/skills/xwiki-doc-writing/tools/docplan.py M xwiki/skills/xwiki-doc-writing/tools/docshot.sh M xwiki/skills/xwiki-doc-writing/tools/xwikidoc.py M xwiki/skills/xwiki-fix-sonarqube-issue/SKILL.md M xwiki/skills/xwiki-knowledge/SKILL.md M xwiki/skills/xwiki-pull-request/SKILL.md M xwiki/skills/xwiki-rest-api/SKILL.md M xwiki/skills/xwiki-review/SKILL.md M xwiki/skills/xwiki-test-guidelines/SKILL.md Log Message: ----------- Merge remote-tracking branch 'origin/master' into okf-data-migrations # Conflicts: # xwiki/instructions/xwiki-org.md Compare: https://github.com/xwiki/xwiki-dev-llm/compare/2216f632d722...ead72f824502 To unsubscribe from these emails, change your notification settings at https://github.com/xwiki/xwiki-dev-llm/settings/notifications