diff --git a/AGENTS.md b/AGENTS.md index cf3b96e..34a1a70 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -124,6 +124,7 @@ npm run gen-metrics # regenerate scripts/metrics.json For specific workflows, load the matching skill under `ai-skills/` rather than improvising: - `wm-ai-release-notes` — add or edit entries in a versioned release notes file under `docs/release-notes/`. +- `wm-ai-release-notes-draft` — draft a whole release notes file from a source sheet of shipped tickets (CSV/XLSX export, GitLab branch-compare report, or pasted developer notes). - `wm-feature-announcements` — new post under `blogs/feature-announcements/`. - `wm-ai-blog` — new narrative or thought-leadership post under `blogs/blog/`. - `wm-ai-create-guide` — create a how-to or tutorial page under `docs/guide/`. diff --git a/ai-skills/wm-ai-release-notes-draft/SKILL.md b/ai-skills/wm-ai-release-notes-draft/SKILL.md new file mode 100644 index 0000000..633e028 --- /dev/null +++ b/ai-skills/wm-ai-release-notes-draft/SKILL.md @@ -0,0 +1,169 @@ +--- +name: wm-ai-release-notes-draft +description: > + Use this skill when drafting a whole release notes file from a source list of shipped work — a CSV or + XLSX export of Jira tickets, a GitLab branch-compare HTML report, or a block of notes pasted by a + developer. Activate when the user hands over a sheet or report and asks to turn it into release notes, + fill in a version's notes, or process a release's tickets in bulk. For adding or editing one entry at a + time in an existing file, use `wm-ai-release-notes` instead. +license: MIT +metadata: + version: 0.1.0 + surface: docs/release-notes + docusaurus: ^3.9.0 +--- + +# Drafting Release Notes From a Source Sheet + +Turn a list of shipped tickets into a complete draft of a versioned release notes file. The source is written by and for engineers and QA — your job is to decide what customers should be told, and say it in their language. + +This skill covers **triage, enrichment, and reporting**. It does not restate entry format. Titles, bodies, pills, links, tabs, accordians, and the release overview line are defined in `../wm-ai-release-notes/references/conventions.md` — read it before writing entries. + +## When to use + +- The user provides a sheet, report, or pasted list covering a release and wants the notes drafted. +- The user wants a source list triaged into Features / Enhancements / Bug Fixes. +- The user wants to know what in a source list is worth announcing at all. + +## When NOT to use + +- Adding or editing one entry in an existing file → use `wm-ai-release-notes`. +- A public-facing post celebrating a feature → use `wm-ai-feature-announcements`. + +## Relationship to `wm-ai-release-notes` + +That skill confirms every entry with the user before writing. **Bulk drafting replaces per-entry confirmation** — otherwise a 50-ticket sheet becomes 50 round trips. Confirm these two things up front instead, then write the whole draft and report: + +1. **Target file and version** — resolve the path and say which file you will write. +2. **Whether to enrich from Jira** — the user has answered both ways on different releases. Ask; do not assume. + +Everything else is reported after the draft is written, not asked before. + +## Procedure + +### Step 1 — Parse the source + +Read the sheet into a ticket list: id, title, description, and any repo or branch column. See `references/source-formats.md` for CSV, XLSX, GitLab-HTML, and pasted-notes recipes. + +**Always de-duplicate by ticket id.** These sheets repeat rows — one 60-row export covered 49 unique tickets. Report both counts. + +### Step 2 — Follow the sources + +**Every reference in the sheet is a lead, and every lead gets followed or raised. Never silently skip one.** + +A ticket's real content is often not in the sheet. It sits behind a link. An entry written without opening that link is a guess dressed as a finding. + +This applies to **any** outbound reference, whatever the host. Jira, Basecamp, GitLab, GitHub, and Jenkins are the common ones, but the rule is not a list of approved platforms — a wiki page, a dashboard, a spreadsheet, a recording, or a one-off internal URL all count. If a ticket points somewhere, go there. + +#### Jira + +Fetch every ticket by key and pull `summary`, `description`, `issuetype`, `status`, `resolution`, and `fixVersions`. The recipe, including the large-output workaround, is in `references/source-formats.md`. + +Jira earns its keep in three ways: + +- **Umbrella tickets.** A ticket whose description is just links to other tickets is unwritable as-is. Fetch the linked ids and you get the real list. +- **`issuetype`.** A Jira `Improvement` is an Enhancement; a `Bug` is a Bug Fix. Use it to check your own classification. +- **`fixVersions`.** Evidence about which release an item belongs to — see Step 3. + +#### Everything else a ticket points to + +Open it if any connector or fetch tool can reach it, whatever the platform. A ticket whose entire description is a link is the strongest signal that the link holds the content. + +#### When you cannot resolve a reference + +Four cases, one rule — **ask the user, and say exactly what you could not reach.** + +| Situation | What to do | +| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| No connector, or it needs authorizing | Name the platform and ask the user to authorize it. OAuth cannot run in a non-interactive session. Offer to continue meanwhile, with the affected entries flagged | +| The link is dead, private, or returns nothing | Say which ticket and which link, and ask how they want it handled | +| Only an id, no URL (`WMS-12345`, `#4821`) | Ask for the base URL or project rather than guessing a host | +| Opened it and it is still unclear | Say what you read and what remains ambiguous. Ask rather than inventing a plausible reading | + +Never let an unreachable reference quietly become an exclusion or a confident-sounding sentence. Carry it into the report under **Unchecked sources**. + +### Step 3 — Check `fixVersions` against the target release + +`fixVersions` is **evidence, not a verdict**. Sheet filenames are often wrong, and the user may deliberately place items elsewhere — for one release they chose to put everything not-yet-documented into the open version regardless of what Jira said. + +So: compare, and if a material number of tickets disagree with the target release, **report the mismatch and let the user decide placement.** Never silently re-target. + +### Step 4 — Check what is already published + +Read the other release notes files in the same version series. Source reports routinely include work already announced — a cherry-picked fix appears in two branches, or a feature's first commit lands one release before its polish. + +If an item is already documented in an earlier file, do not announce it again. Report it as already covered. + +### Step 5 — Triage + +Apply `references/triage-rules.md`. In order: + +1. **Drop** what no customer can observe. +2. **Merge** tickets describing one defect, and umbrella tickets into one entry with sub-bullets. +3. **Split** a ticket that contains both a fix and an enhancement. +4. **Classify** into tab and accordian. + +### Step 6 — Write entries + +Rewrite each kept item in customer language per `references/triage-rules.md`, then format it per `conventions.md`. + +Write the release overview line **last**, from the entries that ended up in the file. + +### Step 7 — Validate + +AGENTS.md makes this a hard gate: + +```bash +npm run lint +npm run build +``` + +Both must pass. Run the build in the background; it is slow. + +### Step 8 — Report + +See **Reporting** below. Do not skip it — it is the part the user actually reviews. + +## Repo to accordian mapping + +For GitLab compare reports spanning repos: + +| Repo | Accordian | Pill | +| -------------------------- | ------------------------------------------------------------------------ | -------- | +| `wavemaker-react-codegen` | User Interface | web | +| `wavemaker-react-runtime` | User Interface | web | +| `wavemaker-foundation-css` | User Interface | per item | +| `wavemaker-ng-studio` | Platform, except canvas / visual-editor / theming items → User Interface | per item | +| `projects-hub` | Platform | none | +| `wm-agent-server` | Platform | none | + +## Reporting + +The user's standing instruction is **do not skip anything without telling them.** Every source row ends up in exactly one bucket, and the report accounts for all of them: + +- **Added** — counts per tab and accordian. +- **Excluded** — every dropped ticket with its reason. List them individually; a total is not enough. +- **Already covered** — items found in an earlier release file, naming that file. +- **Merged or split** — which tickets were combined or divided, and why. +- **Low confidence** — entries where the ticket was too vague to be sure. Say plainly that the wording is your best reading, not established fact. +- **Unchecked sources** — every link or reference you could not open, with the ticket it belongs to and why it failed. This is the bucket that is easiest to drop and most damaging to drop, because a skipped link looks identical to a ticket that had nothing behind it. +- **Open gaps** — a new capability with no doc to link, an unresolved placeholder, a missing pill you could not determine. + +## Common mistakes to avoid + +- **Trusting the sheet's filename for the version.** Check `fixVersions`, and ask. +- **Per-entry confirmation on a bulk draft.** Confirm the file and the Jira question, then draft. +- **Announcing something twice.** Check earlier files in the series first. +- **Keeping QA phrasing.** See the de-jargon test in `references/triage-rules.md`. +- **Skipping a link you could not open.** Follow every reference, or raise it. An unreachable link is never a silent exclusion. +- **Guessing a host from a bare id.** Ask for the base URL instead. +- **Inventing a cause.** State only what the ticket states. +- **Inventing a doc link.** Grep `docs/` first; if nothing covers it, add no link and report the gap. +- **Counts in the overview line.** They go stale on the next edit. +- **Naming a customer or their app.** This repo is public. + +## Reference files + +- Triage, exclusion, and rewriting rules: `references/triage-rules.md` +- Parsing and Jira recipes: `references/source-formats.md` +- Entry format and style: `../wm-ai-release-notes/references/conventions.md` diff --git a/ai-skills/wm-ai-release-notes-draft/references/source-formats.md b/ai-skills/wm-ai-release-notes-draft/references/source-formats.md new file mode 100644 index 0000000..e92cdea --- /dev/null +++ b/ai-skills/wm-ai-release-notes-draft/references/source-formats.md @@ -0,0 +1,155 @@ +# Source Formats and Recipes + +Parsing the inputs these drafts come from, and enriching them from Jira. + +Write intermediate files to the session scratchpad, never into the repo. + +## XLSX + +`openpyxl` is available; `pandas` is not. + +```python +import openpyxl +wb = openpyxl.load_workbook('.xlsx', data_only=True) +ws = wb[wb.sheetnames[0]] +rows = list(ws.iter_rows(values_only=True)) +header, body = rows[0], rows[1:] +``` + +Columns are typically: `S.No`, `Jira ID`, `Title`, `Description`, `Developer (Assignee)`, `Jira Link`. + +Dumping every row at once can blow the context budget. Probe the shape first, then pull the columns you need. + +## CSV + +Standard CSV with quoted multi-line descriptions. Use `csv.DictReader`, not line splitting — descriptions contain commas, newlines, and code blocks. + +## GitLab branch-compare HTML + +Reports titled "Listing Differences Between Branches". Structure: + +- An `h4` per repo, each followed by a table of commits. +- Columns: `S.NO`, `Commit Message`, `WMS ID(s)`, `Title`, `Description`, `Author`, `URL`, `Date & Time`, `Branch`. +- A "Nothing to compare in:" list naming repos with no changes — that is a real finding, not an omission. + +Notes specific to this format: + +- The `Title` and `Description` columns are the **Jira** title and description, so several commits repeat the same text. Group by ticket id, not by row. +- The `Branch` column can name a different release branch than the report's own comparison, usually a cherry-pick. Treat it as a hint to check whether the item is already published. +- One ticket commonly spans several repos. + +## Pasted developer notes + +Sometimes a developer pastes prose already grouped into Features / Improvements / Bug Fixes. Treat the grouping as a proposal, not a decision: + +- Their "Improvements" usually map to Enhancements. +- Check for an item appearing as both a feature and a bug fix — adding a capability and fixing that same capability within one release is churn. Keep the capability, and raise the duplicate with the user rather than dropping it silently. +- Ask which accordian it belongs to if they have not said. + +## De-duplicating + +Source sheets repeat rows. Always collapse by ticket id and report both numbers: + +```python +seen, unique = set(), [] +for r in body: + tid = r[1] + if tid in seen: + continue + seen.add(tid) + unique.append(r) +print(len(body), "rows ->", len(unique), "tickets") +``` + +## Jira enrichment + +Fetch every ticket in one query rather than one call per ticket. + +```yaml +searchJiraIssuesUsingJql + cloudId: wavemaker.atlassian.net + jql: key in (WMS-1111,WMS-2222,...) + fields: ["summary","description","status","issuetype","resolution","fixVersions"] + maxResults: 50 + responseContentFormat: markdown +``` + +Include any ids linked from an umbrella ticket in the same query. + +### Handling the oversized result + +The response exceeds the tool's token cap and is written to a file instead. Extract with `jq`, putting the filter in a file — escaping a quoted `join(", ")` inline fails under the shell: + +```bash +cat > "$SP/extract.jq" << 'EOF' +.issues.nodes[] | "===== \(.key) =====\nSUMMARY: \(.fields.summary)\nTYPE: \(.fields.issuetype.name)\nSTATUS: \(.fields.status.name)\nRESOLUTION: \(.fields.resolution.name // "null")\nFIXVERSIONS: \([.fields.fixVersions[]?.name] | join(", "))\nDESCRIPTION:\n\(.fields.description // "null")\n" +EOF +jq -r -f "$SP/extract.jq" "$RESULT_FILE" > "$SP/jira.txt" +``` + +Then scan the one-line fields across all tickets before reading any full description: + +```bash +grep -E "^=====|^SUMMARY:|^TYPE:|^FIXVERSIONS:" "$SP/jira.txt" +``` + +Read full descriptions only for the tickets that are ambiguous. + +### When the connector is unauthorized + +OAuth cannot run in a non-interactive session. Tell the user to re-authorize it in their connector settings, and offer to proceed from the sheet alone with uncertain entries flagged. + +## Links inside tickets + +Descriptions in these sheets frequently carry the real content behind a link. Treat **every** outbound reference as a lead to follow, and report any you could not reach. + +The table below is what turns up most often — it is **not** an allowlist. Anything a ticket points to counts, including internal URLs, dashboards, wikis, spreadsheets, and recordings on hosts not named here. If you do not recognise the host, still try it, and raise it if you cannot reach it. + +| Source | Typically holds | Notes | +| ------------------------------------------------------------ | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| Jira (`browse/WMS-nnnnn`) | The ticket itself, or the children of an umbrella | Fetch with the connector; include linked ids in the same JQL query | +| Basecamp (`app.basecamp.com/.../todos/...`, `/messages/...`) | The entire specification for a feature whose Jira description is one line | A description that is *only* a Basecamp link means the ticket text is not the source of truth | +| GitLab / GitHub (merge request, PR, commit) | What actually changed, when the ticket is vague | Useful for deciding fix vs enhancement | +| Jenkins or any other CI | Build and job history behind a build-related ticket | | +| Confluence or any wiki | Specs and design docs | | +| Google Drive | Screen recordings and screenshots | Often the only evidence for a QA ticket; usually not machine-readable | +| Figma | Design specs for a UI ticket | | +| Anything else | Whatever the author thought was worth linking | Same rule: open it, or raise it | + +Two shapes to watch for in exported descriptions: + +- Atlassian smart links appear as a `custom` element wrapping the URL rather than as plain markdown. +- Inline images appear as `blob:` URLs that resolve to nothing outside the browser session. An image-only description carries no text you can use — treat it as unreachable and say so. + +### A bare id with no URL + +A sheet may reference `WMS-12345`, `#4821`, or `PROJ-99` with no host. Do not guess the instance. Ask the user for the base URL or the project, then fetch. + +### Still unclear after opening it + +Opening a link does not guarantee an answer — a Drive recording, a screenshot-only ticket, or a thread that never states the outcome can all leave the behaviour ambiguous. Say what you read, say what is still missing, and ask. A plausible-sounding sentence built on an unresolved reference is the failure this rule exists to prevent. + +## Checking what is already published + +Before writing, pull the headings from the other files in the version series to catch both duplicate announcements and near-identical titles: + +```bash +grep -h "^ - ###" docs/release-notes//*.mdx +``` + +Make a new title distinct from an existing one even when the underlying defects differ. + +## Verifying the result + +```bash +python3 -c " +c = open('.mdx').read() +print('entries:', c.count('- ###')) +print('tabs:', c.count(''), c.count('')) +print('placeholders left:', c.count('{/* Content */}')) +" +``` + +A balanced-tag check will not catch leftover QA phrasing — a keyword scan only finds names you already thought of. Re-read each body against the de-jargon test in `triage-rules.md`. + +Then run the `npm run lint` and `npm run build` gate from AGENTS.md. diff --git a/ai-skills/wm-ai-release-notes-draft/references/triage-rules.md b/ai-skills/wm-ai-release-notes-draft/references/triage-rules.md new file mode 100644 index 0000000..d55533f --- /dev/null +++ b/ai-skills/wm-ai-release-notes-draft/references/triage-rules.md @@ -0,0 +1,111 @@ +# Triage Rules + +How to decide what from a source sheet becomes an entry, and how to word it. + +## The filter: can a customer observe it? + +Keep an item if it maps to something the user **clicks, sees, or gets** — a screen, a control, a message, a generated app's behaviour, a build that now succeeds or runs faster. + +Drop it if the only thing that changed is an **event field, an API parameter, an internal detector, a tool's error wording, or a framework refactor**. + +These were cut from a shipped release by the writer, and are the calibration for "too internal": + +| Cut | Why | +| ---------------------------------------------------------- | -------------------- | +| Per-request LLM model override on a WebSocket run API | API parameter | +| Correlating ids added to a start/complete event pair | Event field | +| Compaction trigger counting system prompt and tool schemas | Internal measurement | +| Reworded error message suggesting an alternate tool | Tool message | +| Internal summarization text leaking into a task's output | Internal plumbing | + +### Try rewriting before dropping + +An item can sound internal and still have a surface the user touches. In the same release, a ticket about migrating draft base tracking from tags to marker commits was **not** dropped — it was rewritten in terms of the buttons involved: + +> Restore and Edit for earlier conversation states remain available even after Reject All or Sync Studio Changes. + +So before dropping: ask what the user would notice. If there is a button, label, list, or screen involved, name it and keep the entry. Drop only when there is genuinely no surface. + +## Always exclude + +These never produce an entry. List each one in the report with its reason. + +| Category | Examples | +| ---------------------- | ----------------------------------------------------------------------------------------------------- | +| Merge commits | `Merge branch 'x' into y`, and tickets literally titled as a dummy JIRA for merge purposes | +| CI and pipeline config | Fixing a release job trigger, build routing between internal services | +| Build tooling | Lockfiles, lint config, dependency-group restructuring of internal services | +| Auto-generated commits | `Auto commited migration changes by Studio` | +| Internal repo hygiene | Merging test repos, moving temp files to a gitignored folder, deleting tracking files | +| Test-only work | Unit test coverage, adding or updating test cases | +| Internal observability | Tracing span names, log nesting, telemetry plumbing | +| Reverted work | A fix and its own revert in the same release net to zero — exclude both | +| WIP or debug commits | `login issue check 1` | +| Vague security bumps | `Vulnerabilities resolved` with no stated impact. A named CVE that blocked installs **is** includable | + +### Never name a customer or their app + +This repo is public. Customer names, project codenames, and their application's screen names must not appear in an entry, a title, or an example — even when the ticket is full of them. + +## Merge + +**Same defect, different tickets.** QA often files the same bug from several screens. If the underlying defect is one thing, write one entry. Two separate tickets about a select-all control failing became a single entry. + +**Umbrella plus children.** A parent ticket whose description is a list of links becomes one entry with sub-bullets — one per child. Fetch the children to get their names; do not write "various fixes". + +**One capability split across repos.** A codegen change and its runtime counterpart under one ticket are one entry. + +## Split + +If a ticket contains **both a fix and an improvement**, it becomes two entries. A ticket about preview builds failing with out-of-memory errors because dependencies reinstalled on every build carried both: + +- **Bug Fix** — builds intermittently failing with out-of-memory errors. +- **Enhancement** — unchanged builds now skip dependency installation, cutting build time substantially. + +The test: would a customer who never hit the bug still care? If yes, the improvement deserves its own entry. + +## Classify + +| Tab | Rule | +| ------------ | -------------------------------------------------------------------------- | +| Features | A capability that did not exist | +| Enhancements | An existing capability got better. A Jira `Improvement` usually lands here | +| Bug Fixes | Something was broken and now works | + +Accordian definitions and pill rules are in `../../wm-ai-release-notes/references/conventions.md`. + +## Rewriting QA tickets + +QA tickets are written from inside a test application. They name screens, dialogs, tabs, and record types that mean nothing to a customer. Translate each into the **platform-level defect a WaveMaker developer would recognise**. + +### The test + +> Could a reader who has never seen the test app tell which tab, dialog, message, or page is meant? + +The failure mode is a definite article pointing at app-specific UI. "The create, clone, and view tabs", "the advanced search dialog", "the no-results message" all fail it — they sound generic but refer to one app's screens. Name the widget or behaviour instead, or describe the shape generically ("a dynamically added tab"). + +The writer's own critique of an early draft: + +> "Status column color missing on page 2" — where, what is page 2? Does this make sense in a release note? + +The real defect was a table column's conditional background colour not being re-applied after paging. That is the entry. + +### State only the causes the ticket gives + +QA tickets report symptoms. If the ticket does not say why, describe the symptom and stop. Writing "because the handler was not registered" when the ticket never says so is inventing a root cause. + +### Keep error strings + +If a ticket quotes an error, keep it in the body. It is what someone hitting the bug will search for. `Required field(s) missing` and `Indexed property setter is not supported` both survived review for this reason. + +### Say "in React apps" when parity is the point + +Many tickets exist because behaviour differs between the Angular and React outputs — the ticket says so, or says it works fine in Angular. Without that qualifier, Angular users think the bug affected them too. + +### Do not invent mechanisms + +No filenames, settings, config keys, or version numbers that the ticket does not give. If a ticket says a package version was flagged for a CVE, do not name the version it moved to. + +## Low confidence + +Some tickets are too garbled to translate with certainty, and Jira adds nothing. Write the most defensible reading, then **flag it in the report** as your reading rather than established fact, so the writer can correct it. Do not quietly present a guess as a finding. diff --git a/ai-skills/wm-ai-release-notes/SKILL.md b/ai-skills/wm-ai-release-notes/SKILL.md index 828c08c..2dbcf17 100644 --- a/ai-skills/wm-ai-release-notes/SKILL.md +++ b/ai-skills/wm-ai-release-notes/SKILL.md @@ -4,8 +4,9 @@ description: > Use this skill when editing or filling in a WaveMaker AI release notes file. Activate when the user wants to add a feature, enhancement, or bug fix to a release notes .mdx file, asks how to write a release note entry, wants to categorise a shipped item, needs to verify or add a - doc link, or is reviewing a release notes draft for correctness. This is distinct from feature - announcements (public-facing posts) and blog posts. + doc link, or is reviewing a release notes draft for correctness. For drafting a whole release from a + source sheet or branch-compare report in bulk, use `wm-ai-release-notes-draft` instead. This is distinct + from feature announcements (public-facing posts) and blog posts. license: MIT metadata: version: 0.1.0 @@ -26,6 +27,7 @@ Use this skill to help a writer or developer fill in a versioned release notes f ## When NOT to use +- User hands over a sheet, export, or branch-compare report and wants a whole release drafted in bulk → use the `wm-ai-release-notes-draft` skill. - User wants a public-facing post celebrating a feature → use the `wm-ai-feature-announcements` skill. - User wants a narrative blog post or engineering story → use the `wm-ai-blog` skill. - User wants a reference or how-to doc page → use the `wm-ai-create-guide` skill. @@ -59,6 +61,23 @@ docs/release-notes/release-version-1/version-1-0-x/1.0.0.mdx The top-level template used to generate a new file is `assets/release-notes-template.mdx`. +## Release overview line + +Every release notes file opens with an announcement line that ends in a one-sentence overview of the release: + +```mdx +WaveMaker announces the release of WaveMaker AI 12.0.2. This release adds React Native extensibility through custom app wrappers and Metro configuration, improves widget accessibility, and fixes a broad set of React app issues. +``` + +A new file generated from the template ships with a literal `Overview\...` placeholder. **Replace it before the file is done** — it is not optional, and it publishes verbatim if left alone. + +Rules: + +- One sentence. Name the two or three themes a reader should look forward to, drawn from the entries actually in the file. +- Derive it from the content — after the entries are written, not before. If the release is mostly fixes, say so. +- Same style rules as entry bodies: active voice, present tense, no marketing language. +- Do not list every item, and do not give a count of entries — both go stale on the next edit. + ## Procedure ### Step 0 — Resolve the target file @@ -116,6 +135,7 @@ Edit the release notes file and insert the entry in the correct accordian, maint Ask if there are more items. When the user is done, run a final scan of the file and flag: +- An unreplaced `Overview\...` placeholder in the opening announcement line. - Body copy longer than one sentence. - Relative links that include a `.md` or `.mdx` extension. - Relative links where the target file does not exist. @@ -123,6 +143,7 @@ Ask if there are more items. When the user is done, run a final scan of the file ## Common mistakes to avoid +- **Shipping the `Overview\...` placeholder** — the opening line's overview is required. Write it from the finished entries before calling the file done. - **Multi-sentence body** — the body is one sentence. Everything else goes in a linked doc. - **Placeholder links** — do not write `[Documentation](#)` or `[link to be added]`. Verify first, add only when confirmed. - **Link with file extension** — relative links must not include `.md` or `.mdx`. Strip the extension before writing. @@ -134,6 +155,7 @@ Ask if there are more items. When the user is done, run a final scan of the file ## Validation checklist +- [ ] The opening announcement line ends with a one-sentence overview, with no `Overview\...` placeholder left. - [ ] Entry is in the correct tab (Features / Enhancements / Bug Fixes). - [ ] Entry is in the correct accordian (User Interface / Backend / Platform / Product Ecosystem). - [ ] Title is a `###` heading, 4–7 words. diff --git a/ai-skills/wm-ai-release-notes/references/conventions.md b/ai-skills/wm-ai-release-notes/references/conventions.md index ec14ad0..d716796 100644 --- a/ai-skills/wm-ai-release-notes/references/conventions.md +++ b/ai-skills/wm-ai-release-notes/references/conventions.md @@ -39,6 +39,20 @@ An accordian with no content for this release can be omitted entirely or left wi ``` +## Release overview line + +The announcement line at the top of the file ends with a one-sentence overview of the release. The template ships it as a literal `Overview\...` placeholder, which must be replaced before the file is done. + +```mdx +WaveMaker announces the release of WaveMaker AI 12.0.2. This release adds React Native extensibility through custom app wrappers and Metro configuration, improves widget accessibility, and fixes a broad set of React app issues. +``` + +Write it last, from the entries actually in the file, naming the two or three themes a reader should look forward to. + +- Good: "This release focuses on React app stability, with fixes across tables, forms, and dialogs." +- Bad: "This release is packed with exciting improvements across the board." (marketing, says nothing) +- Bad: "This release includes 3 features, 1 enhancement, and 22 bug fixes." (goes stale on the next edit) + ## Entry format ```mdx diff --git a/data/tech-stack-data/12-0-2.json b/data/tech-stack-data/12-0-2.json new file mode 100644 index 0000000..e748fbe --- /dev/null +++ b/data/tech-stack-data/12-0-2.json @@ -0,0 +1,447 @@ +{ + "Application Stack": { + "UI": { + "Angular": [ + { + "name": "Angular", + "description": "Platform for building mobile and desktop web applications", + "link": "https://angular.io/", + "version": "21.2.20" + }, + { + "name": "jQuery", + "description": "Fast, small, and feature-rich JavaScript library.", + "link": "https://jquery.com/", + "version": "3.7.1" + }, + { + "name": "jQuery UI", + "description": "Set of user interface interactions, effects, widgets, and themes built on top of jQuery.", + "link": "https://jqueryui.com/", + "version": "1.14.1" + }, + { + "name": "ngx-bootstrap", + "description": "Native Angular directives for Bootstrap.", + "link": "https://valor-software.com/ngx-bootstrap/", + "version": "21.2.0" + }, + { + "name": "Bootstrap", + "description": "The most popular HTML, CSS, and JS library for developing responsive, mobile-first projects.", + "link": "https://getbootstrap.com/docs/3.3/", + "version": "3.4.1" + }, + { + "name": "D3.js", + "description": "JavaScript library for manipulating documents based on data.", + "link": "https://d3js.org/", + "version": "7.8.5" + }, + { + "name": "NVD3", + "description": "Re-usable charts for D3.js.", + "link": "https://nvd3.org/", + "version": "1.8.16" + }, + { + "name": "FullCalendar", + "description": "Full-sized drag & drop event calendar.", + "link": "https://fullcalendar.io/", + "version": "6.1.18" + }, + { + "name": "Lodash (lodash-es)", + "description": "A modern JavaScript utility library delivering modularity, performance, & extras.", + "link": "https://lodash.com/", + "version": "4.18.1" + } + ], + "React": [ + { + "name": "React", + "version": "v19.2.3", + "description": "Platform for building desktop web applications", + "link": "https://react.dev/" + }, + { + "name": "Next Js", + "version": "v16.1.1", + "description": "React framework that helps to build fast web apps", + "link": "https://nextjs.org/" + }, + { + "name": "Material UI", + "version": "v6.3.1", + "description": "Ready to use Material Design components", + "link": "https://mui.com/material-ui/" + }, + { + "name": "D3", + "version": "v7.8.5", + "description": "JavaScript library for manipulating documents based on data.", + "link": "https://d3js.org/" + }, + { + "name": "NVD3", + "version": "v1.8.16", + "description": "Re-usable charts for D3.js.", + "link": "https://nvd3.org/" + }, + { + "name": "Fullcalendar", + "version": "v6.1.15", + "description": "Full-sized drag & drop event calendar.", + "link": "https://fullcalendar.io/" + }, + { + "name": "Lodash (lodash-es)", + "version": "v4.17.21", + "description": "A modern JavaScript utility library delivering modularity, performance, & extras.", + "link": "https://lodash.com/" + }, + { + "name": "Moment", + "version": "v2.30.1", + "description": "Parse, validate, manipulate, and display dates and times in JavaScript", + "link": "https://momentjs.com/" + } + ], + "React Native": [ + { + "name": "React Native", + "description": "Framework for building native apps using React.", + "link": "https://reactnative.dev/", + "version": "0.81.4" + }, + { + "name": "Expo", + "description": "Platform for universal React applications.", + "link": "https://expo.dev/", + "version": "54.0.12" + } + ] + }, + "Backend": { + "Java": [ + { + "name": "Spring Framework", + "description": "Comprehensive programming and configuration model for modern Java-based enterprise applications.", + "link": "https://spring.io/projects/spring-framework", + "version": "6.2.19" + }, + { + "name": "Spring Security", + "description": "Authentication and access-control framework.", + "link": "https://spring.io/projects/spring-security", + "version": "6.5.11" + }, + { + "name": "Spring Data", + "description": "Simplifies data access for relational and non-relational databases.", + "link": "https://spring.io/projects/spring-data", + "version": "2025.0.13" + }, + { + "name": "Spring Boot", + "description": "Framework to create stand-alone, production-grade Spring based Applications.", + "link": "https://spring.io/projects/spring-boot", + "version": "3.5.16" + }, + { + "name": "Spring Session", + "description": "Provides an API and implementations for managing a user's session information.", + "link": "https://spring.io/projects/spring-session", + "version": "3.5.7" + }, + { + "name": "Hibernate (Jakarta)", + "description": "Object/Relational Mapping (ORM) library for Java.", + "link": "https://hibernate.org/", + "version": "5.6.15.Final" + }, + { + "name": "Gson", + "description": "Java library to convert Java Objects into JSON and back.", + "link": "https://github.com/google/gson", + "version": "2.14.0" + }, + { + "name": "Jackson", + "description": "Standard JSON library for Java (streaming, DOM, binding).", + "link": "https://github.com/FasterXML/jackson", + "version": "2.22.2" + }, + { + "name": "SLF4J", + "description": "Simple Logging Facade for Java.", + "link": "https://www.slf4j.org/", + "version": "2.0.19" + }, + { + "name": "Log4j2", + "description": "Java-based logging utility.", + "link": "https://logging.apache.org/log4j/2.x/", + "version": "2.26.1" + }, + { + "name": "HttpComponents HttpClient5", + "description": "Client-side HTTP standards implementation.", + "link": "https://hc.apache.org/httpcomponents-client-5.x/", + "version": "5.5.2" + }, + { + "name": "Jakarta Servlet", + "description": "Server-side API for handling HTTP requests.", + "link": "https://jakarta.ee/specifications/servlet/", + "version": "6.0.0" + }, + { + "name": "HikariCP", + "description": "High-performance JDBC connection pool.", + "link": "https://github.com/brettwooldridge/HikariCP", + "version": "7.1.0" + }, + { + "name": "Apache Commons Lang3", + "description": "Extra methods for manipulation of standard Java classes.", + "link": "https://commons.apache.org/proper/commons-lang/", + "version": "3.20.0" + }, + { + "name": "Guava", + "description": "Google core libraries for Java.", + "link": "https://github.com/google/guava", + "version": "33.7.1-jre" + }, + { + "name": "PostgreSQL Driver", + "description": "JDBC driver for PostgreSQL.", + "link": "https://jdbc.postgresql.org/", + "version": "42.7.13" + }, + { + "name": "Hibernate Validator", + "description": "Reference implementation of the Bean Validation specification.", + "link": "https://hibernate.org/validator/", + "version": "8.0.3.Final" + }, + { + "name": "JGit", + "description": "Java implementation of the Git version control system.", + "link": "https://www.eclipse.org/jgit/", + "version": "7.8.0.202609011348-r" + }, + { + "name": "Apache Commons Codec", + "description": "Implementations of common encoders and decoders (Base64, Hex, etc).", + "link": "https://commons.apache.org/proper/commons-codec/", + "version": "1.22.1" + }, + { + "name": "Apache Commons IO", + "description": "Library of utilities to assist with developing IO functionality.", + "link": "https://commons.apache.org/proper/commons-io/", + "version": "2.22.0" + }, + { + "name": "Apache Commons Text", + "description": "Library focused on algorithms working on strings.", + "link": "https://commons.apache.org/proper/commons-text/", + "version": "1.15.0" + }, + { + "name": "OWASP AntiSamy", + "description": "Library for performing fast, configurable cleansing of HTML coming from untrusted sources.", + "link": "https://owasp.org/www-project-antisamy/", + "version": "1.7.8" + }, + { + "name": "Apache FreeMarker", + "description": "Java template engine to generate text output.", + "link": "https://freemarker.apache.org/", + "version": "2.3.35" + }, + { + "name": "Apache Tika", + "description": "Content analysis toolkit to detect and extract metadata and text.", + "link": "https://tika.apache.org/", + "version": "4.0.0" + }, + { + "name": "MariaDB JDBC Driver", + "description": "JDBC driver for MariaDB.", + "link": "https://mariadb.com/kb/en/about-mariadb-connector-j/", + "version": "3.5.2" + }, + { + "name": "MongoDB Driver", + "description": "Java driver for MongoDB.", + "link": "https://www.mongodb.com/docs/drivers/java/sync/current/", + "version": "5.11.1" + }, + { + "name": "Jakarta Validation API", + "description": "Standard API for bean validation.", + "link": "https://jakarta.ee/specifications/bean-validation/", + "version": "3.1.1" + }, + { + "name": "Apache Commons Validator", + "description": "Client-side validation and server-side validation support.", + "link": "https://commons.apache.org/proper/commons-validator/", + "version": "1.11.0" + }, + { + "name": "JSON-Smart", + "description": "Performance focused JSON processor.", + "link": "https://netplex.github.io/json-smart/", + "version": "2.6.0" + }, + { + "name": "HSQLDB", + "description": "Leading SQL relational database engine written in Java (Sample DB).", + "link": "http://hsqldb.org/", + "version": "2.7.4" + } + ] + } + }, + "Build Time": { + "UI": { + "Angular": [ + { + "name": "Apache Maven", + "description": "Software project management and comprehension tool.", + "link": "https://maven.apache.org/", + "version": "3.9.16" + }, + { + "name": "Apache Ant", + "description": "Java library and command-line tool for driving build processes.", + "link": "https://ant.apache.org/", + "version": "1.10.11" + }, + { + "name": "npm", + "description": "Package manager for the JavaScript programming language.", + "link": "https://www.npmjs.com/", + "version": "10.9.3" + } + ], + "React": [], + "React Native": [ + { + "name": "Android Gradle Plugin (AGP)", + "description": "Build system for Android applications.", + "link": "https://developer.android.com/build", + "version": "8.14.3" + }, + { + "name": "SDK Build Tools", + "description": "Tools required to build Android applications.", + "link": "https://developer.android.com/studio/releases/build-tools", + "version": "36.0.0" + }, + { + "name": "@wavemaker-ai/wm-reactnative-cli", + "description": "WaveMaker CLI for React Native projects.", + "link": "https://www.npmjs.com/package/@wavemaker-ai/wm-reactnative-cli", + "version": "1.0.1" + }, + { + "name": "Maven", + "description": "Used for managing Java dependencies in React Native builds.", + "link": "https://maven.apache.org/", + "version": "3.9.9" + }, + { + "name": "npm", + "description": "Package manager used for React Native dependencies.", + "link": "https://www.npmjs.com/", + "version": "10.9.0" + } + ] + }, + "Backend": { + "Java": [] + } + }, + "Run Time": { + "UI": { + "Angular": [ + { + "name": "Java (JDK)", + "description": "Java Development Kit for running the backend and build tools.", + "link": "https://openjdk.org/", + "version": "21.0.6" + }, + { + "name": "Node.js", + "description": "JavaScript runtime environment.", + "link": "https://nodejs.org/", + "version": "22.18.0" + }, + { + "name": "Apache Tomcat", + "description": "Open source implementation of the Jakarta Servlet, Jakarta Server Pages, etc.", + "link": "https://tomcat.apache.org/", + "version": "10.1.39" + }, + { + "name": "WebSphere Liberty", + "description": "Flexible and dynamic Java EE application server.", + "link": "https://www.ibm.com/products/websphere-liberty", + "version": "23.0.0.9+" + }, + { + "name": "JBoss WildFly", + "description": "Flexible, lightweight, managed application runtime.", + "link": "https://www.wildfly.org/", + "version": "27+" + } + ], + "React": [], + "React Native": [ + { + "name": "Java (JDK)", + "description": "Required for Android builds and runtime environment.", + "link": "https://openjdk.org/", + "version": "17" + }, + { + "name": "Node.js", + "description": "JavaScript runtime for the Metro bundler.", + "link": "https://nodejs.org/", + "version": "22.11.0" + } + ] + }, + "Backend": { + "Java": [] + } + }, + "Developer Setup": { + "UI": { + "Angular": [], + "React": [], + "React Native": [ + { + "name": "Android Studio", + "description": "Integrated Development Environment (IDE) for Android app development.", + "link": "https://developer.android.com/studio", + "version": "Meerkat 2024.3.1 to Narwhal 4 Feature Drop 2025.1.4" + }, + { + "name": "Xcode", + "description": "Integrated Development Environment (IDE) for macOS/iOS.", + "link": "https://developer.apple.com/xcode/", + "version": "26.2" + } + ] + }, + "Backend": { + "Java": [] + } + } +} \ No newline at end of file diff --git a/docs/release-notes/release-version-12/version-12-0-x/12.0.2.mdx b/docs/release-notes/release-version-12/version-12-0-x/12.0.2.mdx new file mode 100644 index 0000000..805ce07 --- /dev/null +++ b/docs/release-notes/release-version-12/version-12-0-x/12.0.2.mdx @@ -0,0 +1,183 @@ +--- +last_update: { author: 'Mayank Prakash' } +hide_table_of_contents: true +hide_title: true + +--- + + + +WaveMaker announces the release of WaveMaker AI 12.0.2. This release adds slash commands to the WaveMaker AI Assistant, improves how Screenshot-to-Code generates screens, and fixes a range of issues in React apps. + +For details about the technology stack upgrades, refer to [Technology Stack](/tech-stack?v=12-0-2). + +## 12.0.2 + +*Release date: October 5, 2026* + + + + + - ### Slash commands in WaveMaker AI Assistant + + Type `/` in the WaveMaker AI Assistant to see the available commands. For now, there is one: `/grill-me`. Select it to add it to your message, then add any details after it. + + - `/grill-me`: Stress-tests a plan or design before you build it. The assistant asks questions one at a time, working through each part of the plan. It suggests an answer for each question and leaves every decision to you. It draws on WaveMaker knowledge to ask more relevant questions, and waits until you both agree on the plan before it starts any work. For example, `/grill-me I want to add a customer onboarding flow with email verification and role-based dashboards`. + + - ### List pagination in generated screens + + Screenshot-to-Code now generates pagination for list widgets, so long lists render in pages instead of all at once. + + + + + + - ### Platform upgrade files excluded from changes list + + Files changed only by a platform upgrade no longer appear in the AI chat's list of changes alongside the session's own edits. + + - ### AI Assistant input limits and paste attachments + + Pasted text longer than 200 words now appears as an attachment in the AI Assistant, and each message accepts up to 5,000 typed words and up to 1 MB of content in total. + + - ### Wizard fallback when no variant matches + + When no matching wizard variant is available, Screenshot-to-Code now builds the wizard from containers and labels with one container per step, using a model variable to control which step is shown. + + - ### Avatar detection in screenshots + + Screenshot-to-Code detects and generates avatars from a screenshot more accurately. + + - ### Tab headers sharing a row + + Screenshot-to-Code now skips an extra widget that shares a row with a tab header, so the tabs generate cleanly. + + - ### Page padding matches the screenshot + + Screenshot-to-Code no longer adds default padding to page content, so spacing matches the screenshot more closely. + + - ### Background color and gradient detection + + Screenshot-to-Code detects background colors more carefully, including prominent gradients. + + - ### Enhancements to Spotlight Search in Studio + + - Settings section child-routes are now searchable in Spotlight Search. + - Database tab shortcuts (Settings, Query, Procedure) and table name search are available in Spotlight Search. + - The APIs section is now searchable in Spotlight Search. Endpoints are excluded. + - The no-results screen now includes a "Search in file content" option. + + + + + + - ### Select-all checkbox not selecting rows + + Fixed the select-all checkbox in a table header not selecting rows or updating the selection count in React apps, matching Angular's behavior. + + - ### Toggle value not reflected in the UI + + Fixed a toggle's value change not updating the UI bound to it. + + - ### Navigation between external application links + + Fixed navigation failing when moving directly from one external application link to another. + + - ### Rows added from a dialog not displayed + + Fixed a table not displaying rows that were added through a dialog, leaving the table hidden. + + - ### No-data message missing in deployed apps + + Fixed a widget's no-data message not appearing in deployed React apps when a search returns no records. + + - ### Select options not loading and duplicate validation + + Fixed a Select widget's options not loading and its required-field validation message appearing twice. + + - ### Row selection stops working after a dialog opens + + Fixed row selection not working and the page becoming unresponsive after a dialog is opened. + + - ### Table column binding not passed for sorting + + Fixed the Table widget not passing its column binding, which left the sort fields missing. + + - ### Required field errors when opening a tab + + Fixed `Required field(s) missing` console errors appearing when a dynamically added tab is opened. + + - ### No-data image shown alongside data + + Fixed the no-data placeholder image appearing in a list view even when data was present. + + - ### List item background image not loading + + Fixed a list item's background image not loading when bound to a dataset field. + + - ### Conditional styles and Select widget class + + Fixed conditional styles not being applied, and a missing class on the Select widget. + + - ### Submit stays disabled after making selections + + Fixed a form's Submit button remaining disabled after the required selections had been made. + + - ### Multi-level component repeats root data + + Fixed a multi-level component inside a dialog showing the root level's data at every level. + + - ### Script call to goToFirstPage fails + + Fixed a script call to `goToFirstPage` from a form submit handler failing in React apps with `Cannot read properties of undefined`. + + - ### Validation persists after selecting a value + + Fixed a required-field validation error persisting after a value was selected, with the field alternating between two values and the page becoming unresponsive. + + - ### Unwanted background on a dialog + + Fixed an unwanted background appearing on a dialog opened from within a wizard step. + + - ### Widget accessibility fixes + - Button, Progress Bar, Progress Circle, Audio, Video, and Picture: fixed accessibility not working correctly in some configurations. + - File Upload: fixed the missing `name` attribute. + + - ### DataTable multi-column filter shows all values + + Fixed the DataTable multi-column filter showing all values instead of filtering by the value entered in a column's filter field in Angular apps. + + - ### Partial pages missing from the Properties panel + + Fixed partial pages not appearing in the Properties panel for a newly created page in a new Angular app. + + - ### Switching to Design Dialog needs multiple clicks + + Fixed switching from the Main Page to the Design Dialog requiring more than one click in Angular apps. + + - ### List variant padding overrides inline padding + + Fixed a List widget's variant padding taking priority over the padding set inline on the widget. + + - ### Extra bottom margin on form fields + + Fixed form fields having extra margin at the bottom. + + - ### Dialogs generated incorrectly from screenshots + + Fixed Screenshot-to-Code generating dialogs incorrectly from a screenshot. + + + + - ### PATCH path parameter missing as an input + + Fixed a path parameter not appearing as an input when importing a PATCH API that also has a JSON request body, leaving no way to supply it when invoking the API. + + + + - ### AI chat run stops during a multi-file replace + + Fixed an AI chat run ending with no response when a find-and-replace was applied across a directory instead of across named files. + + + diff --git a/sidebar/sidebars/releaseNotesSidebar.js b/sidebar/sidebars/releaseNotesSidebar.js index 28947c6..45bcbd8 100644 --- a/sidebar/sidebars/releaseNotesSidebar.js +++ b/sidebar/sidebars/releaseNotesSidebar.js @@ -1,39 +1,44 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarConfig} */ export default [ { - type: 'doc', - id: 'release-notes/index', - label: 'WaveMaker Releases', + "type": "doc", + "id": "release-notes/index", + "label": "WaveMaker Releases" }, { - type: 'category', - label: 'Release - Version 12', - collapsible: true, - collapsed: true, - items: [ + "type": "category", + "label": "Release - Version 12", + "collapsible": true, + "collapsed": true, + "items": [ { - type: 'doc', - id: 'release-notes/release-version-12/the-announcement', - label: '📣 The Announcement ', + "type": "doc", + "id": "release-notes/release-version-12/the-announcement", + "label": "📣 The Announcement " }, { - type: 'category', - label: '12.0.x', - collapsible: true, - collapsed: true, - items: [ + "type": "category", + "label": "12.0.x", + "collapsible": true, + "collapsed": true, + "items": [ { - type: 'doc', - id: 'release-notes/release-version-12/version-12-0-x/12.0.1', - label: '12.0.1', + "type": "doc", + "id": "release-notes/release-version-12/version-12-0-x/12.0.2", + "label": "12.0.2" }, { - type: 'doc', - id: 'release-notes/release-version-12/version-12-0-x/12.0.0', - label: '12.0.0', + "type": "doc", + "id": "release-notes/release-version-12/version-12-0-x/12.0.1", + "label": "12.0.1" }, - ], - }, - ], - }, + { + "type": "doc", + "id": "release-notes/release-version-12/version-12-0-x/12.0.0", + "label": "12.0.0" + } + ] + } + ] + } ]; diff --git a/src/components/MDXComponents/Pills/Pills.css b/src/components/MDXComponents/Pills/Pills.css index 988a103..a5b6abb 100644 --- a/src/components/MDXComponents/Pills/Pills.css +++ b/src/components/MDXComponents/Pills/Pills.css @@ -43,7 +43,8 @@ } /* Base styling */ -.wm-pill-web { +.wm-pill-web, +.wm-pill-angular { background: rgba(23, 148, 239, 0.2); color: rgba(23, 148, 239); --wm-pill-icon-color: rgba(23, 148, 239); diff --git a/src/components/MDXComponents/Pills/Pills.jsx b/src/components/MDXComponents/Pills/Pills.jsx index a95f04f..4948390 100644 --- a/src/components/MDXComponents/Pills/Pills.jsx +++ b/src/components/MDXComponents/Pills/Pills.jsx @@ -34,6 +34,7 @@ const MobileIcon = ({ size = 14, color = 'currentColor' }) => ( const pillConfig = { web: { icon: WebIcon, label: 'Web' }, + angular: { icon: null, label: 'Angular' }, mobile: { icon: MobileIcon, label: 'Mobile' }, desktop: { icon: Monitor, label: 'Desktop' }, android: { icon: MobileIcon, label: 'Android' },