Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
298 commits
Select commit Hold shift + click to select a range
39b4334
Make Pixi a single optional peer
woksin Aug 24, 2026
9c03755
Apply final review hardening
woksin Aug 25, 2026
fdf59cb
Complete re-review follow-ups
woksin Aug 25, 2026
7cb6547
Remove provider and toaster module cycle
woksin Aug 25, 2026
b720ae9
Honor explicit no-release pull requests
woksin Aug 25, 2026
9f04d70
Align Components public entry points
woksin Aug 25, 2026
0539609
Merge the Components 4 foundation into README work
woksin Aug 25, 2026
74e7602
Use type-only Storybook metadata import
woksin Aug 25, 2026
d377218
Bind no-release to the exact merged pull request
woksin Aug 25, 2026
2f7dd50
Align the Components 4 package README
woksin Aug 25, 2026
8fd5fe7
Make provider message spec self-contained
woksin Aug 25, 2026
5d8a488
docs: document setup-only root and equal-support capability profiles
woksin Aug 25, 2026
575b975
pi-agent: Implement setup-only root
woksin Aug 25, 2026
f1d881b
Rewrite provider-context identity fixture on react-dom/server
woksin Aug 25, 2026
c3fabfd
Add blocking CI jobs for the setup-only root package-graph gates
woksin Aug 25, 2026
ea10f78
Make root architecture spec self-contained
woksin Aug 25, 2026
9eb8ae0
Correct advanced component capability documentation
woksin Aug 25, 2026
a228548
Add root-namespace-import removal codemod
woksin Aug 25, 2026
0b2c124
Make no-root-barrel-import namespace-aware with a safe autofix
woksin Aug 25, 2026
5e48f3a
Register Codemods as a workspace and point the README at it
woksin Aug 25, 2026
e830ec5
Fix unsupported-require fixture's stale eslint-disable rule id
woksin Aug 25, 2026
6ab25ca
Align migration tooling and capability documentation
woksin Aug 25, 2026
a30f0e2
Run codemod verification in JavaScript CI
woksin Aug 25, 2026
a1e4da5
Restore the claim-safe Components MDX landing
woksin Aug 25, 2026
2b18c9b
Finalize root import migration tooling
woksin Aug 25, 2026
b9b6b5d
Document setup-only lint and codemod contracts
woksin Aug 25, 2026
1c09974
Clarify setup-root dependency graph contract
woksin Aug 25, 2026
7d6024f
Guard migration guide namespace coverage
woksin Aug 25, 2026
073e1d7
Type-check both spatial package entries
woksin Aug 25, 2026
4d80439
Enforce aggregate stylesheet budgets
woksin Aug 25, 2026
a51fcb2
Guard setup-root allowlist against source
woksin Aug 25, 2026
0ee90b2
Publish the root import migration codemod
woksin Aug 25, 2026
de9acc4
Apply repository formatting
woksin Aug 25, 2026
a2c0e93
Harden the published codemod CLI
woksin Aug 25, 2026
654bd47
Cancel superseded pull request workflows
woksin Aug 25, 2026
d6e75bc
Merge remote-tracking branch 'origin/feat/react-aria-foundation' into…
woksin Aug 25, 2026
04a7017
Harden Components 4 release boundaries
woksin Aug 25, 2026
d2ffdc0
Merge Components 4 hardening into public surface
woksin Aug 25, 2026
174dc2d
Merge current main into Components 4
woksin Aug 25, 2026
e296aaa
Align packed ESLint probe with current toolchain
woksin Aug 25, 2026
4874a6d
Clarify Canvas DOM and Pixi reality
woksin Aug 25, 2026
0303cb7
Fix nested Toolbar layout presentation
woksin Aug 25, 2026
1241f50
Add exhaustive Storybook browser coverage
woksin Aug 26, 2026
db9fcee
Strengthen Components 4 migration verification
woksin Aug 26, 2026
aa3d878
Merge main into Components 4 foundation
woksin Aug 26, 2026
42ac43a
Stabilize ChatBubble hover story
woksin Aug 26, 2026
b9ff356
Use synthetic public example data
woksin Aug 26, 2026
ab9d2a2
Merge current main into Components 4
woksin Aug 26, 2026
322c9b9
pi-agent: Implement package guards
woksin Aug 26, 2026
1f34d6a
Merge current main into Components 4 (PR #189: region auto-membership…
woksin Aug 26, 2026
fb6614d
pi-agent: Weave PR 189 into V4
woksin Aug 26, 2026
38e1668
Fix packed-production cascade-layer guard rejecting Tailwind's leadin…
woksin Aug 26, 2026
2bbda31
Give CommandForm field extractValue an (event: unknown) contract
woksin Aug 26, 2026
2c7ecd1
Convert Cratis pt attributes at the React Aria component boundary
woksin Aug 26, 2026
007cf95
Fix Storybook story types surfaced by strict TypeScript
woksin Aug 26, 2026
7a7cf86
Enable strict TypeScript and noImplicitAny for production compile
woksin Aug 26, 2026
204373d
Harden SchemaEditor against malformed schema objects
woksin Aug 26, 2026
81a4bb1
Restrict reusable workflow secret forwarding
woksin Aug 26, 2026
9804d4e
feat(codemods): rewrite named root re-exports, not just imports
woksin Aug 26, 2026
0a1b3fa
docs(components-4): explain the why, fix migration-guide drift
woksin Aug 26, 2026
c76cbf2
fix(components-4): keep id-less CanvasItems anonymous to region membe…
woksin Aug 26, 2026
b0e756b
Stabilize Storybook tests for Canvas messaging
woksin Aug 26, 2026
0a75679
Keep Canvas registry metadata updates observable
woksin Aug 26, 2026
12f1f82
Format Canvas identity specs
woksin Aug 26, 2026
968d778
Reduce external link-check request bursts
woksin Aug 26, 2026
89fe724
Exclude immutable self-links from external checks
woksin Aug 26, 2026
52475c5
Exclude stable organization guidance from link checks
woksin Aug 26, 2026
539140b
Add dedicated Display component stories
woksin Aug 26, 2026
af361b0
Fix DataTableCore Date mutation and row-activation index contract
woksin Aug 26, 2026
3700784
pi-agent: Fix DataTable contracts
woksin Aug 26, 2026
01e09ee
pi-agent: Correct ESLint guidance
woksin Aug 26, 2026
4ce11bb
Clarify onBeforeExecute fallback semantics
woksin Aug 26, 2026
d4b2419
pi-agent: Fix date component contracts
woksin Aug 26, 2026
cca2dc0
pi-agent: Fix SchemaEditor semantics
woksin Aug 26, 2026
77cef62
Honor time-bearing bounds in DatePicker Today action
woksin Aug 26, 2026
82f979b
Preserve and enforce published API documentation
woksin Aug 26, 2026
d3d0c15
Validate the complete supported SchemaEditor shape
woksin Aug 26, 2026
8ba36a7
Align ESLint rule table formatting
woksin Aug 26, 2026
9652844
Cover const-enum members in API docs gate
woksin Aug 26, 2026
4bee0a0
pi-agent: Finish PivotViewer fixes
woksin Aug 26, 2026
2fc9500
Harden concurrent PivotViewer result handling
woksin Aug 26, 2026
e382165
Format final documentation verification sources
woksin Aug 26, 2026
f883247
Harden Pivot property-path and edge-case coverage
woksin Aug 26, 2026
e47dfe0
Reject reserved prototype keys in SchemaEditor
woksin Aug 26, 2026
d308327
Restrict table and pivot property paths to own data
woksin Aug 26, 2026
2e20f1f
Format final property-path hardening
woksin Aug 26, 2026
895ee82
pi-agent: Merge main Chat into V4
woksin Aug 27, 2026
a96a5a8
pi-agent: Finish Chat main reconciliation
woksin Aug 27, 2026
edd3a84
pi-agent: Certify Chat and disable publish
woksin Aug 27, 2026
a448b63
Bound Chat's upstream NodeNext declaration exception
woksin Aug 27, 2026
2e5a3b7
pi-agent: Extract shared Chat kit
woksin Aug 27, 2026
30c1abb
Fix Chat semantic lists and theme contrast
woksin Aug 27, 2026
5247f94
Add Chat root namespace migration
woksin Aug 27, 2026
b42e82a
Use local migration guide links
woksin Aug 27, 2026
4475eb4
Pin React Aria dependency resolutions
woksin Aug 27, 2026
67bfe33
Require immutable installs in JavaScript workflows
woksin Aug 27, 2026
e3ee83e
Block direct package updates
woksin Aug 27, 2026
9c9f028
Pin patched serialization dependency
woksin Aug 27, 2026
b146972
Use canonical Arc documentation link
woksin Aug 27, 2026
20edad6
Treat link-check rate limits as transient
woksin Aug 27, 2026
1eb42ce
Document component architecture decisions
woksin Aug 27, 2026
b56dac5
Add authoritative component parts manifest
woksin Aug 27, 2026
79835d6
pi-agent: Implement Button semantics
woksin Aug 27, 2026
8824df7
Complete Button semantic compatibility
woksin Aug 27, 2026
05565ca
Specify Button semantic mappings
woksin Aug 27, 2026
79184b5
pi-agent: Normalize public change callbacks
woksin Aug 27, 2026
9ee3342
Remove accidental callback formatting churn
woksin Aug 27, 2026
bd7dbae
pi-agent: Complete recovered callbacks
woksin Aug 27, 2026
3a35dd0
pi-agent: Finalize callback recovery
woksin Aug 27, 2026
e1ee21a
Add PivotViewer callback coverage
woksin Aug 27, 2026
29c5a9a
Add Toolbar and Display state attributes
woksin Aug 27, 2026
83d06d4
Add authoritative component state attributes
woksin Aug 27, 2026
74653ab
pi-agent: Add data-view state attributes
woksin Aug 27, 2026
2fba3a9
Fix ColumnFilter pressed interaction spec
woksin Aug 27, 2026
5eb299f
pi-agent: Add CommandForm state attributes
woksin Aug 27, 2026
b046d51
Finalize authoritative field state propagation
woksin Aug 27, 2026
ded7a5d
Preserve CommandStepper busy navigation behavior
woksin Aug 27, 2026
a768973
Add semantic Components migration codemods
woksin Aug 27, 2026
d80efe9
Document semantic codemod migration order
woksin Aug 27, 2026
512f788
Format CommandStepper state coverage
woksin Aug 27, 2026
7ef57ae
Verify codemod output syntax
woksin Aug 27, 2026
45bc32c
Add canonical part state manifest verification
woksin Aug 27, 2026
aaafbc1
Record runtime-owned canonical states
woksin Aug 27, 2026
2307cdc
Lock semantic codemod binaries
woksin Aug 27, 2026
e3aeca3
Update histogram Storybook interaction
woksin Aug 27, 2026
a353dc2
Stabilize generated parts formatting
woksin Aug 27, 2026
4c34caf
Stabilize TimeMachine event collections
woksin Aug 27, 2026
2cfe0bc
Handle codemod processing failures
woksin Aug 27, 2026
3cb6b2e
Format TimeMachine state wiring
woksin Aug 27, 2026
1727e85
Add semantic text token for primary tone
woksin Aug 27, 2026
8ea4b30
Clarify native change-event handling
woksin Aug 27, 2026
7e9064e
Add unstable renderer D1 contracts and schema
woksin Aug 27, 2026
753351b
Run renderer contracts against final ESM
woksin Aug 27, 2026
665f426
pi-agent: Harden renderer graph gate
woksin Aug 27, 2026
1cef5cb
Add Common basic control primitives
woksin Aug 27, 2026
00a92e4
Document Common basic control contracts
woksin Aug 27, 2026
1527365
Format renderer graph verification
woksin Aug 27, 2026
174217a
Add standalone basic-control renderer slots
woksin Aug 27, 2026
e32862e
Add renderer provider resolution context
woksin Aug 27, 2026
eafa405
Specify renderer provider resolution behavior
woksin Aug 27, 2026
662b26f
Defer renderer diagnostics until mount
woksin Aug 27, 2026
f040470
Allow React in renderer runtime boundary
woksin Aug 27, 2026
6f1a473
Preserve open renderer interfaces
woksin Aug 27, 2026
98d74e0
Keep zero-config renderer fallback silent
woksin Aug 27, 2026
a49df7b
Format renderer provider infrastructure
woksin Aug 27, 2026
86147a6
Keep renderer validation hook order stable
woksin Aug 27, 2026
1468016
Capture presentation DOM baseline
woksin Aug 27, 2026
8dff9ab
Extract presentation slot implementations
woksin Aug 27, 2026
65976e3
Route presentation components through renderer slots
woksin Aug 27, 2026
d5a4af5
Keep slot routing internal
woksin Aug 27, 2026
ce66955
Add React-free kernel lint boundary
woksin Aug 27, 2026
4f70672
Gate emitted kernel dependency closures
woksin Aug 27, 2026
051def4
Document repository kernel boundary
woksin Aug 27, 2026
6bdd766
Enforce DOM-free kernel declarations
woksin Aug 27, 2026
c43107a
Format kernel boundary integration
woksin Aug 27, 2026
7c41781
Capture atomic renderer DOM baseline
woksin Aug 27, 2026
899218d
Extract atomic slot implementations
woksin Aug 27, 2026
e9c7622
pi-agent: Self-host atomic renderer slots
woksin Aug 27, 2026
c9c376d
Remove unrelated E2 formatting churn
woksin Aug 27, 2026
107809c
Track extracted atomic part ownership
woksin Aug 27, 2026
ccbfd16
Keep React Aria portal imports external
woksin Aug 27, 2026
a85e92b
Add opt-in built-in renderer manifest
woksin Aug 27, 2026
16141be
Add renderer adapter conformance package
woksin Aug 27, 2026
466bbb3
Keep upstream JSX shim declaration-only
woksin Aug 27, 2026
0f64556
Satisfy conformance peer development graph
woksin Aug 27, 2026
d962b3f
Verify native form reset semantics
woksin Aug 27, 2026
5a691b9
Keep conformance versioning independent
woksin Aug 27, 2026
57f34f6
Strengthen renderer conformance evidence
woksin Aug 27, 2026
9192443
Make renderer conformance evidence fail closed
woksin Aug 27, 2026
a60a531
Format conformance review fixes
woksin Aug 27, 2026
c34bb94
Merge current main package updates
woksin Aug 27, 2026
4065d80
Update Arc public type exception metadata
woksin Aug 27, 2026
4d5d387
Exclude generated Storybook fonts from packages
woksin Aug 27, 2026
8868769
Verify package graph report output
woksin Aug 27, 2026
2995480
Add plain DOM renderer conformance fixture
woksin Aug 27, 2026
d43b86d
Document plain DOM ABI findings
woksin Aug 27, 2026
973760f
pi-agent: Implement private plain proof
woksin Aug 27, 2026
31b5dc9
Merge private plain DOM conformance proof
woksin Aug 27, 2026
4aebfa0
Tighten private plain renderer fidelity
woksin Aug 27, 2026
00fa666
Type-check conformance fixtures
woksin Aug 27, 2026
37a1b18
Point plain proof metadata at its fixture
woksin Aug 28, 2026
b25427e
Prepare Components before fixture type checks
woksin Aug 28, 2026
1a6d3d9
pi-agent: Implement MUI renderer package
woksin Aug 28, 2026
686dc88
Harden MUI adapter fidelity and packaging
woksin Aug 28, 2026
099e43c
Address MUI adapter review findings
woksin Aug 28, 2026
d98fca6
Format MUI adapter review fixes
woksin Aug 28, 2026
fc1a40d
Merge Material UI renderer adapter
woksin Aug 28, 2026
0bd134c
pi-agent: Implement PrimeReact 11 adapter
woksin Aug 28, 2026
d4ff6cf
Type non-secret renderer setup attestations
woksin Aug 28, 2026
98db6ea
Complete PrimeReact 11 adapter evidence
woksin Aug 28, 2026
e277fbd
Harden renderer setup attestations
woksin Aug 28, 2026
2753f17
Pass setup to direct MUI provider fixtures
woksin Aug 28, 2026
0c85436
Document renderer setup attestations
woksin Aug 28, 2026
b68817e
Bound PrimeReact evidence claims
woksin Aug 28, 2026
b84e062
Format PrimeReact review fixes
woksin Aug 28, 2026
64cee53
Merge PrimeReact 11 renderer adapter
woksin Aug 28, 2026
042aa3e
Merge current main discoverability updates
woksin Aug 28, 2026
5b8a80f
Format discoverability documentation
woksin Aug 28, 2026
7f0497a
Use canonical Components documentation link
woksin Aug 28, 2026
8a96985
pi-agent: Implement PrimeReact 10 adapter
woksin Aug 28, 2026
35064f4
Merge latest V4 checkpoint into PrimeReact 10 work
woksin Aug 28, 2026
792f259
Complete PrimeReact 10 adapter certification
woksin Aug 28, 2026
eadaedb
Merge current main value guidance
woksin Aug 28, 2026
3a37db3
Merge PrimeReact 10 renderer adapter
woksin Aug 28, 2026
03e626c
pi-agent: Implement isolated renderer Storybook
woksin Aug 28, 2026
30fad6d
pi-agent: Implement V4 release closure docs
woksin Aug 28, 2026
ca05de7
Complete renderer Storybook matrix certification
woksin Aug 28, 2026
34e9507
Reject traversal in Storybook smoke server
woksin Aug 28, 2026
dc6bc35
Merge dynamic renderer Storybook
woksin Aug 28, 2026
3ff55d3
Merge Components 4 release guidance
woksin Aug 28, 2026
e661780
Finalize Components 4 package compatibility
woksin Aug 28, 2026
7c4775c
Merge current main documentation badge
woksin Aug 28, 2026
341cdd3
Use locally verified renderer documentation link
woksin Aug 28, 2026
ed48110
Merge current main package updates
woksin Aug 28, 2026
63aa25d
Reconcile Arc 22.5 compatibility evidence
woksin Aug 28, 2026
7aa74b7
pi-agent: Add adapter boundary matrix
woksin Aug 28, 2026
7d83b28
Merge renderer adapter peer matrix
woksin Aug 28, 2026
04b04d2
Promote stable presentation renderer profile
woksin Aug 28, 2026
8892f97
Harden renderer adapter boundary evidence
woksin Aug 28, 2026
c029af1
Merge stable presentation renderer profile
woksin Aug 28, 2026
0c2227c
Harden stable presentation capabilities
woksin Aug 28, 2026
6edabc3
Complete stable renderer boundary validation
woksin Aug 28, 2026
d33bbfe
Add V4 compatibility and release safety contracts
woksin Aug 28, 2026
6530af7
Merge compatibility and release safety contracts
woksin Aug 28, 2026
6db2fac
Harden compatibility preflight windows
woksin Aug 28, 2026
bef7498
Adopt ESLint 10 React lint support
woksin Aug 28, 2026
8410004
Add source-candidate release evidence generation
woksin Aug 28, 2026
95a8943
Merge source-candidate SBOM evidence
woksin Aug 28, 2026
87cd6d7
Bind release evidence to clean commits
woksin Aug 28, 2026
3b9b09b
Format release evidence guard
woksin Aug 28, 2026
b4badcb
Document stable renderer slot contracts
woksin Aug 28, 2026
e0b0975
Use durable lowercase release policy path
woksin Aug 28, 2026
f42ea89
Improve Components V4 documentation contracts
woksin Aug 28, 2026
14ebdfc
Merge V4 documentation quality pass
woksin Aug 28, 2026
05a37a9
Clarify documentation evidence boundaries
woksin Aug 28, 2026
dbb7fe8
pi-agent: Review implementation architecture
woksin Aug 28, 2026
51e8bda
Merge V4 architecture hardening review
woksin Aug 28, 2026
d264275
Fix Components 4 migration tooling gaps
woksin Aug 28, 2026
84b61ff
Harden stable renderer manifest identity
woksin Aug 28, 2026
edb6154
Merge Components 4 migration quality pass
woksin Aug 28, 2026
c1abd1d
Improve Storybook coverage and renderer semantics
woksin Aug 28, 2026
86ff09e
Format renderer manifest review changes
woksin Aug 29, 2026
44e706b
Merge Storybook coverage audit
woksin Aug 29, 2026
ccff874
Type the renderer schema package export
woksin Aug 29, 2026
1d8f805
Harden the local Components quality gate
woksin Aug 29, 2026
580903c
Handle conditional package asset exports
woksin Aug 29, 2026
72307d8
Harden adapter metadata property checks
woksin Aug 29, 2026
961b435
Harden Storybook adapter schema checks
woksin Aug 29, 2026
e1faf46
Harden renderer schema verification
woksin Aug 29, 2026
3e2630f
Format hardened schema validators
woksin Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .ai/agents/backend-developer.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ Always read and follow the canonical rules in `.ai/rules/`:
- Slice type (`State Change`, `State View`, `Automation`, `Translation`)
- Domain requirements (what the slice should do)
- Any existing events from other slices this slice depends on
- The namespace root (read from `global.json` or existing source files, e.g. `Studio`, `Library`)
- The namespace root (read from `global.json` or existing source files, e.g. `Product`, `Library`)

---

## Process

1. **Determine the namespace root** by reading an existing source file to identify the convention (e.g. `Studio`, `Library`, `MyApp`).
1. **Determine the namespace root** by reading an existing source file to identify the convention (e.g. `Product`, `Library`, `MyApp`).
2. **Read existing slices** in the same feature to understand naming, existing concepts, and events you may reference.
3. **Create a single `.cs` file** at `<Feature>/<Slice>/<Slice>.cs` (under the app source root; an optional `<Module>/` may group the feature — there is **no** top-level `Features/` wrapper).
4. **Validate** by building Debug *and* Release (Debug regenerates the TypeScript proxies and compiles `#if DEBUG` spec code; build Release with `-p:CratisProxiesOutputPath=` to skip re-running proxy generation).
Expand Down
24 changes: 13 additions & 11 deletions .ai/agents/code-reviewer.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
---
name: Code Reviewer
description: >
Quality gate agent for Cratis-based projects. Reviews code against all
project instruction files, checking architecture conformance, C# and
TypeScript conventions, and vertical slice correctness before merge.
Quality gate agent for Cratis-based projects. Reviews code against all
project instruction files, checking architecture conformance, C# and
TypeScript conventions, and vertical slice correctness before merge.
model: claude-sonnet-4-5
tools:
- githubRepo
- codeSearch
- usages
- rename
- terminalLastCommand
- githubRepo
- codeSearch
- usages
- rename
- terminalLastCommand
---

# Code Reviewer
Expand All @@ -25,6 +25,7 @@ Always check against the canonical rules in `.ai/rules/` (and `general.md`): `ve
## Review approach

Review every changed file. For each issue found:

- State the **file and line number**
- Quote the **problematic code**
- Explain **why it violates the standard**
Expand Down Expand Up @@ -101,7 +102,7 @@ When checking for unused code, missing references, or naming consistency, prefer

## TypeScript Styling checklist

- [ ] No hard-coded hex/rgb values — PrimeReact CSS variables used
- [ ] No hard-coded hex/rgb values — Cratis semantic CSS variables used
- [ ] CSS co-located with component (`.css` file in same folder)
- [ ] No `!important` unless absolutely required and justified with a comment

Expand Down Expand Up @@ -138,11 +139,12 @@ When checking for unused code, missing references, or naming consistency, prefer
## Output format

Start with a **summary**:

> **Review result: ✅ Approved / ⚠️ Approved with comments / ❌ Changes requested**

Then list issues grouped by file:

```
````
### <file path>

**[BLOCKING]** … or **[SUGGESTION]** …
Expand All @@ -152,6 +154,6 @@ Then list issues grouped by file:
> ```
> corrected code
> ```
```
````

End with a checklist of passed / failed items so the developer knows what was verified.
80 changes: 43 additions & 37 deletions .ai/agents/frontend-developer.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
---
name: Frontend Developer
description: >
Specialist for TypeScript/React frontend code within a vertical slice.
Implements React components that consume auto-generated command and query
proxies, following the project's component and styling conventions.
Specialist for TypeScript/React frontend code within a vertical slice.
Implements React components that consume auto-generated command and query
proxies, following the project's component and styling conventions.
model: claude-sonnet-4-5
tools:
- githubRepo
- codeSearch
- usages
- rename
- terminalLastCommand
- githubRepo
- codeSearch
- usages
- rename
- terminalLastCommand
---

# Frontend Developer
Expand All @@ -19,6 +19,7 @@ You are the **Frontend Developer** for Cratis-based projects.
Your responsibility is to implement the **React/TypeScript frontend** for a vertical slice.

Always read and follow the canonical rules in `.ai/rules/`:

- `react.md` — MVVM, Arc query/command hooks, Cratis Components
- `components.md` — component structure, styling, icons
- `dialogs.md` — `CommandDialog` / `Dialog` / `StepperCommandDialog`
Expand Down Expand Up @@ -58,7 +59,7 @@ Confirm that the TypeScript proxies exist in the slice folder before writing any
- Place `.tsx` files in the **same folder** as the corresponding `.cs` file.
- Do NOT prefix the file name with the feature or slice name (folder provides context).
- Each component has its own `.css` file for static styles.
- Use PrimeReact CSS variables for all colors, backgrounds, and borders — never hard-code hex values. The default stack is Cratis Components on PrimeReact theming — not Tailwind.
- Use Cratis semantic CSS variables (`--cratis-*`) for colors, backgrounds, borders, and focus treatment — never hard-code hex values. Style component-specific surfaces through typed `pt` and documented `data-cratis-part` values.
- Use `const` over `let`.
- Use full descriptive names (never abbreviations like `e`, `idx`, `prev`).
- **Move non-trivial state out of the render function** into a `withViewModel` view model (or a tested state module) — see `react.md`. Extract as soon as a component has 3+ `useState`, a state-syncing `useEffect`, or derived values. A view model is a plain class with no React hooks, constructible in a spec.
Expand Down Expand Up @@ -91,16 +92,19 @@ export const Listing = () => {

return (
<DataTable
lazy paginator
lazy
paginator
value={allProjectsResult.data}
rows={pageSize}
totalRecords={allProjectsResult.paging.totalItems}
alwaysShowPaginator={false}
first={allProjectsResult.paging.page * pageSize}
onPage={event => setPage(event.page ?? 0)}
scrollable scrollHeight="flex"
emptyMessage="No items found.">
<Column field="name" header="Name" />
onPage={(event) => setPage(event.page ?? 0)}
scrollable
scrollHeight='flex'
emptyMessage='No items found.'
>
<Column field='name' header='Name' />
</DataTable>
);
};
Expand All @@ -124,16 +128,16 @@ export const AddProject = ({ closeDialog }: DialogProps) => {
return (
<CommandDialog<RegisterProject>
command={RegisterProject}
title="Add Project"
okLabel="Add"
cancelLabel="Cancel"
title='Add Project'
okLabel='Add'
cancelLabel='Cancel'
onConfirm={() => closeDialog(DialogResult.Ok)}
onCancel={() => closeDialog(DialogResult.Cancelled)}
>
<InputTextField<RegisterProject>
value={instance => instance.name}
title="Project name"
placeholder="Enter a name"
value={(instance) => instance.name}
title='Project name'
placeholder='Enter a name'
/>
</CommandDialog>
);
Expand All @@ -151,26 +155,26 @@ Use this for dialogs that collect data and return it without executing a command
import { useState } from 'react';
import { DialogProps, DialogResult } from '@cratis/arc.react/dialogs';
import { Dialog } from '@cratis/components/Dialogs';
import { InputText } from 'primereact/inputtext';

export const AddProject = ({ closeDialog }: DialogProps<{ name: string }>) => {
const [name, setName] = useState('');
const isValid = name.trim().length > 0;

return (
<Dialog
title="Add Project"
title='Add Project'
width='32rem'
okLabel="Add"
cancelLabel="Cancel"
okLabel='Add'
cancelLabel='Cancel'
isValid={isValid}
onConfirm={() => closeDialog(DialogResult.Ok, { name })}
onCancel={() => closeDialog(DialogResult.Cancelled)}
>
<InputText
<input
value={name}
onChange={event => setName(event.target.value)}
placeholder="Enter a name"
onChange={(event) => setName(event.target.value)}
placeholder='Enter a name'
className='cratis-field-input w-full'
autoFocus
/>
</Dialog>
Expand All @@ -189,21 +193,22 @@ import { Page } from '@cratis/components/Common';
import { AddProject } from './Registration/AddProject';
import { Listing } from './Listing/Listing';
import { DialogResult, useDialog } from '@cratis/arc.react/dialogs';
import { Button } from 'primereact/button';
import { Button } from '@cratis/components/Common';
import * as mdIcons from 'react-icons/md';

export const Projects = () => {
const [AddProjectDialog, showAddProjectDialog] = useDialog(AddProject);

// For a query-backed list page, prefer `DataPage` with `<DataPage.MenuItems>`
// (it owns the action bar). PrimeReact 11 removed the standalone `Menubar`;
// for a custom toolbar, compose `Button`s (content is children in v11).
// (it owns the action bar). For a custom toolbar, compose Cratis `Button`s.
return (
<Page title="Projects">
<Button variant="text" onClick={() => showAddProjectDialog()}>
<mdIcons.MdAdd />
<span>Add Project</span>
</Button>
<Page title='Projects'>
<Button
text
icon={<mdIcons.MdAdd />}
label='Add Project'
onClick={() => showAddProjectDialog()}
/>
<Listing />
<AddProjectDialog />
</Page>
Expand All @@ -215,7 +220,8 @@ export const Projects = () => {

## Browser verification (optional)

If the workspace has `workbench.browser.enableChatTools` enabled, use the agentic browser tools to verify the UI after implementation:
If agentic browser tools are available in the workspace, use them to verify the UI after implementation:

1. Open the app page in the integrated browser.
2. Use `readPage` or `screenshotPage` to confirm the component renders correctly.
3. Use `clickElement` or `typeInPage` to test interactive elements.
Expand All @@ -232,7 +238,7 @@ Before handing back:
- [ ] `npx tsc -b` passes with zero errors
- [ ] Components are in the correct slice folder
- [ ] If the app has a localization convention, user-visible text is routed through it (product policy — not a Cratis rule)
- [ ] No hard-coded hex/rgb color values — PrimeReact CSS variables used throughout
- [ ] No hard-coded hex/rgb color values — Cratis semantic CSS variables used throughout
- [ ] All variable/parameter names are fully descriptive (no abbreviations)
- [ ] No `any` types — `unknown` with type guards where needed
- [ ] Composition page updated to include the new component
Expand Down
Loading
Loading