neo.mjs 11.4.0 → 11.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/.sync-metadata.json +214 -17
- package/README.md +69 -54
- package/ServiceWorker.mjs +2 -2
- package/ai/mcp/server/github-workflow/config.mjs +89 -2
- package/ai/mcp/server/github-workflow/logger.mjs +1 -4
- package/ai/mcp/server/github-workflow/mcp-stdio.mjs +28 -0
- package/ai/mcp/server/github-workflow/services/IssueService.mjs +17 -13
- package/ai/mcp/server/github-workflow/services/PullRequestService.mjs +2 -9
- package/ai/mcp/server/github-workflow/services/queries/issueQueries.mjs +1 -15
- package/ai/mcp/server/github-workflow/services/queries/pullRequestQueries.mjs +1 -8
- package/ai/mcp/server/github-workflow/services/sync/IssueSyncer.mjs +13 -5
- package/ai/mcp/server/knowledge-base/config.mjs +89 -2
- package/ai/mcp/server/knowledge-base/logger.mjs +1 -4
- package/ai/mcp/server/knowledge-base/mcp-stdio.mjs +28 -0
- package/ai/mcp/server/memory-core/config.mjs +89 -2
- package/ai/mcp/server/memory-core/logger.mjs +1 -4
- package/ai/mcp/server/memory-core/mcp-stdio.mjs +28 -0
- package/ai/mcp/server/memory-core/openapi.yaml +9 -2
- package/ai/mcp/server/memory-core/services/HealthService.mjs +5 -1
- package/ai/mcp/server/memory-core/services/MemoryService.mjs +5 -0
- package/ai/mcp/server/memory-core/services/SessionService.mjs +9 -1
- package/apps/portal/service/Seo.mjs +1 -1
- package/apps/portal/sitemap.xml +8 -8
- package/apps/portal/view/ViewportController.mjs +1 -5
- package/apps/portal/view/home/FooterContainer.mjs +1 -1
- package/apps/portal/view/learn/ContentComponent.mjs +6 -9
- package/apps/portal/view/learn/ContentTreeList.mjs +1 -1
- package/buildScripts/buildAll.mjs +15 -10
- package/buildScripts/buildHighlightJs.mjs +79 -0
- package/buildScripts/createApp.mjs +10 -9
- package/buildScripts/createAppMinimal.mjs +17 -15
- package/buildScripts/webpack/development/webpack.config.main.mjs +3 -1
- package/buildScripts/webpack/production/webpack.config.main.mjs +3 -1
- package/learn/benefits/ConfigSystem.md +1 -1
- package/package.json +3 -3
- package/resources/scss/src/util/HighlightJs.scss +127 -0
- package/resources/scss/src/util/HighlightJsLineNumbers.scss +33 -0
- package/resources/scss/theme-dark/util/HighlightJs.scss +21 -0
- package/resources/scss/theme-dark/util/HighlightJsLineNumbers.scss +6 -0
- package/resources/scss/theme-light/util/HighlightJs.scss +21 -0
- package/resources/scss/theme-light/util/HighlightJsLineNumbers.scss +6 -0
- package/resources/scss/theme-neo-light/util/HighlightJs.scss +21 -0
- package/resources/scss/theme-neo-light/util/HighlightJsLineNumbers.scss +6 -0
- package/src/DefaultConfig.mjs +5 -5
- package/src/Main.mjs +8 -2
- package/src/controller/Application.mjs +34 -11
- package/src/core/Base.mjs +1 -1
- package/src/core/IdGenerator.mjs +3 -3
- package/src/data/Store.mjs +10 -1
- package/src/main/addon/ServerSideRendering.mjs +30 -0
- package/src/mixin/VdomLifecycle.mjs +11 -9
- package/src/util/HighlightJs.mjs +111 -0
- package/src/util/HighlightJsLineNumbers.mjs +102 -0
- package/src/worker/App.mjs +8 -0
- package/src/worker/Manager.mjs +18 -3
- package/apps/portal/resources/lib/highlight/CHANGES.md +0 -1739
- package/apps/portal/resources/lib/highlight/LICENSE +0 -24
- package/apps/portal/resources/lib/highlight/README.md +0 -186
- package/apps/portal/resources/lib/highlight/highlight.pack.js +0 -2
- package/apps/portal/resources/lib/highlightjs-custom-dark-theme.css +0 -120
- package/apps/portal/resources/lib/highlightjs-custom-github-theme.css +0 -136
- package/test/playwright/mcp/github-workflow/ghIntegrationGate.spec.mjs +0 -13
- package/test/playwright/mcp/github-workflow/test-support/ghGate.mjs +0 -34
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"lastSync": "2025-11-
|
|
3
|
-
"releasesLastFetched": "2025-11-
|
|
2
|
+
"lastSync": "2025-11-19T12:40:24.603Z",
|
|
3
|
+
"releasesLastFetched": "2025-11-19T12:40:24.607Z",
|
|
4
4
|
"pushFailures": [],
|
|
5
5
|
"issues": {
|
|
6
6
|
"3789": {
|
|
@@ -2905,22 +2905,22 @@
|
|
|
2905
2905
|
"state": "OPEN",
|
|
2906
2906
|
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7201.md",
|
|
2907
2907
|
"closedAt": null,
|
|
2908
|
-
"updatedAt": "2025-
|
|
2909
|
-
"contentHash": "
|
|
2908
|
+
"updatedAt": "2025-11-19T02:51:55Z",
|
|
2909
|
+
"contentHash": "84055c05b54b8a110659db99e65891a4b297b65deea3a1e3116ed9040e8cbf68"
|
|
2910
2910
|
},
|
|
2911
2911
|
"7202": {
|
|
2912
2912
|
"state": "OPEN",
|
|
2913
2913
|
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7202.md",
|
|
2914
2914
|
"closedAt": null,
|
|
2915
|
-
"updatedAt": "2025-
|
|
2916
|
-
"contentHash": "
|
|
2915
|
+
"updatedAt": "2025-11-19T02:51:53Z",
|
|
2916
|
+
"contentHash": "9b5f31e856dce32044aa9a4677bb5d08278ef0bb9d3761d9de36706c5e134c73"
|
|
2917
2917
|
},
|
|
2918
2918
|
"7203": {
|
|
2919
2919
|
"state": "OPEN",
|
|
2920
2920
|
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7203.md",
|
|
2921
2921
|
"closedAt": null,
|
|
2922
|
-
"updatedAt": "2025-
|
|
2923
|
-
"contentHash": "
|
|
2922
|
+
"updatedAt": "2025-11-19T02:51:52Z",
|
|
2923
|
+
"contentHash": "33ccf238fd6d2b8036942aff6fa53da3f5cec7972746fefe14c869f033863565"
|
|
2924
2924
|
},
|
|
2925
2925
|
"7204": {
|
|
2926
2926
|
"state": "CLOSED",
|
|
@@ -2933,15 +2933,15 @@
|
|
|
2933
2933
|
"state": "OPEN",
|
|
2934
2934
|
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7205.md",
|
|
2935
2935
|
"closedAt": null,
|
|
2936
|
-
"updatedAt": "2025-
|
|
2937
|
-
"contentHash": "
|
|
2936
|
+
"updatedAt": "2025-11-19T02:51:51Z",
|
|
2937
|
+
"contentHash": "db6e3283cd8bf5b81c06c3840b3de1e873695cb0601d8f8b290b3d708472a4c1"
|
|
2938
2938
|
},
|
|
2939
2939
|
"7206": {
|
|
2940
2940
|
"state": "OPEN",
|
|
2941
2941
|
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7206.md",
|
|
2942
2942
|
"closedAt": null,
|
|
2943
|
-
"updatedAt": "2025-
|
|
2944
|
-
"contentHash": "
|
|
2943
|
+
"updatedAt": "2025-11-19T02:51:49Z",
|
|
2944
|
+
"contentHash": "aec7dffe23f3362bb0e0d473cbf0e45053e19b94c7a90288b8d8a5e5a05627f4"
|
|
2945
2945
|
},
|
|
2946
2946
|
"7207": {
|
|
2947
2947
|
"state": "OPEN",
|
|
@@ -3239,7 +3239,7 @@
|
|
|
3239
3239
|
},
|
|
3240
3240
|
"7249": {
|
|
3241
3241
|
"state": "CLOSED",
|
|
3242
|
-
"path": "/Users/Shared/github/neomjs/neo/.github/
|
|
3242
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.4.0/issue-7249.md",
|
|
3243
3243
|
"closedAt": "2025-11-15T09:45:18Z",
|
|
3244
3244
|
"updatedAt": "2025-11-15T09:45:18Z",
|
|
3245
3245
|
"contentHash": "4036e122ae18e253a64675831ea5c0ec2c585f7ac826a4e6373781763bebcfd3"
|
|
@@ -4541,7 +4541,7 @@
|
|
|
4541
4541
|
},
|
|
4542
4542
|
"7489": {
|
|
4543
4543
|
"state": "CLOSED",
|
|
4544
|
-
"path": "/Users/Shared/github/neomjs/neo/.github/
|
|
4544
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.4.0/issue-7489.md",
|
|
4545
4545
|
"closedAt": "2025-11-15T09:44:33Z",
|
|
4546
4546
|
"updatedAt": "2025-11-15T09:44:33Z",
|
|
4547
4547
|
"contentHash": "423007a56532f4d57142bb685125f9f5e7bf1a3749370d1c7267cc945e48d37c"
|
|
@@ -6361,24 +6361,213 @@
|
|
|
6361
6361
|
},
|
|
6362
6362
|
"7775": {
|
|
6363
6363
|
"state": "CLOSED",
|
|
6364
|
-
"path": "/Users/Shared/github/neomjs/neo/.github/
|
|
6364
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.4.0/issue-7775.md",
|
|
6365
6365
|
"closedAt": "2025-11-15T09:41:42Z",
|
|
6366
6366
|
"updatedAt": "2025-11-15T09:41:42Z",
|
|
6367
6367
|
"contentHash": "4657193d7084aa82709796c45c1b3a0f5d06d14ef9fa6f1d7d4941a8d744325f"
|
|
6368
6368
|
},
|
|
6369
6369
|
"7776": {
|
|
6370
6370
|
"state": "CLOSED",
|
|
6371
|
-
"path": "/Users/Shared/github/neomjs/neo/.github/
|
|
6371
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.4.0/issue-7776.md",
|
|
6372
6372
|
"closedAt": "2025-11-15T12:30:46Z",
|
|
6373
6373
|
"updatedAt": "2025-11-15T12:30:46Z",
|
|
6374
6374
|
"contentHash": "09aa6166ff62f457cdad47c69025b57d0843e0f6f17840ddc1138293cdeb1ad3"
|
|
6375
6375
|
},
|
|
6376
6376
|
"7777": {
|
|
6377
6377
|
"state": "CLOSED",
|
|
6378
|
-
"path": "/Users/Shared/github/neomjs/neo/.github/
|
|
6378
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.4.0/issue-7777.md",
|
|
6379
6379
|
"closedAt": "2025-11-15T12:51:55Z",
|
|
6380
6380
|
"updatedAt": "2025-11-15T12:51:55Z",
|
|
6381
6381
|
"contentHash": "0946c291adc1caa5adf38c109ab8f0be915fc7d6a438fac4c39df4009122d73a"
|
|
6382
|
+
},
|
|
6383
|
+
"7778": {
|
|
6384
|
+
"state": "CLOSED",
|
|
6385
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7778.md",
|
|
6386
|
+
"closedAt": "2025-11-15T13:58:30Z",
|
|
6387
|
+
"updatedAt": "2025-11-15T13:58:30Z",
|
|
6388
|
+
"contentHash": "d1b22b9ce581d36f1e55d5829cadb6c1a02be1c7f4b1b94042f8169eeede2ffd"
|
|
6389
|
+
},
|
|
6390
|
+
"7780": {
|
|
6391
|
+
"state": "CLOSED",
|
|
6392
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7780.md",
|
|
6393
|
+
"closedAt": "2025-11-15T21:34:26Z",
|
|
6394
|
+
"updatedAt": "2025-11-18T08:55:06Z",
|
|
6395
|
+
"contentHash": "412e8c50b57f5f1fa5baf5375c7262bdd6bc2c814f6636258c5fb3d561959b0c"
|
|
6396
|
+
},
|
|
6397
|
+
"7781": {
|
|
6398
|
+
"state": "CLOSED",
|
|
6399
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7781.md",
|
|
6400
|
+
"closedAt": "2025-11-16T23:11:26Z",
|
|
6401
|
+
"updatedAt": "2025-11-16T23:11:26Z",
|
|
6402
|
+
"contentHash": "d386628f811df073e8633b11cf230bbbc6b05ec0ddee3f38f525f4549c3f5e8f"
|
|
6403
|
+
},
|
|
6404
|
+
"7782": {
|
|
6405
|
+
"state": "CLOSED",
|
|
6406
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7782.md",
|
|
6407
|
+
"closedAt": "2025-11-16T23:53:42Z",
|
|
6408
|
+
"updatedAt": "2025-11-16T23:53:42Z",
|
|
6409
|
+
"contentHash": "e89fc8842e0c7ff8b6c283cd241cd1da5910e3c182731806bcb19f9af8a7d089"
|
|
6410
|
+
},
|
|
6411
|
+
"7783": {
|
|
6412
|
+
"state": "CLOSED",
|
|
6413
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7783.md",
|
|
6414
|
+
"closedAt": "2025-11-17T18:57:49Z",
|
|
6415
|
+
"updatedAt": "2025-11-17T18:57:49Z",
|
|
6416
|
+
"contentHash": "f0d42030d5dc70178fc216a6c1d101a7f81a04e4451fe7c6beaa4182e3b9ba7a"
|
|
6417
|
+
},
|
|
6418
|
+
"7784": {
|
|
6419
|
+
"state": "CLOSED",
|
|
6420
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7784.md",
|
|
6421
|
+
"closedAt": "2025-11-17T20:21:21Z",
|
|
6422
|
+
"updatedAt": "2025-11-17T20:21:21Z",
|
|
6423
|
+
"contentHash": "ae86add823a749168646731a25f5c8fc984b731ddffa8096051c8252cd086801"
|
|
6424
|
+
},
|
|
6425
|
+
"7785": {
|
|
6426
|
+
"state": "CLOSED",
|
|
6427
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7785.md",
|
|
6428
|
+
"closedAt": "2025-11-17T20:26:06Z",
|
|
6429
|
+
"updatedAt": "2025-11-17T20:26:06Z",
|
|
6430
|
+
"contentHash": "5c828123f597d55567657e9cc2a5b5157b739d99d6119a05eccba1831b064f05"
|
|
6431
|
+
},
|
|
6432
|
+
"7786": {
|
|
6433
|
+
"state": "CLOSED",
|
|
6434
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7786.md",
|
|
6435
|
+
"closedAt": "2025-11-17T22:49:08Z",
|
|
6436
|
+
"updatedAt": "2025-11-17T22:49:08Z",
|
|
6437
|
+
"contentHash": "bcf1099b42f52268b76f5141c7fd8b6e934877666f5b597af5e6f00e51850ef2"
|
|
6438
|
+
},
|
|
6439
|
+
"7787": {
|
|
6440
|
+
"state": "CLOSED",
|
|
6441
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7787.md",
|
|
6442
|
+
"closedAt": "2025-11-17T23:34:42Z",
|
|
6443
|
+
"updatedAt": "2025-11-17T23:34:42Z",
|
|
6444
|
+
"contentHash": "37615a9e8021d0ad8129b7c1e559c8da590b9413315ebae2cb4538ee78875f50"
|
|
6445
|
+
},
|
|
6446
|
+
"7788": {
|
|
6447
|
+
"state": "CLOSED",
|
|
6448
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7788.md",
|
|
6449
|
+
"closedAt": "2025-11-18T20:07:27Z",
|
|
6450
|
+
"updatedAt": "2025-11-18T20:07:27Z",
|
|
6451
|
+
"contentHash": "a45ca7464c136a21c52cdf762822be8aaafd8e55e2815c8cfa3a77afccbfb813"
|
|
6452
|
+
},
|
|
6453
|
+
"7789": {
|
|
6454
|
+
"state": "CLOSED",
|
|
6455
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7789.md",
|
|
6456
|
+
"closedAt": "2025-11-18T14:15:59Z",
|
|
6457
|
+
"updatedAt": "2025-11-18T14:15:59Z",
|
|
6458
|
+
"contentHash": "ff283feabb89101e40a8e5f34038a9a4d8a58dd17151434d6a105b5bd4c9d4a2"
|
|
6459
|
+
},
|
|
6460
|
+
"7790": {
|
|
6461
|
+
"state": "CLOSED",
|
|
6462
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7790.md",
|
|
6463
|
+
"closedAt": "2025-11-18T12:12:48Z",
|
|
6464
|
+
"updatedAt": "2025-11-18T12:12:48Z",
|
|
6465
|
+
"contentHash": "67c62e4bc1eb83ef7743e14c18c6f203159ff73d3cde6f7d207412d9ee3d2735"
|
|
6466
|
+
},
|
|
6467
|
+
"7791": {
|
|
6468
|
+
"state": "CLOSED",
|
|
6469
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7791.md",
|
|
6470
|
+
"closedAt": "2025-11-18T19:27:35Z",
|
|
6471
|
+
"updatedAt": "2025-11-18T19:27:35Z",
|
|
6472
|
+
"contentHash": "e6904afb6e01c0a80f50e67e7716cd819f6f5dfb8d64eaa94c544148d9f5b50f"
|
|
6473
|
+
},
|
|
6474
|
+
"7793": {
|
|
6475
|
+
"state": "CLOSED",
|
|
6476
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7793.md",
|
|
6477
|
+
"closedAt": "2025-11-19T12:40:12Z",
|
|
6478
|
+
"updatedAt": "2025-11-19T12:40:12Z",
|
|
6479
|
+
"contentHash": "b79258b967d08e9ee3e10f30e79464c6d4ffcc5d308a601af2a321f28cf5389e"
|
|
6480
|
+
},
|
|
6481
|
+
"7794": {
|
|
6482
|
+
"state": "CLOSED",
|
|
6483
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7794.md",
|
|
6484
|
+
"closedAt": "2025-11-18T17:26:27Z",
|
|
6485
|
+
"updatedAt": "2025-11-18T17:26:27Z",
|
|
6486
|
+
"contentHash": "480c851b6513603987373430f75b3261f698fc399f6159f07f3b6e9d612cc11b"
|
|
6487
|
+
},
|
|
6488
|
+
"7795": {
|
|
6489
|
+
"state": "CLOSED",
|
|
6490
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7795.md",
|
|
6491
|
+
"closedAt": "2025-11-18T19:47:12Z",
|
|
6492
|
+
"updatedAt": "2025-11-18T19:47:13Z",
|
|
6493
|
+
"contentHash": "c2145fbd2c0b87f55dfbb035ff4f3cff0dbc1f719838c93098294e9996b4cb77"
|
|
6494
|
+
},
|
|
6495
|
+
"7796": {
|
|
6496
|
+
"state": "CLOSED",
|
|
6497
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE_ARCHIVE/11.5.0/issue-7796.md",
|
|
6498
|
+
"closedAt": "2025-11-18T20:00:39Z",
|
|
6499
|
+
"updatedAt": "2025-11-18T20:00:39Z",
|
|
6500
|
+
"contentHash": "c0c068430f627292b356545c7f791f0b9256d8fec92a5e75a932d72984465813"
|
|
6501
|
+
},
|
|
6502
|
+
"7797": {
|
|
6503
|
+
"state": "CLOSED",
|
|
6504
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7797.md",
|
|
6505
|
+
"closedAt": "2025-11-19T09:54:38Z",
|
|
6506
|
+
"updatedAt": "2025-11-19T09:54:38Z",
|
|
6507
|
+
"contentHash": "7a6730c1ac4f027b62a63bedc58055ffeb0d00fbf0310fa16f1828db7b8ea085"
|
|
6508
|
+
},
|
|
6509
|
+
"7798": {
|
|
6510
|
+
"state": "CLOSED",
|
|
6511
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7798.md",
|
|
6512
|
+
"closedAt": "2025-11-19T01:56:15Z",
|
|
6513
|
+
"updatedAt": "2025-11-19T01:56:15Z",
|
|
6514
|
+
"contentHash": "b16c800b714244c0f5d33098e6bb13a2ef034ff7245675692d3deca454ab6973"
|
|
6515
|
+
},
|
|
6516
|
+
"7799": {
|
|
6517
|
+
"state": "CLOSED",
|
|
6518
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7799.md",
|
|
6519
|
+
"closedAt": "2025-11-19T01:58:16Z",
|
|
6520
|
+
"updatedAt": "2025-11-19T01:58:16Z",
|
|
6521
|
+
"contentHash": "1c206d2e26365960b9a9ca6e8cb188b23b1cd8027b2339ef3211faa82828b3df"
|
|
6522
|
+
},
|
|
6523
|
+
"7800": {
|
|
6524
|
+
"state": "CLOSED",
|
|
6525
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7800.md",
|
|
6526
|
+
"closedAt": "2025-11-19T02:04:02Z",
|
|
6527
|
+
"updatedAt": "2025-11-19T02:04:02Z",
|
|
6528
|
+
"contentHash": "e166fe317017b61f08d1ffb0e0f554c35dbf615ea28877a6ba4522ea2d374148"
|
|
6529
|
+
},
|
|
6530
|
+
"7801": {
|
|
6531
|
+
"state": "CLOSED",
|
|
6532
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7801.md",
|
|
6533
|
+
"closedAt": "2025-11-19T10:09:35Z",
|
|
6534
|
+
"updatedAt": "2025-11-19T10:09:35Z",
|
|
6535
|
+
"contentHash": "84eec3a5182f07ef575857227e50b0d799a28a354e9ff34798f64263a30532b8"
|
|
6536
|
+
},
|
|
6537
|
+
"7802": {
|
|
6538
|
+
"state": "CLOSED",
|
|
6539
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7802.md",
|
|
6540
|
+
"closedAt": "2025-11-19T10:59:33Z",
|
|
6541
|
+
"updatedAt": "2025-11-19T10:59:33Z",
|
|
6542
|
+
"contentHash": "356e92ddd1e6b1a8041263e7d001daed837eaa4d4b1883e4b8769e128f8bc176"
|
|
6543
|
+
},
|
|
6544
|
+
"7803": {
|
|
6545
|
+
"state": "CLOSED",
|
|
6546
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7803.md",
|
|
6547
|
+
"closedAt": "2025-11-19T11:08:40Z",
|
|
6548
|
+
"updatedAt": "2025-11-19T11:08:40Z",
|
|
6549
|
+
"contentHash": "5e272ed54318561523081c173d02c04775496f48d0587d1f760780efcc92ee46"
|
|
6550
|
+
},
|
|
6551
|
+
"7804": {
|
|
6552
|
+
"state": "CLOSED",
|
|
6553
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7804.md",
|
|
6554
|
+
"closedAt": "2025-11-19T11:18:52Z",
|
|
6555
|
+
"updatedAt": "2025-11-19T11:18:52Z",
|
|
6556
|
+
"contentHash": "9792b3df9bcaddd79ce2d286fccd4afc76f49c38af1716e92ba195c184d2f077"
|
|
6557
|
+
},
|
|
6558
|
+
"7805": {
|
|
6559
|
+
"state": "CLOSED",
|
|
6560
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7805.md",
|
|
6561
|
+
"closedAt": "2025-11-19T11:25:48Z",
|
|
6562
|
+
"updatedAt": "2025-11-19T11:25:48Z",
|
|
6563
|
+
"contentHash": "f57c7cba1ca5a122a8e0b885f2637fc596e393f9b0c8d2a2260ce25fa0b3cc26"
|
|
6564
|
+
},
|
|
6565
|
+
"7806": {
|
|
6566
|
+
"state": "CLOSED",
|
|
6567
|
+
"path": "/Users/Shared/github/neomjs/neo/.github/ISSUE/issue-7806.md",
|
|
6568
|
+
"closedAt": "2025-11-19T12:33:43Z",
|
|
6569
|
+
"updatedAt": "2025-11-19T12:33:43Z",
|
|
6570
|
+
"contentHash": "816d05ae4087deba931e4a82d42619748cfc04cd9dd199e069ac9df3e901209b"
|
|
6382
6571
|
}
|
|
6383
6572
|
},
|
|
6384
6573
|
"releases": {
|
|
@@ -6541,6 +6730,14 @@
|
|
|
6541
6730
|
"11.3.0": {
|
|
6542
6731
|
"publishedAt": "2025-11-14T15:35:01Z",
|
|
6543
6732
|
"contentHash": "1ef00564052ebc80568c4677df4414fa38e922d02e251f43da9fd876562b11fb"
|
|
6733
|
+
},
|
|
6734
|
+
"11.4.0": {
|
|
6735
|
+
"publishedAt": "2025-11-15T13:10:59Z",
|
|
6736
|
+
"contentHash": "abcecbb0e46696a81dab5817adcabbf9a731dc7b0c839a6bdd5992908b88c2b1"
|
|
6737
|
+
},
|
|
6738
|
+
"11.5.0": {
|
|
6739
|
+
"publishedAt": "2025-11-18T20:28:02Z",
|
|
6740
|
+
"contentHash": "899bdb696e5a4f1e825e337e189e768fd6c4e5f68453e376b1e3d554644dea8b"
|
|
6544
6741
|
}
|
|
6545
6742
|
}
|
|
6546
6743
|
}
|
package/README.md
CHANGED
|
@@ -11,17 +11,16 @@
|
|
|
11
11
|
<a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-green.svg?logo=GitHub&logoColor=white" alt="PRs Welcome"></a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
|
-
#
|
|
15
|
-
🚀 **
|
|
14
|
+
# The AI-Native Platform for Ultra-Fast Web Apps
|
|
15
|
+
🚀 **True Multithreading Meets Context Engineering — Build Desktop-Class UIs with an AI Co-Developer.**
|
|
16
16
|
|
|
17
|
-
💻 ***Neo.mjs
|
|
17
|
+
💻 ***Neo.mjs is more than a framework; it's a new operating system for the web, architected for unparalleled performance and pioneering human-AI collaboration.***
|
|
18
18
|
|
|
19
|
-
Imagine web applications that never jank, no matter how complex the logic, how many real-time updates they handle, or how
|
|
20
|
-
many browser windows they span. Neo.mjs is engineered from the ground up to deliver **desktop-like fluidity and scalability**.
|
|
21
|
-
**While it excels for Single Page Apps (SPAs), Neo.mjs is simply the best option for browser-based multi-window applications**,
|
|
22
|
-
operating fundamentally different from traditional frameworks.
|
|
19
|
+
Imagine web applications that never jank, no matter how complex the logic, how many real-time updates they handle, or how many browser windows they span. Neo.mjs is engineered from the ground up to deliver **desktop-like fluidity and scalability**. **While it excels for Single Page Apps (SPAs), Neo.mjs is simply the best option for browser-based multi-window applications**, operating fundamentally different from traditional frameworks.
|
|
23
20
|
|
|
24
|
-
By leveraging a **pioneering Off-Main-Thread (OMT) architecture**, Neo.mjs ensures your UI remains butter-smooth
|
|
21
|
+
By leveraging a **pioneering Off-Main-Thread (OMT) architecture**, Neo.mjs ensures your UI remains butter-smooth. The main thread is kept free for one purpose: **flawless user interactions and seamless DOM updates.**
|
|
22
|
+
|
|
23
|
+
But performance is only half the story. With v11, Neo.mjs becomes the world's first **AI-native** frontend platform, designed to be developed *with* AI agents as first-class partners in your workflow.
|
|
25
24
|
|
|
26
25
|
<p align="center">
|
|
27
26
|
<a href="https://youtu.be/pYfM28Pz6_0"><img height="316px" width="400px" src="https://raw.githubusercontent.com/neomjs/pages/master/resources_pub/images/neo33s.png" alt="Neo.mjs Performance Demo 1 (YouTube Video)"></a>
|
|
@@ -37,45 +36,51 @@ Have a question or want to connect with the community? We have two channels to h
|
|
|
37
36
|
* **[⚡️ Slack (For Real-Time Chat)](https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA):** Perfect for quick, real-time conversations. Please note that the free version's history is temporary (messages are deleted after 90 days).
|
|
38
37
|
|
|
39
38
|
</br></br>
|
|
40
|
-
## 🚀
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
You modify code, and your app updates in real-time.
|
|
58
|
-
|
|
59
|
-
3. **Inherent Security by Design**:
|
|
60
|
-
By prioritizing direct DOM API manipulation over string-based methods (like `innerHTML`), Neo.mjs fundamentally reduces
|
|
61
|
-
the attack surface for vulnerabilities like Cross-Site Scripting (XSS), building a more robust and secure application from the ground up.
|
|
62
|
-
|
|
63
|
-
4. **Declarative, Consistent, & Reusable Architecture**:
|
|
64
|
-
Neo.mjs's unique **unified class config system** allows you to define components, layouts, and logic in a clean, declarative,
|
|
65
|
-
and highly consistent way. This significantly reduces boilerplate, improves maintainability, and makes complex UI composition surprisingly straightforward.
|
|
66
|
-
|
|
67
|
-
5. **Scalability for Enterprise & Beyond**:
|
|
68
|
-
Whether building sophisticated enterprise dashboards, data-intensive Gen AI interfaces, or desktop-like multi-window applications,
|
|
69
|
-
Neo.mjs's modular, worker-driven architecture effortlessly scales. Components are persistent, stateful instances that can be unmounted,
|
|
70
|
-
moved, and even remounted across browser windows without losing their logic or state. This is key to preventing the "re-rendering madness"
|
|
71
|
-
common in other frameworks.
|
|
39
|
+
## 🚀 The AI-Native Development Platform
|
|
40
|
+
|
|
41
|
+
Neo.mjs v11 introduces a revolutionary approach to software development: **Context Engineering**. We've moved beyond simple "AI-assisted" coding to create a truly **AI-native** platform where AI agents are deeply integrated partners in the development process. This is made possible by three dedicated **Model Context Protocol (MCP) servers** that give agents the context they need to understand, build, and reason about your code.
|
|
42
|
+
|
|
43
|
+
This isn't just about generating code; it's about creating a self-aware development environment that accelerates velocity, improves quality, and enables a new level of human-AI collaboration.
|
|
44
|
+
|
|
45
|
+
<p align="center">
|
|
46
|
+
<img width="800px" src="https://raw.githubusercontent.com/neomjs/pages/master/resources_pub/website/blog/ContextEngineering.png" alt="Context Engineering Done Right" class="blog-image">
|
|
47
|
+
</p>
|
|
48
|
+
|
|
49
|
+
1. **🧠 The Knowledge Base Server**: Gives agents a deep, semantic understanding of your project. Powered by ChromaDB and Gemini embeddings, it allows agents to perform semantic searches across your entire codebase, documentation, and historical tickets. An agent can ask, "How does VDOM diffing work?" and get the exact source files and architectural guides relevant to the *currently checked-out version*.
|
|
50
|
+
|
|
51
|
+
2. **💾 The Memory Core Server**: Provides agents with persistent, long-term memory. Every interaction—prompt, thought process, and response—is stored, allowing the agent to learn from experience, recall past decisions, and maintain context across multiple sessions. This transforms the agent from a stateless tool into a true collaborator that grows with your project.
|
|
52
|
+
|
|
53
|
+
3. **🤖 The GitHub Workflow Server**: Closes the loop by enabling agents to participate directly in your project's lifecycle. It provides tools for autonomous PR reviews, issue management, and bi-directional synchronization of GitHub issues into a local, queryable set of markdown files. This removes the human bottleneck in code review and project management.
|
|
54
|
+
|
|
55
|
+
This powerful tooling, co-created with AI agents, resulted in **resolving 388 tickets in just 6 weeks**. To learn more about this paradigm shift, read our blog post: **[388 Tickets in 6 Weeks: Context Engineering Done Right](./learn/blog/context-engineering-done-right.md)**.
|
|
72
56
|
|
|
73
57
|
</br></br>
|
|
74
|
-
##
|
|
58
|
+
## 💡 Why Choose Neo.mjs?
|
|
59
|
+
|
|
60
|
+
Traditional single-threaded frameworks struggle with performance bottlenecks, especially in large-scale, data-intensive applications. Neo.mjs offers a fundamentally different solution, designed for **uncompromising performance, AI-native productivity, and superior developer experience.**
|
|
61
|
+
|
|
62
|
+
1. **Eliminate UI Freezes with True Multithreading**:
|
|
63
|
+
> *"The browser's main thread should be treated like a neurosurgeon: only perform precise, scheduled operations with zero distractions."*</br></br>
|
|
64
|
+
— Neo.mjs Core Philosophy
|
|
65
|
+
|
|
66
|
+
Neo.mjs's OMT architecture inherently prevents UI freezes. With our optimized rendering pipeline, your UI will remain consistently responsive, even during intense data processing. It achieves an astonishing rate of **over 40,000 delta updates per second** in optimized environments, potential, limited only by user interaction, not the platform.
|
|
75
67
|
|
|
76
|
-
|
|
68
|
+
2. **Unprecedented Velocity with an AI-Native Workflow**:
|
|
69
|
+
The integrated MCP servers provide a "context-rich" environment where AI agents can work alongside human developers. This enables autonomous code reviews, deep codebase analysis, and a shared understanding of project history, dramatically accelerating development and solving the "bus factor" problem for complex projects.
|
|
77
70
|
|
|
78
|
-
|
|
71
|
+
3. **Build Desktop-Class, Multi-Window Applications**:
|
|
72
|
+
Neo.mjs is the premier solution for building complex, multi-window web applications like **trading platforms, browser-based IDEs, Outlook-style email clients, and multi-screen LLM interfaces**. Its shared worker architecture allows a single application instance to run across multiple browser windows, with real-time state synchronization and the ability to move components between windows seamlessly.
|
|
73
|
+
|
|
74
|
+
4. **Unmatched Developer Experience: Transpilation-Free ESM**:
|
|
75
|
+
Say goodbye to complex build steps. Neo.mjs apps run **natively as ES Modules directly in the browser**. This means **zero builds or transpilation** in dev mode, offering instant reloads and an unparalleled debugging experience where what you write is what you debug.
|
|
76
|
+
|
|
77
|
+
5. **Inherent Security by Design**:
|
|
78
|
+
By prioritizing direct DOM API manipulation over string-based methods (like `innerHTML`), Neo.mjs fundamentally reduces the attack surface for vulnerabilities like Cross-Site Scripting (XSS), building a more robust and secure application from the ground up.
|
|
79
|
+
|
|
80
|
+
</br></br>
|
|
81
|
+
## 📚 Foundational Architecture: The Core Principles
|
|
82
|
+
|
|
83
|
+
The v10 release marked a significant evolution of the Neo.mjs core, introducing a new functional component model and a revolutionary two-tier reactivity system. These principles form the bedrock of the framework today. We've published a five-part blog series that dives deep into this architecture:
|
|
79
84
|
|
|
80
85
|
1. **[A Frontend Love Story: Why the Strategies of Today Won't Build the Apps of Tomorrow](./learn/blog/v10-post1-love-story.md)**
|
|
81
86
|
* *An introduction to the core problems in modern frontend development and the architectural vision of Neo.mjs.*
|
|
@@ -97,6 +102,22 @@ like a full calendar, carousels, and chart wrappers. All components are pre-buil
|
|
|
97
102
|
multi-threaded architecture, significantly accelerating development and eliminating the complexity of integrating disparate
|
|
98
103
|
external component libraries.
|
|
99
104
|
</br></br>
|
|
105
|
+
## A Platform at Scale: More Than Just a Library
|
|
106
|
+
|
|
107
|
+
To appreciate the scope of Neo.mjs, it's important to understand its scale. This is not a micro-library; it's a comprehensive, enterprise-ready platform representing over a decade of architectural investment. **Neo.mjs is an innovation factory.**
|
|
108
|
+
|
|
109
|
+
The stats below, from **October 2025**, provide a snapshot of the ecosystem. For a deeper dive, you can explore the full **[Codebase Overview](./learn/guides/fundamentals/CodebaseOverview.md)**.
|
|
110
|
+
|
|
111
|
+
- **~41,000 lines** of core platform source code
|
|
112
|
+
- **~33,000 lines** across hundreds of working examples and flagship applications
|
|
113
|
+
- **~11,000 lines** of production-grade theming
|
|
114
|
+
- **~6,000 lines** of dedicated AI-native infrastructure
|
|
115
|
+
- **~30,000 lines** of detailed JSDoc documentation
|
|
116
|
+
|
|
117
|
+
**Total: Over 130,000 lines of curated code and documentation.**
|
|
118
|
+
|
|
119
|
+
This is not a small library—it's a complete ecosystem with more source code than many established frameworks, designed for the most demanding use cases.
|
|
120
|
+
</br></br>
|
|
100
121
|
## 📊 Real-World Win: Crushing UI Lag in Action
|
|
101
122
|
|
|
102
123
|
Imagine a developer building a stock trading app with live feeds updating every millisecond. Traditional frameworks often choke,
|
|
@@ -110,7 +131,7 @@ That’s Neo.mjs in action — solving problems others can’t touch.
|
|
|
110
131
|
* **Persistent Component Instances**: Components maintain their state and logic even when their DOM is removed or moved.
|
|
111
132
|
No more wasteful re-creations – just surgical, efficient updates.
|
|
112
133
|
|
|
113
|
-
* **Functional Components
|
|
134
|
+
* **Functional & Class-Based Components**: Neo.mjs offers two powerful component models. **Functional Components**, introduced more recently, provide an easier onboarding experience and a modern, hook-based development style (`defineComponent`, `useConfig`, `useEvent`), similar to other popular frameworks. They are ideal for simpler, more declarative UIs. For advanced use cases requiring granular control over VDOM changes and deeper integration with the framework's lifecycle, **Class-Based Components** offer superior power and flexibility, albeit with slightly more code overhead. Both models seamlessly interoperate, allowing you to choose the right tool for each part of your application while benefiting from the unparalleled performance of our multi-threaded architecture. Best of all, our functional components are free from the "memoization tax" (`useMemo`, `useCallback`) that plagues other frameworks.
|
|
114
135
|
|
|
115
136
|
* **Reactive State Management**: Leveraging `Neo.state.Provider`, Neo.mjs offers natively integrated, hierarchical state management.
|
|
116
137
|
Components declare their data needs via a concise `bind` config. These `bind` functions act as powerful inline formulas, allowing
|
|
@@ -130,17 +151,11 @@ That’s Neo.mjs in action — solving problems others can’t touch.
|
|
|
130
151
|
from UI components for easier maintenance, testing, and team collaboration.
|
|
131
152
|
|
|
132
153
|
* **Multi-Window & Single-Page Applications (SPAs)***: Beyond traditional SPAs, Neo.mjs excels at complex multi-window applications.
|
|
133
|
-
Its unique architecture, powered by seamless cross-worker communication
|
|
134
|
-
extensible Main Thread addons (`Neo.main.addon.*`), enables truly native-like, persistent experiences across browser windows,
|
|
135
|
-
all without a native shell. This is made possible by the same efficient delta-based DOM update engine, which can surgically
|
|
136
|
-
move and update components across window boundaries with unparalleled performance.
|
|
154
|
+
Its unique architecture, powered by seamless cross-worker communication and extensible Main Thread addons, enables truly native-like, persistent experiences across browser windows.
|
|
137
155
|
|
|
138
156
|
* **No npm Dependency Hell**: Neo.mjs apps run with **zero runtime dependencies**, just a few dev dependencies for tooling.
|
|
139
157
|
This means smaller bundles, fewer conflicts, and a simpler dependency graph.
|
|
140
158
|
|
|
141
|
-
* **Cutting-Edge Use Cases**: Ideal for **data-intensive applications, real-time dashboards, web-based IDEs, banking
|
|
142
|
-
applications, and complex multi-window Gen AI interfaces** where performance and responsiveness are non-negotiable.
|
|
143
|
-
|
|
144
159
|
* **Unparalleled Debugging Experience**: Benefit from Neo.mjs's built-in debugging capabilities. Easily inspect the full component
|
|
145
160
|
tree across workers, live-modify component configurations directly in the browser console, and observe real-time UI updates,
|
|
146
161
|
all without complex tooling setup.
|
|
@@ -149,8 +164,6 @@ That’s Neo.mjs in action — solving problems others can’t touch.
|
|
|
149
164
|
|
|
150
165
|
* **Async-Aware Component Lifecycle**: With the `initAsync()` lifecycle method, components can handle asynchronous setup (like fetching data or lazy-loading modules) *before* they are considered "ready." This eliminates entire classes of race conditions and UI flicker, allowing you to build complex, data-dependent components with confidence.
|
|
151
166
|
|
|
152
|
-
* **AI-Native through Context Engineering**: We are pioneering **Context Engineering** to build the first framework architected to be developed *with* AI agents. Instead of just prompting, we are building a dynamic system to provide our AI partner with the right knowledge and tools at the right time. This includes a rich, queryable knowledge base and clear guidelines for both the [AI](./.github/AGENTS.md) and the [human developer](./.github/WORKING_WITH_AGENTS.md). This architectural discipline not only enables AI partnership but also results in a cleaner, more predictable, and more maintainable codebase. Get started with the **[AI Knowledge Base Quick Start Guide](./.github/AI_QUICK_START.md)**.
|
|
153
|
-
|
|
154
167
|
<p align="center">
|
|
155
168
|
<img src="./resources/images/workers-focus.svg" alt="Neo.mjs Worker Architecture Diagram - Shows Main Thread, App Worker, VDom Worker, Canvas Worker, Data Worker, Service Worker, Backend connections.">
|
|
156
169
|
</p>
|
|
@@ -168,9 +181,10 @@ The true power of Neo.mjs lies in its foundational architectural choices, which
|
|
|
168
181
|
| **Component Lifecycle** | **Stable & Persistent**: Instances are created once and persist through UI changes. Features a rich lifecycle with `construct`, `initAsync`, and `afterSetMounted`. | **React**: Ephemeral (functional components are re-executed on every render). **Vue/Angular**: More stable, but lack pre-ready async hooks for complex setup. | **Robust & Predictable**. `initAsync` solves async setup (data fetching, module loading) *before* the first render, preventing UI flicker. Persistence enables complex stateful apps and multi-window operations. |
|
|
169
182
|
| **State Management** | **Surgical Subscriptions**: The integrated `StateProvider` allows components to subscribe *only* to the precise state slices they need, completely bypassing intermediate components. | **React**: Context API re-renders all consumers by default, requiring manual optimization. **Vue/Angular**: Optimized state managers (Pinia, NgRx) are still bound by the main thread. | **Scalable & Decoupled**. More performant for global state changes by default. Architecturally cleaner, avoiding props drilling and the performance traps of React's Context. |
|
|
170
183
|
| **DOM Updates** | **Asymmetric & Off-Thread**: Simple, serializable JSON objects (blueprints) are sent to the VDOM worker for diffing. The Main Thread only receives and applies minimal, pre-calculated patches. | VDOM diffing and DOM manipulation are computationally expensive tasks that occur on the main thread, directly competing with user interactions. | **Faster, More Secure, and AI-Friendly**. Off-thread diffing is faster. Using direct DOM APIs instead of `innerHTML` is more secure. Simple JSON blueprints are trivial for AI to generate and manipulate. |
|
|
184
|
+
| **AI & Dev Tooling** | **Integrated AI-Native Platform**: Three dedicated MCP servers provide context engineering, semantic search, agent memory, and autonomous workflow automation. | **Disconnected Tooling**: Relies on external, disconnected tools (linters, IDE extensions, CI scripts). No built-in context awareness for AI agents. | **Unprecedented Developer Velocity**. Enables true human-AI collaboration, autonomous code review, and a self-aware development environment that solves the "bus factor" problem. |
|
|
171
185
|
| **Dev Experience** | **Zero-Builds Development**: Native ES Modules run directly in the browser. No transpilation or bundling is needed for development. | **Build-Heavy**: Relies on tools like Vite, Webpack, or the Angular CLI, which add complexity, require source maps, and introduce delays. | **Unparalleled Simplicity & Debugging Clarity**. What you write is what you debug. Instant feedback and the absence of complex build toolchains lead to a faster, more intuitive workflow. |
|
|
172
186
|
|
|
173
|
-
**The Bottom Line**: Where other frameworks optimize operations on the main thread, Neo.mjs moves them off the main thread entirely. This fundamental difference results in a
|
|
187
|
+
**The Bottom Line**: Where other frameworks optimize operations on the main thread, Neo.mjs moves them off the main thread entirely. This fundamental difference results in a platform that is not just faster, but architecturally more scalable, robust, and resilient to complexity.
|
|
174
188
|
|
|
175
189
|
</br></br>
|
|
176
190
|
## ⚙️ Declarative Class Configuration: Build Faster, Maintain Easier
|
|
@@ -246,6 +260,7 @@ Next steps:
|
|
|
246
260
|
* Many more are included inside the repos [apps](https://github.com/neomjs/neo/tree/dev/apps)
|
|
247
261
|
& [examples](https://github.com/neomjs/neo/tree/dev/examples) folders.
|
|
248
262
|
* :blue_book: All Blog Posts are listed here: [Neo.mjs Blog](https://neomjs.com/dist/production/apps/portal/#/blog)
|
|
263
|
+
* :robot: Get started with the **[AI Knowledge Base Quick Start Guide](./.github/AI_QUICK_START.md)**.
|
|
249
264
|
|
|
250
265
|
</br></br>
|
|
251
266
|
## 🧭 Vision & Roadmap
|
package/ServiceWorker.mjs
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
1
2
|
import path from 'path';
|
|
3
|
+
import Base from '../../../../src/core/Base.mjs';
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Default configuration object.
|
|
7
|
+
* Defines the structure and default values for the server configuration.
|
|
8
|
+
*/
|
|
9
|
+
const defaultConfig = {
|
|
4
10
|
/**
|
|
5
11
|
* Global debug flag for all MCP servers.
|
|
6
12
|
* @type {boolean}
|
|
@@ -171,4 +177,85 @@ const config = {
|
|
|
171
177
|
}
|
|
172
178
|
};
|
|
173
179
|
|
|
174
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Configuration manager for the GitHub Workflow MCP server.
|
|
182
|
+
* Supports loading configuration from a custom file and merging with defaults.
|
|
183
|
+
* @class Neo.ai.mcp.server.github-workflow.Config
|
|
184
|
+
* @extends Neo.core.Base
|
|
185
|
+
* @singleton
|
|
186
|
+
*/
|
|
187
|
+
class Config extends Base {
|
|
188
|
+
static config = {
|
|
189
|
+
/**
|
|
190
|
+
* @member {String} className='Neo.ai.mcp.server.github-workflow.Config'
|
|
191
|
+
* @protected
|
|
192
|
+
*/
|
|
193
|
+
className: 'Neo.ai.mcp.server.github-workflow.Config',
|
|
194
|
+
/**
|
|
195
|
+
* @member {Boolean} singleton=true
|
|
196
|
+
* @protected
|
|
197
|
+
*/
|
|
198
|
+
singleton: true
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* The current configuration object.
|
|
203
|
+
* Starts with defaults and can be updated via load().
|
|
204
|
+
* @member {Object} data
|
|
205
|
+
*/
|
|
206
|
+
data = null;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Initializes the configuration object by deep cloning the defaults.
|
|
210
|
+
* @param {Object} config
|
|
211
|
+
*/
|
|
212
|
+
construct(config) {
|
|
213
|
+
super.construct(config);
|
|
214
|
+
this.data = Neo.clone(defaultConfig, true);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Loads configuration from a JSON file and merges it with defaults.
|
|
219
|
+
* @param {string} filePath - The path to the configuration file.
|
|
220
|
+
* @returns {Promise<void>}
|
|
221
|
+
*/
|
|
222
|
+
async load(filePath) {
|
|
223
|
+
if (!filePath) return;
|
|
224
|
+
|
|
225
|
+
try {
|
|
226
|
+
const absolutePath = path.resolve(filePath);
|
|
227
|
+
const ext = path.extname(absolutePath);
|
|
228
|
+
let customConfig;
|
|
229
|
+
|
|
230
|
+
if (ext === '.mjs' || ext === '.js') {
|
|
231
|
+
const module = await import(absolutePath);
|
|
232
|
+
customConfig = module.default;
|
|
233
|
+
} else {
|
|
234
|
+
const content = await fs.readFile(absolutePath, 'utf-8');
|
|
235
|
+
customConfig = JSON.parse(content);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Deep merge custom config into the data object
|
|
239
|
+
Neo.merge(this.data, customConfig);
|
|
240
|
+
|
|
241
|
+
console.log(`[Config] Loaded custom configuration from ${absolutePath}`);
|
|
242
|
+
|
|
243
|
+
} catch (error) {
|
|
244
|
+
console.error(`[Config] Failed to load configuration from ${filePath}:`, error.message);
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const instance = Neo.setupClass(Config);
|
|
251
|
+
|
|
252
|
+
export default new Proxy(instance, {
|
|
253
|
+
get(target, prop, receiver) {
|
|
254
|
+
// 1. Prefer properties/methods on the instance itself (e.g. load, className)
|
|
255
|
+
if (Reflect.has(target, prop)) {
|
|
256
|
+
return Reflect.get(target, prop, receiver);
|
|
257
|
+
}
|
|
258
|
+
// 2. Fallback to the data object (e.g. owner, repo)
|
|
259
|
+
return target.data[prop];
|
|
260
|
+
}
|
|
261
|
+
});
|
|
@@ -6,12 +6,9 @@ import aiConfig from './config.mjs';
|
|
|
6
6
|
*/
|
|
7
7
|
const logger = {};
|
|
8
8
|
|
|
9
|
-
// Check for --debug flag in command line arguments
|
|
10
|
-
const isDebugFlagSet = process.argv.includes('--debug');
|
|
11
|
-
|
|
12
9
|
const createLogMethod = (level) => {
|
|
13
10
|
return (...args) => {
|
|
14
|
-
if (aiConfig.debug
|
|
11
|
+
if (aiConfig.debug) {
|
|
15
12
|
console.error(`[${level.toUpperCase()}]`, ...args);
|
|
16
13
|
}
|
|
17
14
|
};
|