Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"clear-architecture",
"mvvm",
"n-tier",
"erp",
"enterprise-architecture"
],
"is_fork": false,
"size_kb": 9415,
"has_wiki": false,
"homepage": null,
"languages": {
"C#": 6058756,
"CSS": 596,
"HTML": 17741,
"Shell": 8617,
"Swift": 5065,
"JavaScript": 426
},
"pushed_at": "2026-07-23T13:50:51Z",
"created_at": "2025-04-16T05:42:33Z",
"owner_type": "User",
"updated_at": "2026-07-23T13:45:06Z",
"description": "Bee.NET — A modular, definition-driven .NET framework for enterprise apps. N-Tier + Clean Architecture + MVVM.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "C#",
"significant_languages": [
"C#"
]
},
"owner": {
"blog": "https://hackmd.io/@jeff377",
"name": "Jeff",
"type": "User",
"login": "jeff377",
"company": "Taiwan",
"location": "Taipei",
"followers": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/16026012?v=4",
"created_at": "2015-11-26T02:42:33Z",
"is_verified": null,
"public_repos": 14,
"account_age_days": 3892
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v4.15.0",
"kind": "minor",
"published_at": "2026-07-23T13:55:19Z"
},
{
"tag": "v4.14.0",
"kind": "minor",
"published_at": "2026-07-09T15:45:34Z"
},
{
"tag": "v4.13.0",
"kind": "minor",
"published_at": "2026-07-01T16:05:00Z"
},
{
"tag": "v4.12.1",
"kind": "patch",
"published_at": "2026-06-26T17:18:39Z"
},
{
"tag": "v4.12.0",
"kind": "minor",
"published_at": "2026-06-26T06:05:04Z"
},
{
"tag": "v4.11.0",
"kind": "minor",
"published_at": "2026-06-24T03:46:17Z"
},
{
"tag": "v4.10.0",
"kind": "minor",
"published_at": "2026-06-15T09:35:28Z"
},
{
"tag": "v4.9.0",
"kind": "minor",
"published_at": "2026-06-12T06:43:20Z"
},
{
"tag": "v4.8.0",
"kind": "minor",
"published_at": "2026-06-09T15:49:23Z"
},
{
"tag": "v4.7.0",
"kind": "minor",
"published_at": "2026-06-09T06:29:59Z"
},
{
"tag": "v4.6.0",
"kind": "minor",
"published_at": "2026-05-26T07:09:53Z"
},
{
"tag": "v4.5.0",
"kind": "minor",
"published_at": "2026-05-23T08:47:47Z"
},
{
"tag": "v4.4.0",
"kind": "minor",
"published_at": "2026-05-16T03:44:38Z"
},
{
"tag": "v4.3.0",
"kind": "minor",
"published_at": "2026-05-13T15:08:00Z"
},
{
"tag": "v4.2.0",
"kind": "minor",
"published_at": "2026-05-13T12:06:34Z"
},
{
"tag": "v4.1.0",
"kind": "minor",
"published_at": "2026-05-05T13:53:46Z"
},
{
"tag": "v4.0.2",
"kind": "patch",
"published_at": "2026-04-23T14:40:44Z"
},
{
"tag": "v4.0.1",
"kind": "patch",
"published_at": "2026-04-09T16:20:05Z"
},
{
"tag": "v3.6.2",
"kind": "patch",
"published_at": "2025-11-07T03:49:01Z"
},
{
"tag": "BeeSettingsEditor-v1.0.8",
"kind": "other",
"published_at": "2025-10-28T15:32:24Z"
},
{
"tag": "v3.6.1",
"kind": "patch",
"published_at": "2025-10-28T15:09:55Z"
},
{
"tag": "v3.6.0",
"kind": "minor",
"published_at": "2025-10-24T14:16:34Z"
},
{
"tag": "v3.5.2",
"kind": "patch",
"published_at": "2025-10-15T08:13:26Z"
},
{
"tag": "BeeSettingsEditor-v1.0.7",
"kind": "other",
"published_at": "2025-10-05T03:23:47Z"
},
{
"tag": "v3.5.1",
"kind": "patch",
"published_at": "2025-10-05T03:01:32Z"
},
{
"tag": "v3.5.0",
"kind": "minor",
"published_at": "2025-09-25T15:05:56Z"
},
{
"tag": "v3.4.9",
"kind": "patch",
"published_at": "2025-09-25T08:19:43Z"
},
{
"tag": "v3.4.8",
"kind": "patch",
"published_at": "2025-09-24T05:06:03Z"
},
{
"tag": "BeeSettingsEditor-v1.0.6",
"kind": "other",
"published_at": "2025-09-24T04:45:49Z"
},
{
"tag": "v3.4.7",
"kind": "patch",
"published_at": "2025-09-23T07:28:54Z"
},
{
"tag": "v3.4.6",
"kind": "patch",
"published_at": "2025-09-22T14:52:18Z"
},
{
"tag": "v3.4.5",
"kind": "patch",
"published_at": "2025-09-22T08:52:18Z"
},
{
"tag": "v3.4.4",
"kind": "patch",
"published_at": "2025-09-22T06:27:09Z"
},
{
"tag": "v3.4.3",
"kind": "patch",
"published_at": "2025-09-21T03:20:24Z"
},
{
"tag": "v3.4.2",
"kind": "patch",
"published_at": "2025-09-18T02:46:48Z"
},
{
"tag": "v3.4.1",
"kind": "patch",
"published_at": "2025-09-16T14:31:15Z"
},
{
"tag": "v3.4.0",
"kind": "minor",
"published_at": "2025-09-05T12:58:14Z"
},
{
"tag": "v3.3.1",
"kind": "patch",
"published_at": "2025-09-04T02:49:07Z"
},
{
"tag": "v3.3.0",
"kind": "minor",
"published_at": "2025-09-03T14:09:59Z"
},
{
"tag": "v3.2.8",
"kind": "patch",
"published_at": "2025-09-03T06:08:43Z"
},
{
"tag": "v3.2.7",
"kind": "patch",
"published_at": "2025-08-19T12:12:33Z"
},
{
"tag": "BeeSettingsEditor-v1.0.5",
"kind": "other",
"published_at": "2025-08-18T00:25:13Z"
},
{
"tag": "BeeSettingsEditor-v1.0.4",
"kind": "other",
"published_at": "2025-08-17T03:09:53Z"
},
{
"tag": "v3.2.6",
"kind": "patch",
"published_at": "2025-08-17T02:29:34Z"
},
{
"tag": "v3.2.5",
"kind": "patch",
"published_at": "2025-08-14T08:08:34Z"
},
{
"tag": "v3.2.4",
"kind": "patch",
"published_at": "2025-08-08T11:44:19Z"
},
{
"tag": "v3.2.3",
"kind": "patch",
"published_at": "2025-08-05T03:50:15Z"
},
{
"tag": "BeeSettingsEditor-v1.0.3",
"kind": "other",
"published_at": "2025-08-01T15:43:40Z"
},
{
"tag": "v3.2.2",
"kind": "patch",
"published_at": "2025-08-01T15:27:52Z"
},
{
"tag": "BeeSettingsEditor-v1.0.2",
"kind": "other",
"published_at": "2025-07-28T02:51:22Z"
},
{
"tag": "BeeSettingsEditor-v1.0.1",
"kind": "other",
"published_at": "2025-07-27T05:31:57Z"
},
{
"tag": "v3.2.1",
"kind": "patch",
"published_at": "2025-07-27T05:32:51Z"
},
{
"tag": "BeeDbUpgrade-v1.0.0",
"kind": "other",
"published_at": "2025-07-25T13:27:46Z"
},
{
"tag": "BeeSettingsEditor-v1.0.0",
"kind": "other",
"published_at": "2025-07-25T03:33:23Z"
},
{
"tag": "v3.2.0",
"kind": "minor",
"published_at": "2025-07-24T14:37:20Z"
},
{
"tag": "v3.1.7",
"kind": "patch",
"published_at": "2025-07-22T14:02:43Z"
},
{
"tag": "v3.1.6",
"kind": "patch",
"published_at": "2025-07-19T12:07:16Z"
},
{
"tag": "v3.1.5",
"kind": "patch",
"published_at": "2025-07-19T02:10:39Z"
},
{
"tag": "v3.1.4",
"kind": "patch",
"published_at": "2025-07-13T11:14:52Z"
},
{
"tag": "v3.1.3",
"kind": "patch",
"published_at": "2025-07-12T14:45:11Z"
}
],
"recent_commits": [
{
"oid": "a240a4ee71d9b0c4710e8f5deacedf39b7616448",
"body": "發版前 wire/API 收斂。兩組 breaking change(pre-stable、無外部消費者,以\nminor 發佈):\n\n- MessagePack 合約序列化由整數 [Key] 改 property-name key(72 型別;ADR-030),\n JSON/MessagePack 統一以屬性名為 wire 合約。[Union]/集合容器/SerializableData*\n 維持整數鍵。\n- Bee.Api.Contracts 合約介面依 System/Form/AuditLog 三軸移入子命名空間,\n 根命名空間僅留 ExecFunc。純 source-level,對 wire 無影響。\n\n更新 CHANGELOG(雙語)+ 明細檔 docs/changelogs/4.15.0{,.zh-TW}.md,\n版號 4.14.0 → 4.15.0(Directory.Build.props)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(release): 4.15.0 — MessagePack property-name key + 合約介面軸分命名空間",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T13:43:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4eb6f98404f71373a78da3f853f9bcd762b11c65",
"body": "commit 7671b81d 將 CreateLogBusinessObject 加入 IBusinessObjectFactory\n時,samples 的 DemoBusinessObjectFactory 漏補此方法,導致 CS0535。因\nsamples/ 不在 build-ci.yml 觸發路徑,CI 未攔到而長期未被發現。\n\n實作直接回框架 LogBusinessObject(稽核日誌 BO 無 demo 客製需求),與正式\nBusinessObjectFactory 一致。連帶修好相依 Bee.Samples.Shared 的\nQuickStart.Server、Blazor.Server.Demo、Blazor.Wasm.Demo.Host。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(samples): 補 DemoBusinessObjectFactory 遺漏的 CreateLogBusinessObject",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T13:26:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b1e32ecf1c6bd1688b922a10f7ee4f5259093427",
"body": "三軸重構 + README 落地;ADR 依使用者決定不新增,CHANGELOG 併發版 draft。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): contracts 命名空間軸對齊 plan 標記完成",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T09:31:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c633577b82756750344553fbecb84da0f294e928",
"body": "更新 Bee.Api.Contracts README(雙語):新增「軸分命名空間」設計慣例,\n重畫目錄結構為 System/Form/AuditLog 子資料夾 + ExecFunc 留根,對映三軸對齊結果。\n\nCHANGELOG 依 releasing 慣例併下一個 major 發版時以 /changelog-draft 統整\n(commit 已帶 BREAKING CHANGE footer),此處不預先起 major 段落。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(contracts): README 反映合約介面軸分命名空間",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T09:29:38Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d924e63741e40cdf355c04bb21ede058924f06cd",
"body": "將 Bee.Api.Contracts 的 AuditLog 軸合約介面(13)與 DTO(RecordFieldChange)\n移入 AuditLog/ 子資料夾,命名空間 Bee.Api.Contracts → Bee.Api.Contracts.AuditLog,\n對齊 Bee.Business.AuditLog 與 Bee.Api.Core.Messages.AuditLog 兩層既有的軸分法。\n\n至此三軸對齊完成:根命名空間 Bee.Api.Contracts 僅保留跨 BO 泛用的 ExecFunc\n(IExecFuncRequest/Response,鏡像 Messages 根層\n[…]\n改為\nBee.Api.Contracts.AuditLog,外部消費者需更新 using。純 source-level 變更,對 wire\n無影響(序列化實作類別命名空間不變、MessagePack 採 property-name key)。\n綁下一個 major 發佈。階段 3/3。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(contracts)!: AuditLog 軸合約介面移入 Bee.Api.Contracts.AuditLog",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T09:26:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "07109d16b7255c08c1cb2931c7504bfc2420dc5a",
"body": "將 Bee.Api.Contracts 的 Form 軸合約介面(12:IDelete/IGetData/IGetList/\nIGetLookup/IGetNewData/ISave 各 Request/Response)移入 Form/ 子資料夾,命名空間\nBee.Api.Contracts → Bee.Api.Contracts.Form,對齊 Bee.Business.Form 與\nBee.Api.Core.Messages.Form 兩層既有的軸分法。消費端(Messages.Form /\nBusiness.Form)補對應 using。\n\nBREAKING CHANGE: Form \n[…]\ni.Contracts.Form,外部消費者需更新 using。純 source-level 變更,對 wire\n無影響(序列化實作類別命名空間不變、MessagePack 採 property-name key)。\n綁下一個 major 發佈。階段 2/3(AuditLog 待續)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(contracts)!: Form 軸合約介面移入 Bee.Api.Contracts.Form",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T09:24:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a68fc52fef0998440003eb442a83927a2837f42e",
"body": "將 Bee.Api.Contracts 的 System 軸合約介面(29)與 DTO(3:PackageDelivery /\nPackageUpdateInfo / PackageUpdateQuery)移入 System/ 子資料夾,命名空間\nBee.Api.Contracts → Bee.Api.Contracts.System,對齊 Bee.Business.System 與\nBee.Api.Core.Messages.System 兩層既有的軸分法。\n\n消除「合約實作已入軸、合約介面卻平放」的不對稱(僅存在於介面層)。\n消費端(Messages.System / Business.S\n[…]\nacts.System,外部消費者需更新 using。純 source-level 變更,\n序列化實作類別命名空間不變、MessagePack 採 property-name key,對 wire 無影響。\n綁下一個 major 發佈。階段 1/3(Form、AuditLog 待續)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(contracts)!: System 軸合約介面移入 Bee.Api.Contracts.System",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T09:23:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "38829fec4ddf255ba90ee29f25003105142dcf7e",
"body": "bunit 2.7.2 傳遞帶入 AngleSharp 1.4.0;新 advisory GHSA-pgww-w46g-26qg\n(< 1.5.0 脆弱)使 CI strict build 的 NuGetAudit gate 失敗。於兩個 Blazor\n測試專案加直接 PackageReference 覆蓋至 1.5.2(patched 版)。\n\n與 MessagePack name-based key 改動無關,屬新發布 advisory 的即時修補。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "build(deps): 釘 AngleSharp 1.5.2 修正 NU1902 安全稽核(Blazor 測試)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T01:54:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6cd64aea0c09bc02cb7adba4f8d86d1702c02db7",
"body": "migration 已執行並驗證。文件更新:\n- ADR-030 → 已採納,新增「執行結果與最終範圍」(category-aware 範圍表 +\n [Union] ⊥ keyAsPropertyName 約束記錄)。\n- ADR-004 交叉註記 → superseded-in-part(整數鍵改 property-name key,\n Union/DataSet plumbing 例外)。\n- plan → 已完成,記錄 [Union] 關鍵發現與驗證結果。\n- api-bo-contract-design(雙語)範例 [Key(100)] → keyAsPropertyName,\n 補 [Union] 例外說明。\n\nRefs: ADR-030\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: ADR-030 轉已採納 + 記錄 [Union] 約束與最終範圍",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T01:26:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1a5fe836bffcc3d47b7762d39ad3789cc7c021ae",
"body": "Batch 2(接續 879105ee):15 個型別轉 keyAsPropertyName、移除整數 [Key(n)]:\n- Group A 純 DTO:PackageUpdateInfo/Query、RecordFieldChange、CompanyInfo、\n DepartmentTree、PagingInfo/Options\n- Group C 非-Union 集合 item:AllowedCurrencyItem、CashRoundingItem、\n NumberFormatItem、CurrencyItem、UnitItem、SortField、DepartmentNode、P\n[…]\n化 201、Api.Core 序列化+合約+Filter 237 全過;全 solution\nRelease build 0 error / 0 warning。\n\nRefs: ADR-030, docs/plans/plan-messagepack-name-based-keys.md\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor!: Bee.Definition/Contracts DTO + 集合 item 改採 property-name key",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T01:23:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "879105ee060e0b49b94d7dcc00157259b4053ddc",
"body": "57 個 Bee.Api.Core.Messages 合約型別 [MessagePackObject] →\n[MessagePackObject(keyAsPropertyName: true)],移除整數 [Key(n)];\nApiMessageBase.Parameters 一併移除 [Key(0)](改以屬性名序列化,由 derived\n的 keyAsPropertyName formatter 以名處理,[IgnoreMember] 成員仍排除)。\n\n消滅整數鍵的 ctor-order 對號 footgun 與跨繼承 key 編號協調;JSON 與\nMessagePack 統一以屬性名\n[…]\n JSON round-trip 保真)全過驗證。\nPhase 0 已證 reflection-only(AOT)下 keyAsPropertyName 亦正常。\n\nRefs: ADR-030, docs/plans/plan-messagepack-name-based-keys.md\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(api-core)!: 合約型別 MessagePack 改採 property-name key",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T01:20:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "05e8a965e0c8ffb2803db27bb2cb825cc728fb37",
"body": "Phase 0 讓 migration 更便宜(免 source-gen)但未改變主成本(對已發佈套件的\nbreaking wire change),決議不做獨立 breaking release、綁進下一個 major。\nplan 標暫緩、adr-030 維持提議中直到隨 major 落地。現況 hybrid 正常運作。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(adr): 記錄 ADR-030 go/no-go 決議為暫緩(綁下一個 major)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T01:01:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d522a1592a9288267e4a737452a0d57b65e44cb0",
"body": "以 runtimeconfig IsDynamicCodeSupported=false 桌面重現行動端 AOT 的\nreflection-only 路徑,對 MessagePackCodec 跑合約 round-trip:整數 key、\n整數 key+集合、keyAsPropertyName 三型別皆 PASS。\n\n結論:MessagePack 3.x 有 reflection-based fallback,source generator 非\nmigration 前置條件(Phase 4 判定不需要)。誠實界定未涵蓋:trimming(half-A,\n與鍵策略無關)、iOS 實機。adr-030 據此下修「source-gen 退路」急迫性,B 決策\n仍維持(其餘三條理由不受影響)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(adr): 記錄 ADR-030 Phase 0 AOT 冒煙結果",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T00:59:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e2f504f708eaa290e0adb54710944d9495964ed6",
"body": "記錄「合約 wire 鍵改 name-based(keyAsPropertyName,非純去標記 contractless)」\n的決策方向與取捨,狀態提議中、gated on go/no-go(對已發佈套件為 breaking\nwire change)。adr-004 加交叉引用指向 ADR-030;plan-messagepack-name-based-keys\n補文件階段與 AOT 冒煙(Phase 0)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(adr): ADR-030 MessagePack 合約改採 property-name key(提議中)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T00:53:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5a56c7fbe190c147a030909de068c91f7e4493ea",
"body": "反射列舉 Bee.Api.Core 組件內所有 ApiRequest/ApiResponse 子型別,以\nMessagePack(MessagePackCodec)與 JSON(JsonCodec)雙格式做 round-trip\n保真比對(serialize == serialize∘deserialize∘serialize),自動涵蓋現有\n與未來合約。57 型別 × 2 格式 = 114 tests;全專案 459 綠無回歸。\n\n對齊 sibling repo 的 ApiContractSerializationTests 做法;差異:bee 無\nJsonPayloadSerializer 故 JSON 走 JsonCodec、SerializeState private setter\n以 SetMethod.IsPublic 過濾繞開、DataSet/DataTable 欄位特判留 null。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(api-core): 新增全合約反射掃描 MessagePack/JSON 序列化測試",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-23T00:53:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ea3a49755317a160e1760ee4a019a1d35b9c55a7",
"body": "以 dotnet format style --diagnostics IDE0005 清掉 tools 與 samples 兩方案\n共 16 檔的無效 using。主方案 src/tests 因 EnforceCodeStyleInBuild +\nTreatWarningsAsErrors 早已無殘留,未受影響。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(cleanup): 移除 tools/samples 未使用的 using(IDE0005)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-22T13:26:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0ae76d0f4fd4b2de4a4e0e508c3b885b91802818",
"body": "新增 14 個 *CoverageTests,鎖定 SonarCloud 標記為未覆蓋的純邏輯分支\n(序列化、值轉換、運算式、DiffGram 解析、scope 過濾、SQL builder、\nJSON-RPC 錯誤路徑、版本資訊、快取 dispatch):\n\n- Bee.Base: DataTableJsonConverter(全型別 round-trip)、ValueUtilities\n- Bee.Definition: FormExpressionCalculator、FormRowDefaults、FormSchema\n- Bee.Business: ChangeDiffGramRea\n[…]\nch / 不可達\n分支(DynamicExpresso ParseException dead-catch、ValueUtilities 型別轉換\ncatch、JsonRpcExecutor async 分支等)已於 code review 確認無法在不改 src\n下觸發,維持未覆蓋。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(coverage): 補純邏輯單元測試提升覆蓋率至 90% 以上",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-11T10:27:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "321b030c03b752e86fa6569a3575d1bedb05e0db",
"body": "- S125 x2(FormView.cs:282,385): 為合法 WHY 註解,依 code-style.md §S125 防誤判\n 改寫為完整英文句子、反引號包識別字、句尾 . 不用 ;,保留 WHY 同時避開誤判\n- CA2263(DynamicExpressoEvaluatorTests): 改用泛型多載 Evaluate<decimal>\n (泛型內部即委派 Evaluate(expr, vars, typeof(T)),轉換路徑相同、覆蓋不變)\n- S107(DbAccess.WriteDbAnomaly): 5 個互斥選用參數收斂為 DbAnomalyDetail struct,\n 簽章 8→4 參數,4 個呼叫端改用物件初始化\n\nskip.json 清空本次相關項目,僅留兩項既有人工 review(S1135 TODO、S2342 PermissionAction)\n\nby /sonar-fix\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(sonar-fix): 清掉剩餘 4 項 issue(S125 x2、CA2263、S107)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-11T09:36:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "221ebe4a644e21dc552405fc4ff2a3a8d4a69f9b",
"body": "- S3776 x4(認知複雜度): FormExpressionCalculator.ApplyFieldExpressions/\n ValidateRules 抽 per-table/per-rule helper;NumberFormatApplier.Bake 抽\n EnumerateFields;ChangeDiffGramReader.Read 抽 IndexBeforeRows/AppendUnmatchedDeletes\n- S3267 x4(foreach→Where): NumberFormatApplier、FormLiveComputation、ScopeResol\n[…]\n改 Assert.False\n\n暫緩(skip.json): S125 x2(FormView WHY 註解,False Positive)、\nCA2263(測試刻意驗 Type 多載)、S107(WriteDbAnomaly private helper)\n\nby /sonar-fix\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(sonar-fix): 處理 20 項 SonarCloud issue、4 項移入人工/暫緩清單",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-10T17:09:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cb189e063008690a013a0587d3c29244b52970bc",
"body": "nuget-publish.yml / build-ci.yml 的 pack 清單為逐一列舉(非 glob),漏了新套件\nBee.Expressions → 4.14.0 發佈時未推上 NuGet(消費端 restore Bee.Business/Definition/\nUI.Avalonia 4.14.0 會因缺相依失敗)。補進兩個 workflow。\n\ndocs 同步新套件:\n- dependency-map(雙語):mermaid 加 Bee.Expressions 節點 + 相依邊、外部套件表、\n 說明、專案數 17→18\n- README(雙語):Shared 套件表加 Bee.Expressions.dll\n- .claude/CLAUDE.md:專案數 17→18\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(release): 補 Bee.Expressions 至 CI/發佈 pack 清單 + docs 同步新套件",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T15:41:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b28e0e3e306c2b734b51ff4f63209c49d1bea8ba",
"body": "運算式與規則引擎(新套件 Bee.Expressions)+ 稽核軌跡/日誌查詢子系統 +\nDataSet 欄名小寫正規化(breaking wire/API,pre-stable 政策以 minor 發佈)。\n雙語 CHANGELOG(主檔 + docs/changelogs/4.14.0 明細)+ Directory.Build.props → 4.14.0。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(release): 4.14.0 — CHANGELOG + 版本號",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T15:03:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dcec8ada5bfb2d08f7f568c84b9b3ac81d918cf8",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(expression): Phase 2 完成 — Northwind demo 使用者實測正常,5d 收尾",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T14:45:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b2bfe11505cacd1a9771b98630bec879019c1223",
"body": "Avalonia 核心與 Semi 等周邊套件非同步釋出:不立同版號硬規則、也不無腦升\n核心到最新;Semi 慢半拍時整組停在其支援版本線,等所有相關套件出對應版且\nruntime 驗證主題不跑版後再整組升。build 過 ≠ 相容。\n\nCLAUDE.md 僅新增 @rules/avalonia.md import,維持本文放大原則、細則走 rule 檔。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(rules): 新增 rules/avalonia.md,立「升級 UI 套件前必先評估相容性」規則",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T14:12:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a1f4f634d1bc8a6e62ec35262716224aa69c0098",
"body": "依 ADR-029,讓定義/資料/UI 三層欄名一律小寫,從源頭消除大小寫敏感名稱比對\n(運算式引擎、早期 UI 繫結)反覆咬人的問題。趁其他 UI head 尚未實作先遷移。\n\nBREAKING CHANGE: 記憶體 DataSet 欄名由大寫改小寫,JSON/MessagePack payload key\n隨之變小寫(如 SYS_ROWID → sys_rowid)。以字面大寫 key 讀取的 JS/TS 前端須改小寫;\nC# 端不受影響(DataColumnCollection 查找本就大小寫無關)。\n\n- DataTableExtensions.AddColumn:ToUpper →\n[…]\n / ObjectCaching 149);\n SQLite 真 DB round-trip 通過(Bee.Db 209 / Bee.Repository 10)\n- 文件:ADR-029 + database-naming-conventions §6(雙語)+ plan 狀態更新\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(data)!: DataSet 欄名正規化為小寫(ADR-029,破壞性 wire 變更)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T13:26:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c83d18606cb659c0c38b5436ba78a4717c0e5e98",
"body": "大小寫敏感的名稱比對(早期 UI 繫結、運算式引擎)反覆咬人;確立欄名於定義/資料/\nUI 三層一律小寫 snake_case 為單一標準,從源頭消除整類問題。\n\n- docs/adr/adr-029-lowercase-field-names.md:拍板全層小寫(已採納);記憶體 DataSet\n 欄名對齊小寫為破壞性 wire 變更,執行見 plan\n- docs/database-naming-conventions.md(.zh-TW):新增 §6 跨層欄名一致性(雙語同步)\n- docs/plans/plan-dataset-lowercase-columns.md:遷移評估(Phase 0 稽核→決策→切換→\n wire/前端→相容回歸);策略由 ADR-029 定為全小寫\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(naming): 立「欄名一律小寫」規則於命名規範 + ADR-029 + 遷移 plan",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T13:07:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "96821c04dec439ab226032035825c6d520051621",
"body": "demo-smoke 於 Northwind Order 存檔抓到 -32000(InternalError):伺服器\nDynamicExpresso 拋 UnknownIdentifierException('quantity' / 'customer_rowid')。\n\n根因:DataTableExtensions.AddColumn 把欄名存成大寫(QUANTITY),BuildVariables 卻\n用 column.ColumnName(大寫)當變數名;運算式引用宣告的欄名(小寫 quantity),而\nDynamicExpresso 識別字區分大小寫 → 未知識別字。前後端共用 B\n[…]\nains 本就大小寫無關,\n寫回 row[field.FieldName] 不受影響。\n\n- 測試:Definition 902(+大寫欄名 ApplyComputedRow / ValidateRules 回歸)、\n Avalonia 334(+大寫欄名 Recompute 回歸)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(expression): 變數以宣告欄名為 key,修大寫 DataColumn 名致 UnknownIdentifier",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T12:33:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e2623195e2b55dadd8c32c1d22bef041a0fe6369",
"body": "前修(string→Guid)用 Guid.Parse,但空字串 Guid 欄(未選的鍵、TEXT 型別空 GUID\n欄)→ Guid.Parse(\"\") → FormatException。造成:\n- client:recompute 的 BuildVariables 對空 Guid 欄拋 FormatException → RunGuarded\n latch 停用預覽 → 「欄位沒即時運算」(不崩潰但從此不算)\n- server:同一空 Guid → 存檔 DoBeforeSave 無 guard → 未處理例外 → JSON-RPC -32000\n\n空/空白字串 Guid → Guid\n[…]\nBNull→預設值政策)。\n\n- 測試:Expressions 33(+空/空白 string→Guid.Empty、空 string→空 byte[])、\n Avalonia 333(Northwind 重現改用空字串 product_rowid,斷言不 degrade + 有算)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(expression): 空字串 Guid/Binary 欄 coerce 為預設值,修 Northwind 即時運算/存檔",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T12:18:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "71bbf88a12a7788f8797d78dffceb5680be04a21",
"body": "demo-smoke 於 Northwind Order 明細抓到:ExpressionPolicy.CoerceValue 用\nConvert.ChangeType 轉 Guid,但 Guid / byte[] 非 IConvertible → 拋 InvalidCastException。\n後端未踩到(DB 直接回 Guid 型別);client 端 wire/SQLite 把 GUID 存 TEXT → 欄位值為\nstring,BuildVariables 對每欄 coerce(含運算式未引用的 Guid 鍵欄)時即崩潰。\n\n- ExpressionPolicy.CoerceValue:\n[…]\nueChanged handler 內弄壞表單\n- 測試:Expressions 30(+string→Guid / Guid→Guid / base64→byte[])、\n Avalonia 333(+Northwind 重現:string 型別 Guid 鍵欄不使數值計算欄崩潰)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(expression): CoerceValue 支援 string→Guid/byte[],修 client 即時運算崩潰",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T09:08:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "954578964924bcfbe953b815ab66bd61a048963f",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(expression): 更新 plan 狀態 — Phase 2 核心 5a–5d(A) 完成",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T08:52:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c925ae7b1c5783866bb6eb477c3df84572886127",
"body": "實測 DynamicExpresso 在 reflection-only(IsDynamicCodeSupported=false,重現\niOS/WASM AOT)下正常:Expression.Compile 自動退回直譯器,計算欄/條件規則/\nDetectIdentifiers 全部正確 → 行動端/WASM 即時運算無需停用(見 plan AOT 段)。\n\ngraceful degrade(為客戶運算式撰寫錯誤,非 AOT):FormLiveComputation 對\nExpressionEvaluationException latch 停用預覽(IsDegraded),避免在 Fiel\n[…]\ne/ApplyDefaults/InitializeNewRow 包 try/catch degrade\n- 測試:Avalonia 332(+求值失敗不拋、IsDegraded、後續 no-op)\n\n5d-B(Northwind 明細金額 demo-smoke 端到端)待驗收時進行。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): Phase 2 PR5d-A 行動端/WASM AOT 實測 + graceful degrade",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T08:44:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e7975b0c7731283f43279cd801aaaee44a2d297c",
"body": "前端即時運算預覽的捨入與顯示位數對齊後端:計算欄依幣別/單位/公司位數捨入、\n金額/數量欄位依幣別位數顯示,取代 Tier 1 的框架預設位數。\n\n- ClientDefineAccess 加 GetCurrencySettingsAsync / GetUnitSettingsAsync(未部署回 null → graceful)\n- ClientInfo 快取 EnterCompany 回應的 CompanyInfo(原僅存 Capabilities、丟棄 Company),\n ClearCompanyContext 一併清除\n- FormView.ResolveRoundingConte\n[…]\ntation(重算逐位)\n 與 GridControl / NumericEdit(display 逐位,Bind 前設定)\n- 測試:Avalonia 331(+Tier 2 BHD 3 位捨入)、UI.Core Company 快取、Api.Client 取設定 no-throw\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): Phase 2 PR5c Tier 2 client 逐位對齊後端",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T08:39:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0cabf3044a2af80dc807653986fcf86947621a05",
"body": "FormView 訂閱 FormDataObject.FieldValueChanged / RowAdded,經 FormLiveComputation\n即時重算計算欄並回寫。master 由 field editor 自動刷新;detail realized cell 不追蹤\nDataRow 寫入,故對應 GridControl 以 Dispatcher.Post(Background) RefreshRows(比照\n既有 in-cell 模式,避開編輯管線 re-entrancy)。\n\n- FieldValueChanged → Recompute(re-entrancy guard +\n[…]\nte-all,單一 guard 區段)\n- FormView 追蹤 detail grids(每次 Rebuild 重填,依 table name 對映)\n- 測試:Avalonia 330(+3 端到端接線:master 編輯重算 / NewAsync 預設 / detail 重算)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): Phase 2 PR5b Avalonia 即時運算綁定接線",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T08:20:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4e14dfb10c29a8865068cbf8e1f263eead89d44c",
"body": "抽出後端 FormRuleProcessor 的純計算邏輯至 Bee.Definition.Forms.\nFormExpressionCalculator(鏡射 FormRowDefaults 的 schema 驅動 + DataRow +\n前後端共用前例),後端 FormRuleProcessor 瘦身為 adapter 委派,杜絕漂移。\n\n- Bee.Definition 加 Bee.Expressions 參考(無循環,Bee.Expressions 僅依賴 Bee.Base)\n- FormExpressionCalculator:全集合 pass(ApplyFieldExpressio\n[…]\nsions 參考 + FormLiveComputation 服務骨架\n (相依圖快取 + re-entrancy guard + 計算欄自身不觸發 + Tier 1 框架預設位數捨入)\n- 測試:Definition 900、Avalonia 327、Business 250 全綠\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): Phase 2 PR5a 共用 row-level 計算器 + 前端即時運算骨架",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T08:09:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1c40dae38d6146f27ac73a561530185e4835d8db",
"body": "依 Avalonia 綁定層探勘結論,把 Phase 2 從設計要點擴寫為可開工規格:\n統一 hook 點 FormDataObject.FieldValueChanged、master 自動刷新 vs detail 需\nRefreshRows、client 捨入設定缺口與 Tier 1/2 分級、共用 row-level 計算器決策、\nre-entrancy 與 row-edit 壓制窗口、AOT 分級與 graceful degrade,及 5a–5d PR 切分。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(expression): Phase 2 前端即時運算執行級規格",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T07:37:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "281f6cdec9b5949a5bf1f7e5d0be81ff528c00cc",
"body": "完成 plan-expression-rule-engine Phase 1d(文件 + 示範),並讓引擎支援 Guid:\n\n- 引擎:DynamicExpressoEvaluator 註冊 Guid 型別,讓驗證式可寫\n `customer_rowid != Guid.Empty`(Guid 為值型別、無 IO 面)。+ 對應測試。\n- Northwind OrderBO 遷移(override Save → override DoBeforeSave):\n - 明細 amount 改 ValueExpression(quantity * unit_price * (1 - discou\n[…]\nmd(設計決策)、\n docs/expression-rules.md(客戶自訂運算式/規則指引)。\n\nPhase 1(後端)全數完成;Phase 2(Avalonia 前端即時運算)待做。\nBee.Expressions 27 測試通過;Northwind.Server 建置通過。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): 文件 + Northwind OrderBO 遷移示範(PR4)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T04:15:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a553cd933502ded8a1a62f8c98217f28564c0653",
"body": "把運算式與規則引擎接進 FormBusinessObject 的模板方法,完成後端 schema 驅動的\n零 per-form 程式碼(plan-expression-rule-engine Phase 1c):\n\n- 新增 IFormRuleProcessor / FormRuleProcessor(Bee.Business):\n - 預設值運算式(Added 列、僅空欄填)\n - 欄位運算(Added/Modified 列,全精度求值後委派 NumberFormatResolver.RoundByKind\n 依 NumberKind 捨入;同列後續計算欄看得到前面結果,支援宣告順\n[…]\nRuleProcessor(singleton)。Bee.Business / Bee.Hosting\n 加 Bee.Expressions 參考。\n\n新增 FormRuleProcessorTests(10 通過);Bee.Business.UnitTests 全數 250 通過。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): 規則處理器接入 BO 生命週期(PR3 step 2)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T03:55:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0d5d175929b676b3b9970843e95cb94144102dc5",
"body": "把 FormBusinessObject.Save / Delete 重構為模板方法,為規則引擎接入預留可覆寫的\n生命週期控管點(plan-expression-rule-engine Phase 1c 前置重構,行為不變):\n\n- Save = 編排層(AuthorizeSave / EnforceWriteScope / change-audit 固定不可覆寫)\n + DoBeforeSave / DoSave / DoAfterSave 三個 protected virtual 覆寫點。\n- Delete = 編排層 + DoBeforeDelete / DoDelete / DoAf\n[…]\n no-op,DoSave/DoDelete base = 既有持久化。\n\n三段式控管點讓框架擴增功能落在編排層或特定 Do*,不與子類「override 整個 Save」\n互相打架。規則引擎於 step 2 接入 base DoBeforeSave / DoBeforeDelete。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(business): Save/Delete 拆為模板方法(PR3 step 1)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T03:44:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e2259ea6f4e6ab6601743fbbd8f84cab986d90ed",
"body": "自訂運算式與規則引擎的求值核心(plan-expression-rule-engine Phase 1b):\n\n- 新專案 src/Bee.Expressions(net10.0,只依賴 Bee.Base + DynamicExpresso.Core\n 2.19.3,無 server-only 相依),供後端 BO 與未來前端(Avalonia)共用同一引擎\n 與同一政策,確保前端預覽值 = 後端存檔值。\n- IExpressionEvaluator:Evaluate / Evaluate<T> / GetReferencedVariables 抽象。\n- DynamicExpressoE\n[…]\n策(FieldDbType→CLR、DBNull→型別\n 預設 0/空)。捨入不在此,PR3 於寫回時委派 NumberFormatResolver.RoundByKind。\n\n新增 Bee.Expressions.UnitTests(25 通過)。尚未接 BO 生命週期(PR3)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): Bee.Expressions 可攜共用求值引擎(PR2)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T02:06:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f17c128d2465bc5237e848464342c72ca878a9b1",
"body": "自訂運算式與規則引擎的定義層地基(plan-expression-rule-engine Phase 1a):\n\n- FormField 新增 ValueExpression(計算欄)、DefaultValueExpression(預設值運算式),\n 兩者為 [XmlAttribute] 純量、空值省略;並補入 Clone。\n- 新增 FormRule / FormRuleCollection / FormRuleTrigger:宣告式驗證與生命週期\n guard(When 兩段式適用性 + Condition 驗證 + Message 中斷訊息,Trigger 首階段\n BeforeS\n[…]\nyField。\n\nFormSchema 以 XML 為唯一傳輸序列化路徑(後端 XmlCodec.Serialize → 前端\nXmlCodec.Deserialize),測試聚焦 XML 往返 + 空值省略 + Clone 深拷貝。\n\n尚未接引擎與 BO 生命週期(PR2/PR3)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(expression): 定義層運算式屬性與 FormRule 規則集合(PR1)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-09T01:48:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1ed06342f060cbb80b116f1f473cc778def49c85",
"body": "… 已涵蓋)\n\nGetRecordHistory 功能上等同 GetChangeLog 帶 ProgId+RowKey filter,明細兩者皆走\nGetChangeDetail,屬冗餘的便利包裝。套件未發佈、無外部使用者,故直接拔除以精簡\nAPI surface。單筆記錄歷程改用 GetChangeLog(帶 ProgId+RowKey)。\n\n移除:GetRecordHistory 合約(IGetRecordHistoryRequest/Response)、wire\n(GetRecordHistoryRequest/Response)、BO(GetRecordHistoryArgs/Resu\n[…]\n應測試。\n\nGetChangeLog 文件補明典型用法:某表單某期間、某人某期間、或單筆記錄(ProgId+RowKey)。\nAuditLog 軸方法數 10 → 9;BoApiSurface baseline、api-method-reference(+zh-TW)、plan 同步。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(audit): 移除冗餘 GetRecordHistory(GetChangeLog + GetChangeDetail…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T09:15:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "942f2e320359cb7f958c3af39a428c6ce4c32f31",
"body": "讀取側主體(情境 1–5、AuditLog 軸 10 方法)交付完畢,plan 整體狀態改 ✅。\n異常趨勢圖、權限強化、跨年 log_YYYY 聚合均為有需求再另案的延後項。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): 稽核查詢讀取側標記完成(趨勢圖 / 權限強化 / 跨年聚合延後)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T09:01:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "626150130c87f414ce893bed2805916b13379362",
"body": "把異常從逐筆清單提升到監控用的彙總檢視(標準 GROUP BY,不碰 dialect 時間桶):\n\n- GetApiAnomalySummary(from,to) — st_log_anomaly_api GROUP BY anomaly_kind COUNT(*)\n- GetDbAnomalySummary(from,to) — st_log_anomaly_db 同上(跨公司,表無 company)\n- GetTopApiMethods(from,to,topN) — GROUP BY method + MAX(elapsed_ms),ORDER BY COUNT(*) DESC 取前 \n[…]\n-safe\n- docs:api-method-reference(+zh-TW) +3;BoApiSurface baseline +3;plan Phase 3a 標記完成\n\n時間分桶「趨勢圖」(需 DateBucketBuilder dialect helper)留待有需求再做。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 稽核查詢 Phase 3a — 異常彙總(Summary + TopN)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T08:47:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0c615c3a0b68efab93ba4008732819864e0b19b2",
"body": "跨年年份分庫的讀取聚合移出本計畫範圍;Phase 3 收斂為「異常監控細分、權限強化」等\n有需求再做的進階項。同步更新階段表與 §3 Q4 決策紀錄。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): 稽核查詢 Phase 3 移除跨年 log_YYYY 聚合(延後到有需求再做)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T08:28:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1c67b525b5fbdc9270f7ac2961901e2a8c718fc0",
"body": "沿用 2a 的 typed filter + 分頁基礎,補齊其餘四軸的清單查詢(純標頭、無 DiffGram):\n\n- GetLoginLog(st_log_login) — time/user/event\n- GetAccessLog(st_log_access) — time/user/progId/rowKey\n- GetApiAnomalyLog(st_log_anomaly_api) — time/user/method/anomaly-kind\n- GetDbAnomalyLog(st_log_anomaly_db) — time/databaseId/anom\n[…]\ntch(四 action)、[DbFact] 真 DB 各軸過濾(SQL Server + PostgreSQL)\n- docs:api-method-reference(+zh-TW) +4 方法;BoApiSurface baseline +4;plan Phase 2b 標記完成\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 稽核查詢 Phase 2b — login / access / anomaly 清單",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T07:07:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "435db2ebb8498ab6104504be963522b1221059df",
"body": "依討論把異動記錄查詢拆成「清單只回標頭 + 明細按需還原」,避免逐列還原 DiffGram\n(量體大、payload 爆)。change 軸現為三方法:\n\n- GetChangeLog(typed filter + 分頁) → 標頭 DataTable + PagingInfo(跨記錄清單)\n- GetChangeDetail(sysRowId) → 單筆 changes_xml 還原為結構化 before/after\n- GetRecordHistory 改為標頭清單(headers-only + 分頁),明細統一走 GetChangeDetail\n (Phase 1 的「全還原」版與 R\n[…]\neById\n (SQL Server + PostgreSQL)\n- docs:api-method-reference(+zh-TW) AuditLog 軸更新為三方法 + 清單/明細說明;\n BoApiSurface baseline +2;plan Phase 2a 標記完成\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 稽核查詢 Phase 2a — change 軸清單/明細二段式",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T06:29:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7671b81d2d91cddec73298048d59e7c25f230a79",
"body": "新增 AuditLog BO 軸(LogBusinessObject)與 GetRecordHistory(progId, rowKey):查詢單筆\n記錄的 st_log_change 異動歷程,伺服器端把 changes_xml DiffGram 還原為結構化欄位級\nbefore/after。稽核軌跡讀取側(寫入側項 0–4 已上線;見 ADR-027)。\n\n- 新軸接線:SysProgIds.AuditLog、LogActions、IBusinessObjectFactory.CreateLogBusinessObject、\n JsonRpcExecutor dispatch 分支\n- \n[…]\neserved-names(+zh-TW) 登記\n AuditLog progId、BoApiSurface baseline、plan Phase 1 標記完成\n\n資料夾用 AuditLog/(非 Log/)——.gitignore 的 [Ll]og/ 會整個忽略 Log/ 目錄。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 稽核日誌查詢讀取側 Phase 1 — GetRecordHistory + DiffGram 還原",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T05:51:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c5f0a6a28ce63b6ebc1329803f50e71450111cdd",
"body": "稽核軌跡寫入側(項 0–4)完成後,讀取/查詢側另立 plan:\n記錄異動歷程 + DiffGram 還原、各 log 表列表查詢、異常監控;\n含查詢層形狀 / DiffGram 還原 / log DB 路由 / 權限 / 分頁等待定案點與三階段。\n母計畫加指向連結。待逐項定案後實作。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): 稽核日誌查詢(讀取側)plan 草稿",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T04:34:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3ed6a24856d2640eb67c6855975832e2300a2965",
"body": "把散在 plan-audit-* 的關鍵決策收斂成長存的 ADR:背景(log 分類原為空、\nTracer 屬 dev-time、DbAccessAnomalyLogOptions 原無消費者)、7 項被否決的替代方案\n(執行記錄全記 / EAV 預設 / outbox / Tracer 作稽核 / user_rowid 正規化 /\nAPI+DB 合表 / DbAccessFactory 直接注入循環相依)、7 項核心決策(D1–D7)與後果。\nframework-reserved-names §1.3 加指向 ADR-027 的連結(英/繁)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(adr): ADR-027 資料軌跡 / 稽核日誌(六軸 st_log_* 設計)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T04:15:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1584b1f657cc76b5d424336fae24e0674913a615",
"body": "稽核軌跡六軸完成後,同步各公開文件(英/繁雙語):\n\n- database-settings-guide:log 分類「典型表」由「視應用而定」改列 5 張 st_log_*\n (事實修正);澄清 opt-in 稽核表與 single-tenant 可略過 log 的前提;情境圖具體化一次\n- terminology:日誌章節補 IAuditLogWriter / AuditEntry / AuditColumn / NullAuditLogWriter\n / 各 entry / AuditLogOptions;列舉補 LoginEvent / ChangeKind / AnomalyKi\n[…]\nnaming-conventions:點名 st_log_* 日誌表子群與 log 分類\n- architecture-overview §12:新增 audit trail 為框架能力\n- api-method-reference:新增「稽核副作用」小節(哪些方法寫哪張 log 表)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 同步稽核軌跡至公開文件(log 表 / 型別 / 命名 / 架構 / API 副作用)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T04:11:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7c81839ee6574d27aaf6ebb35f9d85e0a8ab2e8c",
"body": "呼應「log 分類原為空」的缺口——稽核軌跡六軸完成後,log 資料庫現有:\nst_log_login / st_log_change / st_log_access / st_log_anomaly_api / st_log_anomaly_db。\n§1 引言補上 log 資料庫、新增 §1.3(opt-in、自足去正規化、可依年份分庫)。英/繁雙語同步。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(reserved-names): 登記 log 分類 5 張 st_log_* 稽核表",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T03:34:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e70fc824e2f8ad4bf30e1aca690be81f62eabf97",
"body": "軸④/⑤異常記錄(取代原「執行記錄全記」與「系統/錯誤」),opt-in、best-effort:\n\n- 兩表兩視角:st_log_anomaly_api(method + who)、st_log_anomaly_db\n (database_id + command,精簡無 who —— DbAccess 無 session)\n- AnomalyKind(Error/Timeout/Slow/LargeAffected/LargeResult)、ApiAnomalyEntry、DbAnomalyEntry\n- AuditEntry 重構:抽出可覆寫 AddCommonColumns(向後相容\n[…]\n\n四個 anomaly [DbFact];DefaultsTests 27→29、TableSchema 14→16。\n本機實跑真實 DB(5 方言)全綠,audit [DbFact] 10/10。\n\n設計與決策見 docs/plans/plan-audit-4-anomaly.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 異常記錄(項 4)— API/DB 分表 st_log_anomaly_api/db",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T03:21:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f49c79c50450f3cece9524ab372580258b639d32",
"body": "- 系統/錯誤本質是 observability(維運/除錯),非業務資料軌跡:\n 歸 ILogWriter / host ILogger(檔案/Seq/APM),不建 st_log_trace 稽核表。\n 對齊 SAP SM21 / Odoo ir.logging 與業務稽核分離的定位。\n- 修正先前「ITraceWriter → st_log_trace」的誤用:Tracer/TraceContext 是\n 開發階段偵錯執行流程用,不可作為稽核來源。\n- 索引重整:移除系統列、執行記錄遞補為項 4(暫緩,範圍待決定)。\n\n稽核軌跡主體已交付:登入(①) / 異動(③+安全⑥) / 檢視(②)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(audit): 軸⑤系統/錯誤移出稽核範圍、修正 Tracer 定位",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-08T00:49:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "703669e4a72d57be59627270a9f7f341b87a113f",
"body": "軸②檢視記錄,opt-in + best-effort:\n\n- st_log_access(log 分類):共通欄 + prog_id + row_key,record-level 不記欄位\n (一次 GetData 明細檢視=一列:誰看了哪筆)+ row_key 索引\n- AccessAuditEntry\n- FormBusinessObject.GetData:檢視成功後記一筆(AccessEnabled gating);只掛 GetData,\n GetList 清單不掛(量體)。目前全記所有表單,未來加 per-form 稽核規則\n- 重構共用 ResolveAuditIdentit\n[…]\n視升為項 3\n\n測試:AccessAuditEntry 欄位、st_log_access [DbFact] 端到端;\nDefaultsTests 數量 26→27、TableSchema 13→14。\n\n設計與決策見 docs/plans/plan-audit-3-access.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 檢視記錄(項 3)— st_log_access 與 GetData 埋點",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-07T15:40:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1bd5cdd1c1342c7a64f2dba45324c11f8a1c264f",
"body": "軸③異動記錄(含軸⑥安全旗標),採 DataSet DiffGram 單表 + best-effort 非同步:\n\n- st_log_change(log 分類):共通欄 + prog_id/table_name/row_key/change_kind/\n is_sensitive + changes_xml(DiffGram,master+detail 新舊值全含)+ row_key 索引\n- ChangeAuditEntry / ChangeKind\n- FormBusinessObject.Save:repository.Save 前 GetChanges() 擷取、commit 後 \n[…]\n位、DiffGram round-trip(驗證新舊值保留)、\nst_log_change [DbFact] 端到端;DefaultsTests 數量 25→26、TableSchema 12→13。\n\n設計與決策見 docs/plans/plan-audit-2-change.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 異動記錄(項 2)— st_log_change 與 DataSet DiffGram",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-07T14:45:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "73954e74a89d4e6995d706c796aa35244bf97e11",
"body": "項 1 在 log 分類新增 st_log_login,SharedDatabaseState 因此會 provision log DB。\nCI 原僅建立/授權 common + company;MySQL 的 testuser 對 log 無權限,\n碰到 log 即 Access denied → 整個 MySQL setup 中止,連帶 NorthwindSeed /\nUserCompany 等 MySQL 測試失敗(common/company 未 seed)。\n\n比照 company 補建 log:\n- SQL Server / PostgreSQL:建 log DB(idempotent;兩者 testuser 本就有建庫權)\n- MySQL:root 建 log DB + GRANT testuser(關鍵修正)\n\n其他方言(SQLite / Oracle)本就正常。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: 為 log 測試資料庫補建 + MySQL 授權(st_log_login 落地)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-07T09:27:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8af30ee0204e6b0fff5bc2e61b28d4d048a4f17e",
"body": "軸①登入記錄,第一個實際使用 IAuditLogWriter 的軸:\n\n- st_log_login(log 分類)+ DbCategorySettings 註冊(Defaults + tests/Define)\n- LoginAuditEntry / LoginEvent(成功 / 失敗 / 鎖定 / 登出,列舉自帶結果,無 result 欄)\n- SystemBusinessObject.Login/Logout 四出口埋點,Services escape-hatch 取 writer、\n Enabled + LoginEnabled gating(不改 ctor、不影響 Authent\n[…]\nernal static,供 [DbFact] 端到端寫入讀回驗證\n- .gitignore 放行 TableSchema/log/(通用 [Ll]og/ 規則誤傷 CategoryId 命名的資料夾)\n\n設計與決策見 docs/plans/plan-audit-1-login.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 登入記錄(項 1)— st_log_login 與 Login/Logout 埋點",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-07T08:38:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "abbff6fc512c98390613d228f5d3a77b34698e02",
"body": "資料軌跡日誌的共用基礎設施,六軸日誌的前置工作項:\n\n- Bee.Definition.Logging:IAuditLogWriter / AuditEntry / AuditColumn / NullAuditLogWriter\n- AuditLogOptions(預設關閉,opt-in)掛入 BackendConfiguration\n- Bee.Hosting.Audit:AuditLogDbSink(落固定 log DB + 檔案 fallback)、\n 背景 AuditLogWriterService(bounded channel,滿載退化同步)、SynchronousAuditL\n[…]\nroundWriter 註冊;停用時走 NullAuditLogWriter(零回歸)\n- 單元測試:共通欄位組裝、滿載退化同步不丟失、背景 drain\n\n設計與排程見 docs/plans/plan-audit-trail.md、plan-audit-0-foundation.md。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(audit): 日誌基礎設施(項 0)— IAuditLogWriter 與背景寫入",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-05T15:42:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2f37c94b79eb49ad9ead43f2b7d971b23acac430",
"body": "一輪掃描所有公開文件(docs/、各 src README、ADR)與程式碼的落差,\n修正因多波重構未同步的過時引用,並補齊缺件。均為文件更新,唯一程式碼\n變更為 SQL Server 預設約束命名對齊全小寫慣例。\n\n文件(雙語成對):\n- src README:*Func→Utilities/Extensions、RepositoryInfo(已刪)、\n *Provider→*Factory、CacheFunc→ICacheContainer、RemoteDefineAccess→\n ClientDefineAccess、LocalDefineAccess→CacheDefineAcce\n[…]\n→df_(對齊 snake_case 全小寫\n 慣例;drop 靠 sys.default_constraints 動態查找,不依名字,零相容風險)\n- 對應 2 個測試斷言更新\n\n驗證:Bee.Db.UnitTests Release 1398 passed / 0 failed。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 全面校正文件與程式碼一致性,並修正 df_ 約束命名大小寫",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-05T04:42:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a81216ba3910b2a05914d9b73d1cd881ed9c81aa",
"body": "兩個問題:\n1. 預設 Cost.Read 未勾 → 單價欄依設計被藏,導致「一打開看不到單價」的\n 反教學。改為預設全授權(完整表單),取消勾選才觀察降級。\n2. root 用水平 StackPanel(無界寬度)可能讓明細 DataGrid 鋪不開欄位。\n 改為 Grid 兩欄(左 Auto 授權面板、右 Star 表單),DataGrid 取得有界\n 寬度、正常排所有欄。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(democenter): 權限模擬器預設全授權 + Grid 版面,明細欄位正常顯示",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-05T03:03:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7da0bece39d1babab8c72217462cd5abfd8738c8",
"body": "欄位權限範例擴充為 master-detail:主檔敏感欄(承辦人身分證=PersonalData)\n示範 隱藏/唯讀/可編輯 三態;明細用真實 GridControl,敏感欄(單價=Cost)\n無 Read 時整欄隱藏——展示 ResolveField 帶明細表名反查 SensitiveCategory。\n\n明細以 in-memory FormDataObject + GridControl 綁定(沿用 SampleFormData 模式),\ncapability 在 bind 前套到 layout 欄位(inline 複製 LayoutCapabilityApplier,\n因其為 lib internal)。仍純前端、不需後端。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(democenter): 權限模擬器改為主檔/明細,示範明細 Grid 敏感欄降級",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-05T02:52:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bf595f4d4cce286d9705e57d8b79581cff57b004",
"body": "放寬「主表最多一個 Owner、一個 Dept 欄」限制——某些單據一筆資料合理\n屬於多個部門/擁有者(如調職單的調出/調入部門,兩邊主管都要看得到)。\n\n- FormTable 新增 GetOwnerFields()/GetDeptFields()(回全部;保留單數版為\n first-match 便利方法,向後相容)\n- ScopeResolver 改為對所有標記欄取扁平 OR 聯集:\n Own = 各 owner 欄 IN 身分;Dept/DeptAndSub = 各 dept 欄 =/IN 子樹,再 OR Own\n- PermissionBindingValidator 移除 \">1\n[…]\nner/Dept 報錯\" 上限\n- 讀取與寫入 re-query 共用同一 ResolveFilter,故兩側一致\n- N=1 行為與先前完全相同(既有 ScopeResolver 測試全數不變通過)\n- 測試:多 Dept OR 聯集、多欄 validator 放行;雙語文件同步更新\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(permission): record scope 支援多個 Owner/Dept 欄(OR 聯集)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-05T02:37:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "92cae0c356b15132694787e4f3aed47cf6523102",
"body": "DemoCenter 新增「權限 Capability」類別的互動模組:左側勾選模擬 EnterCompany\n會回傳的 capability 快照,右側「採購單」表單即時降級——無權命令按鈕隱藏、\n敏感欄依 Read/Update 呈現 隱藏/唯讀/可編輯 三態;關掉「啟用」→ 快照 null\n→ 全放行。\n\n不需後端:capability 快照就是一個 Dictionary,demo 在記憶體手工造,餵給\n與正式 View 相同的 ElementCapabilityResolver / PermissionScope。純 UX 示範。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(democenter): 新增互動權限模擬器(前端 capability 範例)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-04T16:19:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "19645c503ec7a40d7325310061e1b65957e43acf",
"body": "欄權限本就分兩個獨立子 gate:Read 管可見、Update 管可編輯,所以能表達\n「看得到成本、但不能改成本」。文件把這個區分補成一等公民:\n\n- 總表欄權限列改為「隱藏(無 Read)/ 唯讀(無 Update)」\n- 第 9 節加三態表(隱藏 / 唯讀 / 可編輯)並舉成本為例\n- 修正授權範例:編輯需同時授 Read + Update(只授 Update 會被隱藏)\n- 雙語同步\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(permission): 明示欄權限的檢視 vs 編輯兩個子 gate",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-04T15:59:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "706837aed6091566b606430ed8fdd4ebc3701dd7",
"body": "原總表把「動作=後端、欄=前端」切割得太乾淨,低估了動作權限也會投影\n到前端決定工具列命令/按鈕狀態。改為「三維度 × 兩把關點」框架:\n\n- 動作維度:後端權威 gate + 前端按鈕/命令狀態(兩處都套用)\n- 列維度:僅後端\n- 欄維度:僅前端(UX,非資料邊界)\n\n- 總表改為 後端 / 前端 兩欄,動作列兩處皆 ✅\n- Part 2 標題改為「動作命令 + 欄權限」,明示前端呈現兩個維度\n- ADR-019 對應段落同步;雙語同步\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(permission): 釐清動作維度同時套用於前端(三維度 × 兩把關點)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-04T15:55:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ec22ec6ef1cf08ec0f133e0e325a6d20d1910ef8",
"body": "把公開權限指南從「兩層」重構為「三維度」框架,並將已完成的前端\ncapability(欄權限)正式納入文件;ADR-019 非目標段落轉正。\n\n- 動作權限(後端權威)、列權限(後端權威)、欄權限(前端 UX 降級)\n- 新增第二部分:敏感欄位標記、well-known 分類 model、capability 快照\n 如何搭 EnterCompany 到前端、client 如何降級、host opt-in 接線\n- 明確警語:欄權限是 UX、非資料邊界(後端未遮罩敏感欄值)\n- 雙語同步(.md / .zh-TW.md);ADR-019 前端 capability 標記 ✅ 已實作\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(permission): 權限指南重構為三維度,補齊前端欄權限(capability)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-04T14:44:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7d80485458e95e6e3a3e528196a1c75ac811fae1",
"body": "detail Grid 與 master 同屬一個 aggregate:明細列能否編輯應跟隨表單編輯\n模式(AllowEdit),而「能否進入編輯」已被主 model 的 Create/Update 在\n工具列命令擋掉。對 Grid 動作再套一次 capability 是多餘且概念錯位。\n\n- 移除 IElementCapabilityResolver.ResolveGridActions 與其實作\n- LayoutCapabilityApplier.ApplyGrid 只保留敏感欄位(column)降級,\n 不再改 LayoutGrid.AllowActions\n- 移除對應 resolver 測試(保留敏感欄位判定)\n\nGrid 內敏感欄位(如明細單價/成本)仍依 SensitiveCategory 降級——那是\n資料分類,與 aggregate 編輯權正交。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(permission): 移除 Grid 動作 capability 降級(改由表單模式驅動)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-04T14:27:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "42cecad40ea5b4f9212367031f22ad46c2352f65",
"body": "搭 EnterCompany 這班車把 per-model action mask 快照送到前端,零額外往返;\n前端以 opt-in 方式降級工具列命令、Grid 動作與敏感欄位。安全邊界仍在後端。\n\n- 後端:CompanyRolePermissions.GetAllowedByModel 算 per-model mask;\n EnterCompany 填 EnterCompanyResult.Capabilities,經 ApiOutputConverter\n 自動 copy 到 EnterCompanyResponse.Capabilities([Key(101)],三棲序列化)\n-\n[…]\nnterCompany MessagePack 5 全綠;Avalonia 320 無回歸。DB 綁定的\nEnterCompany 整合測試待 CI(本機無 docker)。\n\nRefs docs/plans/plan-permission-capability.md, ADR-019\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(permission): 前端權限 capability(element 細粒度降級,Avalonia 消費端)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-04T13:13:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9709f8ebe0db4820074e673ff0492fc17a458352",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(docs): 封存已完成 plan-sqlserver-datetime2 至 docs/archive",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-03T14:04:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "282b1a507ff58ea9e8789b82d51231eee0e8b4e8",
"body": "KeyCollectionBase / Dictionary 原用 CurrentCultureIgnoreCase、StringHashSet\n用 InvariantCultureIgnoreCase,三者不一致。這些集合裝的是識別碼(欄位名、\nProgId、表名、property key),文化相依比較會踩 Turkish-I 問題——tr-TR 地區\n設定下 \"ID\" ≠ \"id\",使同一份序列化定義在不同 server 地區行為不一致。\n\n統一改為文化無關的 OrdinalIgnoreCase(最快、無 Turkish-I),並連同\nStringUtilities.IsEquals(KeyCollectionItem 的 key 變更判斷所依賴)一併由\nCurrentCulture 收斂為 Ordinal。對現有 ASCII key 零行為變化。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(base): string key 不區大小寫比較統一收斂為 OrdinalIgnoreCase",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-03T02:06:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8626fdde0df5753af72eceac911774435a2d3709",
"body": "前一 commit 把 DbTypeMapper.Infer 全域改為 DbType.DateTime2,導致 PostgreSQL /\nOracle 的 Northwind seed 在 CI fresh 容器上回歸(Npgsql 對 Kind=Utc 值在\nDateTime2 下解析型別改變、seed 交易 rollback → 0 rows)。本機因 shared DB 留有\n舊 seed 資料未重現,CI fresh 容器才炸。\n\n正解:DbTypeMapper.Infer 還原為 DbType.DateTime(跨 provider 行為與改動前一致),\n改在 provider-aw\n[…]\nion timezone 影響而脆弱的 PG round-trip 測試(PG/Oracle DateTime 寫入已由\nseed 測試覆蓋);新增 NormalizeDbType 的 SQL Server-only 改寫與非 SQL Server\npass-through 單元測試。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(db): datetime2 參數改寫改為 SQL Server-only,修 PG/Oracle seed 回歸",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-03T00:56:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7df805f4dde72428f79b39d88fe7b428cb33b946",
"body": "對齊 .NET DateTime 的精度(100ns)與範圍(0001~9999)。三處改動:\n\n- SQL Server dialect:DDL 輸出 [datetime2](7);reverse-map 認得 datetime2\n 並讀入 fractional-seconds scale;預設值剝括號涵蓋 datetime2。\n- comparer:DbField.Compare 對 DateTime 加 scale 正規化(未設→canonical 7),\n 既有 datetime(scale 3)與 datetime2(scale 7)差異 → 下次 upgrade 自動\n in\n[…]\n 拋 SqlDateTimeOverflow。\n\n測試:SQL Server 亞毫秒 round-trip、pre-1753 範圍、datetime→datetime2 升級路徑;\nPostgreSQL 微秒 round-trip 驗證跨 provider 無回歸。全 repo 綠燈。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(db): SQL Server DateTime 由 datetime 遷移至 datetime2(7)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-02T16:43:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "23b328039a8f64fde78d14b98087ba459db8ac63",
"body": "CHANGELOG 雙語 + docs/changelogs/4.13.0 明細檔(中英),版本號\n4.12.1 → 4.13.0(Directory.Build.props Version/AssemblyVersion/FileVersion)。\n\n本版新增內容(Added-only、零 breaking):\n- Bee.Definition:NumberKind 語意 + NumberFormatResolver/Applier(round-then-sum、\n 兩層捨入、bake-on-clone)、CurrencySettings(TCURX)/UnitSettings(T006)\n[…]\n幣別/單位感知 + 混幣合計 helper\n\n設計理由見 ADR-026(已於前一 commit 落地)。\n\n驗證:Release build 0 警告 0 錯誤;15 test 專案全綠(4 DB 容器整合測試含\nSQLServer/PostgreSQL/MySQL/Oracle)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(release): 4.13.0 — ERP 數值層(NumberKind + 多幣別 + 計量單位)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T15:53:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2dd7aa4324bdca4a8e585d7b0fedb26b2c816568",
"body": "封存 numeric 系列 plan 後,development-cookbook §Numeric Semantics 兩處\n「signed-off contract」連結指向 docs/plans/(已移至 gitignored docs/archive/)\n成為死連結。新增 ADR-026 收斂 6 個架構決策(NumberKind 語意、round-then-sum、\n兩層捨入、Preserve 不回寫、貨幣/單位 runtime 解析、DB scale 正交容量上限)與\n拒絕的替代方案,作為對外穩定引用目標;cookbook 兩處改指向 ADR-026。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(adr): 新增 ADR-026 數值語意/捨入決策 + 修 cookbook 死連結",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T14:56:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6a1ff22f8ccbb5890b54e5ff0c8ad3ed2ffc896d",
"body": "移至 docs/archive/(gitignored),從 docs/plans/ 移除。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plans): 封存 numeric 系列 plan(core/multicurrency/uom/formatting 全數已完成)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T13:52:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "623d59d8e7f27951636b92f62f882ea04a0a6e02",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plans): plan-numeric-formatting 增量表格 core 補標已完成(3/3 全綠)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T13:51:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "eb10bc0c9b93f26b0bccb2f71b9324ced9f7dc9b",
"body": "…icEdit 單位感知\n\n數值處理三增量收官。完全鏡像 multicurrency,且無 DB/CompanyInfo/st_company 異動\n(單位純 per-列、無公司層或主檔概念)。\n\n階段 1(定義):\n- UnitSettings : MessagePackCollectionBase<UnitItem>(UnitItem [Key(100+)]\n Code/Decimals(直存)/Dimension/Name;GetDecimals 直查 fallback 0)。IDefineStorage\n 雙模式全套仿 CurrencySettings(DefineType/Fil\n[…]\naseFormatter 走 MessagePack\nposition-based ctor 解析,順序不符會對調 Dimension/Name)——已修並記為慣例。\n\n測試:Definition 860、Api.Core 314、Avalonia 320,全 15 test 專案綠。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 計量單位增量 3/3 — UnitSettings(T006) + UNIT 綁定 + Grid/Numer…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T06:09:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "adb85727ca76297b54b96088f947800e3c42eed7",
"body": "…幣合計 helper + DemoCenter\n\n數值處理增量 2/3 的 UI 層(Avalonia)。三階段全數完成。\n\n- GridControl:per-instance CurrencySettings + DefaultCurrencyCode 屬性(null=關閉\n 幣別感知、退欄級 baked 格式,向後相容)。新增 FormatCellForColumn:金額欄逐格讀\n row[CurrencyField](該列 CUKY 值)→ ResolveFormat(Amount, ctx, code),空退\n DefaultCurrencyCode;三個顯示呼叫點改走它,靜\n[…]\nD 位數、列幣別空退預設、無 CurrencySettings\n 退 baked、幣別勝 baked;NumericEdit 依幣別;AmountColumnSummary 混幣/同幣/本幣。\n 全 15 test 專案綠(Avalonia 314、Definition 831)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 多幣別階段 3 — Grid per-cell 幣別感知 + NumericEdit runtime + 混…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T05:02:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4ccb27b2c438162a3a4d06d7abab7ec2154d5f07",
"body": "數值處理增量 2/3 的邏輯層。擴既有 resolver 入口、不另起。\n\n- RoundingContext{Company, CurrencySettings}(uom 增量再加 UnitSettings)。\n- NumberFormatResolver 加 currency-aware overload ResolveDecimals/ResolveFormat/\n RoundByKind(kind, ctx, refCode):Currency 源以 refCode(CUKY 欄幣別)查\n CurrencySettings.GetDecimals;refCode 空退公司 Defa\n[…]\n-currency」節。\n- 測試:USD/JPY/BHD 位數、round-then-sum 不變式、現金捨入 0.05+diff、本幣、\n Preserve、fixture 全鏈 GetCurrencySettings。全 15 test 專案綠(Definition 831)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 多幣別階段 2 — resolver 幣別感知 + 兩層捨入 + 本幣 + ship client",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T04:42:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "86a77f392ca63b447c1091a5a9b34b2efe58863c",
"body": "數值處理增量 2/3 的定義層。相依 core(增量 1/3)已定慣例。\n\n- CurrencySettings(系統層幣別主檔,SAP TCURX 式):MessagePackCollectionBase<CurrencyItem>,\n Code/Numeric/Rounding/Symbol/Name;GetRounding/GetDecimals(因子反推)。走 IDefineStorage\n 雙模式(DefineType/File+Db storage/PathOptions/CurrencySettingsCache/ICacheContainer/\n CacheDefineA\n[…]\n三棲;CompanyCashRounding/AllowedCurrencies;\n CompanyInfo 多幣別 XML+MessagePack round-trip;CurrencyField 序列化/Clone/傳遞;\n Defaults 載入。全 15 test 專案綠。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 多幣別階段 1 — CurrencySettings + CUKY 綁定 + 公司本幣/現金捨入/可用幣別",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T04:15:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ea596f8a3dd4ac88e1d3099c96b512ed947215f5",
"body": "core 完成後,把 multicurrency 新 session 必須沿用、勿重推導的既成事實收斂成\n一段接手指引:MessagePackCollectionBase(非 KeyCollectionBase)+ 顯式註冊\nformatter、DecimalsSource 終版四值於 NumberFormatResolver 擴充、CompanyInfo\nKey(5)~(7) 編號、新 _xml 欄 NOT NULL + 補齊 hand-written INSERT、IDefineStorage\n雙模式接點清單、bake 分工、Grid 逐格化、本機 ALTER 遮蔽 NOT NULL 的驗證雷。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plans): plan-numeric-multicurrency 加「接手指引」(core 已定慣例)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T03:24:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e9ff1ec94872123e4f2b7c38f604ef125fccc6be",
"body": "執行增量 1/3(plan-numeric-core.md 階段 3,核心增量完成):\n\n- ControlType.NumericEdit;LayoutColumnFactory 對 Short/Integer/Long/Decimal/Currency\n 的 Auto 解析為 NumericEdit\n- NumericEdit(繼承 TextEdit):focus 顯完整精度、blur 依 NumberFormat 格式化、\n GetWriteBackValue 解析後回寫完整精度(顯示捨入不回寫)、右對齊、無效輸入保留前值\n- TextEdit 抽 GetWriteBackValue\n[…]\ntion.Collections)\n\n驗證:full build 綠;Definition 781、Avalonia 302 測試綠;DemoCenter 建置 0 錯誤\n(samples 不觸發 CI,需 -c Debug 目視)。plan-numeric-core 三階段全部完成。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 數值處理核心階段 3 — NumericEdit + Grid 格式化 + DemoCenter",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T03:15:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7e9ff07e34aafab2135a1b29c76433684de5a8a0",
"body": "彙整原本只散在程式碼註解與已封存 plan 的跨方言 DDL 規則與例外,供框架使用者查閱:\n- §1 文字/數值欄為何預設 NOT NULL(設計原由:省去應用碼與 SQL 的 null 處理)\n- §2 各方言內建預設值運算式對照(String/numeric/Date/DateTime/Guid)\n- §3 兩個硬性例外:Oracle ''=NULL(String/Text nullable)、MySQL TEXT 不能 DEFAULT\n (hand-written INSERT 必須帶值;含本機 ALTER 遮蔽、CI fresh-CREATE 重現的說明)\n- §4 識別符引號與大小寫、§5 AutoIncrement 語法、§6 ALTER vs 重建\n- §7 跨方言新增欄位檢查清單\n\n於 docs/README(.zh-TW).md 索引登記。docs 變更不觸發 CI。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(db): 新增資料庫方言差異(DDL)公開文件(中英雙語)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T02:50:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5f887582545edb0f0a5364fd105e6e6e2f9ac53f",
"body": "…ten INSERT\n\n還原前一 commit(c8433c30)把欄位改 nullable 的錯誤做法——違反框架 AllowNull\n原則(文字欄 NOT NULL 預設空字串,只有 DateTime/二進位等特定型別才可 null,以\n減少呼叫端對 null 的額外處理)。\n\n正解:欄位維持 NOT NULL;MySQL 底層 DDL 對 TEXT 型別 AllowNull=false 本就不輸出\nDEFAULT(MySqlSchemaSyntax.GetDefaultExpression 已如此,MySQL TEXT 不能帶 DEFAULT),\n故呼叫端 INSERT 必須顯式提供值\n[…]\nesh-CREATE 的 NOT NULL),故手動 ALTER MODIFY 為 NOT NULL 重現 CI,\nRepository MySQL 10/10、Db NorthwindSeed 5/5、Business EnterCompany/Lifecycle 15/15 全綠。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(numeric): st_company.number_formats_xml 維持 NOT NULL,改補齊 hand-writ…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T02:16:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c8433c3089f75aaaf043e3336de5a19c7cc24dde",
"body": "CI 失敗根因:number_formats_xml(DbType=Text)預設 NOT NULL(DbField.AllowNull\n預設 false)。MySQL TEXT 欄無法帶 DEFAULT,故 NOT NULL 下任何省略此欄的 partial\nINSERT 在 strict mode 直接報 \"Field 'number_formats_xml' doesn't have a default\nvalue\"。其他 dialect 對 NOT NULL 字串欄有隱式空字串預設、MySQL TEXT 沒有。\n\n觸及的 partial INSERT(hand-written test\n[…]\n AllowNull=\"true\"(兩份 schema)。此欄為 Text 型\n「常態為空」optional payload,nullable 是合理例外(同 Oracle ''=NULL 一類);\nCompanyRepository 已對 NULL/空字串 fallback 為空表。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(numeric): st_company.number_formats_xml 改 nullable(MySQL CI 修正)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T01:50:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8abffecec5150e401c1167f25c15b9e5e6fd5d38",
"body": "…CI 修正)\n\nCI 失敗根因:此測試 fixture 的 CompanyRepository 固定走 DbCategoryIds.Common\n(bound 至 SQL Server 的 common DB,見 SharedDatabaseState),DbFact 的 dbType\n參數其實被 repo 忽略(既有 Enabled/Disabled 測試以 `_` 收)。故 per-dialect\n以 NewDbAccess(GetDatabaseId(dbType)) 寫入 common_{dbtype} 的列,repo 從\ncommon(SQL Server) 讀不到 → GetBy\n[…]\nts_* DbFact 與其 helper。覆蓋不減——\n- 空欄→空表反序列化:GetById_Enabled_*(5 DB)已加 Assert.Empty(NumberFormats)\n- 填值 XML 反序列化:CompanyInfoTests 單元 round-trip 已覆蓋\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(numeric): 移除 CompanyRepository per-dialect number_formats DbFact(…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T01:40:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bebf2cdd99e262673124a809a90eba2b90fa0607",
"body": "執行增量 1/3(plan-numeric-core.md 階段 2):\n\n- NumberFormatResolver(Bee.Definition):ResolveDecimals / ResolveFormat /\n RoundByKind。Round=AwayFromZero 捨到解析位數、Preserve 原值返回;\n SystemFixed(匯率)忽略公司覆寫用框架預設,Company/Currency/Unit 退 company\n (core 無 currency/unit settings,兩源暫退 company)\n- NumberFormatApplier.Bake\n[…]\n、bake 時機、DB scale 為容量上限)\n- Definition 778 測試全綠(+round-then-sum 不變式、公司 A/B 位數不同、explicit 優先、\n 不污染快取);GetFormSchema/GetFormLayout round-trip 無回歸\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 數值處理核心階段 2 — 交付 bake + round-then-sum",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T01:10:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1d5f6ac72bc64c60d28c3f3bc5b42edc7223469b",
"body": "執行增量 1/3(plan-numeric-core.md 階段 1):\n\n- NumberKind / RoundingPolicy / DecimalsSource enum + NumberKindProfile\n (取代孤立且 0 production caller 的 NumberFormatPresets)\n- CompanyNumberFormats 公司位數覆寫表(MessagePackCollectionBase,非 KeyCollectionBase\n —— CompanyInfo 走 wire、resolver 只認前者);CompanyInfo [Key(4)] N\n[…]\n默出空)\n- NumberKind 契約表拍板;build 0 warn/err、Definition(759) + Api.Core 非 DB 測試全綠\n (CompanyRepository 5-DB round-trip 為 DbFact,本機無 docker 自動 skip)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(numeric): 數值處理核心階段 1 — NumberKind 語意型別 + 公司位數模型",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-07-01T01:01:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2b9b34b52c6846188f6ebe8cc366d6af97228acc",
"body": "回到 🚧 核心完成狀態;待 iOS 實機驗證後再決定封存。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plans): 還原 plan-mobile-release-trim-safe(iOS 實機 AOT 待確認,暫不封存)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-30T14:28:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4bc5bbd8c223660864d3a392d647447a4cb43b1a",
"body": "… 序列化已驗證)\n\n核心已完成:descriptor 內嵌 Bee.Definition 解半 A、iOS 半 B 免實機驗證通過;\niOS 實機 AOT run 為低風險形式收尾(需 Apple Developer 簽章+實機,另案)。\n移至 docs/archive/(gitignored)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plans): 封存已完成 plan(mobile-release-trim-safe,行動端 Release trim/AOT…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-30T14:27:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0e4a6052d6b63fa5c68773a5cd70be8e4792f95a",
"body": "…4.12.1)\n\n移至 docs/archive/(gitignored),plans/ 僅保留進行中與待做 plan。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plans): 封存 4 個已完成 plan(northwind android/ios/graduation、release …",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-27T16:41:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "461072b322ff6de9a7b833c48f17fa0744d3bddd",
"body": "Desktop / Browser / iOS / Android 渲染同一張訂單表單的截圖,\n圖片置於 jeff377/blog-images(raw URL 內嵌)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): Bee.Northwind 加入四出海口執行畫面(內嵌圖,中英同步)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-27T00:21:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b9c4fbb09f604627432725163066569f763769b8",
"body": "Bee.Northwind 實際 8 個 FormSchema / 8 個選單項;apps 與複本 README 先前已更正,\n根 README 漏改,本次補上。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): 根 README 旗艦範例表單數 9→8(與 Bee.Northwind 實際一致,中英同步)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T18:03:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dcdafc108dd90b7cd7c95c80e09d179e899d9cc8",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): 4.12.1 發佈 + 複本同步完成;mobile-trim 複本 sync 項收尾",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T17:26:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "afa6e490533544aa407e5d90ab5f49a68078ed18",
"body": "…im/AOT)\n\nbump 4.12.0 → 4.12.1(patch)。自 v4.12.0 起唯一 src 變更為\nsrc/Bee.Definition/ILLink.Descriptors.xml(內嵌 trimmer descriptor,保留\n定義型別圖於 full trim / AOT),補完 4.12.0 起步的 Avalonia iOS/Android\nRelease 打包能力。無 API 變動。\n\n含 CHANGELOG 雙語條目 + docs/changelogs/4.12.1 明細 + 發版作業 plan。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(release): v4.12.1 — Bee.Definition 內嵌 trimmer descriptor(行動端 tr…",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T17:07:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1bea68d78a6e278bc28dff83a3eae2a17e14f318",
"body": "- intro 表單數 Nine/九 → Eight/八(實際 FormSchema 8 個、選單 8 項)。\n- 移除指向 docs/plans/plan-bee-northwind-demo.md 的連結(已移至 docs/archive/,\n gitignored 不在 GitHub,連結失效)。\n中英同步。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): 修正與現況不符(表單數 9→8、移除已封存 plan 失效連結)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T16:25:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1a2f85c1a57ac41b26b08bdc69aeec1ffb975476",
"body": "該預告句指向的終章教學章節保留;只移除 intro 末尾的預告句。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): 移除 intro 的終章預告句(第十張表單,中英同步)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T16:21:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f7b4c513d5754238e1211370354ea4dcd271fb8b",
"body": "- maui.md:Apple trim 決策樹 #4(TrimmerRootDescriptor)由「不適合」升為**採用解法**\n (descriptor 內嵌 Bee.Definition、wildcard preserve),補半 A/半 B 實測補正與當前對策、\n 免實機驗證法(ValidateXcodeVersion=false / EnableCodeSigning=false / IsDynamicCodeSupported switch)。\n- apps/Bee.Northwind README(中英同步):行動端「Debug-only / Release 另案」更新為\n 「Release trim/AOT 已解並驗證」,結構樹標籤同步。\n- plan:收尾項打勾;複本 sync 釐清為 release-gated(複本 @NuGet 4.12.0 無 descriptor,\n 經下個框架版本發佈 + bump 流入,非檔案複製)。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(mobile-trim): 收尾——maui.md 決策樹回寫 + 行動端 README 更新",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T16:19:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f6805ce1d158f831a96853a29e875ee3ac7c7f57",
"body": "階段 2 完成:強制 RuntimeFeature.IsDynamicCodeSupported=false(= iOS device AOT\n鎖定的 reflection-only XmlSerializer 路徑),在真實 iOS 模擬器 runtime + Release\ntrim(linked Bee.Definition.dll 211,968B,descriptor 生效)跑 round-trip → PASS。\n半 A(trim+descriptor)與半 B(reflection-only)兩半同時施加、在真實 iOS runtime\n通過;與實機唯一差異=AOT 編譯版同程式碼(已證 0 錯誤、已知雷已修),實機 run\n降為低風險形式收尾。\n\n核心完成(階段 0/1/2);Sgen(3)未觸發。診斷鷹架已移除。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): mobile-trim 半 B 免實機驗證通過(iOS 模擬器 reflection-only)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T16:07:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f34110487325f33459803e1a215d2e1edf11ed48",
"body": "- 階段 0:iOS 編譯失敗根因=Xcode 26.5↔26.6 版本鎖;-p:ValidateXcodeVersion=false\n 繞過,Debug 在 iPhone 17 模擬器跑通(Avalonia 渲染 ConnectionView)。\n- 階段 1:descriptor Android full-trim 實測(Bee.Definition 212K→無 91K/有 208K);\n 有無 descriptor round-trip 皆 PASS,半 A 已解。\n- 階段 2:iOS device-target Release AOT build 0 錯誤(EnableCodeSigning=false 跳過簽章),\n linked Bee.Definition.dll 211,968B 證 descriptor 於 iOS linker 亦生效;唯 iOS 實機\n 執行期 round-trip 待實機+簽章。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(plan): mobile-trim 階段 0/1/2 實測結果",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T15:55:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6374e29f742462725c2ff5253119b8a211dc61fb",
"body": "行動 head(Avalonia iOS/Android)的 client 端以 XmlCodec.Deserialize<T> 反序列化\n夾在 JSON-RPC wire 的 FormSchema XML 字串;iOS AOT / Android full-trim 下 trimmer\n會砍掉「看似沒人用」的定義型別建構子、屬性 setter 與集合 Add(T),導致序列化失敗\n(誤導性的 XmlSerializeErrorDetails, 2, 2)。\n\n以 EmbeddedResource(LogicalName=ILLink.Descriptors.xml,trimmer 自動掃描的\n[…]\n。\n- 有無 descriptor,FormSchema round-trip 皆 PASS;descriptor 提供完整覆蓋保險。\n\n詳見 docs/plans/plan-mobile-release-trim-safe.md。723 個 Bee.Definition 測試全通過。\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(definition): 內嵌 ILLink.Descriptors.xml 保留行動端 trim/AOT 序列化(半 A)",
"author_name": "jeff377",
"author_login": "jeff377",
"committed_at": "2026-06-26T15:47:36Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 60,
"commits_last_year": 1710,
"latest_release_at": "2026-07-23T13:55:19Z",
"latest_release_tag": "v4.15.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 36,
"days_since_latest_release": 0,
"mean_days_between_releases": 4.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "Bee.Cli",
"exists": true,
"license": null,
"keywords": [
"bee.net",
"cli",
"dotnet-tool",
"defines"
],
"ecosystem": "nuget",
"matches_repo": true,
"registry_url": "https://www.nuget.org/packages/Bee.Cli",
"is_deprecated": false,
"latest_version": "4.15.0",
"repository_url": "https://github.com/jeff377/bee-library",
"versions_count": 9,
"total_downloads": 870,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-23T13:54:52.303000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 5,
"stars": 10,
"watchers": 2,
"fork_history": {
"days": [
{
"date": "2025-07-26",
"count": 2
},
{
"date": "2025-07-31",
"count": 2
},
{
"date": "2026-06-16",
"count": 1
}
],
"complete": true,
"collected": 5,
"total_forks": 5
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"samples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj",
"apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj",
"apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj",
"apps/Bee.Northwind/Bee.Northwind.Server/Bee.Northwind.Server.csproj",
"apps/Bee.Northwind/Bee.Northwind.UI/Bee.Northwind.UI.csproj",
"apps/Bee.Northwind/Bee.Northwind.iOS/Bee.Northwind.iOS.csproj",
"samples/Avalonia.Demo/Avalonia.Demo.csproj",
"samples/Avalonia.DemoCenter/Avalonia.DemoCenter.csproj",
"samples/Bee.Samples.Shared/Bee.Samples.Shared.csproj",
"samples/Blazor.Server.Demo/Blazor.Server.Demo.csproj",
"samples/Blazor.Wasm.Demo.Host/Blazor.Wasm.Demo.Host.csproj",
"samples/Blazor.Wasm.Demo/Blazor.Wasm.Demo.csproj",
"samples/Maui.Demo/Maui.Demo.csproj",
"samples/QuickStart.Console/QuickStart.Console.csproj",
"samples/QuickStart.Server/QuickStart.Server.csproj",
"src/Bee.Api.AspNetCore/Bee.Api.AspNetCore.csproj",
"src/Bee.Api.Client/Bee.Api.Client.csproj",
"src/Bee.Api.Contracts/Bee.Api.Contracts.csproj",
"src/Bee.Api.Core/Bee.Api.Core.csproj",
"src/Bee.Base/Bee.Base.csproj",
"src/Bee.Business/Bee.Business.csproj",
"src/Bee.Db/Bee.Db.csproj",
"src/Bee.Definition/Bee.Definition.csproj",
"src/Bee.Expressions/Bee.Expressions.csproj",
"src/Bee.Hosting/Bee.Hosting.csproj",
"src/Bee.ObjectCaching/Bee.ObjectCaching.csproj",
"src/Bee.Repository.Abstractions/Bee.Repository.Abstractions.csproj",
"src/Bee.Repository/Bee.Repository.csproj",
"src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
"src/Bee.UI.Core/Bee.UI.Core.csproj",
"src/Bee.UI.Maui/Bee.UI.Maui.csproj",
"src/Bee.Web.Blazor.Server/Bee.Web.Blazor.Server.csproj",
"src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj",
"tests/Bee.Api.AspNetCore.UnitTests/Bee.Api.AspNetCore.UnitTests.csproj",
"tests/Bee.Api.Client.UnitTests/Bee.Api.Client.UnitTests.csproj",
"tests/Bee.Api.Core.UnitTests/Bee.Api.Core.UnitTests.csproj",
"tests/Bee.Base.UnitTests/Bee.Base.UnitTests.csproj",
"tests/Bee.Business.UnitTests/Bee.Business.UnitTests.csproj",
"tests/Bee.Db.UnitTests/Bee.Db.UnitTests.csproj",
"tests/Bee.Definition.UnitTests/Bee.Definition.UnitTests.csproj",
"tests/Bee.Expressions.UnitTests/Bee.Expressions.UnitTests.csproj",
"tests/Bee.Hosting.UnitTests/Bee.Hosting.UnitTests.csproj",
"tests/Bee.ObjectCaching.UnitTests/Bee.ObjectCaching.UnitTests.csproj",
"tests/Bee.Repository.UnitTests/Bee.Repository.UnitTests.csproj",
"tests/Bee.Tests.Shared/Bee.Tests.Shared.csproj",
"tests/Bee.UI.Avalonia.UnitTests/Bee.UI.Avalonia.UnitTests.csproj",
"tests/Bee.UI.Core.UnitTests/Bee.UI.Core.UnitTests.csproj",
"tests/Bee.UI.Maui.UnitTests/Bee.UI.Maui.UnitTests.csproj",
"tests/Bee.Web.Blazor.Server.UnitTests/Bee.Web.Blazor.Server.UnitTests.csproj",
"tests/Bee.Web.Blazor.Wasm.UnitTests/Bee.Web.Blazor.Wasm.UnitTests.csproj",
"tools/Bee.Cli/Bee.Cli.csproj",
"tools/DefineEditor/Bee.DefineEditor.csproj"
],
"largest_source_bytes": 54586,
"source_files_sampled": 1545,
"oversized_source_files": 0,
"agent_instruction_files": [
".claude/CLAUDE.md"
],
"agent_instruction_max_bytes": 5759
},
"dependencies": {
"manifests": [],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [],
"dependencies": [
{
"name": "MessagePack",
"manifest": "src/Bee.Definition/Bee.Definition.csproj",
"ecosystem": "nuget",
"version_constraint": "3.1.7"
},
{
"name": "Microsoft.Extensions.Localization.Abstractions",
"manifest": "src/Bee.Definition/Bee.Definition.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.8"
},
{
"name": "DynamicExpresso.Core",
"manifest": "src/Bee.Expressions/Bee.Expressions.csproj",
"ecosystem": "nuget",
"version_constraint": "2.19.3"
},
{
"name": "Microsoft.Extensions.DependencyInjection",
"manifest": "src/Bee.Hosting/Bee.Hosting.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.Extensions.Hosting.Abstractions",
"manifest": "src/Bee.Hosting/Bee.Hosting.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Microsoft.Extensions.Caching.Memory",
"manifest": "src/Bee.ObjectCaching/Bee.ObjectCaching.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Avalonia",
"manifest": "src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
"ecosystem": "nuget",
"version_constraint": "12.0.0"
},
{
"name": "Avalonia.Controls.DataGrid",
"manifest": "src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
"ecosystem": "nuget",
"version_constraint": "12.0.0"
},
{
"name": "Microsoft.Maui.Controls",
"manifest": "src/Bee.UI.Maui/Bee.UI.Maui.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.20"
},
{
"name": "Microsoft.AspNetCore.Components.WebAssembly",
"manifest": "src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj",
"ecosystem": "nuget",
"version_constraint": "10.0.0"
},
{
"name": "Avalonia",
"manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "12.0.4"
},
{
"name": "Avalonia.Desktop",
"manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "12.0.4"
},
{
"name": "Semi.Avalonia",
"manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "12.0.3"
},
{
"name": "Avalonia.Fonts.Inter",
"manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "12.0.4"
},
{
"name": "AvaloniaUI.DiagnosticsSupport",
"manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "2.2.1"
},
{
"name": "CommunityToolkit.Mvvm",
"manifest": "tools/DefineEditor/Bee.DefineEditor.csproj",
"ecosystem": "nuget",
"version_constraint": "8.4.1"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 89,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 79
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "jeff377",
"commits": 1860,
"avatar_url": "https://avatars.githubusercontent.com/u/16026012?v=4"
},
{
"type": "User",
"login": "claude",
"commits": 189,
"avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.908
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"auto-merge.yml",
"build-ci.yml",
"nuget-publish.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": true,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 6,
"reason": "project has 2 contributing companies or organizations -- score normalized to 6",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 10,
"reason": "all dependencies are pinned",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "a240a4ee71d9b0c4710e8f5deacedf39b7616448",
"ran_at": "2026-07-23T14:07:38Z",
"aggregate_score": 5.3,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T13:55:21Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-06-13T09:16:46Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/jeff377/bee-library",
"host": "github.com",
"name": "bee-library",
"owner": "jeff377"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"security": 53,
"vitality": 93,
"community": 35,
"governance": 47,
"engineering": 71
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 93,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 89,
"inputs": {
"commits_last_year": 1710,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 36
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "36/52 weeks with commits",
"points": 24.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 36
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "1710 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 1710
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 60,
"latest_release_tag": "v4.15.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 4.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "60 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 60
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~4.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 4.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 35,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"forks": 5,
"stars": 10,
"watchers": 2,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "10 stars",
"points": 15.5,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 10
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "5 forks",
"points": 5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 5
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "2 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 2
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "at_risk",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 38,
"inputs": {
"packages": [
"Bee.Cli"
],
"dependents": null,
"ecosystems": "nuget",
"total_downloads": 870,
"monthly_downloads": null
},
"components": [
{
"key": "total_downloads",
"name": "Total downloads",
"detail": "870 downloads all-time across nuget",
"points": 30.5,
"status": "partial",
"details": [
{
"code": "downloads_total",
"params": {
"count": 870,
"ecosystems": "nuget"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 47,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.908
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 91% of commits",
"points": 2.1,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 91
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 2 contributing companies or organizations -- score normalized to 6",
"points": 6,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "at_risk",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 38,
"inputs": {
"merged_prs": 89,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 79
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "89/168 decided PRs merged",
"points": 20.3,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 89,
"decided": 168
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 46,
"inputs": {
"followers": 7,
"owner_type": "User",
"is_verified": null,
"owner_login": "jeff377",
"public_repos": 14,
"account_age_days": 3892
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "7 followers of jeff377",
"points": 6.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 7,
"login": "jeff377"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "14 public repos, account ~10 yr old",
"points": 20.6,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 14
}
},
{
"code": "account_age_years",
"params": {
"years": 10
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"Bee.Cli"
],
"ecosystems": "nuget",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on nuget",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "nuget"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "9 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 9
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 71,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": true,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 6.4,
"status": "met",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"clear-architecture",
"mvvm",
"n-tier",
"erp",
"enterprise-architecture"
],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "5 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 5
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 53,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"ci_tests",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 53,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 5.3
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 2 contributing companies or organizations -- score normalized to 6",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "all dependencies are pinned",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 73,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
".claude/CLAUDE.md"
],
"agent_instruction_max_bytes": 5759
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": ".claude/CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".claude/CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 1,
"toolchain_manifests": [
"apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj",
"apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj",
"apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj",
"apps/Bee.Northwind/Bee.Northwind.Server/Bee.Northwind.Server.csproj",
"apps/Bee.Northwind/Bee.Northwind.UI/Bee.Northwind.UI.csproj",
"apps/Bee.Northwind/Bee.Northwind.iOS/Bee.Northwind.iOS.csproj",
"samples/Avalonia.Demo/Avalonia.Demo.csproj",
"samples/Avalonia.DemoCenter/Avalonia.DemoCenter.csproj",
"samples/Bee.Samples.Shared/Bee.Samples.Shared.csproj",
"samples/Blazor.Server.Demo/Blazor.Server.Demo.csproj",
"samples/Blazor.Wasm.Demo.Host/Blazor.Wasm.Demo.Host.csproj",
"samples/Blazor.Wasm.Demo/Blazor.Wasm.Demo.csproj",
"samples/Maui.Demo/Maui.Demo.csproj",
"samples/QuickStart.Console/QuickStart.Console.csproj",
"samples/QuickStart.Server/QuickStart.Server.csproj",
"src/Bee.Api.AspNetCore/Bee.Api.AspNetCore.csproj",
"src/Bee.Api.Client/Bee.Api.Client.csproj",
"src/Bee.Api.Contracts/Bee.Api.Contracts.csproj",
"src/Bee.Api.Core/Bee.Api.Core.csproj",
"src/Bee.Base/Bee.Base.csproj",
"src/Bee.Business/Bee.Business.csproj",
"src/Bee.Db/Bee.Db.csproj",
"src/Bee.Definition/Bee.Definition.csproj",
"src/Bee.Expressions/Bee.Expressions.csproj",
"src/Bee.Hosting/Bee.Hosting.csproj",
"src/Bee.ObjectCaching/Bee.ObjectCaching.csproj",
"src/Bee.Repository.Abstractions/Bee.Repository.Abstractions.csproj",
"src/Bee.Repository/Bee.Repository.csproj",
"src/Bee.UI.Avalonia/Bee.UI.Avalonia.csproj",
"src/Bee.UI.Core/Bee.UI.Core.csproj",
"src/Bee.UI.Maui/Bee.UI.Maui.csproj",
"src/Bee.Web.Blazor.Server/Bee.Web.Blazor.Server.csproj",
"src/Bee.Web.Blazor.Wasm/Bee.Web.Blazor.Wasm.csproj",
"tests/Bee.Api.AspNetCore.UnitTests/Bee.Api.AspNetCore.UnitTests.csproj",
"tests/Bee.Api.Client.UnitTests/Bee.Api.Client.UnitTests.csproj",
"tests/Bee.Api.Core.UnitTests/Bee.Api.Core.UnitTests.csproj",
"tests/Bee.Base.UnitTests/Bee.Base.UnitTests.csproj",
"tests/Bee.Business.UnitTests/Bee.Business.UnitTests.csproj",
"tests/Bee.Db.UnitTests/Bee.Db.UnitTests.csproj",
"tests/Bee.Definition.UnitTests/Bee.Definition.UnitTests.csproj",
"tests/Bee.Expressions.UnitTests/Bee.Expressions.UnitTests.csproj",
"tests/Bee.Hosting.UnitTests/Bee.Hosting.UnitTests.csproj",
"tests/Bee.ObjectCaching.UnitTests/Bee.ObjectCaching.UnitTests.csproj",
"tests/Bee.Repository.UnitTests/Bee.Repository.UnitTests.csproj",
"tests/Bee.Tests.Shared/Bee.Tests.Shared.csproj",
"tests/Bee.UI.Avalonia.UnitTests/Bee.UI.Avalonia.UnitTests.csproj",
"tests/Bee.UI.Core.UnitTests/Bee.UI.Core.UnitTests.csproj",
"tests/Bee.UI.Maui.UnitTests/Bee.UI.Maui.UnitTests.csproj",
"tests/Bee.Web.Blazor.Server.UnitTests/Bee.Web.Blazor.Server.UnitTests.csproj",
"tests/Bee.Web.Blazor.Wasm.UnitTests/Bee.Web.Blazor.Wasm.UnitTests.csproj",
"tools/Bee.Cli/Bee.Cli.csproj",
"tools/DefineEditor/Bee.DefineEditor.csproj"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj, apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj, apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "apps/Bee.Northwind/Bee.Northwind.Android/Bee.Northwind.Android.csproj, apps/Bee.Northwind/Bee.Northwind.Browser/Bee.Northwind.Browser.csproj, apps/Bee.Northwind/Bee.Northwind.Desktop/Bee.Northwind.Desktop.csproj"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "C# (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C#"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "100 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 100,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "all dependencies are pinned",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "C#",
"largest_source_bytes": 54586,
"source_files_sampled": 1545,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "C# (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C#"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/1545 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 1545,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"samples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "samples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "samples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-23T14:07:46.257374Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jeff377/bee-library.svg",
"full_name": "jeff377/bee-library",
"license_state": "standard",
"license_spdx": "MIT"
}