[LOADED_DOCS: 4 files, no new loads]
Refactor docs: topic folders, TOON, XCUT, protocol sync - Migrated all topic documentation into dedicated folders with canonical `README.md`, `ISSUES.md`, and `TODO.md` per topic (e.g., `LOGGING/`, `SIGNALR/`, `BINARY/`, `TOON/`). - Added comprehensive TOON serializer documentation: design, format, options, attributes, inference, issues, and TODOs. - Introduced `XCUT` folder for cross-cutting issues and TODOs, with canonical entries and topic cross-references. - Updated all references and navigation to use new folder-based doc paths; fixed links and clarified doc structure. - Enhanced AI agent protocol: enforce session skill preloading, `[LOADED_DOCS: ...]` short-name prefix, and mandatory `docs-check` skill for doc/code sync. - Updated `.csproj` to include all `README.md` files for IDE visibility. - Improved and clarified SignalR, grid, and project-level documentation. - Minor code/test tweaks and doc content corrections for consistency.
This commit is contained in:
parent
ac7b4d58df
commit
aecd54ffdd
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,15 @@
|
||||||
|
# FruitBank.Common documentation
|
||||||
|
|
||||||
|
Topic documentation for the `FruitBank.Common` project (shared types across Hybrid client).
|
||||||
|
|
||||||
|
## Reference docs (flat)
|
||||||
|
|
||||||
|
- [`GLOSSARY.md`](GLOSSARY.md) — Common domain terms for the Hybrid client side
|
||||||
|
|
||||||
|
## Navigation
|
||||||
|
|
||||||
|
Per the AI Agent Core Protocol (folder navigation rule), start from this README when browsing `docs/`. Currently only single-file reference.
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- **Repo-level glossary**: `../../docs/GLOSSARY.md`
|
||||||
|
|
@ -24,26 +24,26 @@ namespace FruitBankHybrid.Shared.Tests;
|
||||||
|
|
||||||
//1. "Headered List" (A biztonságos táblázatosítás)
|
//1. "Headered List" (A biztonságos táblázatosítás)
|
||||||
|
|
||||||
//Az LLM-eknek nem kell minden sorban megismételni a mezőneveket, ha a lista elején egyszer definiálod a sorrendet. Ez nem találgatás, hanem egy lokális "szerződés".
|
//Az LLM-eknek nem kell minden sorban megismételni a mezőneveket, ha a lista elején egyszer definiálod a sorrendet.Ez nem találgatás, hanem egy lokális "szerződés".
|
||||||
|
|
||||||
//Hagyományos (pazarló):
|
//Hagyományos (pazarló):
|
||||||
//Kódrészlet
|
//Kódrészlet
|
||||||
|
|
||||||
//OrderItemDtos = [
|
//OrderItemDtos = [
|
||||||
// OrderItemDto { Id = 120, Quantity = 10, ProductName = "Áfonya" }
|
// OrderItemDto { Id = 120, Quantity = 10, ProductName = "Áfonya" }
|
||||||
// OrderItemDto { Id = 121, Quantity = 5, ProductName = "Narancs" }
|
//OrderItemDto { Id = 121, Quantity = 5, ProductName = "Narancs" }
|
||||||
//]
|
//]
|
||||||
|
|
||||||
//Optimalizált (pontos és tömör):
|
//Optimalizált(pontos és tömör) :
|
||||||
//Kódrészlet
|
//Kódrészlet
|
||||||
|
|
||||||
//OrderItemDtos: OrderItemDto[] = [
|
//OrderItemDtos: OrderItemDto[] = [
|
||||||
// [ Id, Quantity, ProductName ]
|
// [Id, Quantity, ProductName]
|
||||||
// [ 120, 10, "Áfonya" ]
|
// [120, 10, "Áfonya"]
|
||||||
// [ 121, 5, "Narancs" ]
|
// [121, 5, "Narancs"]
|
||||||
//]
|
//]
|
||||||
|
|
||||||
// Miért jó ez? Az LLM a fejléc alapján (mint egy CSV-nél) rendeli hozzá az értékeket a típushoz. Mivel a típus (OrderItemDto) ott van a definícióban, a szemantikai kapcsolat nem vész el.
|
// Miért jó ez? Az LLM a fejléc alapján(mint egy CSV-nél) rendeli hozzá az értékeket a típushoz.Mivel a típus (OrderItemDto) ott van a definícióban, a szemantikai kapcsolat nem vész el.
|
||||||
|
|
||||||
//2. Típus-öröklődés a listákban
|
//2. Típus-öröklődés a listákban
|
||||||
|
|
||||||
|
|
@ -53,8 +53,8 @@ namespace FruitBankHybrid.Shared.Tests;
|
||||||
//Kódrészlet
|
//Kódrészlet
|
||||||
|
|
||||||
//// A 'ProductDto' elhagyható az objektum elől, mert a sémából tudja
|
//// A 'ProductDto' elhagyható az objektum elől, mert a sémából tudja
|
||||||
//ProductDto = {
|
//ProductDto = {
|
||||||
// Id = 1
|
// Id = 1
|
||||||
// Name = "Áfonya..."
|
// Name = "Áfonya..."
|
||||||
// GenericAttributes = [
|
// GenericAttributes = [
|
||||||
// { Id = 99, Key = "NetWeight", Value = "178.3" }
|
// { Id = 99, Key = "NetWeight", Value = "178.3" }
|
||||||
|
|
@ -62,13 +62,13 @@ namespace FruitBankHybrid.Shared.Tests;
|
||||||
// ]
|
// ]
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//3. Alapértelmezett értékek elhagyása (Implicit Defaults)
|
//3. Alapértelmezett értékek elhagyása(Implicit Defaults)
|
||||||
|
|
||||||
//Ha egy mező értéke megegyezik a @types-ban definiált default-value-val, vagy null/0/false, akkor azt teljesen hagyd ki a @data részből.
|
//Ha egy mező értéke megegyezik a @types - ban definiált default-value-val, vagy null/0/false, akkor azt teljesen hagyd ki a @data részből.
|
||||||
|
|
||||||
// Szabály: Ami nincs ott, az az alapértelmezett.
|
// Szabály: Ami nincs ott, az az alapértelmezett.
|
||||||
|
|
||||||
// Token megtakarítás: A FruitBank példádban a GenericAttributes = <GenericAttributeDto[]> (count: 0) [] sorok rengeteg helyet foglalnak. Ha üres, egyszerűen ne küldd el a mezőt.
|
// Token megtakarítás: A FruitBank példádban a GenericAttributes = < GenericAttributeDto[] > (count: 0)[] sorok rengeteg helyet foglalnak. Ha üres, egyszerűen ne küldd el a mezőt.
|
||||||
|
|
||||||
//4. String Table helyett: "Object Anchoring"
|
//4. String Table helyett: "Object Anchoring"
|
||||||
|
|
||||||
|
|
@ -78,7 +78,7 @@ namespace FruitBankHybrid.Shared.Tests;
|
||||||
|
|
||||||
// Első alkalommal: ProductDto { ... }
|
// Első alkalommal: ProductDto { ... }
|
||||||
|
|
||||||
// Minden további alkalommal: ProductDto = @ProductDto:1
|
//Minden további alkalommal: ProductDto = @ProductDto:1
|
||||||
|
|
||||||
//[ToonIgnore][ToonDataIgnore]
|
//[ToonIgnore][ToonDataIgnore]
|
||||||
[ToonDescription(Purpose = "Container model for Shipping, Order")]
|
[ToonDescription(Purpose = "Container model for Shipping, Order")]
|
||||||
|
|
@ -130,8 +130,8 @@ public sealed class ToonTests
|
||||||
a.Orders = (await _signalRClient.GetAllOrderDtos())!.Where(x=>x.CreatedOnUtc > DateTime.UtcNow.AddDays(-70)).ToList();
|
a.Orders = (await _signalRClient.GetAllOrderDtos())!.Where(x=>x.CreatedOnUtc > DateTime.UtcNow.AddDays(-70)).ToList();
|
||||||
a.Shippings = (await _signalRClient.GetShippings())!.Where(x=>x.Created > DateTime.UtcNow.AddDays(-70)).ToList();
|
a.Shippings = (await _signalRClient.GetShippings())!.Where(x=>x.Created > DateTime.UtcNow.AddDays(-70)).ToList();
|
||||||
|
|
||||||
//var toon = AcToonSerializer.Serialize(a, FruitBankConstClient.DomainDescription, AcToonSerializerOptions.Default);
|
var toon = AcToonSerializer.Serialize(a, FruitBankConstClient.DomainDescription, AcToonSerializerOptions.Default);
|
||||||
var toon = AcToonSerializer.SerializeTypeMetadata<FullProcessModel>(FruitBankConstClient.DomainDescription);
|
//var toon = AcToonSerializer.SerializeTypeMetadata<FullProcessModel>(FruitBankConstClient.DomainDescription);
|
||||||
|
|
||||||
Console.WriteLine(toon);
|
Console.WriteLine(toon);
|
||||||
Assert.IsNotEmpty(toon);
|
Assert.IsNotEmpty(toon);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Domain-specific grid components, one per entity type. All inherit `FruitBankGridBase<TEntity>`.
|
Domain-specific grid components, one per entity type. All inherit `FruitBankGridBase<TEntity>`.
|
||||||
|
|
||||||
> For the MgGrid framework reference see: `AyCode.Blazor/docs/MGGRID.md`
|
> For the MgGrid framework reference see: `AyCode.Blazor/AyCode.Blazor.Components/docs/MGGRID/README.md`
|
||||||
|
|
||||||
## FruitBankGridBase
|
## FruitBankGridBase
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net10.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
|
@ -72,4 +72,8 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Components\Toolbars\" />
|
<Folder Include="Components\Toolbars\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="**\README.md" Exclude="$(DefaultItemExcludes)" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
@ -41,6 +41,6 @@ All projects reference these via **DLL** (not ProjectReference). Full source is
|
||||||
| Repo | Path | Key Docs |
|
| Repo | Path | Key Docs |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **AyCode.Core** (net9.0) | `../../../Aycode/Source/AyCode.Core/` | [copilot-instructions](../../../Aycode/Source/AyCode.Core/.github/copilot-instructions.md), [ARCHITECTURE](../../../Aycode/Source/AyCode.Core/docs/ARCHITECTURE.md) |
|
| **AyCode.Core** (net9.0) | `../../../Aycode/Source/AyCode.Core/` | [copilot-instructions](../../../Aycode/Source/AyCode.Core/.github/copilot-instructions.md), [ARCHITECTURE](../../../Aycode/Source/AyCode.Core/docs/ARCHITECTURE.md) |
|
||||||
| **AyCode.Blazor** (net10.0) | `../../../Aycode/Source/AyCode.Blazor/` | [copilot-instructions](../../../Aycode/Source/AyCode.Blazor/.github/copilot-instructions.md), [MGGRID](../../../Aycode/Source/AyCode.Blazor/docs/MGGRID.md) |
|
| **AyCode.Blazor** (net10.0) | `../../../Aycode/Source/AyCode.Blazor/` | [copilot-instructions](../../../Aycode/Source/AyCode.Blazor/.github/copilot-instructions.md), [MGGRID](../../../Aycode/Source/AyCode.Blazor/AyCode.Blazor.Components/docs/MGGRID/README.md) |
|
||||||
| **Mango.Nop Libraries** (net9.0) | `../NopCommerce.Common/4.70/Libraries/` | [copilot-instructions](../NopCommerce.Common/4.70/Libraries/.github/copilot-instructions.md), [ARCHITECTURE](../NopCommerce.Common/4.70/Libraries/docs/ARCHITECTURE.md) |
|
| **Mango.Nop Libraries** (net9.0) | `../NopCommerce.Common/4.70/Libraries/` | [copilot-instructions](../NopCommerce.Common/4.70/Libraries/.github/copilot-instructions.md), [ARCHITECTURE](../NopCommerce.Common/4.70/Libraries/docs/ARCHITECTURE.md) |
|
||||||
| **FruitBank Plugin** (net9.0) | `../NopCommerce.Common/4.70/Plugins/Nop.Plugin.Misc.AIPlugin/` | [README](../NopCommerce.Common/4.70/Plugins/Nop.Plugin.Misc.AIPlugin/README.md) |
|
| **FruitBank Plugin** (net9.0) | `../NopCommerce.Common/4.70/Plugins/Nop.Plugin.Misc.AIPlugin/` | [README](../NopCommerce.Common/4.70/Plugins/Nop.Plugin.Misc.AIPlugin/README.md) |
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ User → DevExpress Grid → AcSignalRDataSource → SignalR (AcBinary) → DevA
|
||||||
|
|
||||||
## MgGrid — Grid System
|
## MgGrid — Grid System
|
||||||
|
|
||||||
All data screens use **MgGridBase** from AyCode.Blazor (see `AyCode.Blazor.Components/docs/MGGRID.md` (in AyCode.Blazor repo) for full technical docs).
|
All data screens use **MgGridBase** from AyCode.Blazor (see `AyCode.Blazor.Components/docs/MGGRID/README.md` (in AyCode.Blazor repo) for full technical docs).
|
||||||
|
|
||||||
### FruitBank Grid Hierarchy
|
### FruitBank Grid Hierarchy
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
- **GenericAttributes** for extending nopCommerce entities with custom data (IsMeasurable, Tare, AverageWeight).
|
- **GenericAttributes** for extending nopCommerce entities with custom data (IsMeasurable, Tare, AverageWeight).
|
||||||
- **Composition interfaces** for measurement traits: IMeasuringValues = IMeasuringWeights + IMeasuringQuantity.
|
- **Composition interfaces** for measurement traits: IMeasuringValues = IMeasuringWeights + IMeasuringQuantity.
|
||||||
- **DevExpress DxGrid** with `AcSignalRDataSource` for real-time grid data.
|
- **DevExpress DxGrid** with `AcSignalRDataSource` for real-time grid data.
|
||||||
- **MgGridBase** — canonical grid base from AyCode.Blazor (see `AyCode.Blazor.Components/docs/MGGRID.md` (in AyCode.Blazor repo)). Provides SignalR CRUD, layout persistence, master-detail, InfoPanel, fullscreen.
|
- **MgGridBase** — canonical grid base from AyCode.Blazor (see `AyCode.Blazor.Components/docs/MGGRID/README.md` (in AyCode.Blazor repo)). Provides SignalR CRUD, layout persistence, master-detail, InfoPanel, fullscreen.
|
||||||
- **FruitBankGridBase** — project adapter that fixes `TId=int`, `TLoggerClient=LoggerClient`, adds per-user layout and master/detail defaults.
|
- **FruitBankGridBase** — project adapter that fixes `TId=int`, `TLoggerClient=LoggerClient`, adds per-user layout and master/detail defaults.
|
||||||
- **FruitBankSignalRClient** as single hub client for all server communication.
|
- **FruitBankSignalRClient** as single hub client for all server communication.
|
||||||
- **DatabaseClient** for client-side caching with ConcurrentDictionary tables.
|
- **DatabaseClient** for client-side caching with ConcurrentDictionary tables.
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ FruitBank extends them via:
|
||||||
|
|
||||||
## UI / Grid Components
|
## UI / Grid Components
|
||||||
|
|
||||||
For MgGrid framework terms (MgGridBase, MgGridWithInfoPanel, MgGridToolbarBase, MgGridDataColumn, MgGridInfoPanel, IMgGridBase, etc.) see `GLOSSARY.md` (in AyCode.Blazor repo) and `AyCode.Blazor.Components/docs/MGGRID.md` (in AyCode.Blazor repo).
|
For MgGrid framework terms (MgGridBase, MgGridWithInfoPanel, MgGridToolbarBase, MgGridDataColumn, MgGridInfoPanel, IMgGridBase, etc.) see `GLOSSARY.md` (in AyCode.Blazor repo) and `AyCode.Blazor.Components/docs/MGGRID/README.md` (in AyCode.Blazor repo).
|
||||||
|
|
||||||
| Term | Definition |
|
| Term | Definition |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
# FruitBankHybridApp documentation
|
||||||
|
|
||||||
|
Top-level documentation for the `FruitBankHybridApp` repo (Layer 3 — FruitBank MAUI/Blazor Hybrid client).
|
||||||
|
|
||||||
|
## Reference docs (flat)
|
||||||
|
|
||||||
|
- [`ARCHITECTURE.md`](ARCHITECTURE.md) — Repo architecture overview
|
||||||
|
- [`CONVENTIONS.md`](CONVENTIONS.md) — Coding conventions
|
||||||
|
- [`GLOSSARY.md`](GLOSSARY.md) — Domain glossary (FruitBank terms: Shipping, Order, StockTaking, MeasuringStatus, etc.)
|
||||||
|
|
||||||
|
## Sub-projects with docs
|
||||||
|
|
||||||
|
- `FruitBank.Common/docs/` — Common glossary (shared across Hybrid client-side)
|
||||||
|
|
||||||
|
## Navigation
|
||||||
|
|
||||||
|
Per the AI Agent Core Protocol (folder navigation rule), start from this README when browsing `docs/`. Single-file reference docs remain flat; multi-file topics would live in named subfolders (none currently at this level).
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- **Server-side plugin**: `../../NopCommerce.Common/4.70/Plugins/Nop.Plugin.Misc.AIPlugin/docs/README.md`
|
||||||
|
- **Base framework** (AyCode.Core, AyCode.Blazor): see those repos' `docs/` folders.
|
||||||
Loading…
Reference in New Issue