mirror of
https://github.com/nocobase/nocobase.git
synced 2026-10-16 15:07:08 +08:00
@nocobase/app-cli-client@0.1.0-beta.6
33
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ca0adee71b |
feat(templates): quieter default interface for generated applications (#10817)
* feat(templates): quieter default interface for generated applications Bring the default look of both templates, the UI Library and the application development Skill closer to the NocoCRM application built on them. Templates: one faint border everywhere; a --hover grey for hovered rows, buttons and cards, table headers and the navigation's current entry; one light focus ring for every control; cards and overlays framed by the general border on a faint blurred backdrop; compact preset at 0.225rem spacing and 0.5rem radius; text-2xl page titles; full-width line tabs; table rows on the --hover grey; thin scrollbars shown while scrolling; the pointer cursor on anything clickable; navigation sections and menu counts through NavigationMenu's badges; a small badge size; lifting home cards; a restyled inbox list; centered Appearance options; and Chinese taglines and sign-in descriptions without full stops. Examples now carries everything Default has in its shell. UI Library: the long-text item, an inline variant of property-fields, kanban board panning, drop highlighting and dark-mode contrast, small badges where tags sit beside words, and a preview that uses the template stylesheet. Skill: the --hover token, badge sizes, card lift, focus, long text (I14), menu counts (L8), and an upgrade check for merging tokens with their uses. * docs(app-skills): make the border opaque on a preset with a darker page The template's light border is translucent and tuned to its very light page. Found while rehearsing the upgrade on an application whose darker page made card frames fade out. * fix(templates): draw the sidebar's rules and the Appearance options in the general border The lines under the brand and over the sidebar footer, and the frames of the Appearance popover's presets, used a fraction of the border colour, so they read fainter than every other line. * chore: re-run quality checks The agents test shard failed on agent-runner's local-provider test, which this branch does not touch and which passes on v3-develop. * fix(templates): roomier navigation rows and a tinted current entry |
||
|
|
aefa4ac9cc |
fix(issues): lay out the issue page by its own width (#10720)
* fix(issues): lay out the issue page by its own width At 1280px with the AI assistant panel docked beside the page, IssueDetailLayout's side column and IssueHeader's actions were still switched by the viewport breakpoint, so the main column could shrink far below the breakpoint's assumption and the title was squeezed to a few characters. Switch both to a container query on the page's own width (`@4xl/issue-detail` for the side column, `@md/issue-header` for the header's actions), and collapse "Ask agent" and "Delete" to icon-only buttons with a tooltip below that width. * test(studio): align issue page checks with the 56rem breakpoint --------- Co-authored-by: Junyi <mytharcher@gmail.com> |
||
|
|
ddfe1b1874 |
feat(studio): replace workflows with a project manager and agents discovered from runners (#10786)
* feat(projects): replace workflows with six fixed issue statuses * feat(agent-runner): report tool models, requeue busy workspaces and run read-only steps * feat(agents): discover agents from runner reports and remove online agents * feat(ui-library): drop online agents, model choice, checklists and approvals * feat(studio): add the project manager and fixed statuses on the server * feat(studio): agent page, project manager settings and issue progress in the client * test(studio): cover the project manager, discovered agents and checks-passed signal * docs(studio): describe the project manager, fixed statuses and discovered agents * chore: drop the just-bash catalog entry the agents plugin no longer uses * test(studio): page waiting decisions without approval requests * fix(studio): allow new issues for the project manager in the direct-write quota, and scope its settings to API keys * fix(agents): publish the model catalog export instead of the removed presets * fix(studio): offer only the project manager as an agent executor, keep demo runtimes offline and fix the e2e flows Executor pickers read the kinds' executor candidates, a new issue left to the project manager is not flagged as given to an agent, people talk only to agents discovered from runners, and the e2e tests no longer rely on demo runtimes being online. * fix(studio-cli): ship the updated nb-studio Skill * feat(agent-runner): remove read-only work directories after their run, and build artifacts of idle ones A read-only run's directory goes when the run ends. Once no run has used a working directory for 12 hours, its node_modules, .next and .turbo directories go (configurable with config set artifact-ttl and artifact-patterns), never in a directory a run holds. |
||
|
|
02f37e4fba | fix(ui-library): prevent approval branch content overflow (#10781) | ||
|
|
693e43d86b |
ci(skills): distribute v3 skills on source updates (#10769)
* ci(skills): distribute v3 skills on source updates * refactor: rename app plugin development skill |
||
|
|
8de421ab4b |
docs(workflow): add process diagrams and invoicing walkthroughs (#10727)
* docs(workflow): add process diagrams and invoicing walkthroughs * docs(approval): remove duplicate overview routes |
||
|
|
eea95a7b64 |
feat(app-template-default): establish NocoBase branded default theme (#10607)
* feat(app-template-default): establish NocoBase branded default theme * test(app-template-default): exercise settings select interaction * fix(templates): synchronize branded shared UI sources * feat(app-template-default): refine brand visuals and theme upgrade guidance * fix(templates): exclude hub changes from branding update * feat(app-template-default): add development theme preview lab * revert: remove local theme preview lab from branding PR * test(app-plugin-file): include spinner dependencies in registry fixtures * fix(app-template-default): allow custom dialog layout overrides |
||
|
|
5aae93b824 |
feat(agents): filter run transcripts and event queries (#10630)
* feat(agents): filter run transcripts and event queries * fix(ui-library): clarify transcript filter integration * fix(agents): preserve transcript scrolling and index event filters * docs(agents): streamline transcript filter integration notes |
||
|
|
c796cb909b | feat(app-client)!: remove settings and dev route surfaces, Hub and AI employee (#10642) | ||
|
|
97d94dc4cd |
feat(agents): record and show where each run attempt executed (#10594)
* feat: expose run execution history and actual models * fix: distinguish observed execution facts and protect machine details * fix(agents): order execution history migration after tool slots * docs(agents): describe model requirements without internal task references * fix(agents): rename the attempt snapshot type to avoid the run execution mode v3-develop now exports RunExecution as the 'auto' | 'mine' execution mode of run requests, so the per-attempt claim snapshot becomes RunExecutionSnapshot, with the AgentsRunExecutionSnapshot schema ref. * test(agents): keep attempt history consistent when a team-only claim is refused * fix(agents): retain the latest effort observation across reports |
||
|
|
0fd253898d |
feat(agents): answer with an online agent when no runner can take a chat (#10593)
* feat(app-plugin-agents): answer with an online agent when a runner agent cannot run Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * fix(ci): align chat fixtures and allow cold route imports Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * fix(app-plugin-agents): require an available model for online fallback * fix(agents): align fallback copy and consolidate model regressions * fix(agents): use claim eligibility throughout chat fallback * fix(agents): suppress repeated online fallback failure notices --------- Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> |
||
|
|
57c59a0c46 |
feat(agents): merge work per actor and keep team-only variables on team runners (#10591)
* fix(app-plugin-agents): merge work per actor and hand variables only to trusted runners Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * fix(app-plugin-agents): deliver run variables after a final trust check, and share claim eligibility * fix(app-plugin-agents): isolate variable access failures and restore undelivered claims * fix(app-plugin-agents): renumber the secrets-refused migration after the runner tool slots one * fix(app-plugin-agents): send variables with every run unless marked for team runners only * fix(app-plugin-agents): keep new wait and variable metadata optional * fix(app-plugin-agents): send wait reasons as codes with params and word them on the client * test(agents): describe claim regressions by behavior and use neutral examples * fix(agents): enforce team-only variables for jobs * fix(agents): expose job secret refusal to custom sources --------- Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> |
||
|
|
a695d1987f | chore(v3): use public npm and unify workflow naming (#10588) | ||
|
|
88bc9ebbfe |
feat(ui-library): add the approval-ui block (#586)
* feat(ui-library): add the approval-ui block Presentational components for an approval process: progress, timeline, route preview, parallel branches, receipts and an action bar with forms. They take data already shaped and translated for display and depend on no plugin. Includes a preview demo, its registry example and tests. * docs(app-skills): list the approval-ui block in the UI Library catalog |
||
|
|
bde3b877e0 | PM-75: Prepare client plugins for shadcn installation (#582) | ||
|
|
b8df35c1ad |
feat(agents): limit runner concurrency per coding tool (#575)
* feat(agents): limit runs per coding tool on a runner Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * feat(agent-runner): limit runs per coding tool with --slots Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * feat(agents): edit and show limits per coding tool on the runtimes page Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * chore: format and add the changeset for limits per coding tool Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * fix(agents): make the fields for limits per coding tool optional in shared types * fix(agents): align queue component with per-tool wait reason * feat(agents): one tools table per runtime, saved with its settings --------- Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> |
||
|
|
dc91aab7fd |
PM-74: Use package-local subpath imports in registry sources (#576)
* fix(registry): use package-local subpath imports Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * docs(registry): preserve package imports in plugin guidance * fix(registry): validate installed components in packed plugins * test(create-plugin): isolate offline dependency metadata --------- Co-authored-by: 张中合 <zhonghe.zeke@gmail.com> Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> |
||
|
|
10a17599f1 |
PM-34: fix(markdown): end bare URLs at CJK text and full-width punctuation (#566)
* fix(markdown): end bare URLs at CJK text and full-width punctuation Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> * chore(app-skills): regenerate the UI Library catalog for markdown-view Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> --------- Co-authored-by: Project lead <agent+studio-project-lead@studio.noreply> |
||
|
|
6162033060 |
fix(tests): open popups after their triggers are wired (#561)
* fix(projects): keep an invitation's row menu open when the list renders again The columns depended on the whole useMutation result, a new object each render, so every cell remounted. * test: open popups the way a user does A Base UI trigger is wired to its popup only once React runs the passive effects of the render that mounted it, so a bare fireEvent.click right after the trigger appears is dropped under load. Open popups with userEvent, fix the timing races this exposed, and cancel pending replies when the UI Library chat demo resets. * chore: add a changeset for the new test dependency |
||
|
|
68d4febbcc |
feat(plugins): add the agents, projects, knowledge and releases plugins (#554)
* Add the agents, projects, knowledge and releases plugins Four plugins for agent-run applications, the UI Library's agents and projects items, and the generated UI Library catalog of the application Skill with its check. * Wait on the sent attachment's link as it renders last in the chat test * Keep the demo chat's reply timers off window, so they outlive a test's environment quietly |
||
|
|
bc1e83ffac |
feat(plugins): update the plugins, templates and UI Library for the new runtime (#553)
* Update the plugins, templates and UI Library for the new runtime Device authorization, scoped API keys, service accounts, user invitations and preferences, secrets-backed credentials, the inbox and the cn package across the existing plugins, examples and the three templates, with the UI Library's auth, inbox, authorization and component items. * Declare the UI Library site's favicon * Use the NocoBase favicon on the UI Library site * Fix generated-app shell tests and the Hub's user deletion test Inline the authentication client in the templates' Vitest config so its guards share the test's react-router, and update the Hub test to the users plugin's new copy and spinner label. |
||
|
|
7e5b7d4e72 |
refactor(templates): build the sidebars from shadcn Sidebar primitives (#534)
* refactor(templates): build the sidebars from shadcn Sidebar primitives Replace the hand-rolled LayoutSidebar and NavigationTree in the default, examples and hub templates with shadcn's Sidebar, keeping the collapsed menu behaviour from #317: zero-delay tooltips, hover and keyboard-focus popovers with permission-filtered children, nested expansion, parent navigation and the selected group's highlight. components/ui/sidebar.tsx stays as the shadcn CLI writes it. The layouts customize it from outside: widths through the provider style in spacing units, a phone Sheet with a translated title rendered by app-sidebar.tsx, and a document keydown listener that keeps Ctrl/Cmd+B from reaching the provider's window listener. Claude-Session: https://claude.ai/code/session_01KLvKwu4oUSHnFgGAy3M4v2 * fix(templates): tidy the sidebar footer and add the edge rail Space the footer like the menu above it: the shield aligned to the first line, the slogan's two lines, then the name and version on their own truncated lines in the body font. In icon mode only the shield remains, with a tooltip carrying the same text. Add shadcn's SidebarRail with a translated label and title, passed as props that override the primitive's built-in "Toggle Sidebar". Claude-Session: https://claude.ai/code/session_01KLvKwu4oUSHnFgGAy3M4v2 * refactor(ui-library): split auth-ui into presentational auth components Replace the auth-ui block with four presentational registry components built from shadcn primitives: auth-forms (Field, InputGroup, Alert), auth-methods (Tabs, FieldSeparator, Button), auth-centered-layout and auth-split-layout. They call no plugin and take every string as a prop with an English default. The templates' sign-in, sign-up and password pages become application code that wires the forms to the authentication plugin's headless actions, translates them from client/locales, and keeps the NocoBase brand panel as the split layout's aside. The ui-library preview loads shadcn/tailwind.css and the shadcn Label so the data-attribute variants render. Claude-Session: https://claude.ai/code/session_01KLvKwu4oUSHnFgGAy3M4v2 * fix(ui-library): keep auth demo links inside their demo Claude-Session: https://claude.ai/code/session_01KLvKwu4oUSHnFgGAy3M4v2 * refactor(templates): install the auth registry blocks under client/extensions Claude-Session: https://claude.ai/code/session_01KLvKwu4oUSHnFgGAy3M4v2 |
||
|
|
7534fb6b99 |
refactor(templates): add shadcn/ui primitives on demand with an embedded shadcn/ui skill (#464)
* docs(skills): route frontend work through an embedded shadcn/ui skill The application development Skill now carries the shadcn/ui skill from shadcn 4.21.0, unchanged, under references/frontend/shadcn/, and references/frontend/references/shadcn.md says what to read there and where an application departs from it: `pnpm exec shadcn`, no `apply` or `--preset`, overlays as child routes, labels above inputs, and the English built into a few primitives translated. - Primitives are added on demand with `yes n | pnpm exec shadcn add`, which keeps installed primitives from being overwritten and lets a non-interactive run finish, then formatted with Prettier. - styling.md, form.md and the other topic references link to the skill instead of restating it; the worked example names the primitives each file needs on an **Add first** line. - The frontend handbook rework: the projects worked example split into one document per file, shell.md, the capture tool guide and the reviewer prompts. - Both .prettierignore files skip the vendored skill so a shadcn upgrade can replace it wholesale. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(app-template-default): ship only the primitives the shell uses Primitives are added with the shadcn CLI when a page first needs one, so every application, template and plugin starts from the same CLI output. The shadcn/ui skill embedded in the development Skill replaces the reference gallery. - Remove client/pages/reference/ with its tests, the 49 primitives that neither the shell nor the shipped compositions import, and use-mobile.ts. The template keeps button, calendar, dialog, dropdown-menu, input, label, popover, select, spinner, table, toast and tooltip. - Drop the devDependencies only those primitives used (recharts, cmdk, embla-carousel-react, input-otp, react-resizable-panels, @shadcn/react) and add cn, which registry primitives now import. - toast.tsx names its close button through actions.close, as dialog.tsx and spinner.tsx translate theirs; primitive-labels.test.tsx fails when an update brings the registry's English back. - DataTable takes showSelectedCount, so a table without row selection hides "0 of N row(s) selected". - Add the page test harness and application locale coverage tests; the client routes test pins page grants by their authz resource id. - AGENTS.md and CLAUDE.md send UI work to ui-workflow.md, list the shipped primitives, and describe adding the rest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(templates): ship only the primitives Hub and Examples use Hub and Examples follow Default: primitives are added with the shadcn CLI when a page first needs one, and the shadcn/ui skill embedded in the development Skill replaces the reference gallery. - Remove client/pages/reference/ with its tests and use-mobile.ts from both templates. Hub keeps the twelve primitives its shell and compositions use; Examples also keeps badge, card, field, separator, skeleton, textarea, toggle and toggle-group for its example pages. - Drop recharts, cmdk, embla-carousel-react, input-otp, react-resizable-panels and @shadcn/react, which no template imports now, and add cn, which registry primitives import. - Carry over Default's toast close label, DataTable showSelectedCount, the page harness, locale coverage and primitive label tests, and the AGENTS.md and CLAUDE.md guidance, keeping each template's own route grants and wording. - Add the changeset for all three templates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(skills): name the primitives each template ships The frontend handbook said the template ships twelve primitives, which holds for Default and Hub but not for Examples. shadcn.md now lists the eight Examples adds, and frontend-dev.md and example.md refer to the primitives the shell uses instead of a count. Add the changeset for the embedded shadcn/ui skill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(skills): open records in place, add the back button and the dashboard template A review of a customer-service application built from the handbook found records opening over the wrong page, a row's Edit opening the drawer as well, a back button among the page actions, an unaligned table in a card and unsortable date columns. The handbook now says a record opens over the page the user is on (I9), declares the drawer under every page that opens it, gives a row's Edit its own route, puts BackButton above the title (L6), makes date and number columns sortable (T1.8), and adds a dashboard template (T5) with a worked example. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(templates): add BackButton and keep the page count on one line BackButton is the way back from a page below another one: a link above the heading that leads to the parent route with the query string and replaces the history entry, as closing a route overlay does. It stands on its own, without PageHeader. DataTablePagination gives the page count a minimum width, so the Chinese label no longer wraps. RouteChildPage and the UI Library describe leaving by the back link instead of breadcrumbs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(skills): show the success path in the unsaved-changes example A generated application hit this exact bug: the edit dialog's save cleared neither the dirty flag that beforeClose reads nor the form's report, so closing after a successful save asked to discard the just saved changes. The overlay.md section 2.5 example now carries the whole flow: a stable onDirtyChange callback, an EditProjectBody whose onSubmitted clears the flag before onSaved and close, and the imports that go with it. The frontend handbook's Common mistakes list gains the matching entry. * fix(templates): keep the Switch and pie chart in proportion in the compact theme * docs(app-skills): compare the whole design at acceptance and require consistent navigation icons The acceptance review's D classification was scoped to the design's numbered criteria, so a design's structural declarations — routes, navigation entries and their icons, permissions, the component list and states — were only compared with the code when they happened to be criteria. A trial feature lost two menu icons this way and the acceptance pass did not catch it. D now compares the whole design file with the code; the design template requires every declaration in sections 2–4 to map to a criterion or be marked explicitly as not a criterion; and the review checklist plus page.md require navigation icons to be consistent within a group. * docs(app-skills): open a record's detail under the page that opens it I9 covered drawers and dialogs only, so a page that referenced a record whose detail is a page (a payment list's expense number) linked into the other module's route: the page the user was on disappeared, the menu highlight moved, and Back landed elsewhere. The page version of "the same drawer over another page" was undocumented, and page.md told every record page to hard-code `to`, which blocks reusing one page module under several parents. I9 now covers a covering child page as well, child-routes.md gains "The same detail page over another page", page.md limits `to` to a page with one parent, and the common-mistakes entry names the detail page next to the overlay URL. * fix(templates): make BackButton a muted text link * refactor(templates): group the DataTable components in one directory * docs(app-skills): show a cut-off table cell's full content on hover Guideline T1.11 requires a table cell that is too narrow for its content to show the full content on hover. table.md gives the pattern: the cut-off content in a Popover whose trigger opens on hover, since a Tooltip does not work well here. A cell does not wrap and the table widens to fit it, so the pattern applies only where a column limits its width. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(app-skills): treat the worked example as a reference, not code to copy Agents copied the projects example verbatim, carrying its names, fields and fixed values into features they did not fit. The frontend handbook now says the examples show the rules rather than the feature to build, and names the projects-domain values to decide again. example.md and styling.md no longer tell an agent to copy the files a task depends on; only session-expired-alert.tsx and use-url-search.ts, which are shared infrastructure, are still copied unchanged. The acceptance review also checks the other direction of design conformance: names and copy keys from the projects domain, fields, columns, filters or actions the design does not declare, and example values that do not fit the feature's data are reported as D issues. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(app-skills): end a cut-off cell in an ellipsis and reveal it in a tooltip A generated articles table clipped long titles mid-character and showed "release-notes" as "elease-note": the title used line-clamp in a cell that never wraps, and the tags put truncate on Badge, a flex element that shows no ellipsis and loses both ends of its centered text. Guideline T1.11 now requires the ellipsis and a reveal on hover only when the content is cut off. table.md shows text and links, the name column included, in a Tooltip whose onOpenChange cancels it when the value fits; the tooltip trigger leaves a Link a link, which a Popover trigger would turn into a button. Styled content such as a Badge stays in a Popover, since a badge is unreadable on the inverted tooltip. It also says where truncate works and that line-clamp does not belong in a cell. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(templates): line DataTable up with a card by itself A generated analytics page put a DataTable in a CardContent with px-0, as the handbook's "Table in a card" said, but not the cell padding that went with it. Its own border then sat on the card's edge, a strip was left below it, and the text started to the left of the card's title. The rule lived in four places and was still only half applied, because it asked the agent to pick a different component and hand-write selector classes. DataTable now does it: inside a CardContent it drops its frame, reaches the card's edges and pads its first and last cells with --card-spacing, and a CardContent still given px-0 keeps working. The handbook builds a card's short list from DataTable with plain headers and no pagination, the dashboard example uses it, and guideline T1 says it covers list pages while a short list in a card follows T5.3, which is where the design had picked up sorting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(app-skills): record every review checklist item in the review record Both reviews of a generated content application were non-independent, since the environment could not start subagents, and neither checked T5.3: the design review raised only B1-B4 and S1-S4, and the acceptance review widened a clipped card without asking why the table sorted. The prompts already said to go through the checklist item by item, but the record kept only the items that failed, so a skipped item looked the same as a passed one. The review record now has a "Review checklist" section with one row per checklist item: pass, fail with the issue it raised, or not applicable with the reason. Both prompts and the checklist's own introduction say to fill it in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(app-skills): validate forms on submit, not as a field loses focus A field error flashed for a frame whenever a dialog was closed without saving. Guideline T3.3 validated a field when it lost focus, so the handbook and its examples set useForm's mode to 'onTouched'; clicking Cancel, the close button or the backdrop takes the focus off the field first, and the error rendered while the dialog was fading out. T3.3 now validates on submit, and a form closed without submitting shows no error. The handbook and the four examples leave mode at the default 'onSubmit', and it explains why the blur-based modes do not fit. After a failed submission a field is still revalidated as it changes, so its error clears once it is corrected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(templates): let a child page inside another one cover it whole A covering page under a tab of a record's page can only render through the tab's outlet, inside the record page's RouteChildPage. That layer both positioned and scrolled, so the nested layer resolved inset-0 against it and scrolled out of sight with its content: in the recruitment application, after the candidate page had been scrolled 292px, the offer page opened at top -240 and showed only its footer over the candidate's details. RouteChildPage is now two elements, the way the layout's content area is: the outer one positions and never scrolls, the inner one scrolls, with overscroll-contain so scrolling stops at the layer. A layer rendered inside another one anchors to that layer's outer element and covers it whole. Inside another layer it also makes everything around it inert up to that layer's scrolling element — the record page's back link, header and tab bar — not only its own siblings. The layer carries data-slot='route-child-page'; the props are unchanged. The three templates and the UI Library registry item carry the same file. The templates' AGENTS.md add that an overlay a page's header opens on a page with tabs is declared under every tab and linked through the current tab. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(app-skills): open a page header's overlays over the tab being shown A review of the recruitment application found a record page whose header opened its edit dialog at /candidates/80/edit while the user was on /candidates/80/interviews. The handbook said a record opens over the page the user is on, but not that on a page with tabs that is the tab, and its two examples — the drawer with its stacked edit dialog, and the record page with tabs — never met. A link with a bare `edit` resolves against the route that renders it, not the URL on screen, and the header belongs to the page's route: the dialog replaced the tab in the page's outlet, and closing it went to the page's URL, which redirected to the default tab. - Guidelines T2.1, I1, I6 and I9 define the view the user is on, the tab included, and I9 gives the test: an overlay's URL minus its own segments is the URL it was opened from, and closing returns there with no redirect. - child-routes.md declares the header's overlays under every tab through customerHeaderRoutes(tab) inside customerDetailRoutes(owner), links the header through the tab read from the URL, and has each tab pass the page's context on to its outlet. page.md explains what a relative link resolves against, with a table of the cases. - Going back restores the page underneath exactly (L6): links carry its whole query string down, a view below another one names its own parameters apart (table.md), and the way back removes them with withoutParams (example/url-search.md). child-routes.md no longer advises dropping the current page's filters when linking to another page's record, which lost them on the way back. - example/detail-page-tabs.md is the complete page, a tab, a test that opens the header's "Edit" from every tab and goes back, and the route test helper; its code was compiled, linted and tested inside the default template. - The review checklist, overlay.md, testing.md, frontend-dev.md and the run and design templates check overlays opened from a view other than the first one a page shows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(templates): add DataTable and DatePicker from the UI Library on demand The templates no longer ship DataTable or DatePicker, or the calendar, select and table primitives only they used. Both are UI Library items now, added with `shadcn add @nocobase/data-table` or `@nocobase/date-picker` when a page first needs one. Examples keeps select and table for its own pages, and Hub keeps react-day-picker, which app-plugin-hub requires as a peer. The dataTable and datePicker locale keys stay, so an item added later is translated at once. - ui-library publishes data-table: DataTable and its column header, pagination and view menu as one item of four files under client/components/data-table/, with a preview demo and the dropdown-menu, select and table primitives it renders with. - date-time-picker declares the calendar, popover and react-day-picker that the date-picker.tsx it installs imports; without calendar in the templates, installing it alone no longer compiled. - ui-library gets Vitest. The DataTable and DatePicker tests move there from the templates and render the registry sources against the preview's primitives; Quality runs them on every pull request and the UI Library workflow before it publishes. - The development Skill adds the items on the worked example's Add first lines and says which of the CLI's package.json changes to undo; the upgrade Skill covers an application that still has the old copies. - The pending changesets that described a data-table directory in the templates now describe what ships. * refactor(templates): drop the unused Typography components client/components/typography.tsx held the class strings from the shadcn Typography guide for hand-written long-form text. Nothing in the templates or the plugins imported it, and article content usually comes from Markdown or rich text, which these components cannot style. The templates' AGENTS.md and the development Skill no longer list it. * feat(ui-library): publish BackButton and keep it preinstalled in the templates Make the UI Library the source of truth for BackButton, as it already is for PageHeader and the route overlays. - ui-library: add the back-button component item (back-button.tsx, its registry entry, a Navigation preview demo, and a test that renders it in the strict runtime built from the components README), document it in the components README with its navigation.back key, and use it in the RouteChildPage demo instead of a hand-written back link. - templates: keep client/components/back-button.tsx as an exact copy, checked by tests/scripts/template-ui-library.test.mjs, and name BackButton among the UI Library components in AGENTS.md. The component itself is unchanged, and each template keeps its own back-button test, which is the one check that the template's own locales carry the key. - MAINTAINING.md and USAGE.md list back-button among the preinstalled components, and MAINTAINING.md records navigation.back as the one exception to item-prefixed keys: it predates the item and pairs with the templates' navigation.breadcrumb. - The development Skill's styling reference now says which composed components are preinstalled from the UI Library and which are the template's own, instead of saying the CLI cannot add any of them, and the plugin Skill lists back-button among the items a plugin copies. * feat(ui-library): add a ConfirmDialog item built on alert-dialog ConfirmDialog confirms one action in an alert dialog the page opens from its own state. It runs the action: while a returned promise is pending the confirm button shows a spinner and holds the focus, both buttons are disabled and Escape is ignored; resolving closes the dialog with onOpenChange(false, 'confirm'), and a rejection or a returned { error, retryable } keeps it open with the error inside it. Cancel holds the initial focus, and focusAfterConfirm names where focus goes after a success, when the opener has often gone with its record. A result is reported to the onOpenChange of the latest render, and one that arrives after the caller closed or unmounted the dialog is dropped, so a handler whose close meant cancel is not called with stale state. A ref, not render state, keeps two clicks from running the action twice. The preview gains the alert-dialog and spinner primitives, a demo with a slow, a failing and a refused delete, and the item's tests render it in the strict i18n runtime built from the README's Translations table. * docs(app-skills): fix the frontend guidance the PR review found wrong - The toast examples in complete-button.md and public-switch.md, and the 401 rule in api.md, used actionProps, left over from the Base UI toast API; the toaster's option is action: { label, onClick }. - ui-workflow.md's development step still said to copy the worked example, as did frontend-dev.md and i18n.md in passing; they now say to write the feature's files from its design and copy only what a document calls shared infrastructure. i18n.md no longer lists the extra shared keys twice with different wording. - The customer page test in detail-page-tabs.md assumed a mocked i18n client and queried keys; it renders in the strict test runtime with the application's locale files and queries the wording. The document also says detail/edit.tsx has to be written before the test imports it, with the customers.form keys copy.md does not list, and no longer claims the test checks what only the route test can. - project-form.md and list-page.md name the select primitive they import, and server-table.md says what it needs and names data-table/index.tsx. - The end-to-end guidance and the screenshot tool say what a Hub application sets up first, since the Hub template has no Playwright. - shadcn.md no longer claims the application installs CLI 4.21.0. - The docs site's child page example leaves by BackButton, says why a deeper outlet sits beside the layer as the component now behaves, and its shadcn add example no longer offers to overwrite the translated dialog primitive. - form.md's create page is the frame to follow, not to copy. * docs(app-skills): require RouteChildPage for a child route that is a page of its own A generated application declared its article editor as a child route of a dashboard and of a list and returned a bare PageContainer, so the editor rendered at the parent's Outlet below the dashboard instead of covering it. The handbook implied the rule without stating it. - child-routes.md, page.md, form.md and frontend-dev.md state that only tab content renders inline and a page of its own returns RouteChildPage, including a form page shared by several parents. - testing.md adds a covering child page test: the parent's heading sits in an inert element, which fails for a page rendered inline. - The template AGENTS.md files carry the rule, since they are always read. - The UI Library README and the docs site place the parent's Outlet at the end of its PageContainer, as the handbook does. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
9c5d0c29d1 |
fix(templates): resynchronize auth-ui with the UI Library (#508)
* fix(templates): resynchronize auth-ui with the UI Library The templates' client/extensions/nocobase-auth-ui/ had drifted from the library it is meant to be a copy of: the library lacked the sign-up link switch the templates' PasswordLoginForm gained with defineAuthConfig, and the templates' copies lacked the .js import extensions and the block's locales/. - The library's PasswordLoginForm takes showSignUpLink, defaulting to useSignUpAvailable() from the authentication plugin's client export, and the preview stands in for that export. The item now requires @nocobase/app-plugin-authentication ^1.0.0-beta.23; its ^0.1.0-beta.20 range matched no 1.x release, so installing the item downgraded the plugin to 0.1.0-beta.20. - Every template carries the item's files exactly, locales/ included, and client/locales spreads them ahead of the application's own keys instead of repeating them. The merged resources equal the previous ones key for key, in both languages. - tests/scripts/template-ui-library.test.mjs now checks auth-ui, so a template copy cannot drift from the library again. * fix(templates): teach the Skill the auth-ui locales and drop the stale README Follow-ups from review of the auth-ui resynchronization. - The development Skill's copy reference said to add a language by copying client/locales/zh-CN.ts. That file now spreads the block's Chinese, which satisfies AppResource, so the sign-in pages stayed Chinese in the new language with no error. The steps now translate the block's locales/ as well, and the excerpts in i18n.md and theme.md show the application's keys in messages. The templates' AGENTS.md points there. - Each template kept an out-of-date README.md in the block's directory that the item does not install; it is gone, and the sync test now fails when a block's directory holds any file the item does not install. The changeset links the library's README instead. - MAINTAINING.md's example no longer shows the ^0.1.0-beta.20 range that made shadcn add downgrade the plugin. |
||
|
|
ae6389c9cf | feat(ui-library): add a same-day time range to DateTimePicker (#490) | ||
|
|
71361a843b | feat(ui-library): publish DatePicker and DateTimePicker as registry components (#488) | ||
|
|
91cc403007 |
feat(ui-library): publish the page and route overlay components as registry components (#426)
* feat(ui-library): publish the page and route overlay components as registry items Move PageContainer, PageHeader, RouteDialog, RouteDrawer, RouteChildPage and useRouteOverlay out of the templates' client/components/ and into the UI Library as two items, page-ui and route-overlay-ui, so applications and plugins install one maintained source instead of copying template files. - ui-library: add the items under registry/page/, conforming to the library's authoring rules (.js relative imports, explicit export types, tailwind-merge instead of @/lib/utils, prefixed translation key routeOverlay.close with shipped locales), preview demos, the dialog primitive, and generic preview wiring in website/app.tsx. - templates: ship byte-identical installed copies under client/extensions/nocobase-page-ui/ and nocobase-route-overlay-ui/, import from there, and add routeOverlay.close to client/locales/. - tests/scripts/template-ui-library.test.mjs fails when a template copy drifts from the library source. - Point the app development Skill, the plugin development Skill, the template AGENTS.md files, the docs site and the library's own guides at the new locations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(ui-library): publish one component per item, installed into client/components The page and route overlay components are single business components, not a complete feature, so they follow shadcn's convention for components rather than the block layout auth-ui uses. - Split page-ui and route-overlay-ui into page-container, page-header, route-dialog, route-drawer and route-child-page. route-dialog and route-drawer both list the route-overlay.tsx and use-route-overlay.ts they share, so installing either brings its implementation and the two keep one Context. - Target client/components/<file>, so templates keep their original paths and imports; revert the import rewrites across pages, tests, Skills and docs. - Document the two kinds of item in MAINTAINING.md and USAGE.md: a component installs into client/components/, a block such as auth-ui into client/extensions/nocobase-<item>/, with the rules on relative imports, translations, targets, READMEs, upgrading and removal that follow. - Components ship no locale files; routeOverlay.close is listed in the group README and each overlay item's docs. - Rework the preview demos per item and the sync test for component targets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(ui-library): merge class names with cn from @/lib/utils The components now live in client/components beside the templates' other components, which all merge class names with cn from @/lib/utils. Importing tailwind-merge directly made them the odd ones out. - Import cn from @/lib/utils in page-container, route-child-page and route-overlay, and list utils in their registryDependencies instead of depending on tailwind-merge. - Allow @/lib/utils as the second @/ import an item may use, map it in tsconfig.registry.json, and give the preview a real cn (the one shadcn's utils item generates) so the drawer's overriding classes merge there too. - Document the rule, the plugin rewrite, and keeping the templates' lib/utils.ts (it also exports assetUrl) when an item requests utils. - Teach the sync test that utils resolves to client/lib/utils.ts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f38ae767e1 |
docs(app-skills): move the frontend topic references into references/frontend/references (#415)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8240685485 |
docs(app-skills): replace the frontend references with a workflow, UI guidelines and handbook (#409)
* docs(app-skills): replace the frontend references with a workflow, UI guidelines and handbook Frontend guidance in the application development Skill now lives in references/frontend/. ui-workflow.md is where every change under client/ starts: it chooses between a full workflow (a design file reviewed once, then an independent acceptance review) and a quick change (edit directly, static checks only). ui-guidelines.md holds numbered Must/Should rules for designing and reviewing pages, and frontend-dev.md routes each task to a topic document with complete examples, written against the current default template. The workflow ships fill-in templates and a Playwright screenshot script. The eight references these documents replace are removed. i18n.md keeps server-side text, the offered languages, the default language and fallback; testing.md, server-routes.md, SKILL.md and each template's AGENTS.md and CLAUDE.md point at the new documents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(app-skills): declare the screenshot script's imports as optional peers `references/frontend/scripts/capture.mjs` ships in the package and imports `@playwright/test` and `prettier`, which `pnpm deps:check` requires to be declared. The script runs inside an application, which owns the copy it resolves (both are template devDependencies), so they are optional peers, with matching devDependencies here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
9e8fc3edd3 |
fix(ui-library): sync auth-ui, check items as plugins compile them, and document the library (#399)
* fix(ui-library): sync auth-ui, check items as plugins compile them, and document the library Bring the auth-ui item up to date with the copies the templates ship. Those gained translations in #264 while the registry source kept hard-coded English, so `shadcn add @nocobase/auth-ui` installed an older version than any template carried. The item now declares @nocobase/i18n. - Relative imports inside items carry the .js extension. A plugin compiles installed source with NodeNext, which rejects an extensionless import; an application's bundler resolves either form. - tsconfig.registry.json compiles the registry sources with NodeNext against the real workspace packages. tsconfig.json no longer maps the authentication plugin's actions to the preview's mock, so both programs check the items against the plugin's real exports and the mock is typed from them; only the Vite build swaps it in. A plugin change that breaks an item now fails typecheck in that plugin's pull request. - The package is linted with the rules a plugin uses. The preview's shadcn primitives get the relaxations the Portal configuration gives an application's, and the two problems the rules found in the preview, a synchronous setState in an effect and a fetch that was never aborted, are fixed. The UI Library workflow lints before it publishes, and the pre-commit hook lints the directory with its own configuration. - The preview mounts an i18n runtime, as an application does, so the translated items render without react-i18next warnings. - MAINTAINING.md and USAGE.md document maintaining the library and installing its items into applications and plugins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(ui-library): ship auth-ui's translations with the item The item's strings were translatable, but the translations lived only in the templates' own locale files, so any other consumer had to copy the keys by hand and could not tell when an upgrade added one. - auth-ui ships locales/en-US.ts and locales/zh-CN.ts, listed in its files. en-US exports its shape as a type and zh-CN is annotated with it, so typecheck fails on a key either one lacks or adds. - The item's docs, README and the usage guide describe merging the files into the consumer's locale resources, which installing does not do, and MAINTAINING.md makes shipping every key a rule for items. - i18n:check also scans ui-library/registry/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * revert(ui-library): leave the i18n:check scan to #400 The change that adds ui-library/registry/ to i18n:check now lives in #400, next to the parser fix that makes it effective, so the two pull requests no longer edit the same lines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ui-library): address review findings - The documented merge of an item's locales into a plugin's en-US.ts failed the plugin's declaration build with TS9015, because isolatedDeclarations cannot infer an object built with a spread. The item README now shows en-US annotated as `typeof authUi & typeof messages`, and USAGE.md says the merged file needs it. - The preview's theme effect toggled only the `dark` class, leaving the inline color-scheme index.html sets on load stale after a toggle; it now updates both. - ESLint relaxed only the first of dev-config's two shadcn registry blocks, so adding the chart primitive the documented way failed lint. dev-config now exports createShadcnRegistryConfig(root), which the Portal factory uses for client/ and ui-library uses for website/, so the list is no longer copied. - tsconfig.registry.json compiled items with the ESNext library and without noUnusedLocals, unlike the plugins that install them; it now uses the create-plugin template's lib and noUnusedLocals. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
7264cb162a | ci(ui-library): inline the OSS target in the workflow (#384) | ||
|
|
35ebdb0f2e |
ci(ui-library): publish the registry to OSS and point templates at it (#347)
* fix(templates): update UI registry URL * ci(ui-library): add OSS publishing workflow * ci(ui-library): read OSS bucket and region from secrets * ci(ui-library): derive registry checks from the index * ci(ui-library): simplify build output verification * ci(ui-library): check the built favicon * ci(ui-library): typecheck and check registry entries * docs(ui-library): translate the deployment guide * fix(ui-library): match the auth plugin beta range |
||
|
|
f17f3a6b57 |
refactor: authentication services and UI registry integration (#197)
* refactor(authentication): compose Better Auth through service providers * refactor: simplify application configuration * refactor(authentication): remove refine client adapter * refactor(authentication): move auth UI registry to ui-library * fix CI compatibility after develop merge * fix: sync hub template lockfile * fix: restore template runtime compatibility * fix: repair CI after configuration merge * fix: finish CI cleanup after registry move |